From fbeb85d683b0e084a454daa4cc57237ed8faef6c Mon Sep 17 00:00:00 2001 From: Brian McGue Date: Fri, 22 Jul 2022 06:51:54 -0700 Subject: [PATCH 01/78] Enterprise Search Create Engine Flow (#136493) * a messy WIP commit * Working select step, broken configure app search step * Fix setting next step * Uncomment ConfigureAppSearchEngine react component * Add horizontal steps to AS engine configuration and prettier formatting * WIP elasticsearch engine configuration component and misc cleanup - useActions and useValues in the components where they are needed - stop using props where they are not needed * Add more logic to elasticsearch engine configuration step * Add engine creation step for reviewing BYOEI engine. Still lots to fix, though. * Make sure aliases are unique in the fetchIndices call * Add alias/index badges and disable options/input depending on selection * Add tool tips to the index/alias badges * Update create engine button * UI touchup for select engine page Co-Authored-By: Davey Holler * More UI touchup for all engine creation pages Co-Authored-By: Davey Holler * Extract IndexStatusDetails into its own react component Co-Authored-By: Davey Holler * Get rid of the subdue color; update alert to bold alias and index names Co-Authored-By: Davey Holler * Small fixes Co-Authored-By: Davey Holler * Remove unused file * Fix more UI spacing and i18n translation; delete duplicate interface Co-Authored-By: Davey Holler * Add engine_creation_logic tests * Update mocked data to test more things Add really janky replace call to ignore tabbed whitespace difference in tests. * update fetch_indices tests * Use EUI CSS variable Co-Authored-By: Davey Holler * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Copy pass and i18n unique identifiers fixes. * Replace custom removeWhitespace with dedent * Remove extra spacer Seems not to make a difference anymore anyway * More kibana auto-fix merge fixes * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Another copy pass * WIP first component tests * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Append '-alias' to alias name and show error for duplicate alias name * Disable continue when alias name errors are present * Do not return indices for which user does not have correct privileges * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Add privileges info to index info instead of filtering out indices * Filter select options by privileges and add tests * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * Use aliasRawName to format the aliasName * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * Fix Kibana Checks * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Add tests for SelectEngineType component * Dedupe test title name * Address review feedback: mostly i18n labels changes * Try as string * Give up on dedent * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * Remove unused translations * Fix type checking: omit new fields on sub-interfaces that don't use them * Another shot at types * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' * Add component tests for ReviewElasticsearchEngine * Add WIP component tests for ConfigureElasticsearchEngine * Fix component tests for ConfigureElasticsearchEngine * Rename SearchIndex to ElasticsearchIndexWithPrivileges * Add component tests for IndexStatusDetails * [CI] Auto-commit changed files from 'node scripts/precommit_hook.js --ref HEAD~1..HEAD --fix' Co-authored-by: James Rucker Co-authored-by: Davey Holler Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../enterprise_search/common/types/index.ts | 2 +- .../enterprise_search/common/types/indices.ts | 7 + .../__mocks__/engine_creation_logic.mock.ts | 169 +++++++- .../configure_app_search_engine.test.tsx | 122 ++++++ .../configure_app_search_engine.tsx | 199 ++++++++++ .../configure_elasticsearch_engine.test.tsx | 157 ++++++++ .../configure_elasticsearch_engine.tsx | 368 ++++++++++++++++++ .../components/engine_creation/constants.ts | 2 +- .../engine_creation/engine_creation.scss | 20 + .../engine_creation/engine_creation.test.tsx | 138 ++----- .../engine_creation/engine_creation.tsx | 233 +---------- .../engine_creation_logic.test.ts | 249 +++++++++++- .../engine_creation/engine_creation_logic.ts | 134 ++++++- .../review_elasticsearch_engine.test.tsx | 67 ++++ .../review_elasticsearch_engine.tsx | 259 ++++++++++++ .../search_index_selectable.scss | 5 - .../search_index_selectable.test.tsx | 152 ++------ .../search_index_selectable.tsx | 199 ++++------ .../select_engine_type.test.tsx | 82 ++++ .../engine_creation/select_engine_type.tsx | 196 ++++++++++ .../components/engine_creation/utils.ts | 74 +++- .../server/lib/indices/fetch_indices.test.ts | 79 +++- .../server/lib/indices/fetch_indices.ts | 60 ++- .../server/routes/app_search/engines.ts | 1 + .../routes/enterprise_search/indices.ts | 2 +- .../translations/translations/fr-FR.json | 15 - .../translations/translations/ja-JP.json | 15 - .../translations/translations/zh-CN.json | 15 - 28 files changed, 2369 insertions(+), 652 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/review_elasticsearch_engine.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/review_elasticsearch_engine.tsx delete mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.tsx diff --git a/x-pack/plugins/enterprise_search/common/types/index.ts b/x-pack/plugins/enterprise_search/common/types/index.ts index e37706892ad2c..87dc53051c7b3 100644 --- a/x-pack/plugins/enterprise_search/common/types/index.ts +++ b/x-pack/plugins/enterprise_search/common/types/index.ts @@ -51,4 +51,4 @@ export interface Meta { page: MetaPage; } -export type { ElasticsearchIndex } from './indices'; +export type { ElasticsearchIndexWithPrivileges } from './indices'; diff --git a/x-pack/plugins/enterprise_search/common/types/indices.ts b/x-pack/plugins/enterprise_search/common/types/indices.ts index 09735acc90b98..8c106801e333d 100644 --- a/x-pack/plugins/enterprise_search/common/types/indices.ts +++ b/x-pack/plugins/enterprise_search/common/types/indices.ts @@ -42,3 +42,10 @@ export interface ElasticsearchIndexWithIngestion extends ElasticsearchIndex { connector?: Connector; crawler?: Crawler; } +export interface ElasticsearchIndexWithPrivileges extends ElasticsearchIndex { + alias: boolean; + privileges: { + read: boolean; + manage: boolean; + }; +} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/__mocks__/engine_creation_logic.mock.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/__mocks__/engine_creation_logic.mock.ts index b78b936de127b..e256933cacccd 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/__mocks__/engine_creation_logic.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/__mocks__/engine_creation_logic.mock.ts @@ -5,6 +5,9 @@ * 2.0. */ +import dedent from 'dedent'; + +import { EngineCreationSteps } from '../components/engine_creation/engine_creation_logic'; import { SearchIndexSelectableOption } from '../components/engine_creation/search_index_selectable'; export const DEFAULT_VALUES = { @@ -19,6 +22,14 @@ export const DEFAULT_VALUES = { selectedIndex: '', engineType: 'appSearch', isSubmitDisabled: true, + aliasName: '', + aliasRawName: '', + isAliasAllowed: true, + isAliasRequired: false, + currentEngineCreationStep: EngineCreationSteps.SelectStep, + aliasNameErrorMessage: '', + showAliasNameErrorMessages: false, + selectedIndexFormatted: undefined, }; export const mockElasticsearchIndices = [ @@ -27,6 +38,8 @@ export const mockElasticsearchIndices = [ status: 'open', name: 'search-my-index-1', uuid: 'ydlR_QQJTeyZP66tzQSmMQ', + alias: false, + privileges: { read: true, manage: true }, total: { docs: { count: 0, @@ -37,11 +50,98 @@ export const mockElasticsearchIndices = [ }, }, }, + { + health: 'green', + status: 'open', + name: 'my-index-2', + uuid: '4dlR_QQJTe2ZP6qtzQSmMQ', + alias: false, + privileges: { read: true, manage: true }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, { health: 'green', status: 'open', name: 'search-my-index-2', uuid: '4dlR_QQJTe2ZP6qtzQSmMQ', + alias: true, + privileges: { read: true, manage: true }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, + { + health: 'green', + status: 'open', + name: 'alias-my-index-2', + uuid: '4dlR_QQJTe2ZP6qtzQSmMQ', + alias: true, + privileges: { read: true, manage: true }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, + { + health: 'green', + status: 'open', + name: 'index-without-read-privilege', + uuid: '4dlR_QQJTe2ZP6qtzQSmMQ', + alias: false, + privileges: { read: false, manage: true }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, + { + health: 'green', + status: 'open', + name: 'index-without-manage-privilege', + uuid: '4dlR_QQJTe2ZP6qtzQSmMQ', + alias: false, + privileges: { read: true, manage: false }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, + { + health: 'green', + status: 'open', + name: 'alias-without-manage-privilege', + uuid: '4dlR_QQJTe2ZP6qtzQSmMQ', + alias: true, + privileges: { read: true, manage: false }, total: { docs: { count: 100, @@ -51,7 +151,6 @@ export const mockElasticsearchIndices = [ size_in_bytes: '225b', }, }, - aliases: ['search-index-123'], }, ]; @@ -60,6 +159,17 @@ export const mockSearchIndexOptions: SearchIndexSelectableOption[] = [ label: 'search-my-index-1', health: 'yellow', status: 'open', + alias: false, + disabled: false, + badge: { + color: 'success', + label: 'Index', + toolTipTitle: 'Index name is compatible', + toolTipContent: dedent(` + You can directly use this index. You can also optionally create an + alias to use as the source of the engine instead. + `), + }, total: { docs: { count: 0, @@ -70,10 +180,67 @@ export const mockSearchIndexOptions: SearchIndexSelectableOption[] = [ }, }, }, + { + label: 'my-index-2', + health: 'green', + status: 'open', + alias: false, + disabled: false, + badge: { + color: 'warning', + label: 'Index', + icon: 'iInCircle', + toolTipTitle: 'Index name is incompatible', + toolTipContent: dedent(` + Enterprise Search will automatically create an alias to use as the + source of the search engine rather than use this index directly. + `), + }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, { label: 'search-my-index-2', health: 'green', status: 'open', + alias: true, + disabled: false, + badge: { + color: 'success', + label: 'Alias', + toolTipTitle: 'Alias is compatible', + toolTipContent: 'You can use this alias.', + }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '225b', + }, + }, + }, + { + label: 'alias-my-index-2', + health: 'green', + status: 'open', + alias: true, + disabled: true, + badge: { + color: 'danger', + label: 'Alias', + icon: 'alert', + toolTipTitle: 'Alias name is incompatible', + toolTipContent: 'You\'ll have to create a new alias prefixed with "search-".', + }, total: { docs: { count: 100, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.test.tsx new file mode 100644 index 0000000000000..8d2af69f28a03 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.test.tsx @@ -0,0 +1,122 @@ +/* + * Copyright 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 '../../../__mocks__/react_router'; +import '../../../__mocks__/shallow_useeffect.mock'; +import { setMockActions, setMockValues } from '../../../__mocks__/kea_logic'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { ConfigureAppSearchEngine } from './configure_app_search_engine'; + +describe('ConfigureAppSearchEngine', () => { + const DEFAULT_VALUES = { + name: '', + rawName: '', + language: 'Universal', + isSubmitDisabled: false, + }; + + const MOCK_ACTIONS = { + setRawName: jest.fn(), + setLanguage: jest.fn(), + submitEngine: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + setMockValues(DEFAULT_VALUES); + setMockActions(MOCK_ACTIONS); + }); + + it('renders', () => { + const wrapper = shallow(); + expect(wrapper.find('[data-test-subj="EngineCreationForm"]')).toHaveLength(1); + }); + + it('EngineCreationForm calls submitEngine on form submit', () => { + const wrapper = shallow(); + const simulatedEvent = { + preventDefault: jest.fn(), + }; + wrapper.find('[data-test-subj="EngineCreationForm"]').simulate('submit', simulatedEvent); + + expect(MOCK_ACTIONS.submitEngine).toHaveBeenCalledTimes(1); + }); + + it('EngineCreationNameInput calls setRawName on change', () => { + const wrapper = shallow(); + const simulatedEvent = { + currentTarget: { value: 'new-raw-name' }, + }; + wrapper.find('[data-test-subj="EngineCreationNameInput"]').simulate('change', simulatedEvent); + + expect(MOCK_ACTIONS.setRawName).toHaveBeenCalledWith('new-raw-name'); + }); + + it('EngineCreationLanguageInput calls setLanguage on change', () => { + const wrapper = shallow(); + const simulatedEvent = { + currentTarget: { value: 'English' }, + }; + wrapper + .find('[data-test-subj="EngineCreationLanguageInput"]') + .simulate('change', simulatedEvent); + + expect(MOCK_ACTIONS.setLanguage).toHaveBeenCalledWith('English'); + }); + + describe('NewEngineSubmitButton', () => { + it('is disabled when name is empty', () => { + setMockValues({ ...DEFAULT_VALUES, name: '', rawName: '', isSubmitDisabled: true }); + const wrapper = shallow(); + + expect(wrapper.find('[data-test-subj="NewEngineSubmitButton"]').prop('disabled')).toEqual( + true + ); + }); + + it('is enabled when name has a value', () => { + setMockValues({ ...DEFAULT_VALUES, name: 'test', rawName: 'test' }); + const wrapper = shallow(); + + expect(wrapper.find('[data-test-subj="NewEngineSubmitButton"]').prop('disabled')).toEqual( + false + ); + }); + }); + + describe('EngineCreationNameFormRow', () => { + it('renders sanitized name helptext when the raw name is being sanitized', () => { + setMockValues({ + ...DEFAULT_VALUES, + name: 'un-sanitized-name', + rawName: 'un-----sanitized-------name', + }); + const wrapper = shallow(); + const formRow = wrapper.find('[data-test-subj="EngineCreationNameFormRow"]').dive(); + + expect(formRow.contains('Your engine will be named')).toBeTruthy(); + }); + + it('renders allowed character helptext when rawName and sanitizedName match', () => { + setMockValues({ + ...DEFAULT_VALUES, + name: 'pre-sanitized-name', + rawName: 'pre-sanitized-name', + }); + const wrapper = shallow(); + const formRow = wrapper.find('[data-test-subj="EngineCreationNameFormRow"]').dive(); + + expect( + formRow.contains('Engine names can only contain lowercase letters, numbers, and hyphens') + ).toBeTruthy(); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.tsx new file mode 100644 index 0000000000000..2f6df58031fc3 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_app_search_engine.tsx @@ -0,0 +1,199 @@ +/* + * Copyright 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 { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiButtonEmpty, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiFormRow, + EuiPanel, + EuiSelect, + EuiSpacer, + EuiStepsHorizontal, + EuiText, + EuiTextAlign, + EuiTitle, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { + ENGINE_CREATION_FORM_ENGINE_NAME_LABEL, + SANITIZED_NAME_NOTE, + ALLOWED_CHARS_NOTE, + ENGINE_CREATION_FORM_TITLE, + ENGINE_CREATION_FORM_ENGINE_NAME_PLACEHOLDER, + ENGINE_CREATION_FORM_ENGINE_LANGUAGE_LABEL, + SUPPORTED_LANGUAGES, +} from './constants'; + +import { EngineCreationLogic, EngineCreationSteps } from './engine_creation_logic'; + +export const ConfigureAppSearchEngine: React.FC = () => { + const { isSubmitDisabled, language, name, rawName } = useValues(EngineCreationLogic); + const { setCreationStep, setLanguage, setRawName, submitEngine } = + useActions(EngineCreationLogic); + + return ( +
+ setCreationStep(EngineCreationSteps.SelectStep), + status: 'complete', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.searchEngineType.label', + { + defaultMessage: 'Search engine type', + } + ), + }, + { + onClick: () => {}, + status: 'current', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.configuration.label', + { + defaultMessage: 'Configuration', + } + ), + }, + { + onClick: () => {}, + status: 'disabled', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.finish.label', + { + defaultMessage: 'Finish', + } + ), + }, + ]} + /> + + + + + { + e.preventDefault(); + submitEngine(); + }} + > + + +

{ENGINE_CREATION_FORM_TITLE}

+
+
+ + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.appSearch.description', + { + defaultMessage: + 'Provide a unique name and an optional language choice for your App Search engine.', + } + )} + + + + + + + 0 && rawName !== name ? ( + <> + {SANITIZED_NAME_NOTE} {name} + + ) : ( + ALLOWED_CHARS_NOTE + ) + } + fullWidth + > + setRawName(event.currentTarget.value)} + autoComplete="off" + fullWidth + data-test-subj="EngineCreationNameInput" + placeholder={ENGINE_CREATION_FORM_ENGINE_NAME_PLACEHOLDER} + autoFocus + /> + + + + + setLanguage(event.currentTarget.value)} + /> + + + + + + + + + { + setCreationStep(EngineCreationSteps.SelectStep); + }} + > + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.form.backButton.label', + { + defaultMessage: 'Back', + } + )} + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.form.continue.label', + { + defaultMessage: 'Create search engine', + } + )} + + + +
+
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.test.tsx new file mode 100644 index 0000000000000..bacf707709823 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.test.tsx @@ -0,0 +1,157 @@ +/* + * Copyright 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 '../../../__mocks__/react_router'; +import '../../../__mocks__/shallow_useeffect.mock'; +import { setMockActions, setMockValues } from '../../../__mocks__/kea_logic'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { ConfigureElasticsearchEngine } from './configure_elasticsearch_engine'; +import { EngineCreationSteps } from './engine_creation_logic'; + +describe('ConfigureElasticsearchEngine', () => { + const DEFAULT_VALUES = { + aliasName: '', + aliasRawName: '', + isSubmitDisabled: false, + name: '', + rawName: '', + }; + + const MOCK_ACTIONS = { + loadIndices: jest.fn(), + setAliasRawName: jest.fn(), + setCreationStep: jest.fn(), + setRawName: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + setMockValues(DEFAULT_VALUES); + setMockActions(MOCK_ACTIONS); + }); + + it('renders', () => { + const wrapper = shallow(); + expect(wrapper.find('[data-test-subj="EngineCreationForm"]')).toHaveLength(1); + }); + + it('EngineCreationForm calls setCreationStep on form submit', () => { + const wrapper = shallow(); + const simulatedEvent = { + preventDefault: jest.fn(), + }; + wrapper.find('[data-test-subj="EngineCreationForm"]').simulate('submit', simulatedEvent); + + expect(MOCK_ACTIONS.setCreationStep).toHaveBeenCalledWith(EngineCreationSteps.ReviewStep); + }); + + it('NewEngineBackButton calls setCreationStep when clicked', () => { + const wrapper = shallow(); + wrapper.find('[data-test-subj="NewEngineBackButton"]').simulate('click'); + + expect(MOCK_ACTIONS.setCreationStep).toHaveBeenCalledWith(EngineCreationSteps.SelectStep); + }); + + it('EngineCreationNameInput calls setRawName on change', () => { + const wrapper = shallow(); + const simulatedEvent = { + currentTarget: { value: 'new-raw-name' }, + }; + wrapper.find('[data-test-subj="EngineCreationNameInput"]').simulate('change', simulatedEvent); + + expect(MOCK_ACTIONS.setRawName).toHaveBeenCalledWith('new-raw-name'); + }); + + describe('NewEngineContinueButton', () => { + it('is disabled when isSubmitDisabled is true', () => { + setMockValues({ ...DEFAULT_VALUES, isSubmitDisabled: true }); + const wrapper = shallow(); + const submitButton = wrapper.find('[data-test-subj="NewEngineContinueButton"]'); + + expect(submitButton.prop('disabled')).toEqual(true); + }); + + it('is enabled isSubmitDisabled is false', () => { + const wrapper = shallow(); + const submitButton = wrapper.find('[data-test-subj="NewEngineContinueButton"]'); + + expect(submitButton.prop('disabled')).toEqual(false); + }); + }); + + describe('EngineCreationNameFormRow', () => { + it('renders sanitized name helptext when the raw name is being sanitized', () => { + setMockValues({ + ...DEFAULT_VALUES, + name: 'un-sanitized-name', + rawName: 'un-----sanitized-------name', + }); + const wrapper = shallow(); + const formRow = wrapper.find('[data-test-subj="EngineCreationNameFormRow"]').dive(); + + expect(formRow.contains('Your engine will be named')).toBeTruthy(); + }); + + it('renders allowed character helptext when rawName and sanitizedName match', () => { + setMockValues({ + ...DEFAULT_VALUES, + name: 'pre-sanitized-name', + rawName: 'pre-sanitized-name', + }); + const wrapper = shallow(); + const formRow = wrapper.find('[data-test-subj="EngineCreationNameFormRow"]').dive(); + + expect( + formRow.contains('Engine names can only contain lowercase letters, numbers, and hyphens') + ).toBeTruthy(); + }); + }); + + describe('AliasNameFormRow', () => { + it('renders sanitized aliasName helptext when the aliasRawName is being sanitized', () => { + setMockValues({ + ...DEFAULT_VALUES, + aliasName: 'un-sanitized-name', + aliasRawName: 'un-----sanitized-------name', + }); + const wrapper = shallow(); + const formRow = wrapper.find('[data-test-subj="AliasNameFormRow"]').dive(); + const expectedMessage = + "Alias names must be prefixed with 'search-' in order to be used with App Search engines. Your alias will be named"; + + expect(formRow.contains(expectedMessage)).toBeTruthy(); + }); + + it('renders prefix helptext when aliasRawName and aliasName match', () => { + setMockValues({ + ...DEFAULT_VALUES, + aliasName: 'pre-sanitized-name', + aliasRawName: 'pre-sanitized-name', + }); + const wrapper = shallow(); + const formRow = wrapper.find('[data-test-subj="AliasNameFormRow"]').dive(); + const expectedMessage = + "Alias names must be prefixed with 'search-' in order to be used with App Search engines"; + + expect(formRow.contains(expectedMessage)).toBeTruthy(); + }); + }); + + it('AliasNameInput calls setAliasRawName on change', () => { + const wrapper = shallow(); + const simulatedEvent = { + currentTarget: { value: 'search-new-raw-name' }, + }; + wrapper.find('[data-test-subj="AliasNameInput"]').simulate('change', simulatedEvent); + + expect(MOCK_ACTIONS.setAliasRawName).toHaveBeenCalledWith('search-new-raw-name'); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.tsx new file mode 100644 index 0000000000000..364294ff188d2 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/configure_elasticsearch_engine.tsx @@ -0,0 +1,368 @@ +/* + * Copyright 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 } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiButtonEmpty, + EuiCallOut, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiFormRow, + EuiHighlight, + EuiPanel, + EuiSelectable, + EuiSpacer, + EuiStepsHorizontal, + EuiText, + EuiTextAlign, + EuiTitle, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { + ALLOWED_CHARS_NOTE, + ENGINE_CREATION_FORM_ENGINE_NAME_LABEL, + ENGINE_CREATION_FORM_ENGINE_NAME_PLACEHOLDER, + ENGINE_CREATION_FORM_TITLE, + SANITIZED_NAME_NOTE, +} from './constants'; + +import { EngineCreationLogic, EngineCreationSteps } from './engine_creation_logic'; +import { IndexStatusDetails, SearchIndexSelectableOption } from './search_index_selectable'; + +import './engine_creation.scss'; + +const renderIndexOption = (option: SearchIndexSelectableOption, searchValue: string) => { + return ( + <> + {option.label ?? ''} + + + + ); +}; + +export const ConfigureElasticsearchEngine: React.FC = () => { + const { + aliasName, + aliasNameErrorMessage, + aliasRawName, + indicesFormatted, + isAliasAllowed, + isAliasRequired, + isLoading, + isLoadingIndices, + isSubmitDisabled, + name, + rawName, + showAliasNameErrorMessages, + } = useValues(EngineCreationLogic); + const { + loadIndices, + setIsAliasAllowed, + setAliasRawName, + setCreationStep, + setRawName, + setSelectedIndex, + } = useActions(EngineCreationLogic); + + const onChange = (options: SearchIndexSelectableOption[]) => { + const selectedOption = options.find((option) => option.checked === 'on'); + setSelectedIndex(selectedOption?.label ?? ''); + + // If this is an alias, remove the alias name. Do nothing if an option was deselected + if (selectedOption?.alias ?? false) setAliasRawName(''); + + // Set isAliasAllowed depending on if the selectedOption is an alias or not. + // Set it to true if an option was deselected. + setIsAliasAllowed(!selectedOption?.alias ?? true); + }; + + const aliasOptionalOrRequired = !isAliasAllowed + ? 'Disabled' + : isAliasRequired + ? 'Required' + : 'Optional'; + + useEffect(() => { + loadIndices(); + }, []); + + return ( +
+ setCreationStep(EngineCreationSteps.SelectStep), + status: 'complete', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.searchEngineType.label', + { + defaultMessage: 'Search engine type', + } + ), + }, + { + onClick: () => {}, + status: 'current', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.configuration.label', + { + defaultMessage: 'Configuration', + } + ), + }, + { + onClick: () => {}, + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.review.label', + { + defaultMessage: 'Review', + } + ), + }, + ]} + /> + + + + + { + e.preventDefault(); + setCreationStep(EngineCreationSteps.ReviewStep); + }} + > + + +

{ENGINE_CREATION_FORM_TITLE}

+
+
+ + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.elasticsearchIndex.description', + { + defaultMessage: + 'Provide a unique name and select an index for your App Search engine.', + } + )} + + + + + + + 0 && rawName !== name ? ( + <> + {SANITIZED_NAME_NOTE} {name} + + ) : ( + ALLOWED_CHARS_NOTE + ) + } + fullWidth + > + setRawName(event.currentTarget.value)} + autoComplete="off" + fullWidth + data-test-subj="EngineCreationNameInput" + placeholder={ENGINE_CREATION_FORM_ENGINE_NAME_PLACEHOLDER} + autoFocus + /> + + + + + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.callout.body', + { + defaultMessage: ` + App Search engines can only be created with indices or + aliases prefixed with "search-". If you select an index that + doesn’t start with "search-", an alias to that index will be + created and used. + `, + } + )} +

+
+ + + + + + {(list, search) => ( + <> + {search} + {list} + + )} + + + + + + + + 0 && aliasRawName !== aliasName ? ( + <> + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.aliasName.prefixAndNamed.helpText', + { + defaultMessage: + "Alias names must be prefixed with 'search-' in order to be used with App Search engines. Your alias will be named", + } + )} +  {aliasName} + + ) : ( + i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.aliasName.prefix.helpText', + { + defaultMessage: + "Alias names must be prefixed with 'search-' in order to be used with App Search engines", + } + ) + ) + } + fullWidth + isInvalid={showAliasNameErrorMessages} + error={aliasNameErrorMessage} + > + setAliasRawName(event.currentTarget.value)} + autoComplete="off" + fullWidth + data-test-subj="AliasNameInput" + prepend={aliasOptionalOrRequired} + disabled={!isAliasAllowed} + isInvalid={showAliasNameErrorMessages} + /> + + + + + + + + + setCreationStep(EngineCreationSteps.SelectStep)} + > + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.backButton.label', + { + defaultMessage: 'Back', + } + )} + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.continue.label', + { + defaultMessage: 'Continue', + } + )} + + + +
+
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/constants.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/constants.ts index 1f28be2282562..c5fa7e33fbe37 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/constants.ts @@ -19,7 +19,7 @@ export const ENGINE_CREATION_TITLE = i18n.translate( export const ENGINE_CREATION_FORM_TITLE = i18n.translate( 'xpack.enterpriseSearch.appSearch.engineCreation.form.title', { - defaultMessage: 'Name your engine', + defaultMessage: 'Configure your search engine', } ); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.scss b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.scss new file mode 100644 index 0000000000000..074b79503c03c --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.scss @@ -0,0 +1,20 @@ +.entSearch__createEngineLayout { + max-width: 60rem; + margin: auto; +} + +.entSearch__indexListItem { + pointer-events: none; + .euiBadge { + pointer-events: all; + } +} + +.entSearch__indexSelectable { + .euiSelectableListItem-isFocused, + .euiSelectableListItem__append { + position: absolute; + top: $euiSizeXS; + right: calc(1rem - 2px); + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.test.tsx index 1faf2f93fa1b9..121331456f595 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.test.tsx @@ -14,130 +14,64 @@ import { useLocation } from 'react-router-dom'; import { shallow } from 'enzyme'; +import { ConfigureAppSearchEngine } from './configure_app_search_engine'; +import { ConfigureElasticsearchEngine } from './configure_elasticsearch_engine'; +import { EngineCreationSteps } from './engine_creation_logic'; +import { ReviewElasticsearchEngine } from './review_elasticsearch_engine'; +import { SelectEngineType } from './select_engine_type'; + import { EngineCreation } from '.'; -describe('EngineCreation', () => { - const DEFAULT_VALUES = { - ingestionMethod: '', - isLoading: false, - name: '', - rawName: '', - language: 'Universal', - isSubmitDisabled: false, - }; - - const MOCK_ACTIONS = { - setIngestionMethod: jest.fn(), - setRawName: jest.fn(), - setLanguage: jest.fn(), - submitEngine: jest.fn(), - }; +const MOCK_ACTIONS = { + setIngestionMethod: jest.fn(), +}; +describe('EngineCreation', () => { beforeEach(() => { jest.clearAllMocks(); - setMockValues(DEFAULT_VALUES); + setMockActions(MOCK_ACTIONS); }); - it('renders', () => { - const wrapper = shallow(); - expect(wrapper.find('[data-test-subj="EngineCreation"]')).toHaveLength(1); - }); + it('renders SelectEngineType when the EngineCreationSteps is SelectStep', () => { + setMockValues({ currentEngineCreationStep: EngineCreationSteps.SelectStep }); - it('EngineCreationLanguageInput calls setIngestionMethod on mount', () => { - const search = '?method=crawler'; - (useLocation as jest.Mock).mockImplementationOnce(() => ({ search })); - - shallow(); - expect(MOCK_ACTIONS.setIngestionMethod).toHaveBeenCalledWith('crawler'); - }); - - it('EngineCreationForm calls submitEngine on form submit', () => { const wrapper = shallow(); - const simulatedEvent = { - preventDefault: jest.fn(), - }; - wrapper.find('[data-test-subj="EngineCreationForm"]').simulate('submit', simulatedEvent); - - expect(MOCK_ACTIONS.submitEngine).toHaveBeenCalledTimes(1); + expect(wrapper.find(SelectEngineType)).toHaveLength(1); }); - it('EngineCreationNameInput calls setRawName on change', () => { - const wrapper = shallow(); - const simulatedEvent = { - currentTarget: { value: 'new-raw-name' }, - }; - wrapper.find('[data-test-subj="EngineCreationNameInput"]').simulate('change', simulatedEvent); - - expect(MOCK_ACTIONS.setRawName).toHaveBeenCalledWith('new-raw-name'); - }); + it('renders ConfigureAppSearchEngine when appropriate', () => { + setMockValues({ + currentEngineCreationStep: EngineCreationSteps.ConfigureStep, + engineType: 'appSearch', + }); - it('EngineCreationLanguageInput calls setLanguage on change', () => { const wrapper = shallow(); - const simulatedEvent = { - currentTarget: { value: 'English' }, - }; - wrapper - .find('[data-test-subj="EngineCreationLanguageInput"]') - .simulate('change', simulatedEvent); - - expect(MOCK_ACTIONS.setLanguage).toHaveBeenCalledWith('English'); + expect(wrapper.find(ConfigureAppSearchEngine)).toHaveLength(1); }); - describe('NewEngineSubmitButton', () => { - it('is disabled when name is empty', () => { - setMockValues({ ...DEFAULT_VALUES, name: '', rawName: '', isSubmitDisabled: true }); - const wrapper = shallow(); - - expect(wrapper.find('[data-test-subj="NewEngineSubmitButton"]').prop('disabled')).toEqual( - true - ); + it('renders ConfigureElasticsearchEngine when appropriate', () => { + setMockValues({ + currentEngineCreationStep: EngineCreationSteps.ConfigureStep, + engineType: 'elasticsearch', }); - it('is enabled when name has a value', () => { - setMockValues({ ...DEFAULT_VALUES, name: 'test', rawName: 'test' }); - const wrapper = shallow(); - - expect(wrapper.find('[data-test-subj="NewEngineSubmitButton"]').prop('disabled')).toEqual( - false - ); - }); + const wrapper = shallow(); + expect(wrapper.find(ConfigureElasticsearchEngine)).toHaveLength(1); + }); - it('passes isLoading state', () => { - setMockValues({ ...DEFAULT_VALUES, isLoading: true }); - const wrapper = shallow(); + it('renders ReviewElasticsearchEngine when the EngineCreationSteps is ReviewStep', () => { + setMockValues({ currentEngineCreationStep: EngineCreationSteps.ReviewStep }); - expect(wrapper.find('[data-test-subj="NewEngineSubmitButton"]').prop('isLoading')).toEqual( - true - ); - }); + const wrapper = shallow(); + expect(wrapper.find(ReviewElasticsearchEngine)).toHaveLength(1); }); - describe('EngineCreationNameFormRow', () => { - it('renders sanitized name helptext when the raw name is being sanitized', () => { - setMockValues({ - ...DEFAULT_VALUES, - name: 'un-sanitized-name', - rawName: 'un-----sanitized-------name', - }); - const wrapper = shallow(); - const formRow = wrapper.find('[data-test-subj="EngineCreationNameFormRow"]').dive(); - - expect(formRow.contains('Your engine will be named')).toBeTruthy(); - }); + it('EngineCreationLanguageInput calls setIngestionMethod on mount', () => { + const search = '?method=crawler'; + (useLocation as jest.Mock).mockImplementationOnce(() => ({ search })); - it('renders allowed character helptext when rawName and sanitizedName match', () => { - setMockValues({ - ...DEFAULT_VALUES, - name: 'pre-sanitized-name', - rawName: 'pre-sanitized-name', - }); - const wrapper = shallow(); - const formRow = wrapper.find('[data-test-subj="EngineCreationNameFormRow"]').dive(); - - expect( - formRow.contains('Engine names can only contain lowercase letters, numbers, and hyphens') - ).toBeTruthy(); - }); + shallow(); + expect(MOCK_ACTIONS.setIngestionMethod).toHaveBeenCalledWith('crawler'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.tsx index 33a8135fa63d4..95ed3875888f4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation.tsx @@ -12,54 +12,23 @@ import { useLocation } from 'react-router-dom'; import { Location } from 'history'; import { useActions, useValues } from 'kea'; -import { - EuiAccordion, - EuiBadge, - EuiButton, - EuiCheckableCard, - EuiFieldText, - EuiFlexGroup, - EuiFlexItem, - EuiForm, - EuiFormFieldset, - EuiFormRow, - EuiLink, - EuiPanel, - EuiSelect, - EuiSpacer, - EuiText, - EuiTitle, -} from '@elastic/eui'; - -import { i18n } from '@kbn/i18n'; - -import { docLinks } from '../../../shared/doc_links'; import { parseQueryParams } from '../../../shared/query_params'; import { ENGINES_TITLE } from '../engines'; import { AppSearchPageTemplate } from '../layout'; -import { - ALLOWED_CHARS_NOTE, - ENGINE_CREATION_FORM_ENGINE_LANGUAGE_LABEL, - ENGINE_CREATION_FORM_ENGINE_NAME_LABEL, - ENGINE_CREATION_FORM_ENGINE_NAME_PLACEHOLDER, - ENGINE_CREATION_FORM_SUBMIT_BUTTON_LABEL, - ENGINE_CREATION_FORM_TITLE, - ENGINE_CREATION_TITLE, - SANITIZED_NAME_NOTE, - SUPPORTED_LANGUAGES, -} from './constants'; -import { EngineCreationLogic } from './engine_creation_logic'; -import { SearchIndexSelectable } from './search_index_selectable'; +import { ConfigureAppSearchEngine } from './configure_app_search_engine'; +import { ConfigureElasticsearchEngine } from './configure_elasticsearch_engine'; +import { ENGINE_CREATION_TITLE } from './constants'; +import { EngineCreationLogic, EngineCreationSteps } from './engine_creation_logic'; +import { ReviewElasticsearchEngine } from './review_elasticsearch_engine'; +import { SelectEngineType } from './select_engine_type'; export const EngineCreation: React.FC = () => { const { search } = useLocation() as Location; const { method } = parseQueryParams(search); - const { name, rawName, language, isLoading, engineType, isSubmitDisabled } = - useValues(EngineCreationLogic); - const { setIngestionMethod, setLanguage, setRawName, submitEngine, setEngineType } = - useActions(EngineCreationLogic); + const { engineType, currentEngineCreationStep } = useValues(EngineCreationLogic); + const { setIngestionMethod } = useActions(EngineCreationLogic); useEffect(() => { if (typeof method === 'string') { @@ -73,184 +42,14 @@ export const EngineCreation: React.FC = () => { pageHeader={{ pageTitle: ENGINE_CREATION_TITLE }} data-test-subj="EngineCreation" > - - { - e.preventDefault(); - submitEngine(); - }} - > - -

{ENGINE_CREATION_FORM_TITLE}

-
- - - - 0 && rawName !== name ? ( - <> - {SANITIZED_NAME_NOTE} {name} - - ) : ( - ALLOWED_CHARS_NOTE - ) - } - fullWidth - > - setRawName(event.currentTarget.value)} - autoComplete="off" - fullWidth - data-test-subj="EngineCreationNameInput" - placeholder={ENGINE_CREATION_FORM_ENGINE_NAME_PLACEHOLDER} - autoFocus - /> - - - - - setLanguage(event.currentTarget.value)} - /> - - - - - - - - - - {i18n.translate('xpack.enterpriseSearch.engineCreation.engineTypeLabel', { - defaultMessage: - "Select how you'd like to manage the index for this engine", - })} - - - ), - }} - > - - - setEngineType('appSearch')} - checked={engineType === 'appSearch'} - label={ - <> - - - {i18n.translate( - 'xpack.enterpriseSearch.engineCreation.appSearchManagedLabel', - { defaultMessage: 'I want App Search to ingest and manage my data' } - )} - - - - -

- {i18n.translate( - 'xpack.enterpriseSearch.engineCreation.appSearchManagedDescription', - { - defaultMessage: - 'Create and engine and add documents via Web Crawler, API, or JSON file.', - } - )} -

-
- - } - /> -
- - setEngineType('elasticsearch')} - checked={engineType === 'elasticsearch'} - label={ - <> - - {i18n.translate( - 'xpack.enterpriseSearch.engineCreation.elasticsearchTechPreviewBadge', - { defaultMessage: 'Technical Preview' } - )} - - - - - {i18n.translate( - 'xpack.enterpriseSearch.engineCreation.elasticsearchManagedLabel', - { defaultMessage: 'I want to manage my data with Elasticsearch' } - )} - - - - -

- {i18n.translate( - 'xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLabel', - { - defaultMessage: - 'Create an engine based on data managed in an Elasticsearch index.', - } - )} -

-

- - - {i18n.translate( - 'xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLink', - { - defaultMessage: - 'Learn more about using an existing Elasticsearch index', - } - )} - - -

-
- - } - /> -
-
-
- - {engineType === 'elasticsearch' && } -
-
- - - {ENGINE_CREATION_FORM_SUBMIT_BUTTON_LABEL} - -
-
+ {currentEngineCreationStep === EngineCreationSteps.SelectStep && } + {currentEngineCreationStep === EngineCreationSteps.ConfigureStep && + engineType === 'appSearch' && } + {currentEngineCreationStep === EngineCreationSteps.ConfigureStep && + engineType === 'elasticsearch' && } + {currentEngineCreationStep === EngineCreationSteps.ReviewStep && ( + + )} ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.test.ts index a7a3523c7ebf3..9a5754173db1b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.test.ts @@ -20,7 +20,7 @@ import { import { nextTick } from '@kbn/test-jest-helpers'; -import { EngineCreationLogic } from './engine_creation_logic'; +import { EngineCreationLogic, EngineCreationSteps } from './engine_creation_logic'; describe('EngineCreationLogic', () => { const { mount } = new LogicMounter(EngineCreationLogic); @@ -134,6 +134,19 @@ describe('EngineCreationLogic', () => { expect(EngineCreationLogic.values).toEqual({ ...DEFAULT_VALUES, selectedIndex: 'search-test-index', + isAliasRequired: false, + }); + }); + + it('sets aliasRawName and isAliasRequired if it does not start with "search-"', () => { + mount(); + EngineCreationLogic.actions.setSelectedIndex('test-index'); + expect(EngineCreationLogic.values).toEqual({ + ...DEFAULT_VALUES, + selectedIndex: 'test-index', + aliasName: 'search-test-index-alias', + aliasRawName: 'search-test-index-alias', + isAliasRequired: true, }); }); }); @@ -148,6 +161,40 @@ describe('EngineCreationLogic', () => { }); }); }); + + describe('setAliasRawName', () => { + it('sets aliasRawName', () => { + mount(); + EngineCreationLogic.actions.setAliasRawName('search index name'); + expect(EngineCreationLogic.values).toEqual({ + ...DEFAULT_VALUES, + aliasRawName: 'search index name', + aliasName: 'search-index-name', + }); + }); + }); + + describe('setCreationStep', () => { + it('sets currentEngineCreationStep', () => { + mount(); + EngineCreationLogic.actions.setCreationStep(EngineCreationSteps.ConfigureStep); + expect(EngineCreationLogic.values).toEqual({ + ...DEFAULT_VALUES, + currentEngineCreationStep: EngineCreationSteps.ConfigureStep, + }); + }); + }); + + describe('setIsAliasAllowed', () => { + it('sets isAliasAllowed', () => { + mount(); + EngineCreationLogic.actions.setIsAliasAllowed(false); + expect(EngineCreationLogic.values).toEqual({ + ...DEFAULT_VALUES, + isAliasAllowed: false, + }); + }); + }); }); describe('selectors', () => { @@ -204,6 +251,7 @@ describe('EngineCreationLogic', () => { expect(EngineCreationLogic.values.isSubmitDisabled).toBe(false); }); }); + describe('Elasticsearch Index based engine', () => { it('should disable button if engine name is empty', () => { mount({ @@ -225,7 +273,40 @@ describe('EngineCreationLogic', () => { expect(EngineCreationLogic.values.isSubmitDisabled).toBe(true); }); - it('should enable button if all selected', () => { + it('should disable button if non "search-" index selected without alias', () => { + mount({ + rawName: 'my-engine-name', + selectedIndex: 'my-index', + aliasRawName: '', + engineType: 'elasticsearch', + }); + + expect(EngineCreationLogic.values.isSubmitDisabled).toBe(true); + }); + + it('should disable button if non "search-" index selected and non "search-" alias', () => { + mount({ + rawName: 'my-engine-name', + selectedIndex: 'my-index', + aliasRawName: 'an-alias', + engineType: 'elasticsearch', + }); + + expect(EngineCreationLogic.values.isSubmitDisabled).toBe(true); + }); + + it('should disable button if "search-" index selected and non "search-" alias', () => { + mount({ + rawName: 'my-engine-name', + selectedIndex: 'search-my-index', + aliasRawName: 'an-alias', + engineType: 'elasticsearch', + }); + + expect(EngineCreationLogic.values.isSubmitDisabled).toBe(true); + }); + + it('should enable button if all selected and "search-" index', () => { mount({ rawName: 'my-engine-name', selectedIndex: 'search-my-index-1', @@ -234,6 +315,147 @@ describe('EngineCreationLogic', () => { expect(EngineCreationLogic.values.isSubmitDisabled).toBe(false); }); + + it('should enable button if all selected and "search-" alias', () => { + mount({ + rawName: 'my-engine-name', + selectedIndex: 'my-index-1', + aliasRawName: 'search-my-index-1', + engineType: 'elasticsearch', + }); + + expect(EngineCreationLogic.values.isSubmitDisabled).toBe(false); + }); + + it('should enable button if all selected and "search-" index and alias', () => { + mount({ + rawName: 'my-engine-name', + selectedIndex: 'my-index-1', + aliasRawName: 'search-my-index-1', + engineType: 'elasticsearch', + }); + + expect(EngineCreationLogic.values.isSubmitDisabled).toBe(false); + }); + }); + }); + + describe('isAliasRequired', () => { + it('should return false when index is prefixed with "search-"', () => { + mount({ + selectedIndex: 'search-my-index', + }); + + expect(EngineCreationLogic.values.isAliasRequired).toEqual(false); + }); + + it('should return false when index is not selected', () => { + mount({ + selectedIndex: '', + }); + + expect(EngineCreationLogic.values.isAliasRequired).toEqual(false); + }); + + it('should return true when index is not prefixed with "search-"', () => { + mount({ + selectedIndex: 'my-index', + }); + + expect(EngineCreationLogic.values.isAliasRequired).toEqual(true); + }); + }); + + describe('selectedIndexFormatted', () => { + it('should be null if indices is empty', () => { + mount({ + indices: [], + }); + + expect(EngineCreationLogic.values.selectedIndexFormatted).toBeUndefined(); + }); + + it('should be null if there is no selectedIndex', () => { + mount({ + indices: mockElasticsearchIndices, + selectedIndex: '', + }); + + expect(EngineCreationLogic.values.selectedIndexFormatted).toBeUndefined(); + }); + + it('should select the correctly formatted search index', () => { + mount({ + indices: mockElasticsearchIndices, + selectedIndex: 'search-my-index-2', + }); + const mockCheckedSearchIndexOptions = [...mockSearchIndexOptions]; + mockCheckedSearchIndexOptions[2].checked = 'on'; + + expect(EngineCreationLogic.values.selectedIndexFormatted).toEqual( + mockCheckedSearchIndexOptions[2] + ); + }); + }); + + describe('aliasName', () => { + it('should format the aliasName by replacing whitespace with hyphens from the aliasRawName', () => { + mount({ + aliasRawName: ' search my index-------now', + }); + + expect(EngineCreationLogic.values.aliasName).toEqual('search-my-index-now'); + }); + }); + + describe('aliasNameErrorMessage', () => { + it('should be an empty string if indices is empty', () => { + mount({ + indices: [], + }); + + expect(EngineCreationLogic.values.aliasNameErrorMessage).toEqual(''); + }); + + it('should be an empty string if there is no aliasName', () => { + mount({ + aliasName: '', + indices: mockElasticsearchIndices, + }); + + expect(EngineCreationLogic.values.aliasNameErrorMessage).toEqual(''); + }); + + it('should set an error message if there is an existing alias/index', () => { + mount({ + aliasRawName: 'alias-without-manage-privilege', + indices: mockElasticsearchIndices, + }); + + // ugly, but cannot use dedent here and pass Kibana's Checks + expect(EngineCreationLogic.values.aliasNameErrorMessage).toEqual(` +There is an existing index or alias with the name alias-without-manage-privilege. +Please choose another alias name. +`); + }); + }); + + describe('showAliasNameErrorMessages', () => { + it('should be false if there is no error message', () => { + mount({ + aliasNameErrorMessage: '', + }); + + expect(EngineCreationLogic.values.showAliasNameErrorMessages).toBe(false); + }); + + it('should be true if there is an error message', () => { + mount({ + aliasRawName: 'alias-without-manage-privilege', + indices: mockElasticsearchIndices, + }); + + expect(EngineCreationLogic.values.showAliasNameErrorMessages).toBe(true); }); }); }); @@ -335,6 +557,29 @@ describe('EngineCreationLogic', () => { await nextTick(); expect(flashAPIErrors).toHaveBeenCalledTimes(1); }); + + it('adds alias_name to the payload if aliasName is present', () => { + mount({ + engineType: 'elasticsearch', + name: 'engine-name', + selectedIndex: 'selected-index', + aliasRawName: 'search-selected-index', + }); + + const body = JSON.stringify({ + name: EngineCreationLogic.values.name, + search_index: { + type: 'elasticsearch', + index_name: EngineCreationLogic.values.selectedIndex, + alias_name: EngineCreationLogic.values.aliasName, + }, + }); + EngineCreationLogic.actions.submitEngine(); + + expect(http.post).toHaveBeenCalledWith('/internal/app_search/elasticsearch/engines', { + body, + }); + }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.ts index 4b1a96a25412b..dbf7efa907c74 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/engine_creation_logic.ts @@ -7,7 +7,9 @@ import { kea, MakeLogicType } from 'kea'; -import { ElasticsearchIndex } from '../../../../../common/types'; +import { i18n } from '@kbn/i18n'; + +import { ElasticsearchIndexWithPrivileges } from '../../../../../common/types'; import { flashAPIErrors, flashSuccessToast } from '../../../shared/flash_messages'; import { HttpLogic } from '../../../shared/http'; import { KibanaLogic } from '../../../shared/kibana'; @@ -17,31 +19,50 @@ import { DEFAULT_LANGUAGE, ENGINE_CREATION_SUCCESS_MESSAGE } from './constants'; import { SearchIndexSelectableOption } from './search_index_selectable'; import { getRedirectToAfterEngineCreation, formatIndicesToSelectable } from './utils'; -type EngineType = 'appSearch' | 'elasticsearch'; +export enum EngineCreationSteps { + SelectStep = 'Select Engine Type', + ConfigureStep = 'Configure Engine', + ReviewStep = 'Review', +} + +export type EngineType = 'appSearch' | 'elasticsearch'; interface EngineCreationActions { onEngineCreationSuccess(): void; setIngestionMethod(method: string): { method: string }; setLanguage(language: string): { language: string }; setRawName(rawName: string): { rawName: string }; + setAliasRawName(aliasRawName: string): { aliasRawName: string }; + setCreationStep(creationStep: EngineCreationSteps): EngineCreationSteps; submitEngine(): void; onSubmitError(): void; loadIndices(): void; - onLoadIndicesSuccess(indices: ElasticsearchIndex[]): { indices: ElasticsearchIndex[] }; + onLoadIndicesSuccess(indices: ElasticsearchIndexWithPrivileges[]): { + indices: ElasticsearchIndexWithPrivileges[]; + }; setSelectedIndex(selectedIndexName: string): { selectedIndexName: string }; setEngineType(engineType: EngineType): { engineType: EngineType }; + setIsAliasAllowed(isAliasAllowed: boolean): { isAliasAllowed: boolean }; } interface EngineCreationValues { + currentEngineCreationStep: EngineCreationSteps; ingestionMethod: string; isLoading: boolean; language: string; name: string; rawName: string; isLoadingIndices: boolean; - indices: ElasticsearchIndex[]; + indices: ElasticsearchIndexWithPrivileges[]; indicesFormatted: SearchIndexSelectableOption[]; selectedIndex: string; + selectedIndexFormatted?: SearchIndexSelectableOption; engineType: EngineType; + aliasName: string; + aliasNameErrorMessage: string; + aliasRawName: string; + showAliasNameErrorMessages: boolean; + isAliasAllowed: boolean; + isAliasRequired: boolean; isSubmitDisabled: boolean; } @@ -52,12 +73,15 @@ export const EngineCreationLogic = kea ({ method }), setLanguage: (language) => ({ language }), setRawName: (rawName) => ({ rawName }), + setAliasRawName: (aliasRawName) => ({ aliasRawName }), submitEngine: true, onSubmitError: true, loadIndices: true, onLoadIndicesSuccess: (indices) => ({ indices }), setSelectedIndex: (selectedIndexName) => ({ selectedIndexName }), setEngineType: (engineType) => ({ engineType }), + setCreationStep: (currentEngineCreationStep) => currentEngineCreationStep, + setIsAliasAllowed: (isAliasAllowed) => ({ isAliasAllowed }), }, reducers: { ingestionMethod: [ @@ -85,6 +109,23 @@ export const EngineCreationLogic = kea rawName, }, ], + aliasRawName: [ + '', + { + setAliasRawName: (_, { aliasRawName }) => aliasRawName, + setSelectedIndex: (_, { selectedIndexName }) => { + return selectedIndexName.length === 0 || selectedIndexName.startsWith('search-') + ? '' + : `search-${selectedIndexName}-alias`; + }, + }, + ], + isAliasAllowed: [ + true, + { + setIsAliasAllowed: (_, { isAliasAllowed }) => isAliasAllowed, + }, + ], isLoadingIndices: [ false, { @@ -112,25 +153,95 @@ export const EngineCreationLogic = kea engineType, }, ], + currentEngineCreationStep: [ + EngineCreationSteps.SelectStep, + { + setCreationStep: (_, currentEngineCreationStep) => currentEngineCreationStep, + }, + ], }, selectors: ({ selectors }) => ({ name: [() => [selectors.rawName], (rawName) => formatApiName(rawName)], + aliasName: [() => [selectors.aliasRawName], (aliasRawName) => formatApiName(aliasRawName)], indicesFormatted: [ () => [selectors.indices, selectors.selectedIndex], - (indices: ElasticsearchIndex[], selectedIndexName) => + (indices: ElasticsearchIndexWithPrivileges[], selectedIndexName) => formatIndicesToSelectable(indices, selectedIndexName), ], isSubmitDisabled: [ - () => [selectors.name, selectors.engineType, selectors.selectedIndex], - (name: string, engineType: EngineType, selectedIndex: string) => - (name.length === 0 && engineType === 'appSearch') || - ((name.length === 0 || selectedIndex.length === 0) && engineType === 'elasticsearch'), + () => [ + selectors.name, + selectors.engineType, + selectors.selectedIndex, + selectors.aliasName, + selectors.showAliasNameErrorMessages, + ], + ( + name: string, + engineType: EngineType, + selectedIndex: string, + aliasName: string, + showAliasNameErrorMessages: boolean + ) => { + if (name.length === 0 || showAliasNameErrorMessages) { + return true; + } + + if (engineType === 'elasticsearch') { + if (selectedIndex.length === 0) { + return true; + } + + if (aliasName.length === 0) { + return !selectedIndex.startsWith('search-'); + } else { + return !aliasName.startsWith('search-'); + } + } + + return false; + }, + ], + isAliasRequired: [ + () => [selectors.selectedIndex], + (selectedIndex: string) => selectedIndex.length > 0 && !selectedIndex?.startsWith('search-'), + ], + selectedIndexFormatted: [ + () => [selectors.selectedIndex, selectors.indicesFormatted], + (selectedIndex: string, indicesFormatted: SearchIndexSelectableOption[]) => { + return indicesFormatted.find((el) => el.label === selectedIndex); + }, + ], + aliasNameErrorMessage: [ + () => [selectors.aliasName, selectors.indices], + (aliasName: string, indices: ElasticsearchIndexWithPrivileges[]) => { + const existingAlias = indices.find((el) => el.name === aliasName); + if (existingAlias) { + return i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.aliasName.errorText', + { + // ugly, but cannot use dedent here and pass Kibana's Checks + defaultMessage: ` +There is an existing index or alias with the name {aliasName}. +Please choose another alias name. +`, + values: { aliasName }, + } + ); + } else { + return ''; + } + }, + ], + showAliasNameErrorMessages: [ + () => [selectors.aliasNameErrorMessage], + (aliasNameErrorMessage: string) => aliasNameErrorMessage.length > 0, ], }), listeners: ({ values, actions }) => ({ submitEngine: async () => { const { http } = HttpLogic.values; - const { name, language, engineType, selectedIndex } = values; + const { name, language, engineType, selectedIndex, aliasName } = values; try { if (engineType === 'appSearch') { @@ -143,6 +254,7 @@ export const EngineCreationLogic = kea { + const DEFAULT_VALUES = { + aliasName: '', + }; + + const MOCK_ACTIONS = { + submitEngine: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + setMockValues(DEFAULT_VALUES); + setMockActions(MOCK_ACTIONS); + }); + + it('renders', () => { + const wrapper = shallow(); + expect(wrapper.find('[data-test-subj="ElasticsearchEngineCreationForm"]')).toHaveLength(1); + }); + + it('ElasticsearchEngineCreationForm calls submitEngine on form submit', () => { + const wrapper = shallow(); + const simulatedEvent = { + preventDefault: jest.fn(), + }; + wrapper + .find('[data-test-subj="ElasticsearchEngineCreationForm"]') + .simulate('submit', simulatedEvent); + + expect(MOCK_ACTIONS.submitEngine).toHaveBeenCalledTimes(1); + }); + + it('ElasticsearchEngineCreationFormAliasNameCallout is present if aliasName is present', () => { + setMockValues({ ...DEFAULT_VALUES, aliasName: 'i-exist' }); + + const wrapper = shallow(); + expect( + wrapper.find('[data-test-subj="ElasticsearchEngineCreationFormAliasNameCallout"]') + ).toHaveLength(1); + }); + + it('ElasticsearchEngineCreationFormAliasNameCallout is not present if aliasName is not present', () => { + setMockValues({ ...DEFAULT_VALUES, aliasName: '' }); + + const wrapper = shallow(); + expect( + wrapper.find('[data-test-subj="ElasticsearchEngineCreationFormAliasNameCallout"]') + ).toHaveLength(0); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/review_elasticsearch_engine.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/review_elasticsearch_engine.tsx new file mode 100644 index 0000000000000..5218e4f2c3eec --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/review_elasticsearch_engine.tsx @@ -0,0 +1,259 @@ +/* + * Copyright 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 { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiButtonEmpty, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiForm, + EuiI18n, + EuiPanel, + EuiSpacer, + EuiStepsHorizontal, + EuiText, + EuiTextAlign, + EuiTitle, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { EngineCreationLogic, EngineCreationSteps } from './engine_creation_logic'; +import { IndexStatusDetails } from './search_index_selectable'; + +export const ReviewElasticsearchEngine: React.FC = () => { + const { aliasName, name, selectedIndex, selectedIndexFormatted } = useValues(EngineCreationLogic); + const { setCreationStep, submitEngine } = useActions(EngineCreationLogic); + + return ( +
+ setCreationStep(EngineCreationSteps.SelectStep), + status: 'complete', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.searchEngineType.label', + { + defaultMessage: 'Search engine type', + } + ), + }, + { + onClick: () => setCreationStep(EngineCreationSteps.ConfigureStep), + status: 'complete', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.configuration.label', + { + defaultMessage: 'Configuration', + } + ), + }, + { + onClick: () => {}, + status: 'current', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.review.label', + { + defaultMessage: 'Review', + } + ), + }, + ]} + /> + + + + + { + e.preventDefault(); + submitEngine(); + }} + > + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.title.label', + { + defaultMessage: 'Review your search engine', + } + )} +

+
+
+ + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.description', + { + defaultMessage: + 'Your App Search engine will be created with the following configuration.', + } + )} + + + + + + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.engineType.title', + { + defaultMessage: 'Engine Type', + } + )} +

+
+ + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.engineType.description', + { + defaultMessage: 'Elasticsearch index-based', + } + )} + +
+
+ + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.aliasName.title', + { + defaultMessage: 'Alias Name', + } + )} +

+
+ {aliasName || '--'} +
+
+ + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.engineName.title', + { + defaultMessage: 'Engine Name', + } + )} +

+
+ {name} +
+
+
+ + + + + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.reviewForm.elasticsearchIndex.title', + { + defaultMessage: 'Elasticsearch Index', + } + )} +

+
+ {selectedIndex} + + + + +
+
+
+ + + + {aliasName.length > 0 && ( + + {aliasName}, + name: {name}, + }} + /> + + )} + + + + + + { + setCreationStep(EngineCreationSteps.ConfigureStep); + }} + > + {i18n.translate( + // FIXME: this and the rest of the paths + 'xpack.enterpriseSearch.appSearch.engineCreation.form.editConfiguration.label', + { + defaultMessage: 'Edit configuration', + } + )} + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.form.continue.label', + { + defaultMessage: 'Create search engine', + } + )} + + + +
+
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.scss b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.scss deleted file mode 100644 index 7d50e8607d442..0000000000000 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.scss +++ /dev/null @@ -1,5 +0,0 @@ -.selectableSecondaryContentLabel { - &:not(:last-child) { - padding-right: $euiSizeL; - } -} \ No newline at end of file diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.test.tsx index 74836d6e0e202..c3c1bb012b755 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.test.tsx @@ -5,126 +5,44 @@ * 2.0. */ +import '../../../__mocks__/react_router'; import '../../../__mocks__/shallow_useeffect.mock'; -import { setMockActions, setMockValues } from '../../../__mocks__/kea_logic'; -import React, { MouseEvent } from 'react'; - -import { shallow, mount } from 'enzyme'; - -import { EuiSelectable, EuiIcon, EuiHighlight } from '@elastic/eui'; - -import { SearchIndexSelectable, SearchIndexSelectableOption } from './search_index_selectable'; - -describe('SearchIndexSelectable', () => { - const DEFAULT_VALUES = { - isIndicesLoading: false, - indicesFormatted: [ - { - label: 'search-test-index-1', - health: 'green', - status: 'open', - total: { - docs: { - count: 100, - deleted: 0, - }, - store: { - size_in_bytes: '108Kb', - }, - }, - }, - { - label: 'search-test-index-2', - health: 'green', - status: 'open', - total: { - docs: { - count: 100, - deleted: 0, - }, - store: { - size_in_bytes: '108Kb', - }, - }, - checked: 'on', - }, - ], - }; - const MOCK_ACTIONS = { loadIndices: jest.fn(), setSelectedIndex: jest.fn() }; - beforeEach(() => { - jest.clearAllMocks(); - setMockValues(DEFAULT_VALUES); - setMockActions(MOCK_ACTIONS); - }); - - it('renders', () => { - const wrapper = shallow(); - const selectable = wrapper.find(EuiSelectable); - expect(wrapper.find('[data-test-subj="SearchIndexSelectable"]')).toHaveLength(1); - expect(selectable.prop('emptyMessage')).toEqual('No Elasticsearch indices available'); - expect(selectable.prop('loadingMessage')).toEqual('Loading Elasticsearch indices'); - }); - - it('renders custom options', () => { - const wrapper = shallow(); - const selectable = wrapper.find(EuiSelectable); - const customOptions = selectable.prop('renderOption')!; - const renderedOptions = mount( - <> - {customOptions( - DEFAULT_VALUES.indicesFormatted[0] as SearchIndexSelectableOption, - 'search-' - )} - - ); - - expect(renderedOptions.find(EuiHighlight).text()).toEqual('search-test-index-1'); - expect(renderedOptions.find(EuiIcon).prop('color')).toEqual('success'); - expect(renderedOptions.find('[data-test-subj="optionStatus"]').text()).toEqual( - 'Status:\u00a0open' - ); - expect(renderedOptions.find('[data-test-subj="optionDocs"]').text()).toEqual( - 'Docs count:\u00a0100' - ); - expect(renderedOptions.find('[data-test-subj="optionStorage"]').text()).toEqual( - 'Storage size:\u00a0108Kb' - ); - }); - - it('calls loadIndices on mount', () => { - shallow(); - expect(MOCK_ACTIONS.loadIndices).toHaveBeenCalled(); - }); - - it('renders - on rows for missing information', () => { - const wrapper = shallow(); - const selectable = wrapper.find(EuiSelectable); - const customOptions = selectable.prop('renderOption')!; - const renderedOptions = mount( - <>{customOptions({ label: 'search-missing-data' }, 'search-')} - ); - - expect(renderedOptions.find(EuiHighlight).text()).toEqual('search-missing-data'); - expect(renderedOptions.find(EuiIcon).prop('color')).toEqual(''); - expect(renderedOptions.find('[data-test-subj="optionStatus"]').text()).toEqual( - 'Status:\u00a0-' - ); - expect(renderedOptions.find('[data-test-subj="optionDocs"]').text()).toEqual( - 'Docs count:\u00a0-' - ); - expect(renderedOptions.find('[data-test-subj="optionStorage"]').text()).toEqual( - 'Storage size:\u00a0-' - ); +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { IndexStatusDetails, SearchIndexSelectableOption } from './search_index_selectable'; + +const mockOption: SearchIndexSelectableOption = { + label: 'string', + alias: true, + badge: { + color: 'string', + label: 'string', + toolTipTitle: 'string', + toolTipContent: 'string', + }, + disabled: true, + total: { + docs: { + count: 123, + deleted: 123, + }, + store: { + size_in_bytes: 'string', + }, + }, +}; + +describe('IndexStatusDetails', () => { + it('does not render anything if an option is not provided', () => { + const wrapper = shallow(); + expect(wrapper.find('.entSearch__indexListItem')).toHaveLength(0); }); - it('calls setSelectedIndex onChange', () => { - const wrapper = shallow(); - const onChangeHandler = wrapper.find(EuiSelectable).prop('onChange')!; - onChangeHandler( - DEFAULT_VALUES.indicesFormatted as SearchIndexSelectableOption[], - {} as MouseEvent - ); - expect(MOCK_ACTIONS.setSelectedIndex).toHaveBeenCalledWith('search-test-index-2'); + it('renders if there is an option provided', () => { + const wrapper = shallow(); + expect(wrapper.find('.entSearch__indexListItem')).toHaveLength(1); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.tsx index 8f7ad85a39dfa..848e0d230c90a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/search_index_selectable.tsx @@ -5,32 +5,36 @@ * 2.0. */ -import React, { useEffect } from 'react'; - -import { useValues, useActions } from 'kea'; +import React from 'react'; import { HealthStatus } from '@elastic/elasticsearch/lib/api/types'; import { - EuiSelectable, - EuiPanel, - EuiFormRow, - EuiHighlight, - EuiIcon, - EuiSpacer, EuiTextColor, + EuiFlexGroup, + EuiFlexItem, + EuiHealth, + EuiToolTip, + EuiBadge, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { EngineCreationLogic } from './engine_creation_logic'; - -import './search_index_selectable.scss'; +import './engine_creation.scss'; export interface SearchIndexSelectableOption { label: string; health?: HealthStatus; status?: string; + alias: boolean; + badge: { + color: string; + icon?: string; + label: string; + toolTipTitle: string; + toolTipContent: string; + }; + disabled: boolean; total: { docs: { count: number; @@ -52,116 +56,67 @@ const healthColorsMap = { YELLOW: 'warning', }; -const renderIndexOption = (option: SearchIndexSelectableOption, searchValue: string) => { - return ( - <> - {option.label ?? ''} - - - - - -  {option.health ?? '-'} - - - - {i18n.translate( - 'xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.status', - { - defaultMessage: 'Status:', - } - )} - -  {option.status ?? '-'} - - - - {i18n.translate( - 'xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.docCount', - { - defaultMessage: 'Docs count:', - } - )} - -  {option.total?.docs?.count ?? '-'} - - - - {i18n.translate( - 'xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.storage', - { - defaultMessage: 'Storage size:', - } - )} - -  {option.total?.store?.size_in_bytes ?? '-'} - - - - - ); -}; - -export const SearchIndexSelectable: React.FC = () => { - const { indicesFormatted, isLoadingIndices } = useValues(EngineCreationLogic); - const { loadIndices, setSelectedIndex } = useActions(EngineCreationLogic); - - const onChange = (options: SearchIndexSelectableOption[]) => { - const selected = options.find((option) => option.checked === 'on'); - setSelectedIndex(selected?.label ?? ''); - }; - - useEffect(() => { - loadIndices(); - }, []); +interface IndexStatusDetailsProps { + option?: SearchIndexSelectableOption; +} - return ( - - - - {(list, search) => ( - <> - {search} - {list} - - )} - - - +export const IndexStatusDetails: React.FC = ({ option }) => { + return !option ? ( + <> + ) : ( + + + + {option.health ?? '-'} + + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.elasticsearchIndex.status', + { defaultMessage: 'Status' } + )} + + : {option.status ?? '-'} + + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.elasticsearchIndex.docCount', + { defaultMessage: 'Docs count' } + )} + + : {option.total?.docs?.count ?? '-'} + + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.configureForm.elasticsearchIndex.storage', + { defaultMessage: 'Storage size' } + )} + + : + +  {option.total?.store?.size_in_bytes ?? '-'} + + + + + + +

{option.badge.label}

+
+
+
+
); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.test.tsx new file mode 100644 index 0000000000000..0a289a7425171 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.test.tsx @@ -0,0 +1,82 @@ +/* + * Copyright 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 '../../../__mocks__/react_router'; +import '../../../__mocks__/shallow_useeffect.mock'; +import { setMockActions, setMockValues } from '../../../__mocks__/kea_logic'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { SelectEngineType } from './select_engine_type'; + +describe('SelectEngineType', () => { + const DEFAULT_VALUES = { + engineType: 'appSearch', + }; + + const MOCK_ACTIONS = { + setEngineType: jest.fn(), + }; + + beforeEach(() => { + jest.clearAllMocks(); + setMockValues(DEFAULT_VALUES); + setMockActions(MOCK_ACTIONS); + }); + + it('renders', () => { + const wrapper = shallow(); + expect(wrapper.find('[data-test-subj="AppSearchEngineSelectable"]')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="ElasticsearchEngineSelectable"]')).toHaveLength(1); + }); + + it('create App Search managed engine is the default', () => { + const wrapper = shallow(); + const appSearchCardSelectable = wrapper + .find('[data-test-subj="AppSearchEngineSelectable"]') + .prop('selectable') as any; + const elasticsearchCardSelectable = wrapper + .find('[data-test-subj="ElasticsearchEngineSelectable"]') + .prop('selectable') as any; + + expect(appSearchCardSelectable.isSelected).toBeTruthy(); + expect(elasticsearchCardSelectable.isSelected).toBeFalsy(); + }); + + it('create Elasticsearch-index based engine is selected if chosen', () => { + setMockValues({ + ...DEFAULT_VALUES, + engineType: 'elasticsearch', + }); + + const wrapper = shallow(); + const appSearchCardSelectable = wrapper + .find('[data-test-subj="AppSearchEngineSelectable"]') + .prop('selectable') as any; + const elasticsearchCardSelectable = wrapper + .find('[data-test-subj="ElasticsearchEngineSelectable"]') + .prop('selectable') as any; + + expect(appSearchCardSelectable.isSelected).toBeFalsy(); + expect(elasticsearchCardSelectable.isSelected).toBeTruthy(); + }); + + it('clicking on Elasticsearch-index based engine sets the engineType', () => { + const wrapper = shallow(); + const elasticsearchCardSelectable = wrapper + .find('[data-test-subj="ElasticsearchEngineSelectable"]') + .prop('selectable') as any; + + // Like .simulate('click'), but get the function from the selectable + // property and then call it directly + elasticsearchCardSelectable.onClick(); + + expect(MOCK_ACTIONS.setEngineType).toHaveBeenCalledTimes(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.tsx new file mode 100644 index 0000000000000..3f6b96f346068 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/select_engine_type.tsx @@ -0,0 +1,196 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiCard, + EuiFlexGroup, + EuiFlexItem, + EuiLink, + EuiPanel, + EuiSpacer, + EuiStepsHorizontal, + EuiText, + EuiTextAlign, + EuiTitle, +} from '@elastic/eui'; + +import { i18n } from '@kbn/i18n'; + +import { EngineCreationLogic, EngineCreationSteps } from './engine_creation_logic'; + +export const SelectEngineType: React.FC = () => { + const { engineType } = useValues(EngineCreationLogic); + const { setEngineType, setCreationStep } = useActions(EngineCreationLogic); + + return ( +
+ {}, + status: 'current', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.searchEngineType.label', + { + defaultMessage: 'Search engine type', + } + ), + }, + { + onClick: () => setCreationStep(EngineCreationSteps.ConfigureStep), + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.configuration.label', + { + defaultMessage: 'Configuration', + } + ), + }, + { + onClick: () => {}, + status: 'disabled', + title: i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.steps.review.label', + { + defaultMessage: 'Review', + } + ), + }, + ]} + /> + + + + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.selectEngineTypeForm.title', + { + defaultMessage: 'Select a search engine type', + } + )} +

+
+
+ + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.selectEngineTypeForm.description', + { + defaultMessage: ` + You can now create search engines that use an existing + Elasticsearch index to combine the search management tools of App + Search with the flexibility of Elasticsearch indices. + `, + } + )} + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.selectEngineTypeForm.description.link', + { + defaultMessage: 'Learn more', + } + )} + + + + + + + + + setEngineType('appSearch'), + }} + data-test-subj="AppSearchEngineSelectable" + hasBorder + /> + + + setEngineType('elasticsearch'), + }} + data-test-subj="ElasticsearchEngineSelectable" + hasBorder + /> + + + + + + + + { + setCreationStep(EngineCreationSteps.ConfigureStep); + }} + > + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineCreation.nextStep.buttonLabel', + { + defaultMessage: 'Continue', + } + )} + + + +
+
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/utils.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/utils.ts index bdedd88169a28..f823f5f54d652 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/utils.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_creation/utils.ts @@ -7,7 +7,9 @@ import { generatePath } from 'react-router-dom'; -import { ElasticsearchIndex } from '../../../../../common/types'; +import dedent from 'dedent'; + +import { ElasticsearchIndexWithPrivileges } from '../../../../../common/types'; import { ENGINE_CRAWLER_PATH, ENGINE_PATH } from '../../routes'; import { SearchIndexSelectableOption } from './search_index_selectable'; @@ -32,14 +34,68 @@ export const getRedirectToAfterEngineCreation = ({ }; export const formatIndicesToSelectable = ( - indices: ElasticsearchIndex[], + indices: ElasticsearchIndexWithPrivileges[], selectedIndexName: string ): SearchIndexSelectableOption[] => { - return indices.map((index) => ({ - ...(selectedIndexName === index.name ? { checked: 'on' } : {}), - label: index.name, - health: index.health, - status: index.status, - total: index.total, - })); + return indices + .filter(({ alias, privileges }) => { + if (alias) { + return privileges.manage; + } else { + return privileges.read && privileges.manage; + } + }) + .map((index) => { + let icon; + let color; + let toolTipTitle; + let toolTipContent; + + if (index.name.startsWith('search-')) { + color = 'success'; + + if (index.alias) { + toolTipTitle = 'Alias is compatible'; + toolTipContent = 'You can use this alias.'; + } else { + toolTipTitle = 'Index name is compatible'; + toolTipContent = dedent(` + You can directly use this index. You can also optionally create an + alias to use as the source of the engine instead. + `); + } + } else { + if (index.alias) { + icon = 'alert'; + color = 'danger'; + toolTipTitle = 'Alias name is incompatible'; + toolTipContent = 'You\'ll have to create a new alias prefixed with "search-".'; + } else { + icon = 'iInCircle'; + color = 'warning'; + toolTipTitle = 'Index name is incompatible'; + toolTipContent = dedent(` + Enterprise Search will automatically create an alias to use as the + source of the search engine rather than use this index directly. + `); + } + } + + return { + ...(selectedIndexName === index.name ? { checked: 'on' } : {}), + alias: index.alias, + badge: { + color, + toolTipTitle, + toolTipContent, + label: index.alias ? 'Alias' : 'Index', + ...(icon ? { icon } : {}), + }, + disabled: index.alias && !index.name.startsWith('search-'), + label: index.name, + health: index.health, + status: index.status, + total: index.total, + }; + }); }; diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.test.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.test.ts index 41f15530475f4..3eae802e2f49e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.test.ts @@ -17,6 +17,9 @@ describe('fetchIndices lib function', () => { get: jest.fn(), stats: jest.fn(), }, + security: { + hasPrivileges: jest.fn(), + }, }, asInternalUser: {}, }; @@ -47,6 +50,16 @@ describe('fetchIndices lib function', () => { }, }; + mockClient.asCurrentUser.security.hasPrivileges.mockImplementation(() => ({ + index: { + 'index-without-prefix': { read: true, manage: true }, + 'search-aliased': { read: true, manage: true }, + 'search-double-aliased': { read: true, manage: true }, + 'search-regular-index': { read: true, manage: true }, + 'second-index': { read: true, manage: true }, + }, + })); + beforeEach(() => { jest.clearAllMocks(); }); @@ -65,6 +78,8 @@ describe('fetchIndices lib function', () => { health: 'green', name: 'search-regular-index', status: 'open', + alias: false, + privileges: { read: true, manage: true }, total: { docs: { count: 100, @@ -89,6 +104,15 @@ describe('fetchIndices lib function', () => { index: 'search-*', metric: ['docs', 'store'], }); + + expect(mockClient.asCurrentUser.security.hasPrivileges).toHaveBeenCalledWith({ + index: [ + { + names: ['search-regular-index', 'hidden'], + privileges: ['read', 'manage'], + }, + ], + }); }); it('should return hidden indices without aliases if specified', async () => { @@ -96,12 +120,14 @@ describe('fetchIndices lib function', () => { mockClient.asCurrentUser.indices.stats.mockImplementation(() => regularIndexStatsResponse); await expect( - fetchIndices(mockClient as unknown as IScopedClusterClient, 'search-*', true, /search-.*/) + fetchIndices(mockClient as unknown as IScopedClusterClient, 'search-*', true) ).resolves.toEqual([ { health: 'green', name: 'search-regular-index', status: 'open', + alias: false, + privileges: { read: true, manage: true }, total: { docs: { count: 100, @@ -128,7 +154,7 @@ describe('fetchIndices lib function', () => { }); }); - it('should return index with aliases', async () => { + it('should return index with unique aliases', async () => { const aliasedIndexResponse = { 'index-without-prefix': { ...regularIndexResponse['search-regular-index'], @@ -137,22 +163,48 @@ describe('fetchIndices lib function', () => { 'search-double-aliased': {}, }, }, + 'second-index': { + ...regularIndexResponse['search-regular-index'], + aliases: { + 'search-aliased': {}, + }, + }, }; const aliasedStatsResponse = { indices: { 'index-without-prefix': { ...regularIndexStatsResponse.indices['search-regular-index'] }, + 'second-index': { ...regularIndexStatsResponse.indices['search-regular-index'] }, }, }; mockClient.asCurrentUser.indices.get.mockImplementationOnce(() => aliasedIndexResponse); mockClient.asCurrentUser.indices.stats.mockImplementationOnce(() => aliasedStatsResponse); await expect( - fetchIndices(mockClient as unknown as IScopedClusterClient, 'search-*', false, /^search-*/) + fetchIndices(mockClient as unknown as IScopedClusterClient, 'search-*', false) ).resolves.toEqual([ + { + health: 'green', + name: 'index-without-prefix', + status: 'open', + alias: false, + privileges: { read: true, manage: true }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '105.47kb', + }, + }, + uuid: '83a81e7e-5955-4255-b008-5d6961203f57', + }, { health: 'green', name: 'search-aliased', status: 'open', + alias: true, + privileges: { read: true, manage: true }, total: { docs: { count: 100, @@ -168,6 +220,25 @@ describe('fetchIndices lib function', () => { health: 'green', name: 'search-double-aliased', status: 'open', + alias: true, + privileges: { read: true, manage: true }, + total: { + docs: { + count: 100, + deleted: 0, + }, + store: { + size_in_bytes: '105.47kb', + }, + }, + uuid: '83a81e7e-5955-4255-b008-5d6961203f57', + }, + { + health: 'green', + name: 'second-index', + status: 'open', + alias: false, + privileges: { read: true, manage: true }, total: { docs: { count: 100, @@ -200,6 +271,8 @@ describe('fetchIndices lib function', () => { health: undefined, name: 'search-regular-index', status: undefined, + alias: false, + privileges: { read: true, manage: true }, total: { docs: { count: 0, diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.ts b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.ts index a563c7c0838b9..cbec20e42b66e 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/fetch_indices.ts @@ -13,7 +13,7 @@ import { import { ByteSizeValue } from '@kbn/config-schema'; import { IScopedClusterClient } from '@kbn/core/server'; -import { ElasticsearchIndex } from '../../../common/types'; +import { ElasticsearchIndexWithPrivileges } from '../../../common/types'; export const mapIndexStats = ( indexData: IndicesIndexState, @@ -47,9 +47,8 @@ export const mapIndexStats = ( export const fetchIndices = async ( client: IScopedClusterClient, indexPattern: string, - returnHiddenIndices: boolean, - indexRegExp?: RegExp -): Promise => { + returnHiddenIndices: boolean +): Promise => { // This call retrieves alias and settings information about indices const expandWildcards: ExpandWildcard[] = returnHiddenIndices ? ['hidden', 'all'] : ['open']; const totalIndices = await client.asCurrentUser.indices.get({ @@ -62,6 +61,14 @@ export const fetchIndices = async ( index: indexPattern, }); + const indexAndAliasNames = Object.keys(totalIndices).reduce((accum, indexName) => { + accum.push(indexName); + const aliases = Object.keys(totalIndices[indexName].aliases!); + + aliases.forEach((alias) => accum.push(alias)); + return accum; + }, [] as string[]); + const indicesNames = returnHiddenIndices ? Object.keys(totalIndices) : Object.keys(totalIndices).filter( @@ -76,24 +83,47 @@ export const fetchIndices = async ( index: indexPattern, metric: ['docs', 'store'], }); - const resultIndices = indicesNames + + // TODO: make multiple batched requests if indicesNames.length > SOMETHING + const { index: indexPrivileges } = await client.asCurrentUser.security.hasPrivileges({ + index: [ + { + names: indexAndAliasNames, + privileges: ['read', 'manage'], + }, + ], + }); + + return indicesNames .map((indexName: string) => { const indexData = totalIndices[indexName]; const indexStats = indicesStats[indexName]; return mapIndexStats(indexData, indexStats, indexName); }) - .flatMap(({ name, aliases, ...engineData }) => { + .flatMap(({ name, aliases, ...indexData }) => { // expand aliases and add to results - const engines = []; - engines.push({ name, ...engineData }); + const indicesAndAliases = [] as ElasticsearchIndexWithPrivileges[]; + indicesAndAliases.push({ + name, + alias: false, + privileges: { read: false, manage: false, ...indexPrivileges[name] }, + ...indexData, + }); aliases.forEach((alias) => { - engines.push({ name: alias, ...engineData }); + indicesAndAliases.push({ + name: alias, + alias: true, + privileges: { read: false, manage: false, ...indexPrivileges[name] }, + ...indexData, + }); }); - return engines; - }); - - // The previous step could have added indices that don't match the index pattern, so filter those out again - // We wildcard RegExp the pattern unless user provides a more specific regex - return indexRegExp ? resultIndices.filter(({ name }) => name.match(indexRegExp)) : resultIndices; + return indicesAndAliases; + }) + .filter( + ({ name }, index, array) => + // make list of aliases unique since we add an alias per index above + // and aliases can point to multiple indices + array.findIndex((engineData) => engineData.name === name) === index + ); }; diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts index 99314d6da8112..57e5122abb6fe 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/engines.ts @@ -64,6 +64,7 @@ export function registerEnginesRoutes({ search_index: schema.object({ type: schema.string(), index_name: schema.string(), + alias_name: schema.maybe(schema.string()), }), }), }, diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts index ac8904d8d224f..6cca98815c456 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts @@ -25,7 +25,7 @@ export function registerIndexRoutes({ router }: RouteDependencies) { async (context, _, response) => { const { client } = (await context.core).elasticsearch; try { - const indices = await fetchIndices(client, 'search-*', false, /^search-.*/); + const indices = await fetchIndices(client, '*', false); return response.ok({ body: indices, headers: { 'content-type': 'application/json' }, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 2c1cca62fea79..30ad26e5de0d9 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -11005,13 +11005,7 @@ "xpack.enterpriseSearch.appSearch.documentCreation.buttons.jsonTitle": "Coller ou charger JSON", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.button": "Connecter pour indexer", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.description": "Vous pouvez désormais vous connecter directement à un index Elasticsearch existant pour rendre ses données interrogeables et ajustables par le biais d'interfaces utilisateur Enterprise Search. {learnMoreLink}", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.docCount": "Nombre de documents :", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.indexSelectorAriaLabel": "Sélectionner un index Elasticsearch", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.link": "En savoir plus sur l'utilisation d'un index existant", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.selectable.empty": "Aucun index Elasticsearch disponible", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.selectable.loading": "Chargement des index Elasticsearch", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.status": "Statut :", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.storage": "Taille du stockage :", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.title": "Connecter un index Elasticsearch", "xpack.enterpriseSearch.appSearch.documentCreation.errorsTitle": "Un problème est survenu. Veuillez corriger les erreurs et réessayer.", "xpack.enterpriseSearch.appSearch.documentCreation.helperText": "Il existe trois façons d'envoyer des documents à votre moteur pour l'indexation. Vous pouvez coller ou télécharger un fichier JSON, envoyer un message POST au point de terminaison de l'API des documents, ou utiliser le robot d'indexation d'Elastic pour indexer automatiquement les documents à partir d'une URL.", @@ -11452,8 +11446,6 @@ "xpack.enterpriseSearch.appSearch.engineCreation.form.engineName.sanitizedNameHelpText": "Votre moteur sera nommé", "xpack.enterpriseSearch.appSearch.engineCreation.form.submitButton.buttonLabel": "Créer un moteur", "xpack.enterpriseSearch.appSearch.engineCreation.form.title": "Nommer votre moteur", - "xpack.enterpriseSearch.appSearch.engineCreation.searchIndexSelectable.helpText": "Seuls les indices précédés de \"rechercher-\" peuvent être sélectionnés", - "xpack.enterpriseSearch.appSearch.engineCreation.searchIndexSelectable.label": "Sélectionner un index Elasticsearch à utiliser", "xpack.enterpriseSearch.appSearch.engineCreation.successMessage": "Le moteur \"{name}\" a été créé", "xpack.enterpriseSearch.appSearch.engineCreation.supportedLanguages.chineseDropDownOptionLabel": "Chinois", "xpack.enterpriseSearch.appSearch.engineCreation.supportedLanguages.danishDropDownOptionLabel": "Danois", @@ -11802,13 +11794,6 @@ "xpack.enterpriseSearch.elasticsearch.productName": "Elasticsearch", "xpack.enterpriseSearch.emailLabel": "E-mail", "xpack.enterpriseSearch.emptyState.description": "Les données que vous ajoutez dans Enterprise Search sont appelées \"index de recherche\", et vous pouvez effectuer des recherches à l'intérieur à la fois dans App Search et dans Workplace Search. Maintenant, vous pouvez utiliser vos connecteurs dans App Search et vos robots d'indexation dans Workplace Search.", - "xpack.enterpriseSearch.engineCreation.appSearchManagedDescription": "Créez un moteur et ajoutez des documents via un robot d'indexation, une API ou un fichier JSON.", - "xpack.enterpriseSearch.engineCreation.appSearchManagedLabel": "Je veux qu'App Search ingère et gère mes données", - "xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLabel": "Créez un moteur basé sur les données gérées dans un index Elasticsearch.", - "xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLink": "En savoir plus sur l'utilisation d'un index Elasticsearch existant", - "xpack.enterpriseSearch.engineCreation.elasticsearchManagedLabel": "Je veux gérer mes données avec Elasticsearch", - "xpack.enterpriseSearch.engineCreation.elasticsearchTechPreviewBadge": "Version d'évaluation technique", - "xpack.enterpriseSearch.engineCreation.engineTypeLabel": "Sélectionnez la manière dont vous souhaitez gérer l'index pour ce moteur", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.description": "Effectuez des recherches sur tout, partout. Offrez à vos équipes débordées une expérience de recherche innovante et puissante facilement mise en œuvre. Intégrez rapidement une fonction de recherche préréglée à votre site web, à votre application ou à votre lieu de travail. Effectuez des recherches simples sur tout.", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.notConfigured": "Enterprise Search n'est pas encore configuré dans votre instance Kibana.", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.videoAlt": "Premiers pas avec Enterprise Search", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f5114db0917ba..f9f15aed0c938 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10996,13 +10996,7 @@ "xpack.enterpriseSearch.appSearch.documentCreation.buttons.jsonTitle": "JSONを貼り付けまたはアップロード", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.button": "インデックスに接続", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.description": "エンタープライズ サーチUIを使用して、既存のElasticsearchインデックスに直接接続し、データを検索可能かつチューニング可能にできるようになりました。{learnMoreLink}", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.docCount": "ドキュメント数:", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.indexSelectorAriaLabel": "Elasticsearchインデックスを選択", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.link": "既存のインデックスの使用の詳細", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.selectable.empty": "Elasticsearchインデックスがありません", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.selectable.loading": "Elasticsearchインデックスを読み込んでいます", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.status": "ステータス:", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.storage": "ストレージサイズ:", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.title": "Elasticsearchインデックスを関連付け", "xpack.enterpriseSearch.appSearch.documentCreation.errorsTitle": "何か問題が発生しましたエラーを解決して、再試行してください。", "xpack.enterpriseSearch.appSearch.documentCreation.helperText": "ドキュメントをインデックスのためにエンジンに送信するには、3つの方法があります。JSONファイルの貼り付けやアップロード、ドキュメントAPIエンドポイントへのPOST、Elastic Webクローラーの使用によって、URLから自動的にドキュメントにインデックスを作成できます。", @@ -11443,8 +11437,6 @@ "xpack.enterpriseSearch.appSearch.engineCreation.form.engineName.sanitizedNameHelpText": "エンジン名が変更されます", "xpack.enterpriseSearch.appSearch.engineCreation.form.submitButton.buttonLabel": "エンジンを作成", "xpack.enterpriseSearch.appSearch.engineCreation.form.title": "エンジン名を指定", - "xpack.enterpriseSearch.appSearch.engineCreation.searchIndexSelectable.helpText": "エイリアス'search-'のインデックスのみを選択できます", - "xpack.enterpriseSearch.appSearch.engineCreation.searchIndexSelectable.label": "使用するElasticsearchインデックスを選択", "xpack.enterpriseSearch.appSearch.engineCreation.successMessage": "エンジン'{name}'が作成されました", "xpack.enterpriseSearch.appSearch.engineCreation.supportedLanguages.chineseDropDownOptionLabel": "中国語", "xpack.enterpriseSearch.appSearch.engineCreation.supportedLanguages.danishDropDownOptionLabel": "デンマーク語", @@ -11793,13 +11785,6 @@ "xpack.enterpriseSearch.elasticsearch.productName": "Elasticsearch", "xpack.enterpriseSearch.emailLabel": "メール", "xpack.enterpriseSearch.emptyState.description": "エンタープライズ サーチで追加したデータは検索インデックスと呼ばれ、App SearchとWorkplace Searchの両方で検索可能です。App SearchのコネクターとWorkplace SearchのWebクローラーを使用できます。", - "xpack.enterpriseSearch.engineCreation.appSearchManagedDescription": "エンジンを追加し、Webクローラー、API、JSONファイル経由でドキュメントを追加します。", - "xpack.enterpriseSearch.engineCreation.appSearchManagedLabel": "App Searchでデータを取り込み、管理する", - "xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLabel": "Elasticsearchインデックスで管理されたデータに基づいてエンジンを作成します。", - "xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLink": "既存のElasticsearchインデックスの使用の詳細", - "xpack.enterpriseSearch.engineCreation.elasticsearchManagedLabel": "Elasticsearchでデータを管理する", - "xpack.enterpriseSearch.engineCreation.elasticsearchTechPreviewBadge": "テクニカルプレビュー", - "xpack.enterpriseSearch.engineCreation.engineTypeLabel": "このエンジンのインデックスを管理する方法を選択", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.description": "場所を問わず、何でも検索。組織を支える多忙なチームのために、パワフルでモダンな検索エクスペリエンスを簡単に導入できます。Webサイトやアプリ、ワークプレイスに事前調整済みの検索をすばやく追加しましょう。何でもシンプルに検索できます。", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.notConfigured": "エンタープライズサーチはまだKibanaインスタンスで構成されていません。", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.videoAlt": "エンタープライズ サーチの基本操作", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 64b5b6a82efbd..e5981b5a62bc5 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -11012,13 +11012,7 @@ "xpack.enterpriseSearch.appSearch.documentCreation.buttons.jsonTitle": "粘贴或上传 JSON", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.button": "连接到索引", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.description": "现在您可以直接连接到现有 Elasticsearch 索引,以便可以通过 Enterprise Search Ul 搜索和调整其数据。{learnMoreLink}", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.docCount": "文档计数:", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.indexSelectorAriaLabel": "选择 Elasticsearch 索引", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.link": "详细了解如何使用现有索引", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.selectable.empty": "无 Elasticsearch 索引可用", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.selectable.loading": "正在加载 Elasticsearch 索引", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.status": "状态:", - "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.storage": "存储大小:", "xpack.enterpriseSearch.appSearch.documentCreation.elasticsearchIndex.title": "连接 Elasticsearch 索引", "xpack.enterpriseSearch.appSearch.documentCreation.errorsTitle": "出问题了。请解决这些错误,然后重试。", "xpack.enterpriseSearch.appSearch.documentCreation.helperText": "有三种方法将文档发送到引擎进行索引。您可以粘贴或上传 JSON 文件、POST 到文档 API 终端,或者使用 Elastic 网络爬虫来自动索引 URL 中的文档。", @@ -11459,8 +11453,6 @@ "xpack.enterpriseSearch.appSearch.engineCreation.form.engineName.sanitizedNameHelpText": "您的引擎将命名为", "xpack.enterpriseSearch.appSearch.engineCreation.form.submitButton.buttonLabel": "创建引擎", "xpack.enterpriseSearch.appSearch.engineCreation.form.title": "命名您的引擎", - "xpack.enterpriseSearch.appSearch.engineCreation.searchIndexSelectable.helpText": "只可以选择别名含“search-”的索引", - "xpack.enterpriseSearch.appSearch.engineCreation.searchIndexSelectable.label": "选择要使用的 Elasticsearch 索引", "xpack.enterpriseSearch.appSearch.engineCreation.successMessage": "引擎“{name}”已创建", "xpack.enterpriseSearch.appSearch.engineCreation.supportedLanguages.chineseDropDownOptionLabel": "中文", "xpack.enterpriseSearch.appSearch.engineCreation.supportedLanguages.danishDropDownOptionLabel": "丹麦语", @@ -11809,13 +11801,6 @@ "xpack.enterpriseSearch.elasticsearch.productName": "Elasticsearch", "xpack.enterpriseSearch.emailLabel": "电子邮件", "xpack.enterpriseSearch.emptyState.description": "您在 Enterprise Search 中添加的数据称为搜索索引,您可在 App Search 和 Workplace Search 中搜索这些数据。现在,您可以在 App Search 中使用连接器,在 Workplace Search 中使用网络爬虫。", - "xpack.enterpriseSearch.engineCreation.appSearchManagedDescription": "创建引擎并通过网络爬虫、API 或 JSON 文件添加文档。", - "xpack.enterpriseSearch.engineCreation.appSearchManagedLabel": "我需要 App Search 来采集和管理我的数据", - "xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLabel": "基于 Elasticsearch 索引中管理的数据创建引擎。", - "xpack.enterpriseSearch.engineCreation.elasticsearchIndexedLink": "详细了解如何使用现有 Elasticsearch 索引", - "xpack.enterpriseSearch.engineCreation.elasticsearchManagedLabel": "我希望使用 Elasticsearch 来管理我的数据", - "xpack.enterpriseSearch.engineCreation.elasticsearchTechPreviewBadge": "技术预览", - "xpack.enterpriseSearch.engineCreation.engineTypeLabel": "选择您希望如何管理此引擎的索引", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.description": "随时随地进行全面搜索。为工作繁忙的团队轻松实现强大的现代搜索体验。将预先调整的搜索功能快速添加到您的网站、应用或工作区。全面搜索就是这么简单。", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.notConfigured": "企业搜索尚未在您的 Kibana 实例中配置。", "xpack.enterpriseSearch.enterpriseSearch.setupGuide.videoAlt": "企业搜索入门", From 8483cd18c3b9c73270a3560711e52773781e79d3 Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Fri, 22 Jul 2022 16:06:37 +0200 Subject: [PATCH 02/78] Properly sort the results returned by the user profiles bulk get API. (#136923) --- .../user_profile/user_profile_service.test.ts | 24 +++++----- .../user_profile/user_profile_service.ts | 27 ++++++++--- .../tests/user_profiles/bulk_get.ts | 47 ++++++++++--------- .../tests/user_profiles/suggest.ts | 35 +++++++------- 4 files changed, 73 insertions(+), 60 deletions(-) diff --git a/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts b/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts index 70a0eeb75112a..cde087b8f9dd4 100644 --- a/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts +++ b/x-pack/plugins/security/server/user_profile/user_profile_service.test.ts @@ -348,29 +348,29 @@ describe('UserProfileService', () => { }); describe('#bulkGet', () => { - it('properly parses returned profiles', async () => { + it('properly parses and sorts returned profiles', async () => { mockStartParams.clusterClient.asInternalUser.transport.request.mockResolvedValue({ profiles: [ userProfileMock.createWithSecurity({ - uid: 'UID-1', + uid: 'UID-2', user: { - username: 'user-1', - display_name: 'display-name-1', - full_name: 'full-name-1', + username: 'user-2', + display_name: 'display-name-2', + full_name: 'full-name-2', realm_name: 'some-realm', realm_domain: 'some-domain', - roles: ['role-1'], + roles: ['role-2'], }, }), userProfileMock.createWithSecurity({ - uid: 'UID-2', + uid: 'UID-1', user: { - username: 'user-2', - display_name: 'display-name-2', - full_name: 'full-name-2', + username: 'user-1', + display_name: 'display-name-1', + full_name: 'full-name-1', realm_name: 'some-realm', realm_domain: 'some-domain', - roles: ['role-2'], + roles: ['role-1'], }, }), ], @@ -417,9 +417,9 @@ describe('UserProfileService', () => { it('filters out not requested profiles', async () => { mockStartParams.clusterClient.asInternalUser.transport.request.mockResolvedValue({ profiles: [ - userProfileMock.createWithSecurity({ uid: 'UID-1' }), userProfileMock.createWithSecurity({ uid: 'UID-2' }), userProfileMock.createWithSecurity({ uid: 'UID-NOT-REQUESTED' }), + userProfileMock.createWithSecurity({ uid: 'UID-1' }), ], }); diff --git a/x-pack/plugins/security/server/user_profile/user_profile_service.ts b/x-pack/plugins/security/server/user_profile/user_profile_service.ts index b11406987cd52..c9a2f8faa2b57 100644 --- a/x-pack/plugins/security/server/user_profile/user_profile_service.ts +++ b/x-pack/plugins/security/server/user_profile/user_profile_service.ts @@ -308,14 +308,27 @@ export class UserProfileService { }, }); - return ( - body.profiles - // "uids" is just a hint that allows to put user profiles with the requested uids on the top of the - // returned list, but if Elasticsearch cannot find user profiles for all requested uids it might include - // other "matched" user profiles as well. - .filter((rawProfile) => uids.has(rawProfile.uid)) - .map((rawProfile) => parseUserProfile(rawProfile)) + // Using `_suggest` API to simulate `_bulk_get` API has two important shortcomings: + // 1. "uids" parameter is just a hint that asks Elasticsearch to put user profiles with the requested uids on the + // top of the returned list, but if Elasticsearch cannot find user profiles for all requested uids it might + // include other "matched" user profiles as well. We should filter those non-requested profiles out. + // 2. The `_suggest` API is supposed to sort results by relevance i.e. first by the search score (if `name` + // parameter is specified which isn't the case here) and then by the activation time. The `_bulk_get` API, on the + // contrary, should always return results in the order the consumer specified UIDs in (in our case, the insertion + // order for the `Set` we use as the UIDs parameter). That's why we're manually sorting profiles here. + const rawUserProfiles = new Map( + body.profiles.map((rawUserProfile) => [rawUserProfile.uid, rawUserProfile]) ); + + const parsedUserProfiles = []; + for (const uid of uids) { + const rawUserProfile = rawUserProfiles.get(uid); + if (rawUserProfile) { + parsedUserProfiles.push(parseUserProfile(rawUserProfile)); + } + } + + return parsedUserProfiles; } catch (error) { this.logger.error(`Failed to bulk get user profiles: ${getDetailedErrorMessage(error)}`); throw error; diff --git a/x-pack/test/security_api_integration/tests/user_profiles/bulk_get.ts b/x-pack/test/security_api_integration/tests/user_profiles/bulk_get.ts index 8bdb13be2c2a5..8955a06261848 100644 --- a/x-pack/test/security_api_integration/tests/user_profiles/bulk_get.ts +++ b/x-pack/test/security_api_integration/tests/user_profiles/bulk_get.ts @@ -14,8 +14,7 @@ export default function ({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); const security = getService('security'); - // Failing: See https://github.com/elastic/kibana/issues/136827 - describe.skip('Getting user profiles in bulk', () => { + describe('Getting user profiles in bulk', () => { const usersSessions = new Map(); before(async () => { // 1. Create test users @@ -30,7 +29,9 @@ export default function ({ getService }: FtrProviderContext) { ) ); - // 2. Activate user profiles + // 2. Activate user profiles (activation time affects the order in which Elasticsearch returns results, but the + // `bulk_get` operation should always manually sort the results before returning them to the consumers, and the + // activation order should not matter for these tests). await Promise.all( ['one', 'two', 'three'].map(async (userPrefix) => { const response = await supertestWithoutAuth @@ -75,17 +76,17 @@ export default function ({ getService }: FtrProviderContext) { Object { "data": Object {}, "user": Object { - "email": "two@elastic.co", - "full_name": "TWO", - "username": "user_two", + "email": "one@elastic.co", + "full_name": "ONE", + "username": "user_one", }, }, Object { "data": Object {}, "user": Object { - "email": "one@elastic.co", - "full_name": "ONE", - "username": "user_one", + "email": "two@elastic.co", + "full_name": "TWO", + "username": "user_two", }, }, ] @@ -119,17 +120,17 @@ export default function ({ getService }: FtrProviderContext) { Object { "data": Object {}, "user": Object { - "email": "two@elastic.co", - "full_name": "TWO", - "username": "user_two", + "email": "one@elastic.co", + "full_name": "ONE", + "username": "user_one", }, }, Object { "data": Object {}, "user": Object { - "email": "one@elastic.co", - "full_name": "ONE", - "username": "user_one", + "email": "two@elastic.co", + "full_name": "TWO", + "username": "user_two", }, }, ] @@ -151,22 +152,22 @@ export default function ({ getService }: FtrProviderContext) { Array [ Object { "data": Object { - "some": "data-two", + "some": "data-one", }, "user": Object { - "email": "two@elastic.co", - "full_name": "TWO", - "username": "user_two", + "email": "one@elastic.co", + "full_name": "ONE", + "username": "user_one", }, }, Object { "data": Object { - "some": "data-one", + "some": "data-two", }, "user": Object { - "email": "one@elastic.co", - "full_name": "ONE", - "username": "user_one", + "email": "two@elastic.co", + "full_name": "TWO", + "username": "user_two", }, }, ] diff --git a/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts b/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts index 83b08c7e17811..db3e64244e965 100644 --- a/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts +++ b/x-pack/test/security_api_integration/tests/user_profiles/suggest.ts @@ -74,24 +74,23 @@ export default function ({ getService }: FtrProviderContext) { ) ); - // 3. Activate user profiles - await Promise.all( - ['one', 'two', 'three'].map(async (userPrefix) => { - const response = await supertestWithoutAuth - .post('/internal/security/login') - .set('kbn-xsrf', 'xxx') - .send({ - providerType: 'basic', - providerName: 'basic', - currentURL: '/', - params: { username: `user_${userPrefix}`, password: 'changeme' }, - }) - .expect(200); - usersSessions.set(`user_${userPrefix}`, { - cookie: parseCookie(response.headers['set-cookie'][0])!, - }); - }) - ); + // 3. Activate user profiles (activation time affects the order in which Elasticsearch returns results, that's why + // we should activate profiles in a predefined order to keep tests as stable as possible). + for (const userPrefix of ['one', 'two', 'three']) { + const response = await supertestWithoutAuth + .post('/internal/security/login') + .set('kbn-xsrf', 'xxx') + .send({ + providerType: 'basic', + providerName: 'basic', + currentURL: '/', + params: { username: `user_${userPrefix}`, password: 'changeme' }, + }) + .expect(200); + usersSessions.set(`user_${userPrefix}`, { + cookie: parseCookie(response.headers['set-cookie'][0])!, + }); + } }); after(async () => { From debc23bae3ee1ba32e3476a04f026393f84aa809 Mon Sep 17 00:00:00 2001 From: Ying Mao Date: Fri, 22 Jul 2022 10:10:04 -0400 Subject: [PATCH 03/78] [Rule Registry] Additional error logging (#136225) * Adding error logs * PR feedback * Fixing types Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../rule_data_client/rule_data_client.test.ts | 46 +++++++++++------ .../rule_data_client/rule_data_client.ts | 33 ++++++++---- .../resource_installer.ts | 51 ++++++++++++------- 3 files changed, 86 insertions(+), 44 deletions(-) diff --git a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts index 6a2841d868fb9..03dd09a0dc8d8 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.test.ts @@ -6,6 +6,8 @@ */ import { left, right } from 'fp-ts/lib/Either'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; import { RuleDataClient, RuleDataClientConstructorOptions, WaitResult } from './rule_data_client'; import { IndexInfo } from '../rule_data_plugin_service/index_info'; import { Dataset, RuleDataWriterInitializationError } from '..'; @@ -15,7 +17,7 @@ import { IndexPatternsFetcher } from '@kbn/data-plugin/server'; import { createNoMatchingIndicesError } from '@kbn/data-views-plugin/server/fetcher/lib/errors'; import { ElasticsearchClient } from '@kbn/core/server'; -const mockLogger = loggingSystemMock.create().get(); +const logger: ReturnType = loggingSystemMock.createLogger(); const scopedClusterClient = elasticsearchServiceMock.createScopedClusterClient().asInternalUser; const mockResourceInstaller = resourceInstallerMock.create(); @@ -52,7 +54,7 @@ function getRuleDataClientOptions({ waitUntilReadyForReading ?? Promise.resolve(right(scopedClusterClient) as WaitResult), waitUntilReadyForWriting: waitUntilReadyForWriting ?? Promise.resolve(right(scopedClusterClient) as WaitResult), - logger: mockLogger, + logger, }; } @@ -71,15 +73,12 @@ describe('RuleDataClient', () => { }); describe('getReader()', () => { - beforeAll(() => { + beforeEach(() => { + jest.resetAllMocks(); getFieldsForWildcardMock.mockResolvedValue(['foo']); IndexPatternsFetcher.prototype.getFieldsForWildcard = getFieldsForWildcardMock; }); - beforeEach(() => { - getFieldsForWildcardMock.mockClear(); - }); - afterAll(() => { getFieldsForWildcardMock.mockRestore(); }); @@ -116,6 +115,10 @@ describe('RuleDataClient', () => { body: query, }) ).rejects.toThrowErrorMatchingInlineSnapshot(`"something went wrong!"`); + + expect(logger.error).toHaveBeenCalledWith( + `Error performing search in RuleDataClient - something went wrong!` + ); }); test('waits until cluster client is ready before getDynamicIndexPattern', async () => { @@ -143,6 +146,10 @@ describe('RuleDataClient', () => { await expect(reader.getDynamicIndexPattern()).rejects.toThrowErrorMatchingInlineSnapshot( `"something went wrong!"` ); + + expect(logger.error).toHaveBeenCalledWith( + `Error fetching index patterns in RuleDataClient - something went wrong!` + ); }); test('correct handles no_matching_indices errors from getFieldsForWildcard', async () => { @@ -155,6 +162,8 @@ describe('RuleDataClient', () => { timeFieldName: '@timestamp', title: '.alerts-observability.apm.alerts*', }); + + expect(logger.error).not.toHaveBeenCalled(); }); test('handles errors getting cluster client', async () => { @@ -193,7 +202,7 @@ describe('RuleDataClient', () => { await expect(() => ruleDataClient.getWriter()).rejects.toThrowErrorMatchingInlineSnapshot( `"Rule registry writing is disabled. Make sure that \\"xpack.ruleRegistry.write.enabled\\" configuration is not set to false and \\"observability.apm\\" is not disabled in \\"xpack.ruleRegistry.write.disabledRegistrationContexts\\" within \\"kibana.yml\\"."` ); - expect(mockLogger.debug).toHaveBeenCalledWith( + expect(logger.debug).toHaveBeenCalledWith( `Writing is disabled, bulk() will not write any data.` ); }); @@ -210,7 +219,7 @@ describe('RuleDataClient', () => { await expect(() => ruleDataClient.getWriter()).rejects.toThrowErrorMatchingInlineSnapshot( `"There has been a catastrophic error trying to install index level resources for the following registration context: observability.apm. This may have been due to a non-additive change to the mappings, removal and type changes are not permitted. Full error: Error: could not get cluster client"` ); - expect(mockLogger.error).toHaveBeenNthCalledWith( + expect(logger.error).toHaveBeenNthCalledWith( 1, new RuleDataWriterInitializationError( 'index', @@ -218,7 +227,7 @@ describe('RuleDataClient', () => { new Error('could not get cluster client') ) ); - expect(mockLogger.error).toHaveBeenNthCalledWith( + expect(logger.error).toHaveBeenNthCalledWith( 2, `The writer for the Rule Data Client for the observability.apm registration context was not initialized properly, bulk() cannot continue, and writing will be disabled.` ); @@ -228,7 +237,7 @@ describe('RuleDataClient', () => { await expect(() => ruleDataClient.getWriter()).rejects.toThrowErrorMatchingInlineSnapshot( `"Rule registry writing is disabled due to an error during Rule Data Client initialization."` ); - expect(mockLogger.debug).toHaveBeenCalledWith( + expect(logger.debug).toHaveBeenCalledWith( `Writing is disabled, bulk() will not write any data.` ); }); @@ -242,7 +251,7 @@ describe('RuleDataClient', () => { await expect(() => ruleDataClient.getWriter()).rejects.toThrowErrorMatchingInlineSnapshot( `"There has been a catastrophic error trying to install namespace level resources for the following registration context: observability.apm. This may have been due to a non-additive change to the mappings, removal and type changes are not permitted. Full error: Error: bad resource installation"` ); - expect(mockLogger.error).toHaveBeenNthCalledWith( + expect(logger.error).toHaveBeenNthCalledWith( 1, new RuleDataWriterInitializationError( 'namespace', @@ -250,7 +259,7 @@ describe('RuleDataClient', () => { new Error('bad resource installation') ) ); - expect(mockLogger.error).toHaveBeenNthCalledWith( + expect(logger.error).toHaveBeenNthCalledWith( 2, `The writer for the Rule Data Client for the observability.apm registration context was not initialized properly, bulk() cannot continue, and writing will be disabled.` ); @@ -260,7 +269,7 @@ describe('RuleDataClient', () => { await expect(() => ruleDataClient.getWriter()).rejects.toThrowErrorMatchingInlineSnapshot( `"Rule registry writing is disabled due to an error during Rule Data Client initialization."` ); - expect(mockLogger.debug).toHaveBeenCalledWith( + expect(logger.debug).toHaveBeenCalledWith( `Writing is disabled, bulk() will not write any data.` ); }); @@ -297,7 +306,7 @@ describe('RuleDataClient', () => { await delay(); expect(await writer.bulk({})).toEqual(undefined); - expect(mockLogger.debug).toHaveBeenCalledWith( + expect(logger.debug).toHaveBeenCalledWith( `Writing is disabled, bulk() will not write any data.` ); }); @@ -317,11 +326,16 @@ describe('RuleDataClient', () => { await expect(() => writer.bulk({})).rejects.toThrowErrorMatchingInlineSnapshot( `"something went wrong!"` ); - expect(mockLogger.error).toHaveBeenNthCalledWith(1, error); + expect(logger.error).toHaveBeenNthCalledWith(1, error); expect(ruleDataClient.isWriteEnabled()).toBe(true); }); test('waits until cluster client is ready before calling bulk', async () => { + scopedClusterClient.bulk.mockResolvedValueOnce( + elasticsearchClientMock.createSuccessTransportRequestPromise( + {} + ) as unknown as estypes.BulkResponse + ); const ruleDataClient = new RuleDataClient( getRuleDataClientOptions({ waitUntilReadyForWriting: new Promise((resolve) => diff --git a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts index cb78e6fb8ac23..7b7fead83d4ea 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.ts @@ -13,6 +13,7 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { Logger } from '@kbn/core/server'; import { IndexPatternsFetcher } from '@kbn/data-plugin/server'; +import { ESSearchRequest, ESSearchResponse } from '@kbn/core/types/elasticsearch'; import { RuleDataWriteDisabledError, RuleDataWriterInitializationError, @@ -20,6 +21,8 @@ import { import { IndexInfo } from '../rule_data_plugin_service/index_info'; import { IResourceInstaller } from '../rule_data_plugin_service/resource_installer'; import { IRuleDataClient, IRuleDataReader, IRuleDataWriter } from './types'; +import { ParsedTechnicalFields } from '../../common/parse_technical_fields'; +import { ParsedExperimentalFields } from '../../common/parse_experimental_fields'; export interface RuleDataClientConstructorOptions { indexInfo: IndexInfo; @@ -103,15 +106,24 @@ export class RuleDataClient implements IRuleDataClient { }; return { - search: async (request) => { - const clusterClient = await waitUntilReady(); - - const body = await clusterClient.search({ - ...request, - index: indexPattern, - }); - - return body as any; + search: async ( + request: TSearchRequest + ): Promise< + ESSearchResponse, TSearchRequest> + > => { + try { + const clusterClient = await waitUntilReady(); + return (await clusterClient.search({ + ...request, + index: indexPattern, + })) as unknown as ESSearchResponse< + Partial, + TSearchRequest + >; + } catch (err) { + this.options.logger.error(`Error performing search in RuleDataClient - ${err.message}`); + throw err; + } }, getDynamicIndexPattern: async () => { @@ -136,6 +148,9 @@ export class RuleDataClient implements IRuleDataClient { title: indexPattern, }; } + this.options.logger.error( + `Error fetching index patterns in RuleDataClient - ${err.message}` + ); throw err; } }, diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts index d10d0efcc580b..2ed80cb02c0d3 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts @@ -95,25 +95,32 @@ export class ResourceInstaller { */ public async installCommonResources(): Promise { await this.installWithTimeout('common resources shared between all indices', async () => { - const { getResourceName } = this.options; - - // We can install them in parallel - await Promise.all([ - this.createOrUpdateLifecyclePolicy({ - name: getResourceName(DEFAULT_ILM_POLICY_ID), - body: defaultLifecyclePolicy, - }), - - this.createOrUpdateComponentTemplate({ - name: getResourceName(TECHNICAL_COMPONENT_TEMPLATE_NAME), - body: technicalComponentTemplate, - }), - - this.createOrUpdateComponentTemplate({ - name: getResourceName(ECS_COMPONENT_TEMPLATE_NAME), - body: ecsComponentTemplate, - }), - ]); + const { getResourceName, logger } = this.options; + + try { + // We can install them in parallel + await Promise.all([ + this.createOrUpdateLifecyclePolicy({ + name: getResourceName(DEFAULT_ILM_POLICY_ID), + body: defaultLifecyclePolicy, + }), + + this.createOrUpdateComponentTemplate({ + name: getResourceName(TECHNICAL_COMPONENT_TEMPLATE_NAME), + body: technicalComponentTemplate, + }), + + this.createOrUpdateComponentTemplate({ + name: getResourceName(ECS_COMPONENT_TEMPLATE_NAME), + body: ecsComponentTemplate, + }), + ]); + } catch (err) { + logger.error( + `Error installing common resources in RuleRegistry ResourceInstaller - ${err.message}` + ); + throw err; + } }); } @@ -375,6 +382,9 @@ export class ResourceInstaller { }, }); } catch (err) { + logger.error( + `Error creating index ${initialIndexName} as the write index for alias ${primaryNamespacedAlias} in RuleRegistry ResourceInstaller: ${err.message}` + ); // If the index already exists and it's the write index for the alias, // something else created it so suppress the error. If it's not the write // index, that's bad, throw an error. @@ -460,6 +470,9 @@ export class ResourceInstaller { return createConcreteIndexInfo({}); } + logger.error( + `Error fetching concrete indices for ${indexPatternForBackingIndices} in RuleRegistry ResourceInstaller - ${err.message}` + ); // A non-404 error is a real problem so we re-throw. throw err; } From 42dde01bce3f551c67e3a3f741f50b903f7f7d15 Mon Sep 17 00:00:00 2001 From: Ashokaditya <1849116+ashokaditya@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:13:53 +0200 Subject: [PATCH 04/78] [Security Solution][Endpoint][Response Actions] Hide console done button (#136921) * Hide console Done button We decided to not show the done button in V1. So hiding it for now. We may bring it back and so not removing the code. * default to false review changes --- .../components/console_page_overlay.tsx | 37 +++++++++++-------- .../console_manager/console_manager.test.tsx | 12 ++++-- .../console_manager/console_manager.tsx | 7 +++- .../components/console_manager/mocks.tsx | 2 +- .../components/console_manager/types.ts | 3 ++ .../page_objects/endpoint_responder.ts | 2 +- 6 files changed, 41 insertions(+), 22 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/components/console_page_overlay.tsx b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/components/console_page_overlay.tsx index a003cbf3ea726..29078a66d2d8f 100644 --- a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/components/console_page_overlay.tsx +++ b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/components/console_page_overlay.tsx @@ -26,10 +26,11 @@ export interface ConsolePageOverlayProps { pageTitle?: ReactNode; body?: ReactNode; actions?: ReactNode[]; + showCloseButton?: boolean; } export const ConsolePageOverlay = memo( - ({ console, onHide, isHidden, body, actions, pageTitle = '' }) => { + ({ console, onHide, isHidden, body, actions, pageTitle = '', showCloseButton = false }) => { const getTestId = useTestIdGenerator('consolePageOverlay'); const handleCloseOverlayOnClick: MouseEventHandler = useCallback( (ev) => { @@ -55,27 +56,31 @@ export const ConsolePageOverlay = memo( size="xs" iconType="arrowLeft" onClick={handleCloseOverlayOnClick} + data-test-subj={getTestId('header-back-link')} > {BACK_LABEL} ), - actions: [ - - - , + // hide the close button for now + actions: showCloseButton + ? [ + + + , - ...(actions ?? []), - ], + ...(actions ?? []), + ] + : [...(actions ?? [])], }; - }, [actions, getTestId, handleCloseOverlayOnClick, isHidden, pageTitle, body]); + }, [actions, body, getTestId, handleCloseOverlayOnClick, isHidden, pageTitle, showCloseButton]); return ( { expect(renderResult.getByTestId('testRunningConsole')).toBeTruthy(); }); - it('should show `Done` button', async () => { + it('should not show `Done` button', async () => { await render(); - expect(renderResult.getByTestId('consolePageOverlay-doneButton')).toBeTruthy(); + expect(renderResult.queryByTestId('consolePageOverlay-doneButton')).toBeFalsy(); + }); + + it('should show `Back` link', async () => { + await render(); + + expect(renderResult.getByTestId('consolePageOverlay-header-back-link')).toBeTruthy(); }); it('should hide the console page overlay', async () => { await render(); - userEvent.click(renderResult.getByTestId('consolePageOverlay-doneButton')); + userEvent.click(renderResult.getByTestId('consolePageOverlay-header-back-link')); expect(renderResult.queryByTestId('consolePageOverlay')).toBeNull(); }); diff --git a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/console_manager.tsx b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/console_manager.tsx index 932ffb1e4b477..deb6967da2c27 100644 --- a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/console_manager.tsx +++ b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/console_manager.tsx @@ -19,7 +19,11 @@ import { Console } from '../../console'; interface ManagedConsole extends Pick< ConsoleRegistrationInterface, - 'consoleProps' | 'PageTitleComponent' | 'PageBodyComponent' | 'ActionComponents' + | 'consoleProps' + | 'PageTitleComponent' + | 'PageBodyComponent' + | 'ActionComponents' + | 'showCloseButton' > { client: RegisteredConsoleClient; console: JSX.Element; // actual console component @@ -291,6 +295,7 @@ export const ConsoleManager = memo(({ storage = {}, childre return ; }) } + showCloseButton={visibleConsole.showCloseButton} /> )} diff --git a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/mocks.tsx b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/mocks.tsx index 1a33514bb47c2..242d1d9059534 100644 --- a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/mocks.tsx +++ b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/mocks.tsx @@ -74,7 +74,7 @@ export const getConsoleManagerMockRenderResultQueriesAndActions = ( }, hideOpenedConsole: async () => { - userEvent.click(renderResult.getByTestId('consolePageOverlay-doneButton')); + userEvent.click(renderResult.getByTestId('consolePageOverlay-header-back-link')); await waitFor(() => { expect(renderResult.queryByTestId('consolePageOverlay')).toBeNull(); diff --git a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/types.ts b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/types.ts index 5fa4fee704036..c8a95b1dc7f95 100644 --- a/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/types.ts +++ b/x-pack/plugins/security_solution/public/management/components/console/components/console_manager/types.ts @@ -35,6 +35,9 @@ export interface ConsoleRegistrationInterface { * the Responder page overlay is shown. */ ActionComponents?: Array>>; + + /** controls the visibility of the console close button */ + showCloseButton?: boolean; } /** diff --git a/x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts b/x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts index c570f97fa7139..7412f7044d4b6 100644 --- a/x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts +++ b/x-pack/test/security_solution_endpoint/page_objects/endpoint_responder.ts @@ -21,7 +21,7 @@ export function EndpointResponderPageObjects({ getService }: FtrProviderContext) const closeResponder = async () => { await ensureOnResponder(); - (await testSubjects.find('consolePageOverlay-doneButton')).click(); + (await testSubjects.find('consolePageOverlay-header-back-link')).click(); await testSubjects.missingOrFail(TEST_SUBJ.responderPage); }; From e9d9c69757503a7c3310b41f666b45447ecd5335 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Fri, 22 Jul 2022 16:16:19 +0200 Subject: [PATCH 05/78] [ML] Explain log rate spikes: Split main chart by selected field/value pair. (#136712) - Adds the ability to show the hovered/selected field/value pair in the main chart. - Optional search queries now get applied to the analysis. --- .../api/explain_log_rate_spikes/schema.ts | 2 +- .../public/application/utils/query_utils.ts | 25 ++++++- .../document_count_chart.tsx | 60 ++++++++++++++- .../document_count_content.tsx | 15 +++- .../explain_log_rate_spikes_analysis.tsx | 38 +++++++++- ... => explain_log_rate_spikes_app_state.tsx} | 12 +-- ...s.tsx => explain_log_rate_spikes_page.tsx} | 60 ++++++++++++--- .../explain_log_rate_spikes/index.ts | 23 +++++- .../spike_analysis_table.tsx | 74 +++++++++++-------- .../aiops/public/get_document_stats.ts | 19 ++++- x-pack/plugins/aiops/public/hooks/use_data.ts | 48 +++++++++--- .../aiops/public/shared_lazy_components.tsx | 12 +-- .../queries/fetch_field_candidates.test.ts | 7 +- .../server/routes/queries/get_filters.test.ts | 6 +- .../server/routes/queries/get_filters.ts | 15 ---- .../queries/get_query_with_params.test.ts | 6 +- .../routes/queries/get_query_with_params.ts | 4 + .../routes/queries/get_request_base.test.ts | 4 +- .../apis/aiops/explain_log_rate_spikes.ts | 2 +- .../apis/aiops/permissions.ts | 2 +- 20 files changed, 330 insertions(+), 104 deletions(-) rename x-pack/plugins/aiops/public/components/explain_log_rate_spikes/{explain_log_rate_spikes_wrapper.tsx => explain_log_rate_spikes_app_state.tsx} (92%) rename x-pack/plugins/aiops/public/components/explain_log_rate_spikes/{explain_log_rate_spikes.tsx => explain_log_rate_spikes_page.tsx} (76%) diff --git a/x-pack/plugins/aiops/common/api/explain_log_rate_spikes/schema.ts b/x-pack/plugins/aiops/common/api/explain_log_rate_spikes/schema.ts index 9c4928d310701..058c46f7e45e0 100644 --- a/x-pack/plugins/aiops/common/api/explain_log_rate_spikes/schema.ts +++ b/x-pack/plugins/aiops/common/api/explain_log_rate_spikes/schema.ts @@ -10,7 +10,7 @@ import { schema, TypeOf } from '@kbn/config-schema'; export const aiopsExplainLogRateSpikesSchema = schema.object({ start: schema.number(), end: schema.number(), - kuery: schema.string(), + searchQuery: schema.string(), timeFieldName: schema.string(), includeFrozen: schema.maybe(schema.boolean()), /** Analysis selection time ranges */ diff --git a/x-pack/plugins/aiops/public/application/utils/query_utils.ts b/x-pack/plugins/aiops/public/application/utils/query_utils.ts index 9a51fbb719d71..85ad3d236a98e 100644 --- a/x-pack/plugins/aiops/public/application/utils/query_utils.ts +++ b/x-pack/plugins/aiops/public/application/utils/query_utils.ts @@ -8,11 +8,14 @@ // TODO Consolidate with duplicate query utils in // `x-pack/plugins/data_visualizer/common/utils/query_utils.ts` +import { cloneDeep } from 'lodash'; + import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + import { Query } from '@kbn/es-query'; -import { cloneDeep } from 'lodash'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; +import type { ChangePoint } from '@kbn/ml-agg-utils'; /* * Contains utility functions for building and processing queries. @@ -24,7 +27,9 @@ export function buildBaseFilterCriteria( timeFieldName?: string, earliestMs?: number, latestMs?: number, - query?: Query['query'] + query?: Query['query'], + selectedChangePoint?: ChangePoint, + includeSelectedChangePoint = true ): estypes.QueryDslQueryContainer[] { const filterCriteria = []; if (timeFieldName && earliestMs && latestMs) { @@ -43,6 +48,22 @@ export function buildBaseFilterCriteria( filterCriteria.push(query); } + if (selectedChangePoint && includeSelectedChangePoint) { + filterCriteria.push({ + term: { [selectedChangePoint.fieldName]: selectedChangePoint.fieldValue }, + }); + } else if (selectedChangePoint && !includeSelectedChangePoint) { + filterCriteria.push({ + bool: { + must_not: [ + { + term: { [selectedChangePoint.fieldName]: selectedChangePoint.fieldValue }, + }, + ], + }, + }); + } + return filterCriteria; } diff --git a/x-pack/plugins/aiops/public/components/document_count_content/document_count_chart/document_count_chart.tsx b/x-pack/plugins/aiops/public/components/document_count_content/document_count_chart/document_count_chart.tsx index 308e91f47506a..09253f3881df7 100644 --- a/x-pack/plugins/aiops/public/components/document_count_content/document_count_chart/document_count_chart.tsx +++ b/x-pack/plugins/aiops/public/components/document_count_content/document_count_chart/document_count_chart.tsx @@ -27,6 +27,7 @@ import { DualBrush, DualBrushAnnotation } from '@kbn/aiops-components'; import { getWindowParameters } from '@kbn/aiops-utils'; import type { WindowParameters } from '@kbn/aiops-utils'; import { MULTILAYER_TIME_AXIS_STYLE } from '@kbn/charts-plugin/common'; +import type { ChangePoint } from '@kbn/ml-agg-utils'; import { useAiOpsKibana } from '../../../kibana_context'; @@ -39,9 +40,11 @@ interface DocumentCountChartProps { brushSelectionUpdateHandler: (d: WindowParameters) => void; width?: number; chartPoints: DocumentCountChartPoint[]; + chartPointsSplit?: DocumentCountChartPoint[]; timeRangeEarliest: number; timeRangeLatest: number; interval: number; + changePoint?: ChangePoint; } const SPEC_ID = 'document_count'; @@ -65,9 +68,11 @@ export const DocumentCountChart: FC = ({ brushSelectionUpdateHandler, width, chartPoints, + chartPointsSplit, timeRangeEarliest, timeRangeLatest, interval, + changePoint, }) => { const { services: { data, uiSettings, fieldFormats, charts }, @@ -79,9 +84,21 @@ export const DocumentCountChart: FC = ({ const xAxisFormatter = fieldFormats.deserialize({ id: 'date' }); const useLegacyTimeAxis = uiSettings.get('visualization:useLegacyTimeAxis', false); - const seriesName = i18n.translate('xpack.aiops.dataGrid.field.documentCountChart.seriesLabel', { - defaultMessage: 'document count', - }); + const overallSeriesName = i18n.translate( + 'xpack.aiops.dataGrid.field.documentCountChart.seriesLabel', + { + defaultMessage: 'document count', + } + ); + + const overallSeriesNameWithSplit = i18n.translate( + 'xpack.aiops.dataGrid.field.documentCountChartSplit.seriesLabel', + { + defaultMessage: 'other document count', + } + ); + + const splitSeriesName = `${changePoint?.fieldName}:${changePoint?.fieldValue}`; // TODO Let user choose between ZOOM and BRUSH mode. const [viewMode] = useState(VIEW_MODE.BRUSH); @@ -107,6 +124,26 @@ export const DocumentCountChart: FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [chartPoints, timeRangeEarliest, timeRangeLatest, interval]); + const adjustedChartPointsSplit = useMemo(() => { + // Display empty chart when no data in range + if (!Array.isArray(chartPointsSplit) || chartPointsSplit.length < 1) + return [{ time: timeRangeEarliest, value: 0 }]; + + // If chart has only one bucket + // it won't show up correctly unless we add an extra data point + if (chartPointsSplit.length === 1) { + return [ + ...chartPointsSplit, + { + time: interval ? Number(chartPointsSplit[0].time) + interval : timeRangeEarliest, + value: 0, + }, + ]; + } + return chartPointsSplit; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [chartPointsSplit, timeRangeEarliest, timeRangeLatest, interval]); + const timefilterUpdateHandler = useCallback( (ranges: { from: number; to: number }) => { data.query.timefilter.timefilter.setTime({ @@ -223,14 +260,29 @@ export const DocumentCountChart: FC = ({ + {chartPointsSplit && ( + + )} {windowParameters && ( <> void; + changePoint?: ChangePoint; documentCountStats?: DocumentCountStats; + documentCountStatsSplit?: DocumentCountStats; totalCount: number; } export const DocumentCountContent: FC = ({ brushSelectionUpdateHandler, + changePoint, documentCountStats, + documentCountStatsSplit, totalCount, }) => { if (documentCountStats === undefined) { @@ -37,6 +42,12 @@ export const DocumentCountContent: FC = ({ chartPoints = Object.entries(buckets).map(([time, value]) => ({ time: +time, value })); } + let chartPointsSplit: DocumentCountChartPoint[] | undefined; + if (documentCountStatsSplit?.buckets !== undefined) { + const buckets: Record = documentCountStatsSplit?.buckets; + chartPointsSplit = Object.entries(buckets).map(([time, value]) => ({ time: +time, value })); + } + return ( <> @@ -44,9 +55,11 @@ export const DocumentCountContent: FC = ({ )} diff --git a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_analysis.tsx b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_analysis.tsx index 5bca9e6aa1ed0..6bd060577a425 100644 --- a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_analysis.tsx +++ b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_analysis.tsx @@ -6,10 +6,13 @@ */ import React, { useEffect, FC } from 'react'; + import type { DataView } from '@kbn/data-views-plugin/public'; import { ProgressControls } from '@kbn/aiops-components'; import { useFetchStream } from '@kbn/aiops-utils'; import type { WindowParameters } from '@kbn/aiops-utils'; +import type { ChangePoint } from '@kbn/ml-agg-utils'; +import type { Query } from '@kbn/es-query'; import { useAiOpsKibana } from '../../kibana_context'; import { initialState, streamReducer } from '../../../common/api/stream_reducer'; @@ -29,6 +32,10 @@ interface ExplainLogRateSpikesAnalysisProps { latest: number; /** Window parameters for the analysis */ windowParameters: WindowParameters; + searchQuery: Query['query']; + onPinnedChangePoint?: (changePoint: ChangePoint | null) => void; + onSelectedChangePoint?: (changePoint: ChangePoint | null) => void; + selectedChangePoint?: ChangePoint; } export const ExplainLogRateSpikesAnalysis: FC = ({ @@ -36,6 +43,10 @@ export const ExplainLogRateSpikesAnalysis: FC earliest, latest, windowParameters, + searchQuery, + onPinnedChangePoint, + onSelectedChangePoint, + selectedChangePoint, }) => { const { services } = useAiOpsKibana(); const basePath = services.http?.basePath.get() ?? ''; @@ -48,8 +59,7 @@ export const ExplainLogRateSpikesAnalysis: FC { start: earliest, end: latest, - // TODO Consider an optional Kuery. - kuery: '', + searchQuery: JSON.stringify(searchQuery), // TODO Handle data view without time fields. timeFieldName: dataView.timeFieldName ?? '', index: dataView.title, @@ -57,22 +67,42 @@ export const ExplainLogRateSpikesAnalysis: FC }, { reducer: streamReducer, initialState } ); + useEffect(() => { start(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + // Start handler clears possibly hovered or pinned + // change points on analysis refresh. + function startHandler() { + if (onPinnedChangePoint) { + onPinnedChangePoint(null); + } + if (onSelectedChangePoint) { + onSelectedChangePoint(null); + } + start(); + } + return ( <> {data?.changePoints ? ( - + ) : null} ); diff --git a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_wrapper.tsx b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_app_state.tsx similarity index 92% rename from x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_wrapper.tsx rename to x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_app_state.tsx index ecae23f4f408c..b7d5d20792a89 100644 --- a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_wrapper.tsx +++ b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_app_state.tsx @@ -15,9 +15,9 @@ import { useHistory, useLocation } from 'react-router-dom'; import { SavedSearch } from '@kbn/discover-plugin/public'; import { EuiPageBody } from '@elastic/eui'; -import { DataView } from '@kbn/data-views-plugin/public'; -import { ExplainLogRateSpikes } from './explain_log_rate_spikes'; +import type { DataView } from '@kbn/data-views-plugin/public'; + import { SEARCH_QUERY_LANGUAGE, SearchQueryLanguage, @@ -34,7 +34,9 @@ import { SetUrlState, } from '../../hooks/url_state'; -export interface ExplainLogRateSpikesWrapperProps { +import { ExplainLogRateSpikesPage } from './explain_log_rate_spikes_page'; + +export interface ExplainLogRateSpikesAppStateProps { /** The data view to analyze. */ dataView: DataView; /** The saved search to analyze. */ @@ -64,7 +66,7 @@ export const getDefaultAiOpsListState = ( export const restorableDefaults = getDefaultAiOpsListState(); -export const ExplainLogRateSpikesWrapper: FC = ({ +export const ExplainLogRateSpikesAppState: FC = ({ dataView, savedSearch, }) => { @@ -159,7 +161,7 @@ export const ExplainLogRateSpikesWrapper: FC = return ( - + ); diff --git a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes.tsx b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx similarity index 76% rename from x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes.tsx rename to x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx index 3fb5b7e4bdb4e..6ee6d8b70f8fd 100644 --- a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes.tsx +++ b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/explain_log_rate_spikes_page.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useEffect, useState, FC } from 'react'; +import React, { useCallback, useEffect, useMemo, useState, FC } from 'react'; import { EuiFlexGroup, EuiFlexItem, @@ -19,6 +19,7 @@ import { import type { DataView } from '@kbn/data-views-plugin/public'; import type { WindowParameters } from '@kbn/aiops-utils'; +import type { ChangePoint } from '@kbn/ml-agg-utils'; import { Filter, Query } from '@kbn/es-query'; import { SavedSearch } from '@kbn/discover-plugin/public'; @@ -26,24 +27,28 @@ import { useAiOpsKibana } from '../../kibana_context'; import { SearchQueryLanguage, SavedSearchSavedObject } from '../../application/utils/search_utils'; import { useUrlState, usePageUrlState, AppStateKey } from '../../hooks/url_state'; import { useData } from '../../hooks/use_data'; -import { restorableDefaults } from './explain_log_rate_spikes_wrapper'; import { FullTimeRangeSelector } from '../full_time_range_selector'; import { DocumentCountContent } from '../document_count_content/document_count_content'; import { DatePickerWrapper } from '../date_picker_wrapper'; import { SearchPanel } from '../search_panel'; + +import { restorableDefaults } from './explain_log_rate_spikes_app_state'; import { ExplainLogRateSpikesAnalysis } from './explain_log_rate_spikes_analysis'; /** * ExplainLogRateSpikes props require a data view. */ -interface ExplainLogRateSpikesProps { +interface ExplainLogRateSpikesPageProps { /** The data view to analyze. */ dataView: DataView; /** The saved search to analyze. */ savedSearch: SavedSearch | SavedSearchSavedObject | null; } -export const ExplainLogRateSpikes: FC = ({ dataView, savedSearch }) => { +export const ExplainLogRateSpikesPage: FC = ({ + dataView, + savedSearch, +}) => { const { services } = useAiOpsKibana(); const { data: dataService } = services; @@ -82,8 +87,37 @@ export const ExplainLogRateSpikes: FC = ({ dataView, [currentSavedSearch, aiopsListState, setAiopsListState] ); - const { docStats, timefilter, earliest, latest, searchQueryLanguage, searchString, searchQuery } = - useData({ currentDataView: dataView, currentSavedSearch }, aiopsListState, setGlobalState); + const [pinnedChangePoint, setPinnedChangePoint] = useState(null); + const [selectedChangePoint, setSelectedChangePoint] = useState(null); + + // If a row is pinned, still overrule with a potentially hovered row. + const currentSelectedChangePoint = useMemo(() => { + if (selectedChangePoint) { + return selectedChangePoint; + } else if (pinnedChangePoint) { + return pinnedChangePoint; + } + }, [pinnedChangePoint, selectedChangePoint]); + + const { + overallDocStats, + selectedDocStats, + timefilter, + earliest, + latest, + searchQueryLanguage, + searchString, + searchQuery, + } = useData( + { currentDataView: dataView, currentSavedSearch }, + aiopsListState, + setGlobalState, + currentSelectedChangePoint + ); + + const totalCount = currentSelectedChangePoint + ? overallDocStats.totalCount + selectedDocStats.totalCount + : overallDocStats.totalCount; useEffect(() => { return () => { @@ -169,12 +203,16 @@ export const ExplainLogRateSpikes: FC = ({ dataView, setSearchParams={setSearchParams} /> - {docStats?.totalCount !== undefined && ( + {overallDocStats?.totalCount !== undefined && ( )} @@ -186,6 +224,10 @@ export const ExplainLogRateSpikes: FC = ({ dataView, earliest={earliest} latest={latest} windowParameters={windowParameters} + searchQuery={searchQuery} + onPinnedChangePoint={setPinnedChangePoint} + onSelectedChangePoint={setSelectedChangePoint} + selectedChangePoint={currentSelectedChangePoint} /> )} diff --git a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/index.ts b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/index.ts index 4c344313209e4..243066a924f8d 100644 --- a/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/index.ts +++ b/x-pack/plugins/aiops/public/components/explain_log_rate_spikes/index.ts @@ -5,9 +5,26 @@ * 2.0. */ -export type { ExplainLogRateSpikesWrapperProps } from './explain_log_rate_spikes_wrapper'; -import { ExplainLogRateSpikesWrapper } from './explain_log_rate_spikes_wrapper'; +/** + * The usage of the components in this folder works like this: + * + * + * + * + * + * - `ExplainLogRateSpikesAppState`: Manages and passes down url/app state related data, e.g. search parameters. + * - `ExplainLogRateSpikesPageProps`: The overall page layout. Includes state management for data selection + * like date range, data fetching for the document count chart, window parameters for the analysis. + * - `ExplainLogRateSpikesAnalysis`: Hosts the analysis results table including code to fetch its data. + * While for example the earliest/latest parameter can still be `undefined` on load in the upper component, + * this component expects all necessary parameters/props already to be defined. The reason is the usage of + * data fetching hooks which cannot be called conditionally, so the pattern used here is to only load this + * whole component conditionally on the outer level. + */ + +export type { ExplainLogRateSpikesAppStateProps } from './explain_log_rate_spikes_app_state'; +import { ExplainLogRateSpikesAppState } from './explain_log_rate_spikes_app_state'; // required for dynamic import using React.lazy() // eslint-disable-next-line import/no-default-export -export default ExplainLogRateSpikesWrapper; +export default ExplainLogRateSpikesAppState; diff --git a/x-pack/plugins/aiops/public/components/spike_analysis_table/spike_analysis_table.tsx b/x-pack/plugins/aiops/public/components/spike_analysis_table/spike_analysis_table.tsx index 2df67e1a45bb1..e37b301f36da3 100644 --- a/x-pack/plugins/aiops/public/components/spike_analysis_table/spike_analysis_table.tsx +++ b/x-pack/plugins/aiops/public/components/spike_analysis_table/spike_analysis_table.tsx @@ -19,13 +19,23 @@ const noDataText = i18n.translate('xpack.aiops.correlations.correlationsTable.no defaultMessage: 'No data', }); -interface Props { - changePointData: ChangePoint[]; +interface SpikeAnalysisTableProps { + changePoints: ChangePoint[]; error?: string; loading: boolean; + onPinnedChangePoint?: (changePoint: ChangePoint | null) => void; + onSelectedChangePoint?: (changePoint: ChangePoint | null) => void; + selectedChangePoint?: ChangePoint; } -export const SpikeAnalysisTable: FC = ({ changePointData, error, loading }) => { +export const SpikeAnalysisTable: FC = ({ + changePoints, + error, + loading, + onPinnedChangePoint, + onSelectedChangePoint, + selectedChangePoint, +}) => { const [pageIndex, setPageIndex] = useState(0); const [pageSize, setPageSize] = useState(10); @@ -102,9 +112,9 @@ export const SpikeAnalysisTable: FC = ({ changePointData, error, loading const { pagination, pageOfItems } = useMemo(() => { const pageStart = pageIndex * pageSize; - const itemCount = changePointData?.length ?? 0; + const itemCount = changePoints?.length ?? 0; return { - pageOfItems: changePointData + pageOfItems: changePoints // Temporary default sorting by ascending pValue until we add native table sorting ?.sort((a, b) => { return (a?.pValue ?? 1) - (b?.pValue ?? 0); @@ -117,7 +127,7 @@ export const SpikeAnalysisTable: FC = ({ changePointData, error, loading pageSizeOptions: PAGINATION_SIZE_OPTIONS, }, }; - }, [pageIndex, pageSize, changePointData]); + }, [pageIndex, pageSize, changePoints]); return ( = ({ changePointData, error, loading loading={loading} error={error} // sorting={sorting} - // rowProps={(term) => { - // return { - // onClick: () => { - // // if (setPinnedSignificantTerm) { - // // setPinnedSignificantTerm(term); - // // } - // }, - // onMouseEnter: () => { - // // setSelectedSignificantTerm(term); - // }, - // onMouseLeave: () => { - // // setSelectedSignificantTerm(null); - // }, - // // style: - // // selectedTerm && - // // selectedTerm.fieldValue === term.fieldValue && - // // selectedTerm.fieldName === term.fieldName - // // ? { - // // backgroundColor: euiTheme.eui.euiColorLightestShade, - // // } - // // : null, - // }; - // }} + rowProps={(changePoint) => { + return { + onClick: () => { + if (onPinnedChangePoint) { + onPinnedChangePoint(changePoint); + } + }, + onMouseEnter: () => { + if (onSelectedChangePoint) { + onSelectedChangePoint(changePoint); + } + }, + onMouseLeave: () => { + if (onSelectedChangePoint) { + onSelectedChangePoint(null); + } + }, + style: + selectedChangePoint && + selectedChangePoint.fieldValue === changePoint.fieldValue && + selectedChangePoint.fieldName === changePoint.fieldName + ? { + // TODO use euiTheme + // backgroundColor: euiTheme.eui.euiColorLightestShade, + backgroundColor: '#ddd', + } + : null, + }; + }} /> ); }; diff --git a/x-pack/plugins/aiops/public/get_document_stats.ts b/x-pack/plugins/aiops/public/get_document_stats.ts index 4344c0eeb6daa..1df4e4bd57ae8 100644 --- a/x-pack/plugins/aiops/public/get_document_stats.ts +++ b/x-pack/plugins/aiops/public/get_document_stats.ts @@ -6,9 +6,13 @@ */ import { each, get } from 'lodash'; + import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import { Query } from '@kbn/es-query'; +import type { ChangePoint } from '@kbn/ml-agg-utils'; +import type { Query } from '@kbn/es-query'; + import { buildBaseFilterCriteria } from './application/utils/query_utils'; export interface DocumentCountStats { @@ -28,6 +32,8 @@ export interface DocumentStatsSearchStrategyParams { timeFieldName?: string; runtimeFieldMap?: estypes.MappingRuntimeFields; fieldsToFetch?: string[]; + selectedChangePoint?: ChangePoint; + includeSelectedChangePoint?: boolean; } export const getDocumentCountStatsRequest = (params: DocumentStatsSearchStrategyParams) => { @@ -40,10 +46,19 @@ export const getDocumentCountStatsRequest = (params: DocumentStatsSearchStrategy searchQuery, intervalMs, fieldsToFetch, + selectedChangePoint, + includeSelectedChangePoint, } = params; const size = 0; - const filterCriteria = buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, searchQuery); + const filterCriteria = buildBaseFilterCriteria( + timeFieldName, + earliestMs, + latestMs, + searchQuery, + selectedChangePoint, + includeSelectedChangePoint + ); // Don't use the sampler aggregation as this can lead to some potentially // confusing date histogram results depending on the date range of data amongst shards. diff --git a/x-pack/plugins/aiops/public/hooks/use_data.ts b/x-pack/plugins/aiops/public/hooks/use_data.ts index 2e87f309fed91..54a4020bd5ae2 100644 --- a/x-pack/plugins/aiops/public/hooks/use_data.ts +++ b/x-pack/plugins/aiops/public/hooks/use_data.ts @@ -5,23 +5,29 @@ * 2.0. */ -import { useEffect, useMemo, useState } from 'react'; // useCallback, useRef -import type { DataView } from '@kbn/data-views-plugin/public'; +import { useEffect, useMemo, useState } from 'react'; import { merge } from 'rxjs'; + +import type { DataView } from '@kbn/data-views-plugin/public'; import { UI_SETTINGS } from '@kbn/data-plugin/common'; -import { SavedSearch } from '@kbn/discover-plugin/public'; +import type { ChangePoint } from '@kbn/ml-agg-utils'; + +import type { SavedSearch } from '@kbn/discover-plugin/public'; + +import { TimeBuckets } from '../../common/time_buckets'; + import { useAiOpsKibana } from '../kibana_context'; -import { useTimefilter } from './use_time_filter'; import { aiopsRefresh$ } from '../application/services/timefilter_refresh_service'; -import { TimeBuckets } from '../../common/time_buckets'; -import { useDocumentCountStats } from './use_document_count_stats'; -import { Dictionary } from './url_state'; -import { DocumentStatsSearchStrategyParams } from '../get_document_stats'; +import type { DocumentStatsSearchStrategyParams } from '../get_document_stats'; +import type { AiOpsIndexBasedAppState } from '../components/explain_log_rate_spikes/explain_log_rate_spikes_app_state'; import { getEsQueryFromSavedSearch, SavedSearchSavedObject, } from '../application/utils/search_utils'; -import { AiOpsIndexBasedAppState } from '../components/explain_log_rate_spikes/explain_log_rate_spikes_wrapper'; + +import { useTimefilter } from './use_time_filter'; +import { useDocumentCountStats } from './use_document_count_stats'; +import type { Dictionary } from './url_state'; export const useData = ( { @@ -29,7 +35,8 @@ export const useData = ( currentSavedSearch, }: { currentDataView: DataView; currentSavedSearch: SavedSearch | SavedSearchSavedObject | null }, aiopsListState: AiOpsIndexBasedAppState, - onUpdate: (params: Dictionary) => void + onUpdate: (params: Dictionary) => void, + selectedChangePoint?: ChangePoint ) => { const { services } = useAiOpsKibana(); const { uiSettings, data } = services; @@ -90,7 +97,23 @@ export const useData = ( autoRefreshSelector: true, }); - const { docStats } = useDocumentCountStats(fieldStatsRequest, lastRefresh); + const overallStatsRequest = useMemo(() => { + return fieldStatsRequest + ? { ...fieldStatsRequest, selectedChangePoint, includeSelectedChangePoint: false } + : undefined; + }, [fieldStatsRequest, selectedChangePoint]); + + const selectedChangePointStatsRequest = useMemo(() => { + return fieldStatsRequest + ? { ...fieldStatsRequest, selectedChangePoint, includeSelectedChangePoint: true } + : undefined; + }, [fieldStatsRequest, selectedChangePoint]); + + const { docStats: overallDocStats } = useDocumentCountStats(overallStatsRequest, lastRefresh); + const { docStats: selectedDocStats } = useDocumentCountStats( + selectedChangePointStatsRequest, + lastRefresh + ); function updateFieldStatsRequest() { const timefilterActiveBounds = timefilter.getActiveBounds(); @@ -150,7 +173,8 @@ export const useData = ( }, [searchString, JSON.stringify(searchQuery)]); return { - docStats, + overallDocStats, + selectedDocStats, timefilter, /** Start timestamp filter */ earliest: fieldStatsRequest?.earliest, diff --git a/x-pack/plugins/aiops/public/shared_lazy_components.tsx b/x-pack/plugins/aiops/public/shared_lazy_components.tsx index c96e769b60e8b..a84bd359bdb68 100644 --- a/x-pack/plugins/aiops/public/shared_lazy_components.tsx +++ b/x-pack/plugins/aiops/public/shared_lazy_components.tsx @@ -8,9 +8,9 @@ import React, { FC, Suspense } from 'react'; import { EuiErrorBoundary, EuiLoadingContent } from '@elastic/eui'; -import type { ExplainLogRateSpikesWrapperProps } from './components/explain_log_rate_spikes'; +import type { ExplainLogRateSpikesAppStateProps } from './components/explain_log_rate_spikes'; -const ExplainLogRateSpikesWrapperLazy = React.lazy( +const ExplainLogRateSpikesAppStateLazy = React.lazy( () => import('./components/explain_log_rate_spikes') ); @@ -21,11 +21,11 @@ const LazyWrapper: FC = ({ children }) => ( ); /** - * Lazy-wrapped ExplainLogRateSpikesWrapper React component - * @param {ExplainLogRateSpikesWrapperProps} props - properties specifying the data on which to run the analysis. + * Lazy-wrapped ExplainLogRateSpikesAppState React component + * @param {ExplainLogRateSpikesAppStateProps} props - properties specifying the data on which to run the analysis. */ -export const ExplainLogRateSpikes: FC = (props) => ( +export const ExplainLogRateSpikes: FC = (props) => ( - + ); diff --git a/x-pack/plugins/aiops/server/routes/queries/fetch_field_candidates.test.ts b/x-pack/plugins/aiops/server/routes/queries/fetch_field_candidates.test.ts index 24bbda6a5d22e..53e21e7a9dcce 100644 --- a/x-pack/plugins/aiops/server/routes/queries/fetch_field_candidates.test.ts +++ b/x-pack/plugins/aiops/server/routes/queries/fetch_field_candidates.test.ts @@ -9,9 +9,11 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { ElasticsearchClient } from '@kbn/core/server'; +import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes'; + import { fetchFieldCandidates, getRandomDocsRequest } from './fetch_field_candidates'; -const params = { +const params: AiopsExplainLogRateSpikesSchema = { index: 'the-index', timeFieldName: 'the-time-field-name', start: 1577836800000, @@ -21,7 +23,7 @@ const params = { deviationMin: 30, deviationMax: 40, includeFrozen: false, - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', }; describe('query_field_candidates', () => { @@ -38,6 +40,7 @@ describe('query_field_candidates', () => { query: { bool: { filter: [ + { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, { range: { 'the-time-field-name': { diff --git a/x-pack/plugins/aiops/server/routes/queries/get_filters.test.ts b/x-pack/plugins/aiops/server/routes/queries/get_filters.test.ts index 97b9f7a8a7309..c34d81fa91bdf 100644 --- a/x-pack/plugins/aiops/server/routes/queries/get_filters.test.ts +++ b/x-pack/plugins/aiops/server/routes/queries/get_filters.test.ts @@ -8,11 +8,11 @@ import { getFilters } from './get_filters'; describe('getFilters', () => { - it('returns an empty array with no timeFieldName and kuery supplied', () => { + it('returns an empty array with no timeFieldName and searchQuery supplied', () => { const filters = getFilters({ index: 'the-index', timeFieldName: '', - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', start: 1577836800000, end: 1609459200000, baselineMin: 10, @@ -27,7 +27,7 @@ describe('getFilters', () => { const filters = getFilters({ index: 'the-index', timeFieldName: 'the-time-field-name', - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', start: 1577836800000, end: 1609459200000, baselineMin: 10, diff --git a/x-pack/plugins/aiops/server/routes/queries/get_filters.ts b/x-pack/plugins/aiops/server/routes/queries/get_filters.ts index c04ca0b184ea7..9ff34f5d4900a 100644 --- a/x-pack/plugins/aiops/server/routes/queries/get_filters.ts +++ b/x-pack/plugins/aiops/server/routes/queries/get_filters.ts @@ -8,7 +8,6 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ESFilter } from '@kbn/core/types/elasticsearch'; -import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes'; @@ -30,17 +29,7 @@ export function rangeQuery( ]; } -export function kqlQuery(kql: string): estypes.QueryDslQueryContainer[] { - if (!kql) { - return []; - } - - const ast = fromKueryExpression(kql); - return [toElasticsearchQuery(ast)]; -} - export function getFilters({ - kuery, start, end, timeFieldName, @@ -51,9 +40,5 @@ export function getFilters({ filters.push(...rangeQuery(start, end, timeFieldName)); } - if (kuery !== '') { - filters.push(...kqlQuery(kuery)); - } - return filters; } diff --git a/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.test.ts b/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.test.ts index 6353a662f035d..aa600065fd223 100644 --- a/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.test.ts +++ b/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.test.ts @@ -20,12 +20,13 @@ describe('getQueryWithParams', () => { deviationMin: 30, deviationMax: 40, includeFrozen: false, - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', }, }); expect(query).toEqual({ bool: { filter: [ + { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, { range: { 'the-time-field-name': { @@ -52,7 +53,7 @@ describe('getQueryWithParams', () => { deviationMin: 30, deviationMax: 40, includeFrozen: false, - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', }, termFilters: [ { @@ -64,6 +65,7 @@ describe('getQueryWithParams', () => { expect(query).toEqual({ bool: { filter: [ + { bool: { filter: [], must: [{ match_all: {} }], must_not: [] } }, { range: { 'the-time-field-name': { diff --git a/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.ts b/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.ts index 1b53e5424b3db..9e0b82b341d1d 100644 --- a/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.ts +++ b/x-pack/plugins/aiops/server/routes/queries/get_query_with_params.ts @@ -7,7 +7,9 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { Query } from '@kbn/es-query'; import type { FieldValuePair } from '@kbn/ml-agg-utils'; + import type { AiopsExplainLogRateSpikesSchema } from '../../../common/api/explain_log_rate_spikes'; import { getFilters } from './get_filters'; @@ -21,9 +23,11 @@ interface QueryParams { termFilters?: FieldValuePair[]; } export const getQueryWithParams = ({ params, termFilters }: QueryParams) => { + const searchQuery = JSON.parse(params.searchQuery) as Query['query']; return { bool: { filter: [ + searchQuery, ...getFilters(params), ...(Array.isArray(termFilters) ? termFilters.map(getTermsQuery) : []), ] as estypes.QueryDslQueryContainer[], diff --git a/x-pack/plugins/aiops/server/routes/queries/get_request_base.test.ts b/x-pack/plugins/aiops/server/routes/queries/get_request_base.test.ts index 4cde99cbd0c39..ee21cb985f5d6 100644 --- a/x-pack/plugins/aiops/server/routes/queries/get_request_base.test.ts +++ b/x-pack/plugins/aiops/server/routes/queries/get_request_base.test.ts @@ -12,7 +12,7 @@ describe('getRequestBase', () => { const requestBase = getRequestBase({ index: 'the-index', timeFieldName: 'the-time-field-name', - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', start: 1577836800000, end: 1609459200000, baselineMin: 10, @@ -28,7 +28,7 @@ describe('getRequestBase', () => { index: 'the-index', timeFieldName: 'the-time-field-name', includeFrozen: true, - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', start: 1577836800000, end: 1609459200000, baselineMin: 10, diff --git a/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts b/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts index f096541f1a7fd..f2b606ff183cd 100644 --- a/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts +++ b/x-pack/test/api_integration/apis/aiops/explain_log_rate_spikes.ts @@ -28,7 +28,7 @@ export default ({ getService }: FtrProviderContext) => { deviationMin: 1561986810992, end: 2147483647000, index: 'ft_ecommerce', - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', start: 0, timeFieldName: 'order_date', }; diff --git a/x-pack/test/api_integration_basic/apis/aiops/permissions.ts b/x-pack/test/api_integration_basic/apis/aiops/permissions.ts index 8c6686750e2f8..25b8366be98ba 100644 --- a/x-pack/test/api_integration_basic/apis/aiops/permissions.ts +++ b/x-pack/test/api_integration_basic/apis/aiops/permissions.ts @@ -26,7 +26,7 @@ export default ({ getService }: FtrProviderContext) => { deviationMin: 1561986810992, end: 2147483647000, index: 'ft_ecommerce', - kuery: '', + searchQuery: '{"bool":{"filter":[],"must":[{"match_all":{}}],"must_not":[]}}', start: 0, timeFieldName: 'order_date', }; From 9043402f40384554233eb07a744ed2c703e7ad42 Mon Sep 17 00:00:00 2001 From: Michael Katsoulis Date: Fri, 22 Jul 2022 17:20:18 +0300 Subject: [PATCH 06/78] Remove Kubernetes Package granularity (#136622) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../sections/epm/screens/home/available_packages.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx index e8d4692f2a3b9..36fd2d785bbcd 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/home/available_packages.tsx @@ -219,11 +219,20 @@ export const AvailablePackages: React.FC<{ category: '', excludeInstallStatus: true, }); + + // Remove Kubernetes package granularity + if (eprPackages?.items) { + eprPackages.items.forEach(function (element) { + if (element.id === 'kubernetes') { + element.policy_templates = []; + } + }); + } + const eprIntegrationList = useMemo( () => packageListToIntegrationsList(eprPackages?.items || []), [eprPackages] ); - const { value: replacementCustomIntegrations } = useGetReplacementCustomIntegrations(); const mergedEprPackages: Array = From fd6039b0fc6662bf76d32af6959101c3c9f3b01c Mon Sep 17 00:00:00 2001 From: "Devin W. Hurley" Date: Fri, 22 Jul 2022 10:27:30 -0400 Subject: [PATCH 07/78] [Security Solution] [Platform] Extract data view saved object reference for saved query rule types (#136774) fix for saved query with query rule type + data views not extracting data view saved object reference Co-authored-by: Marshall Main <55718608+marshallmain@users.noreply.github.com> Co-authored-by: Marshall Main <55718608+marshallmain@users.noreply.github.com> --- .../schemas/response/rules_schema.test.ts | 4 ++-- .../schemas/response/rules_schema.ts | 5 ++++- .../schemas/rule_converters.ts | 2 ++ .../extract_references.ts | 9 ++------- .../security_and_spaces/group1/create_rules.ts | 18 ++++++++++++++++++ 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts index 06168a4d2bdca..bac55c8510929 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.test.ts @@ -663,9 +663,9 @@ describe('rules_schema', () => { expect(emptyArray).toEqual(expected); }); - test('should array of size 1 given a "saved_query"', () => { + test('should array of size 2 given a "saved_query"', () => { const array = addSavedId({ type: 'saved_query' }); - expect(array.length).toEqual(1); + expect(array.length).toEqual(2); }); }); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts index c55d61617671e..1566aa3c23858 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/response/rules_schema.ts @@ -227,7 +227,10 @@ export type RulesSchema = t.TypeOf; export const addSavedId = (typeAndTimelineOnly: TypeAndTimelineOnly): t.Mixed[] => { if (typeAndTimelineOnly.type === 'saved_query') { - return [t.exact(t.type({ saved_id: dependentRulesSchema.props.saved_id }))]; + return [ + t.exact(t.type({ saved_id: dependentRulesSchema.props.saved_id })), + t.exact(t.partial({ data_view_id: dependentRulesSchema.props.data_view_id })), + ]; } else { return []; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts index f7dbb2358aca8..7312037ae956d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts @@ -408,6 +408,7 @@ export const convertPatchAPIToInternalSchema = ( }; }; +// eslint-disable-next-line complexity export const convertCreateAPIToInternalSchema = ( input: CreateRulesSchema & { related_integrations?: RelatedIntegrationArray; @@ -519,6 +520,7 @@ export const typeSpecificCamelToSnake = (params: TypeSpecificRuleParams): Respon query: params.query, filters: params.filters, saved_id: params.savedId, + data_view_id: params.dataViewId, }; } case 'threshold': { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/extract_references.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/extract_references.ts index 8ec99fa6d228d..9843223b37e89 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/extract_references.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/saved_object_references/extract_references.ts @@ -10,7 +10,7 @@ import type { RuleParamsAndRefs } from '@kbn/alerting-plugin/server'; import type { RuleParams } from '../../schemas/rule_schemas'; -import { isEqlParams, isQueryParams, isThresholdParams, isThreatParams } from '../utils'; +import { isMachineLearningParams } from '../utils'; import { extractExceptionsList } from './extract_exceptions_list'; import { extractDataView } from './extract_data_view'; @@ -51,12 +51,7 @@ export const extractReferences = ({ // if statement is needed here because dataViewId is not on the base rule params // much like how the index property is not on the base rule params either - if ( - isEqlParams(params) || - isQueryParams(params) || - isThresholdParams(params) || - isThreatParams(params) - ) { + if (!isMachineLearningParams(params)) { returnReferences = [ ...returnReferences, ...extractDataView({ diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts index 89b85412f4992..babf1aedb64a3 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_rules.ts @@ -60,6 +60,24 @@ export default ({ getService }: FtrProviderContext) => { await deleteAllAlerts(supertest, log); }); + describe('saved query', () => { + it('should create a saved query rule and query a data view', async () => { + const savedQueryRule = { + ...getSimpleRule(), + data_view_id: 'my-data-view', + type: 'saved_query', + saved_id: 'my-saved-query-id', + }; + const { body } = await supertest + .post(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .send(savedQueryRule) + .expect(200); + + expect(body.data_view_id).to.eql('my-data-view'); + }); + }); + describe('elastic admin', () => { it('should create a single rule with a rule_id', async () => { const { body } = await supertest From 0cf9ce14b8a2ebef794c8ee96fb2d5fd3364c1ed Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Fri, 22 Jul 2022 16:44:15 +0200 Subject: [PATCH 08/78] [Security Solution] Enable new navigation by default (#136819) * enable new nav by default * cypres tests added/fixed * fix more cypress * code format Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/experimental_features.ts | 1 - .../integration/header/navigation.spec.ts | 23 +++++- .../cypress/integration/urls/state.spec.ts | 16 +++- .../cypress/screens/security_header.ts | 75 +++++++++++++++---- .../cypress/tasks/security_header.ts | 3 +- .../cypress/urls/navigation.ts | 4 + .../common/components/navigation/helpers.ts | 4 +- .../security_solution/public/plugin.tsx | 2 +- .../security_solution/server/ui_settings.ts | 36 ++++----- 9 files changed, 118 insertions(+), 46 deletions(-) diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index b9bcdb3f27927..e29726ce1ceac 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -22,7 +22,6 @@ export const allowedExperimentalValues = Object.freeze({ pendingActionResponsesWithAck: true, policyListEnabled: true, policyResponseInFleetEnabled: true, - groupedNavigation: true, /** * This is used for enabling the end to end tests for the security_solution telemetry. diff --git a/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts b/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts index 6b30c1ebe9727..4926a2ea1d85b 100644 --- a/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/header/navigation.spec.ts @@ -17,6 +17,8 @@ import { TIMELINES, RULES, EXCEPTIONS, + USERS, + DETECTION_RESPONSE, } from '../../screens/security_header'; import { login, visit } from '../../tasks/login'; @@ -35,6 +37,11 @@ import { TIMELINES_URL, EXCEPTIONS_URL, DETECTIONS_RULE_MANAGEMENT_URL, + USERS_URL, + DASHBOARDS_URL, + DETECTION_RESPONSE_URL, + EXPLORE_URL, + MANAGE_URL, } from '../../urls/navigation'; import { openKibanaNavigation, @@ -63,6 +70,11 @@ describe('top-level navigation common to all pages in the Security app', () => { cy.url().should('include', OVERVIEW_URL); }); + it('navigates to the Detection & Response page', () => { + navigateFromHeaderTo(DETECTION_RESPONSE); + cy.url().should('include', DETECTION_RESPONSE_URL); + }); + it('navigates to the Alerts page', () => { navigateFromHeaderTo(ALERTS); cy.url().should('include', ALERTS_URL); @@ -78,6 +90,11 @@ describe('top-level navigation common to all pages in the Security app', () => { cy.url().should('include', NETWORK_URL); }); + it('navigates to the Users page', () => { + navigateFromHeaderTo(USERS); + cy.url().should('include', USERS_URL); + }); + it('navigates to the Rules page', () => { navigateFromHeaderTo(RULES); cy.url().should('include', DETECTIONS_RULE_MANAGEMENT_URL); @@ -121,7 +138,7 @@ describe('Kibana navigation to all pages in the Security app ', () => { }); it('navigates to the Dashboards page', () => { navigateFromKibanaCollapsibleTo(DASHBOARDS_PAGE); - cy.url().should('include', OVERVIEW_URL); + cy.url().should('include', DASHBOARDS_URL); }); it('navigates to the Alerts page', () => { @@ -141,11 +158,11 @@ describe('Kibana navigation to all pages in the Security app ', () => { it('navigates to the Explore page', () => { navigateFromKibanaCollapsibleTo(EXPLORE_PAGE); - cy.url().should('include', HOSTS_URL); + cy.url().should('include', EXPLORE_URL); }); it('navigates to the Manage page', () => { navigateFromKibanaCollapsibleTo(MANAGE_PAGE); - cy.url().should('include', ENDPOINTS_URL); + cy.url().should('include', MANAGE_URL); }); }); diff --git a/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts b/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts index f30816d455070..faedd11b1d12b 100644 --- a/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/urls/state.spec.ts @@ -14,7 +14,14 @@ import { } from '../../screens/date_picker'; import { HOSTS_NAMES } from '../../screens/hosts/all_hosts'; import { ANOMALIES_TAB } from '../../screens/hosts/main'; -import { BREADCRUMBS, HOSTS, KQL_INPUT, NETWORK } from '../../screens/security_header'; +import { + BREADCRUMBS, + EXPLORE, + HOSTS, + KQL_INPUT, + NETWORK, + openNavigationPanel, +} from '../../screens/security_header'; import { TIMELINE_TITLE } from '../../screens/timeline'; import { login, visit, visitWithoutDateRange } from '../../tasks/login'; @@ -213,6 +220,8 @@ describe('url state', () => { visitWithoutDateRange(ABSOLUTE_DATE_RANGE.url); kqlSearch('source.ip: "10.142.0.9" {enter}'); navigateFromHeaderTo(HOSTS); + + openNavigationPanel(EXPLORE); cy.get(NETWORK).should( 'have.attr', 'href', @@ -226,6 +235,7 @@ describe('url state', () => { openAllHosts(); waitForAllHostsToBeLoaded(); + openNavigationPanel(EXPLORE); cy.get(HOSTS).should( 'have.attr', 'href', @@ -249,14 +259,14 @@ describe('url state', () => { ); cy.get(BREADCRUMBS) - .eq(1) + .eq(2) .should( 'have.attr', 'href', `/app/security/hosts?sourcerer=(default:(id:security-solution-default,selectedPatterns:!('auditbeat-*')))&query=(language:kuery,query:'agent.type:%20%22auditbeat%22%20')&timerange=(global:(linkTo:!(timeline),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2023-01-01T21:33:29.186Z')),timeline:(linkTo:!(global),timerange:(from:'2019-08-01T20:03:29.186Z',kind:absolute,to:'2023-01-01T21:33:29.186Z')))` ); cy.get(BREADCRUMBS) - .eq(2) + .eq(3) .should( 'have.attr', 'href', diff --git a/x-pack/plugins/security_solution/cypress/screens/security_header.ts b/x-pack/plugins/security_solution/cypress/screens/security_header.ts index 4bfb03e6e5c97..55c1b37923572 100644 --- a/x-pack/plugins/security_solution/cypress/screens/security_header.ts +++ b/x-pack/plugins/security_solution/cypress/screens/security_header.ts @@ -5,32 +5,79 @@ * 2.0. */ -export const ALERTS = '[data-test-subj="navigation-alerts"]'; +// main links +export const DASHBOARDS = '[data-test-subj="groupedNavItemLink-dashboards"]'; -export const BREADCRUMBS = '[data-test-subj="breadcrumbs"] a'; +export const ALERTS = '[data-test-subj="groupedNavItemLink-alerts"]'; -export const CASES = '[data-test-subj="navigation-cases"]'; +export const CASES = '[data-test-subj="groupedNavItemLink-cases"]'; -export const HOSTS = '[data-test-subj="navigation-hosts"]'; +export const TIMELINES = '[data-test-subj="groupedNavItemLink-timelines"]'; -export const KQL_INPUT = '[data-test-subj="queryInput"]'; +export const EXPLORE = '[data-test-subj="groupedNavItemLink-explore"]'; -export const ENDPOINTS = '[data-test-subj="navigation-endpoints"]'; +export const MANAGE = '[data-test-subj="groupedNavItemLink-administration"]'; -export const TRUSTED_APPS = '[data-test-subj="navigation-trusted_apps"]'; +// nested links +export const OVERVIEW = '[data-test-subj="groupedNavPanelLink-overview"]'; -export const EVENT_FILTERS = '[data-test-subj="navigation-event_filters"]'; +export const DETECTION_RESPONSE = '[data-test-subj="groupedNavPanelLink-detection_response"]'; -export const NETWORK = '[data-test-subj="navigation-network"]'; +export const HOSTS = '[data-test-subj="groupedNavPanelLink-hosts"]'; -export const RULES = '[data-test-subj="navigation-rules"]'; +export const ENDPOINTS = '[data-test-subj="groupedNavPanelLink-endpoints"]'; -export const EXCEPTIONS = '[data-test-subj="navigation-exceptions"]'; +export const TRUSTED_APPS = '[data-test-subj="groupedNavPanelLink-trusted_apps"]'; -export const OVERVIEW = '[data-test-subj="navigation-overview"]'; +export const EVENT_FILTERS = '[data-test-subj="groupedNavPanelLink-event_filters"]'; -export const REFRESH_BUTTON = '[data-test-subj="querySubmitButton"]'; +export const NETWORK = '[data-test-subj="groupedNavPanelLink-network"]'; + +export const USERS = '[data-test-subj="groupedNavPanelLink-users"]'; -export const TIMELINES = '[data-test-subj="navigation-timelines"]'; +export const RULES = '[data-test-subj="groupedNavPanelLink-rules"]'; + +export const EXCEPTIONS = '[data-test-subj="groupedNavPanelLink-exceptions"]'; + +// other +export const BREADCRUMBS = '[data-test-subj="breadcrumbs"] a'; + +export const KQL_INPUT = '[data-test-subj="queryInput"]'; + +export const REFRESH_BUTTON = '[data-test-subj="querySubmitButton"]'; export const LOADING_INDICATOR = '[data-test-subj="globalLoadingIndicator"]'; + +// opens the navigation panel for a given nested link +export const openNavigationPanelFor = (page: string) => { + let panel; + switch (page) { + case OVERVIEW: + case DETECTION_RESPONSE: { + panel = DASHBOARDS; + break; + } + case HOSTS: + case NETWORK: + case USERS: { + panel = EXPLORE; + break; + } + case ENDPOINTS: + case TRUSTED_APPS: + case EVENT_FILTERS: + case RULES: + case EXCEPTIONS: { + panel = MANAGE; + break; + } + } + if (panel) { + openNavigationPanel(panel); + } +}; + +// opens the navigation panel of a main link +export const openNavigationPanel = (page: string) => { + cy.get(`${page} button.solutionGroupedNavItemButton`).click({ force: true }); +}; diff --git a/x-pack/plugins/security_solution/cypress/tasks/security_header.ts b/x-pack/plugins/security_solution/cypress/tasks/security_header.ts index 14b1a6db4bc71..54ee209950801 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/security_header.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/security_header.ts @@ -6,7 +6,7 @@ */ import { TOASTER } from '../screens/alerts_detection_rules'; -import { KQL_INPUT, REFRESH_BUTTON } from '../screens/security_header'; +import { KQL_INPUT, openNavigationPanelFor, REFRESH_BUTTON } from '../screens/security_header'; export const clearSearchBar = () => { cy.get(KQL_INPUT).clear().type('{enter}'); @@ -18,6 +18,7 @@ export const kqlSearch = (search: string) => { }; export const navigateFromHeaderTo = (page: string) => { + openNavigationPanelFor(page); cy.get(page).click({ force: true }); }; diff --git a/x-pack/plugins/security_solution/cypress/urls/navigation.ts b/x-pack/plugins/security_solution/cypress/urls/navigation.ts index 43e9b2da41273..5a655f5306488 100644 --- a/x-pack/plugins/security_solution/cypress/urls/navigation.ts +++ b/x-pack/plugins/security_solution/cypress/urls/navigation.ts @@ -46,6 +46,10 @@ export const TRUSTED_APPS_URL = '/app/security/administration/trusted_apps'; export const EVENT_FILTERS_URL = '/app/security/administration/event_filters'; export const NETWORK_URL = '/app/security/network'; export const OVERVIEW_URL = '/app/security/overview'; +export const DASHBOARDS_URL = '/app/security/dashboards'; +export const DETECTION_RESPONSE_URL = '/app/security/detection_response'; +export const EXPLORE_URL = '/app/security/explore'; +export const MANAGE_URL = '/app/security/manage'; export const RULE_CREATION = 'app/security/rules/create'; export const TIMELINES_URL = '/app/security/timelines'; export const TIMELINE_TEMPLATES_URL = '/app/security/timelines/template'; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/helpers.ts b/x-pack/plugins/security_solution/public/common/components/navigation/helpers.ts index b0d9573008655..7f1bd2ee4d1c2 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/helpers.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/helpers.ts @@ -21,7 +21,6 @@ import { } from '../url_state/helpers'; import type { SearchNavTab } from './types'; -import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features'; import { useUiSetting$ } from '../../lib/kibana'; import { ENABLE_GROUPED_NAVIGATION } from '../../../../common/constants'; @@ -76,7 +75,6 @@ export const getUrlStateSearch = (urlState: UrlState): string => * TODO: remove this function when flag and setting not needed */ export const useIsGroupedNavigationEnabled = () => { - const groupedNavFlagEnabled = useIsExperimentalFeatureEnabled('groupedNavigation'); const [groupedNavSettingEnabled] = useUiSetting$(ENABLE_GROUPED_NAVIGATION); - return groupedNavFlagEnabled && groupedNavSettingEnabled; + return groupedNavSettingEnabled; }; diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 39892dcd9b3ea..f03a38817bf85 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -475,7 +475,7 @@ export class Plugin implements IPlugin(ENABLE_GROUPED_NAVIGATION, false); + const newNavEnabled$ = core.uiSettings.get$(ENABLE_GROUPED_NAVIGATION, true); let appLinksSubscription: Subscription | null = null; license$.pipe(combineLatestWith(newNavEnabled$)).subscribe(async ([license, newNavEnabled]) => { diff --git a/x-pack/plugins/security_solution/server/ui_settings.ts b/x-pack/plugins/security_solution/server/ui_settings.ts index 33e3accaf5d93..ddc41ae3e2926 100644 --- a/x-pack/plugins/security_solution/server/ui_settings.ts +++ b/x-pack/plugins/security_solution/server/ui_settings.ts @@ -146,27 +146,23 @@ export const initUiSettings = ( requiresPageReload: true, schema: schema.number(), }, - ...(experimentalFeatures.groupedNavigation - ? { - [ENABLE_GROUPED_NAVIGATION]: { - name: i18n.translate('xpack.securitySolution.uiSettings.enableGroupedNavigation', { - defaultMessage: 'New streamlined navigation', - }), - value: false, - type: 'boolean', - description: i18n.translate( - 'xpack.securitySolution.uiSettings.enableGroupedNavigationDescription', - { - defaultMessage: - '

Improve your experience with the new navigation organized and optimized around the most important workflows.

', - } - ), - category: [APP_ID], - requiresPageReload: false, - schema: schema.boolean(), - }, + [ENABLE_GROUPED_NAVIGATION]: { + name: i18n.translate('xpack.securitySolution.uiSettings.enableGroupedNavigation', { + defaultMessage: 'New streamlined navigation', + }), + value: true, + type: 'boolean', + description: i18n.translate( + 'xpack.securitySolution.uiSettings.enableGroupedNavigationDescription', + { + defaultMessage: + '

Improve your experience with the new navigation organized and optimized around the most important workflows.

', } - : {}), + ), + category: [APP_ID], + requiresPageReload: false, + schema: schema.boolean(), + }, [ENABLE_NEWS_FEED_SETTING]: { name: i18n.translate('xpack.securitySolution.uiSettings.enableNewsFeedLabel', { defaultMessage: 'News feed', From dffddad32adcb80e0bfffbacc63873ec593a59ec Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 22 Jul 2022 17:00:39 +0200 Subject: [PATCH 09/78] [Lens] Add value count (#136385) * add value count * fix tests * fix tests * fix tests * fix tests * fix tests * fix types * Update gauge.ts * adjust reference wording Co-authored-by: Stratoula Kalafateli --- .../data/common/search/aggs/agg_types.ts | 2 + .../common/search/aggs/aggs_service.test.ts | 2 + .../data/common/search/aggs/metrics/index.ts | 2 + .../search/aggs/metrics/metric_agg_type.ts | 8 +- .../search/aggs/metrics/metric_agg_types.ts | 1 + .../common/search/aggs/metrics/value_count.ts | 48 ++++++ .../aggs/metrics/value_count_fn.test.ts | 49 ++++++ .../search/aggs/metrics/value_count_fn.ts | 101 +++++++++++++ src/plugins/data/common/search/aggs/types.ts | 4 + .../public/search/aggs/aggs_service.test.ts | 4 +- .../dimension_panel/dimension_editor.tsx | 5 +- .../dimension_panel/dimension_panel.test.tsx | 34 +---- .../droppable/get_drop_props.test.ts | 2 +- .../indexpattern_suggestions.test.tsx | 2 +- .../public/indexpattern_datasource/loader.ts | 2 +- .../operations/definitions.test.ts | 2 +- .../operations/definitions/count.tsx | 140 ++++++++++++------ .../formula/editor/formula_help.tsx | 2 +- .../definitions/formula/formula.test.tsx | 30 ++-- .../definitions/formula/generate.ts | 14 +- .../operations/definitions/formula/parse.ts | 10 +- .../definitions/formula/validation.ts | 81 +++++----- .../definitions/terms/terms.test.tsx | 10 +- .../operations/operations.test.ts | 19 ++- .../indexpattern_datasource/pure_helpers.ts | 9 +- .../apps/lens/group3/drag_and_drop.ts | 20 +-- .../test/functional/apps/lens/group3/gauge.ts | 3 +- 27 files changed, 431 insertions(+), 175 deletions(-) create mode 100644 src/plugins/data/common/search/aggs/metrics/value_count.ts create mode 100644 src/plugins/data/common/search/aggs/metrics/value_count_fn.test.ts create mode 100644 src/plugins/data/common/search/aggs/metrics/value_count_fn.ts diff --git a/src/plugins/data/common/search/aggs/agg_types.ts b/src/plugins/data/common/search/aggs/agg_types.ts index 396ca49edaf4f..43e3df6100a75 100644 --- a/src/plugins/data/common/search/aggs/agg_types.ts +++ b/src/plugins/data/common/search/aggs/agg_types.ts @@ -36,6 +36,7 @@ export const getAggTypes = () => ({ { name: METRIC_TYPES.MAX, fn: metrics.getMaxMetricAgg }, { name: METRIC_TYPES.STD_DEV, fn: metrics.getStdDeviationMetricAgg }, { name: METRIC_TYPES.CARDINALITY, fn: metrics.getCardinalityMetricAgg }, + { name: METRIC_TYPES.VALUE_COUNT, fn: metrics.getValueCountMetricAgg }, { name: METRIC_TYPES.PERCENTILES, fn: metrics.getPercentilesMetricAgg }, { name: METRIC_TYPES.PERCENTILE_RANKS, fn: metrics.getPercentileRanksMetricAgg }, { name: METRIC_TYPES.TOP_HITS, fn: metrics.getTopHitMetricAgg }, @@ -97,6 +98,7 @@ export const getAggTypesFunctions = () => [ metrics.aggBucketSum, metrics.aggFilteredMetric, metrics.aggCardinality, + metrics.aggValueCount, metrics.aggCount, metrics.aggCumulativeSum, metrics.aggDerivative, diff --git a/src/plugins/data/common/search/aggs/aggs_service.test.ts b/src/plugins/data/common/search/aggs/aggs_service.test.ts index ee40a1d76d1aa..f0425e460ae0f 100644 --- a/src/plugins/data/common/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/common/search/aggs/aggs_service.test.ts @@ -84,6 +84,7 @@ describe('Aggs service', () => { "max", "std_dev", "cardinality", + "value_count", "percentiles", "percentile_ranks", "top_hits", @@ -136,6 +137,7 @@ describe('Aggs service', () => { "max", "std_dev", "cardinality", + "value_count", "percentiles", "percentile_ranks", "top_hits", diff --git a/src/plugins/data/common/search/aggs/metrics/index.ts b/src/plugins/data/common/search/aggs/metrics/index.ts index 55af141b8fcb7..492f76ccd3a08 100644 --- a/src/plugins/data/common/search/aggs/metrics/index.ts +++ b/src/plugins/data/common/search/aggs/metrics/index.ts @@ -20,6 +20,8 @@ export * from './filtered_metric_fn'; export * from './filtered_metric'; export * from './cardinality_fn'; export * from './cardinality'; +export * from './value_count_fn'; +export * from './value_count'; export * from './count'; export * from './count_fn'; export * from './cumulative_sum_fn'; diff --git a/src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts b/src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts index 59bbe377ba28a..6af5e18b0709e 100644 --- a/src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts +++ b/src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts @@ -77,9 +77,11 @@ export class MetricAggType { // Metric types where an empty set equals `zero` - const isSettableToZero = [METRIC_TYPES.CARDINALITY, METRIC_TYPES.SUM].includes( - agg.type.name as METRIC_TYPES - ); + const isSettableToZero = [ + METRIC_TYPES.CARDINALITY, + METRIC_TYPES.VALUE_COUNT, + METRIC_TYPES.SUM, + ].includes(agg.type.name as METRIC_TYPES); // Return proper values when no buckets are present // `Count` handles empty sets properly diff --git a/src/plugins/data/common/search/aggs/metrics/metric_agg_types.ts b/src/plugins/data/common/search/aggs/metrics/metric_agg_types.ts index 4174808892a16..151f18110a301 100644 --- a/src/plugins/data/common/search/aggs/metrics/metric_agg_types.ts +++ b/src/plugins/data/common/search/aggs/metrics/metric_agg_types.ts @@ -10,6 +10,7 @@ export enum METRIC_TYPES { AVG = 'avg', FILTERED_METRIC = 'filtered_metric', CARDINALITY = 'cardinality', + VALUE_COUNT = 'value_count', AVG_BUCKET = 'avg_bucket', MAX_BUCKET = 'max_bucket', MIN_BUCKET = 'min_bucket', diff --git a/src/plugins/data/common/search/aggs/metrics/value_count.ts b/src/plugins/data/common/search/aggs/metrics/value_count.ts new file mode 100644 index 0000000000000..c5cea76c88bb5 --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/value_count.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; +import { aggValueCountFnName } from './value_count_fn'; +import { MetricAggType, IMetricAggConfig } from './metric_agg_type'; +import { METRIC_TYPES } from './metric_agg_types'; +import { BaseAggParams } from '../types'; + +const valueCountTitle = i18n.translate('data.search.aggs.metrics.valueCountTitle', { + defaultMessage: 'Value Count', +}); + +export interface AggParamsValueCount extends BaseAggParams { + field: string; + emptyAsNull?: boolean; +} + +export const getValueCountMetricAgg = () => + new MetricAggType({ + name: METRIC_TYPES.VALUE_COUNT, + valueType: 'number', + expressionName: aggValueCountFnName, + title: valueCountTitle, + enableEmptyAsNull: true, + makeLabel(aggConfig: IMetricAggConfig) { + return i18n.translate('data.search.aggs.metrics.valueCountLabel', { + defaultMessage: 'Value count of {field}', + values: { field: aggConfig.getFieldDisplayName() }, + }); + }, + getSerializedFormat(agg) { + return { + id: 'number', + }; + }, + params: [ + { + name: 'field', + type: 'field', + }, + ], + }); diff --git a/src/plugins/data/common/search/aggs/metrics/value_count_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/value_count_fn.test.ts new file mode 100644 index 0000000000000..db590244659fa --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/value_count_fn.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { functionWrapper } from '../test_helpers'; +import { aggValueCount } from './value_count_fn'; + +describe('agg_expression_functions', () => { + describe('aggValueCount', () => { + const fn = functionWrapper(aggValueCount()); + + test('required args are provided', () => { + const actual = fn({ + field: 'machine.os.keyword', + }); + expect(actual).toMatchInlineSnapshot(` + Object { + "type": "agg_type", + "value": Object { + "enabled": true, + "id": undefined, + "params": Object { + "customLabel": undefined, + "emptyAsNull": undefined, + "field": "machine.os.keyword", + "json": undefined, + "timeShift": undefined, + }, + "schema": undefined, + "type": "value_count", + }, + } + `); + }); + + test('correctly parses json string argument', () => { + const actual = fn({ + field: 'machine.os.keyword', + json: '{ "foo": true }', + }); + + expect(actual.value.params.json).toEqual('{ "foo": true }'); + }); + }); +}); diff --git a/src/plugins/data/common/search/aggs/metrics/value_count_fn.ts b/src/plugins/data/common/search/aggs/metrics/value_count_fn.ts new file mode 100644 index 0000000000000..3acf2da345d27 --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/value_count_fn.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 { i18n } from '@kbn/i18n'; +import { ExpressionFunctionDefinition } from '@kbn/expressions-plugin/common'; +import { AggExpressionType, AggExpressionFunctionArgs, METRIC_TYPES } from '..'; + +export const aggValueCountFnName = 'aggValueCount'; + +type Input = any; +type AggArgs = AggExpressionFunctionArgs; +type Output = AggExpressionType; +type FunctionDefinition = ExpressionFunctionDefinition< + typeof aggValueCountFnName, + Input, + AggArgs, + Output +>; + +export const aggValueCount = (): FunctionDefinition => ({ + name: aggValueCountFnName, + help: i18n.translate('data.search.aggs.function.metrics.valueCount.help', { + defaultMessage: 'Generates a serialized agg config for a value count agg', + }), + type: 'agg_type', + args: { + id: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.value_count.id.help', { + defaultMessage: 'ID for this aggregation', + }), + }, + enabled: { + types: ['boolean'], + default: true, + help: i18n.translate('data.search.aggs.metrics.value_count.enabled.help', { + defaultMessage: 'Specifies whether this aggregation should be enabled', + }), + }, + schema: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.value_count.schema.help', { + defaultMessage: 'Schema to use for this aggregation', + }), + }, + field: { + types: ['string'], + required: true, + help: i18n.translate('data.search.aggs.metrics.value_count.field.help', { + defaultMessage: 'Field to use for this aggregation', + }), + }, + json: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.value_count.json.help', { + defaultMessage: 'Advanced json to include when the agg is sent to Elasticsearch', + }), + }, + customLabel: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.value_count.customLabel.help', { + defaultMessage: 'Represents a custom label for this aggregation', + }), + }, + timeShift: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.timeShift.help', { + defaultMessage: + 'Shift the time range for the metric by a set time, for example 1h or 7d. "previous" will use the closest time range from the date histogram or time range filter.', + }), + }, + emptyAsNull: { + types: ['boolean'], + help: i18n.translate('data.search.aggs.metrics.emptyAsNull.help', { + defaultMessage: + 'If set to true, a missing value is treated as null in the resulting data table. If set to false, a "zero" is filled in', + }), + }, + }, + fn: (input, args) => { + const { id, enabled, schema, ...rest } = args; + + return { + type: 'agg_type', + value: { + id, + enabled, + schema, + type: METRIC_TYPES.VALUE_COUNT, + params: { + ...rest, + }, + }, + }; + }, +}); diff --git a/src/plugins/data/common/search/aggs/types.ts b/src/plugins/data/common/search/aggs/types.ts index 7e72365f06af0..16fac531fad94 100644 --- a/src/plugins/data/common/search/aggs/types.ts +++ b/src/plugins/data/common/search/aggs/types.ts @@ -15,6 +15,7 @@ import { aggBucketMin, aggBucketSum, aggCardinality, + aggValueCount, AggConfigs, AggConfigSerialized, aggCount, @@ -41,6 +42,7 @@ import { AggParamsBucketSum, AggParamsFilteredMetric, AggParamsCardinality, + AggParamsValueCount, AggParamsCumulativeSum, AggParamsDateHistogram, AggParamsDateRange, @@ -174,6 +176,7 @@ export interface AggParamsMapping { [METRIC_TYPES.AVG]: AggParamsAvg; [METRIC_TYPES.CARDINALITY]: AggParamsCardinality; [METRIC_TYPES.COUNT]: AggParamsCount; + [METRIC_TYPES.VALUE_COUNT]: AggParamsValueCount; [METRIC_TYPES.GEO_BOUNDS]: AggParamsGeoBounds; [METRIC_TYPES.GEO_CENTROID]: AggParamsGeoCentroid; [METRIC_TYPES.MAX]: AggParamsMax; @@ -222,6 +225,7 @@ export interface AggFunctionsMapping { aggBucketSum: ReturnType; aggFilteredMetric: ReturnType; aggCardinality: ReturnType; + aggValueCount: ReturnType; aggCount: ReturnType; aggCumulativeSum: ReturnType; aggDerivative: ReturnType; diff --git a/src/plugins/data/public/search/aggs/aggs_service.test.ts b/src/plugins/data/public/search/aggs/aggs_service.test.ts index 40cc3590a32e2..0c8067df5c7f7 100644 --- a/src/plugins/data/public/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/public/search/aggs/aggs_service.test.ts @@ -53,7 +53,7 @@ describe('AggsService - public', () => { service.setup(setupDeps); const start = service.start(startDeps); expect(start.types.getAll().buckets.length).toBe(16); - expect(start.types.getAll().metrics.length).toBe(25); + expect(start.types.getAll().metrics.length).toBe(26); }); test('registers custom agg types', () => { @@ -70,7 +70,7 @@ describe('AggsService - public', () => { const start = service.start(startDeps); expect(start.types.getAll().buckets.length).toBe(17); expect(start.types.getAll().buckets.some(({ name }) => name === 'foo')).toBe(true); - expect(start.types.getAll().metrics.length).toBe(26); + expect(start.types.getAll().metrics.length).toBe(27); expect(start.types.getAll().metrics.some(({ name }) => name === 'bar')).toBe(true); }); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx index 413f40279a3ce..559c3ef7fff44 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_editor.tsx @@ -45,6 +45,7 @@ import { Filtering } from './filtering'; import { AdvancedOptions } from './advanced_options'; import { TimeShift } from './time_shift'; import type { LayerType } from '../../../common'; +import { DOCUMENT_FIELD_NAME } from '../../../common'; import { quickFunctionsName, staticValueOperationName, @@ -62,6 +63,7 @@ import { ParamEditorProps } from '../operations/definitions'; import { WrappingHelpPopover } from '../help_popover'; import { isColumn } from '../operations/definitions/helpers'; import { FieldChoiceWithOperationType } from './field_select'; +import { documentField } from '../document_field'; export interface DimensionEditorProps extends IndexPatternDimensionEditorProps { selectedColumn?: GenericIndexPatternColumn; @@ -449,7 +451,8 @@ export function DimensionEditor(props: DimensionEditorProps) { indexPattern: currentIndexPattern, columnId, op: operationType, - field: undefined, + // if document field can be used, default to it + field: possibleFields.has(DOCUMENT_FIELD_NAME) ? documentField : undefined, visualizationGroups: dimensionGroups, targetGroup: props.groupId, }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx index a2d83da5d89e2..291ccb1ede76b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/dimension_panel.test.tsx @@ -986,26 +986,16 @@ describe('IndexPatternDimensionEditorPanel', () => { }); }); - it('should select the Records field when count is selected', () => { + it('should select the Records field when count is selected on non-existing column', () => { wrapper = mount( ); - wrapper - .find('button[data-test-subj="lns-indexPatternDimension-count incompatible"]') - .simulate('click'); + wrapper.find('button[data-test-subj="lns-indexPatternDimension-count"]').simulate('click'); const newColumnState = setState.mock.calls[0][0](state).layers.first.columns.col2; expect(newColumnState.operationType).toEqual('count'); @@ -1175,9 +1165,7 @@ describe('IndexPatternDimensionEditorPanel', () => { label: 'Sum of bytes per hour', }); wrapper = mount(); - wrapper - .find('button[data-test-subj="lns-indexPatternDimension-count incompatible"]') - .simulate('click'); + wrapper.find('button[data-test-subj="lns-indexPatternDimension-count"]').simulate('click'); expect(setState.mock.calls[0]).toEqual([expect.any(Function), { isDimensionComplete: true }]); expect(setState.mock.calls[0][0](props.state)).toEqual({ ...props.state, @@ -1188,7 +1176,7 @@ describe('IndexPatternDimensionEditorPanel', () => { ...props.state.layers.first.columns, col2: expect.objectContaining({ timeScale: 'h', - label: 'Count of records per hour', + label: 'Value count of bytes per hour', }), }, }, @@ -1385,9 +1373,7 @@ describe('IndexPatternDimensionEditorPanel', () => { label: 'Sum of bytes per hour', }); wrapper = mount(); - wrapper - .find('button[data-test-subj="lns-indexPatternDimension-count incompatible"]') - .simulate('click'); + wrapper.find('button[data-test-subj="lns-indexPatternDimension-count"]').simulate('click'); expect((props.setState as jest.Mock).mock.calls[0][0](props.state)).toEqual({ ...props.state, layers: { @@ -1523,9 +1509,7 @@ describe('IndexPatternDimensionEditorPanel', () => { label: 'Sum of bytes per hour', }); wrapper = mount(); - wrapper - .find('button[data-test-subj="lns-indexPatternDimension-count incompatible"]') - .simulate('click'); + wrapper.find('button[data-test-subj="lns-indexPatternDimension-count"]').simulate('click'); expect(setState.mock.calls[0]).toEqual([expect.any(Function), { isDimensionComplete: true }]); expect(setState.mock.calls[0][0](props.state)).toEqual({ ...props.state, @@ -1764,10 +1748,6 @@ describe('IndexPatternDimensionEditorPanel', () => { .prop('options'); expect(options![0]['data-test-subj']).not.toContain('Incompatible'); - - options![1].options!.map((operation) => - expect(operation['data-test-subj']).toContain('Incompatible') - ); }); it('should not update when selecting the current field again', () => { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.test.ts index f9afc9a00c98f..f48e4d897a637 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/droppable/get_drop_props.test.ts @@ -362,7 +362,7 @@ describe('IndexPatternDimensionEditorPanel#getDropProps', () => { }) ).toEqual({ dropTypes: ['replace_incompatible', 'replace_duplicate_incompatible'], - nextLabel: 'Minimum', + nextLabel: 'Count', }); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx index 812bb8413137a..f96a6dbd3340e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/indexpattern_suggestions.test.tsx @@ -3030,7 +3030,7 @@ describe('IndexPattern Data Source suggestions', () => { operation: { dataType: 'number', isBucketed: false, - label: 'Cumulative sum of Records label', + label: 'Cumulative sum of Records', scale: undefined, isStaticValue: false, hasTimeShift: false, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts index 8ca21272a555e..d3affb5b32d8c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts @@ -105,7 +105,7 @@ export function convertDataViewIntoLensIndexPattern(dataView: DataView): IndexPa ]) ), fields: newFields, - getFieldByName: getFieldByNameFactory(newFields), + getFieldByName: getFieldByNameFactory(newFields, false), hasRestrictions: !!typeMeta?.aggs, }; } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts index 1a0da126f28e3..dae677663d289 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions.test.ts @@ -211,7 +211,7 @@ describe('time scale transition', () => { ).toEqual( expect.objectContaining({ timeScale: undefined, - label: 'Count of records', + label: 'Value count of bytesLabel', }) ); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx index 888c992031430..d3c0b9700379c 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/count.tsx @@ -11,6 +11,7 @@ import { euiThemeVars } from '@kbn/ui-theme'; import { EuiSwitch } from '@elastic/eui'; import { AggFunctionsMapping } from '@kbn/data-plugin/public'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; +import { TimeScaleUnit } from '../../../../common/expressions'; import { OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn, ValueFormatConfig } from './column_types'; import { IndexPatternField } from '../../types'; @@ -32,6 +33,39 @@ const countLabel = i18n.translate('xpack.lens.indexPattern.countOf', { defaultMessage: 'Count of records', }); +const supportedTypes = new Set([ + 'string', + 'boolean', + 'number', + 'number_range', + 'ip', + 'ip_range', + 'date', + 'date_range', + 'murmur3', +]); + +function ofName( + field: IndexPatternField | undefined, + timeShift: string | undefined, + timeScale: string | undefined +) { + return adjustTimeScaleLabelSuffix( + field?.type !== 'document' + ? i18n.translate('xpack.lens.indexPattern.valueCountOf', { + defaultMessage: 'Value count of {name}', + values: { + name: field?.displayName || '-', + }, + }) + : countLabel, + undefined, + timeScale as TimeScaleUnit, + undefined, + timeShift + ); +} + export type CountIndexPatternColumn = FieldBasedIndexPatternColumn & { operationType: 'count'; params?: { @@ -40,9 +74,11 @@ export type CountIndexPatternColumn = FieldBasedIndexPatternColumn & { }; }; +const SCALE = 'ratio'; +const IS_BUCKETED = false; + export const countOperation: OperationDefinition = { type: 'count', - priority: 2, displayName: i18n.translate('xpack.lens.indexPattern.count', { defaultMessage: 'Count', }), @@ -56,42 +92,27 @@ export const countOperation: OperationDefinition { return { ...oldColumn, - label: adjustTimeScaleLabelSuffix( - field.displayName, - undefined, - oldColumn.timeScale, - undefined, - oldColumn.timeShift - ), + label: ofName(field, oldColumn.timeShift, oldColumn.timeShift), sourceField: field.name, }; }, - getPossibleOperationForField: (field: IndexPatternField) => { - if (field.type === 'document') { - return { - dataType: 'number', - isBucketed: false, - scale: 'ratio', - }; + getPossibleOperationForField: ({ aggregationRestrictions, aggregatable, type }) => { + if ( + type === 'document' || + (aggregatable && + (!aggregationRestrictions || aggregationRestrictions.value_count) && + supportedTypes.has(type)) + ) { + return { dataType: 'number', isBucketed: IS_BUCKETED, scale: SCALE }; } }, - getDefaultLabel: (column) => - adjustTimeScaleLabelSuffix( - countLabel, - undefined, - column.timeScale, - undefined, - column.timeShift - ), + getDefaultLabel: (column, indexPattern) => { + const field = indexPattern.getFieldByName(column.sourceField); + return ofName(field, column.timeShift, column.timeScale); + }, buildColumn({ field, previousColumn }, columnParams) { return { - label: adjustTimeScaleLabelSuffix( - countLabel, - undefined, - previousColumn?.timeScale, - undefined, - previousColumn?.timeShift - ), + label: ofName(field, previousColumn?.timeShift, previousColumn?.timeScale), dataType: 'number', operationType: 'count', isBucketed: false, @@ -147,33 +168,58 @@ export const countOperation: OperationDefinition adjustTimeScaleOnOtherColumnChange(layer, thisColumnId), - toEsAggsFn: (column, columnId) => { - return buildExpressionFunction('aggCount', { - id: columnId, - enabled: true, - schema: 'metric', - // time shift is added to wrapping aggFilteredMetric if filter is set - timeShift: column.filter ? undefined : column.timeShift, - emptyAsNull: column.params?.emptyAsNull, - }).toAst(); + toEsAggsFn: (column, columnId, indexPattern) => { + const field = indexPattern.getFieldByName(column.sourceField); + if (field?.type === 'document') { + return buildExpressionFunction('aggCount', { + id: columnId, + enabled: true, + schema: 'metric', + // time shift is added to wrapping aggFilteredMetric if filter is set + timeShift: column.filter ? undefined : column.timeShift, + emptyAsNull: column.params?.emptyAsNull, + }).toAst(); + } else { + return buildExpressionFunction('aggValueCount', { + id: columnId, + enabled: true, + schema: 'metric', + field: column.sourceField, + // time shift is added to wrapping aggFilteredMetric if filter is set + timeShift: column.filter ? undefined : column.timeShift, + emptyAsNull: column.params?.emptyAsNull, + }).toAst(); + } }, - isTransferable: () => { - return true; + isTransferable: (column, newIndexPattern) => { + const newField = newIndexPattern.getFieldByName(column.sourceField); + + return Boolean( + newField && + (newField.type === 'document' || + (supportedTypes.has(newField.type) && + newField.aggregatable && + (!newField.aggregationRestrictions || newField.aggregationRestrictions.cardinality))) + ); }, timeScalingMode: 'optional', filterable: true, documentation: { section: 'elasticsearch', - signature: '', + signature: i18n.translate('xpack.lens.indexPattern.count.signature', { + defaultMessage: '[field: string]', + }), description: i18n.translate('xpack.lens.indexPattern.count.documentation.markdown', { defaultMessage: ` -Calculates the number of documents. +The total number of documents. When you provide a field as the first argument, the total number of field values is counted. Use the count function for fields that have multiple values in a single document. + +#### Examples + +To calculate the total number of documents, use \`count()\`. -Example: Calculate the number of documents: -\`count()\` +To calculate the number of products in all orders, use \`count(products.id)\`. -Example: Calculate the number of documents matching a certain filter: -\`count(kql='price > 500')\` +To calculate the number of documents that match a specific filter, use \`count(kql='price > 500')\`. `, }), }, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_help.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_help.tsx index 3059318bd562d..bdc774f9d15f3 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_help.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/editor/formula_help.tsx @@ -483,7 +483,7 @@ export function getFunctionSignatureLabel( const def = operationDefinitionMap[name]; let extraArgs = ''; if (def.filterable) { - extraArgs += hasFunctionFieldArgument(name) || 'operationParams' in def ? ',' : ''; + extraArgs += ','; extraArgs += i18n.translate('xpack.lens.formula.kqlExtraArguments', { defaultMessage: '[kql]?: string, [lucene]?: string', }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx index c4402277148c7..1e16c27253d9b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/formula.test.tsx @@ -674,14 +674,6 @@ describe('formula', () => { } }); - it('returns no change but error if an argument is passed to count operation', () => { - const formulas = ['count(7)', 'count("bytes")', 'count(bytes)']; - - for (const formula of formulas) { - testIsBrokenFormula(formula); - } - }); - it('returns no change but error if a required parameter is not passed to the operation in formula', () => { const formula = 'moving_average(average(bytes))'; testIsBrokenFormula(formula); @@ -1124,19 +1116,15 @@ invalid: " } }); - it('returns an error if an argument is passed to count() operation', () => { - const formulas = ['count(7)', 'count("bytes")', 'count(bytes)']; - - for (const formula of formulas) { - expect( - formulaOperation.getErrorMessage!( - getNewLayerWithFormula(formula), - 'col1', - indexPattern, - operationDefinitionMap - ) - ).toEqual(['The operation count does not accept any field as argument']); - } + it('does not return an error if count() is called without a field', () => { + expect( + formulaOperation.getErrorMessage!( + getNewLayerWithFormula('count()'), + 'col1', + indexPattern, + operationDefinitionMap + ) + ).toEqual(undefined); }); it('returns an error if an operation with required parameters does not receive them', () => { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/generate.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/generate.ts index 4be0df4f86c1b..01bae7d7511b0 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/generate.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/generate.ts @@ -6,6 +6,7 @@ */ import { isObject } from 'lodash'; +import { DOCUMENT_FIELD_NAME } from '../../../../../common'; import { FieldBasedIndexPatternColumn, GenericOperationDefinition, @@ -25,7 +26,7 @@ export function getSafeFieldName({ operationType, }: FieldBasedIndexPatternColumn) { // return empty for the records field - if (!fieldName || operationType === 'count') { + if (!fieldName || (operationType === 'count' && fieldName === DOCUMENT_FIELD_NAME)) { return ''; } if (unquotedStringRegex.test(fieldName)) { @@ -66,7 +67,10 @@ export function generateFormula( ', ' + formulaNamedArgs.map(({ name, value }) => `${name}=${value}`).join(', '); } if (previousColumn.filter) { - if (previousColumn.operationType !== 'count') { + if ( + previousColumn.operationType !== 'count' || + ('sourceField' in previousColumn && previousColumn.sourceField !== DOCUMENT_FIELD_NAME) + ) { previousFormula += ', '; } previousFormula += @@ -74,7 +78,11 @@ export function generateFormula( `'${previousColumn.filter.query.replace(/'/g, `\\'`)}'`; // replace all } if (previousColumn.timeShift) { - if (previousColumn.operationType !== 'count' || previousColumn.filter) { + if ( + previousColumn.operationType !== 'count' || + ('sourceField' in previousColumn && previousColumn.sourceField !== DOCUMENT_FIELD_NAME) || + previousColumn.filter + ) { previousFormula += ', '; } previousFormula += `shift='${previousColumn.timeShift}'`; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/parse.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/parse.ts index 371c7e268388b..63e0935a3425b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/parse.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/parse.ts @@ -103,9 +103,10 @@ function extractColumns( if (nodeOperation.input === 'field') { const [fieldName] = variables.filter((v): v is TinymathVariable => isObject(v)); // a validation task passed before executing this and checked already there's a field - const field = shouldHaveFieldArgument(node) - ? indexPattern.getFieldByName(fieldName.value)! - : documentField; + let field = fieldName ? indexPattern.getFieldByName(fieldName.value) : undefined; + if (!shouldHaveFieldArgument(node) && !field) { + field = documentField; + } const mappedParams = { ...mergeWithGlobalFilter( @@ -122,7 +123,8 @@ function extractColumns( { layer, indexPattern, - field, + // checked in the validation phase + field: field!, }, mappedParams ); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts index 5936b90c095ec..28e015e4fc0b5 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts @@ -638,23 +638,23 @@ function runFullASTValidation( } } else { if (nodeOperation.input === 'field') { - if (shouldHaveFieldArgument(node)) { - if (!isArgumentValidType(firstArg, 'variable')) { - if (isMathNode(firstArg)) { - errors.push( - getMessageFromId({ - messageId: 'wrongFirstArgument', - values: { - operation: node.name, - type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { - defaultMessage: 'field', - }), - argument: `math operation`, - }, - locations: node.location ? [node.location] : [], - }) - ); - } else { + if (!isArgumentValidType(firstArg, 'variable')) { + if (isMathNode(firstArg)) { + errors.push( + getMessageFromId({ + messageId: 'wrongFirstArgument', + values: { + operation: node.name, + type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { + defaultMessage: 'field', + }), + argument: `math operation`, + }, + locations: node.location ? [node.location] : [], + }) + ); + } else { + if (shouldHaveFieldArgument(node)) { errors.push( getMessageFromId({ messageId: 'wrongFirstArgument', @@ -673,41 +673,28 @@ function runFullASTValidation( }) ); } - } else { - // If the first argument is valid proceed with the other arguments validation - const fieldErrors = validateFieldArguments(node, variables, { - isFieldOperation: true, - firstArg, - returnedType: getReturnedType(nodeOperation, indexPattern, firstArg), - }); - if (fieldErrors.length) { - errors.push(...fieldErrors); - } } - const functionErrors = validateFunctionArguments(node, functions, 0, { + } else { + // If the first argument is valid proceed with the other arguments validation + const fieldErrors = validateFieldArguments(node, variables, { isFieldOperation: true, - type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { - defaultMessage: 'field', - }), - firstArgValidation: false, + firstArg, + returnedType: getReturnedType(nodeOperation, indexPattern, firstArg), }); - if (functionErrors.length) { - errors.push(...functionErrors); - } - } else { - // Named arguments only - if (functions?.length || variables?.length) { - errors.push( - getMessageFromId({ - messageId: 'shouldNotHaveField', - values: { - operation: node.name, - }, - locations: node.location ? [node.location] : [], - }) - ); + if (fieldErrors.length) { + errors.push(...fieldErrors); } } + const functionErrors = validateFunctionArguments(node, functions, 0, { + isFieldOperation: true, + type: i18n.translate('xpack.lens.indexPattern.formulaFieldValue', { + defaultMessage: 'field', + }), + firstArgValidation: false, + }); + if (functionErrors.length) { + errors.push(...functionErrors); + } if (!canHaveParams(nodeOperation) && namedArguments.length) { errors.push( getMessageFromId({ diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx index 335677b279132..c4661d6799df5 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/terms.test.tsx @@ -2555,13 +2555,19 @@ describe('terms', () => { const functionComboBox = comboBoxes.filter( '[data-test-subj="indexPattern-reference-function"]' ); - const fieldComboBox = comboBoxes.filter('[data-test-subj="indexPattern-dimension-field"]'); const option = functionComboBox.prop('options')!.find(({ label }) => label === 'Average')!; act(() => { functionComboBox.prop('onChange')!([option]); }); + instance.update(); - expect(fieldComboBox.prop('isInvalid')).toBeTruthy(); + expect( + instance + .find('ReferenceEditor') + .find(EuiComboBox) + .filter('[data-test-subj="indexPattern-dimension-field"]') + .prop('isInvalid') + ).toBeTruthy(); expect(updateLayerSpy).not.toHaveBeenCalled(); }); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts index 0f626cef850f9..4e3ee9b1ff66f 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.test.ts @@ -56,7 +56,7 @@ describe('getOperationTypesForField', () => { aggregatable: true, searchable: true, }) - ).toEqual(['terms', 'unique_count', 'last_value']); + ).toEqual(['terms', 'unique_count', 'last_value', 'count']); }); it('should return only bucketed operations on strings when passed proper filterOperations function', () => { @@ -96,6 +96,7 @@ describe('getOperationTypesForField', () => { 'percentile', 'percentile_rank', 'last_value', + 'count', ]); }); @@ -122,6 +123,7 @@ describe('getOperationTypesForField', () => { 'percentile', 'percentile_rank', 'last_value', + 'count', ]); }); @@ -388,6 +390,21 @@ describe('getOperationTypesForField', () => { "operationType": "last_value", "type": "field", }, + Object { + "field": "timestamp", + "operationType": "count", + "type": "field", + }, + Object { + "field": "bytes", + "operationType": "count", + "type": "field", + }, + Object { + "field": "source", + "operationType": "count", + "type": "field", + }, Object { "operationType": "math", "type": "managedReference", diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.ts index e22fb30b23b27..6c81634fb4c09 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/pure_helpers.ts @@ -7,6 +7,7 @@ import { keyBy } from 'lodash'; import { IndexPatternField, IndexPatternPrivateState } from './types'; +import { documentField } from './document_field'; export function fieldExists( existingFields: IndexPatternPrivateState['existingFields'], @@ -16,7 +17,13 @@ export function fieldExists( return existingFields[indexPatternTitle] && existingFields[indexPatternTitle][fieldName]; } -export function getFieldByNameFactory(newFields: IndexPatternField[]) { +export function getFieldByNameFactory( + newFields: IndexPatternField[], + addRecordsField: boolean = true +) { const fieldsLookup = keyBy(newFields, 'name'); + if (addRecordsField) { + fieldsLookup[documentField.name] = documentField; + } return (name: string) => fieldsLookup[name]; } diff --git a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts b/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts index 5022852bf08ff..bfb573636383d 100644 --- a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts +++ b/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts @@ -105,7 +105,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.getDimensionTriggersTexts('lnsXY_splitDimensionPanel') ).to.eql([]); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Unique count of @message.raw', + 'Value count of @message.raw', ]); }); it('should duplicate the column when dragging to empty dimension in the same group', async () => { @@ -118,9 +118,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { to: 'lnsXY_yDimensionPanel > lns-empty-dimension', }); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Unique count of @message.raw', - 'Unique count of @message.raw [1]', - 'Unique count of @message.raw [2]', + 'Value count of @message.raw', + 'Value count of @message.raw [1]', + 'Value count of @message.raw [2]', ]); }); it('should move duplicated column to non-compatible dimension group', async () => { @@ -129,8 +129,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { to: 'lnsXY_xDimensionPanel > lns-empty-dimension', }); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Unique count of @message.raw', - 'Unique count of @message.raw [1]', + 'Value count of @message.raw', + 'Value count of @message.raw [1]', ]); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_xDimensionPanel')).to.eql([ 'Top 5 values of @message.raw', @@ -160,7 +160,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'swap' ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_yDimensionPanel')).to.eql( - 'Unique count of @timestamp' + 'Value count of @timestamp' ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_splitDimensionPanel')).to.eql( 'Top 3 values of @message.raw' @@ -297,14 +297,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dimensionKeyboardDragDrop('lnsXY_xDimensionPanel', 0, 2); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ 'Count of records', - 'Unique count of @timestamp', + 'Value count of @timestamp', ]); - await PageObjects.lens.assertFocusedDimension('Unique count of @timestamp'); + await PageObjects.lens.assertFocusedDimension('Value count of @timestamp'); }); it('should reorder elements with keyboard', async () => { await PageObjects.lens.dimensionKeyboardReorder('lnsXY_yDimensionPanel', 0, 1); expect(await PageObjects.lens.getDimensionTriggersTexts('lnsXY_yDimensionPanel')).to.eql([ - 'Unique count of @timestamp', + 'Value count of @timestamp', 'Count of records', ]); await PageObjects.lens.assertFocusedDimension('Count of records'); diff --git a/x-pack/test/functional/apps/lens/group3/gauge.ts b/x-pack/test/functional/apps/lens/group3/gauge.ts index ea029793ddfc0..0a283c4fc62f7 100644 --- a/x-pack/test/functional/apps/lens/group3/gauge.ts +++ b/x-pack/test/functional/apps/lens/group3/gauge.ts @@ -53,7 +53,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.configureDimension({ dimension: 'lnsGauge_metricDimensionPanel > lns-dimensionTrigger', operation: 'count', - isPreviousIncompatible: true, + field: 'Records', + isPreviousIncompatible: false, keepOpen: true, }); From 678d59e8ec805e4ebe567d987c72a3e854284000 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 22 Jul 2022 17:25:04 +0200 Subject: [PATCH 10/78] [Lens] Change wording in error message (#136931) * change wording * format the label with the right default formatter * Revert "format the label with the right default formatter" This reverts commit db2ce95a29289e4b6326f349b8bf0dc74475f490. --- x-pack/plugins/lens/public/indexpattern_datasource/utils.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/utils.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/utils.tsx index fe12328e3177a..dc95f06aa8ac6 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/utils.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/utils.tsx @@ -504,7 +504,7 @@ export function getFiltersInLayer( return { error: i18n.translate('xpack.lens.indexPattern.nonDefaultTimeFieldError', { defaultMessage: - 'Underlying data does not support date histograms on non-default time fields if time field is set on the data view', + '"Explore data in Discover" does not support date histograms on non-default time fields if time field is set on the data view', }), }; } From a59ba34397f0f1d66ff54bbbe33afed223ac588e Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Fri, 22 Jul 2022 17:30:08 +0200 Subject: [PATCH 11/78] [SecuritySolution] Update Save Timeline button behaviour (#136724) * Update Save Timeline button behaviour based on the user privileges Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../integration/timelines/creation.spec.ts | 32 +++- .../cypress/screens/timeline.ts | 4 + .../security_solution/cypress/tasks/login.ts | 10 +- .../header/save_timeline_button.test.tsx | 138 ++++++++++++------ .../timeline/header/save_timeline_button.tsx | 25 +++- 5 files changed, 155 insertions(+), 54 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/timelines/creation.spec.ts b/x-pack/plugins/security_solution/cypress/integration/timelines/creation.spec.ts index 30ab386efebb7..d62e73b321d53 100644 --- a/x-pack/plugins/security_solution/cypress/integration/timelines/creation.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/timelines/creation.spec.ts @@ -6,6 +6,7 @@ */ import { getTimeline } from '../../objects/timeline'; +import { ROLES } from '../../../common/test'; import { LOCKED_ICON, @@ -19,6 +20,8 @@ import { TIMELINE_PANEL, TIMELINE_TAB_CONTENT_EQL, TIMELINE_TAB_CONTENT_GRAPHS_NOTES, + EDIT_TIMELINE_BTN, + EDIT_TIMELINE_TOOLTIP, } from '../../screens/timeline'; import { createTimelineTemplate } from '../../tasks/api_calls/timelines'; @@ -48,6 +51,7 @@ describe('Create a timeline from a template', () => { createTimelineTemplate(getTimeline()); visitWithoutDateRange(TIMELINE_TEMPLATES_URL); }); + it('Should have the same query and open the timeline modal', () => { selectCustomTemplates(); expandEventAction(); @@ -71,10 +75,30 @@ describe('Timelines', (): void => { after(() => { closeTimeline(); }); + context('Privileges: CRUD', () => { + it('toggle create timeline ', () => { + createNewTimeline(); + addNameAndDescriptionToTimeline(getTimeline()); + cy.get(TIMELINE_PANEL).should('be.visible'); + }); + }); - it('toggle create timeline ', () => { - createNewTimeline(); - cy.get(TIMELINE_PANEL).should('be.visible'); + context('Privileges: READ', () => { + before(() => { + login(ROLES.reader); + visit(OVERVIEW_URL, undefined, ROLES.reader); + }); + it('should not be able to create/update timeline ', () => { + createNewTimeline(); + cy.get(TIMELINE_PANEL).should('be.visible'); + cy.get(EDIT_TIMELINE_BTN).should('be.disabled'); + cy.get(EDIT_TIMELINE_BTN).first().trigger('mouseover', { force: true }); + cy.get(EDIT_TIMELINE_TOOLTIP).should('be.visible'); + cy.get(EDIT_TIMELINE_TOOLTIP).should( + 'have.text', + 'You can use Timeline to investigate events, but you do not have the required permissions to save timelines for future use. If you need to save timelines, contact your Kibana administrator.' + ); + }); }); }); @@ -84,6 +108,8 @@ describe('Timelines', (): void => { }); before(() => { + login(); + visit(OVERVIEW_URL); openTimelineUsingToggle(); addNameAndDescriptionToTimeline(getTimeline()); populateTimeline(); diff --git a/x-pack/plugins/security_solution/cypress/screens/timeline.ts b/x-pack/plugins/security_solution/cypress/screens/timeline.ts index 60347ffe1293a..231c24b3127f3 100644 --- a/x-pack/plugins/security_solution/cypress/screens/timeline.ts +++ b/x-pack/plugins/security_solution/cypress/screens/timeline.ts @@ -263,3 +263,7 @@ export const TIMELINE_TAB_CONTENT_GRAPHS_NOTES = export const TIMESTAMP_HOVER_ACTION_OVERFLOW_BTN = '[data-test-subj="more-actions-@timestamp"]'; export const USER_KPI = '[data-test-subj="siem-timeline-user-kpi"]'; + +export const EDIT_TIMELINE_BTN = '[data-test-subj="save-timeline-button-icon"]'; + +export const EDIT_TIMELINE_TOOLTIP = '[data-test-subj="save-timeline-btn-tooltip"]'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/login.ts b/x-pack/plugins/security_solution/cypress/tasks/login.ts index 7bf00aa573c83..a86948b383385 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/login.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/login.ts @@ -312,9 +312,15 @@ export const waitForPage = (url: string) => { ); }; -export const visit = (url: string, onBeforeLoadCallback?: (win: Cypress.AUTWindow) => void) => { +export const visit = ( + url: string, + onBeforeLoadCallback?: (win: Cypress.AUTWindow) => void, + role?: ROLES +) => { cy.visit( - `${url}?timerange=(global:(linkTo:!(timeline),timerange:(from:1547914976217,fromStr:'2019-01-19T16:22:56.217Z',kind:relative,to:1579537385745,toStr:now)),timeline:(linkTo:!(global),timerange:(from:1547914976217,fromStr:'2019-01-19T16:22:56.217Z',kind:relative,to:1579537385745,toStr:now)))`, + `${ + role ? getUrlWithRoute(role, url) : url + }?timerange=(global:(linkTo:!(timeline),timerange:(from:1547914976217,fromStr:'2019-01-19T16:22:56.217Z',kind:relative,to:1579537385745,toStr:now)),timeline:(linkTo:!(global),timerange:(from:1547914976217,fromStr:'2019-01-19T16:22:56.217Z',kind:relative,to:1579537385745,toStr:now)))`, { onBeforeLoad(win) { if (onBeforeLoadCallback) { diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.test.tsx index 7a54c80e82593..ee67b469e9250 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.test.tsx @@ -6,9 +6,18 @@ */ import React from 'react'; -import { mount } from 'enzyme'; +import { render, fireEvent, waitFor, screen } from '@testing-library/react'; +import type { SaveTimelineComponentProps } from './save_timeline_button'; import { SaveTimelineButton } from './save_timeline_button'; import { TestProviders } from '../../../../common/mock'; +import { useUserPrivileges } from '../../../../common/components/user_privileges'; + +const TEST_ID = { + SAVE_TIMELINE_MODAL: 'save-timeline-modal', + SAVE_TIMELINE_BTN: 'save-timeline-button-icon', + SAVE_TIMELINE_TOOLTIP: 'save-timeline-tooltip', +}; + jest.mock('react-redux', () => { const actual = jest.requireActual('react-redux'); return { @@ -16,59 +25,100 @@ jest.mock('react-redux', () => { useDispatch: jest.fn(), }; }); + jest.mock('../../../../common/lib/kibana'); -jest.mock('./title_and_description'); + +jest.mock('../../../../common/components/user_privileges'); + +const props = { + initialFocus: 'title' as const, + timelineId: 'timeline-1', + toolTip: 'tooltip message', +}; + +const TestSaveTimelineButton = (_props: SaveTimelineComponentProps) => ( + + + +); + +jest.mock('raf', () => { + return jest.fn().mockImplementation((cb) => cb()); +}); + describe('SaveTimelineButton', () => { - const props = { - initialFocus: 'title' as const, - timelineId: 'timeline-1', - toolTip: 'tooltip message', - }; - test('Show tooltip', () => { - const component = mount( - - - - ); - expect(component.find('[data-test-subj="save-timeline-btn-tooltip"]').exists()).toEqual(true); + beforeEach(() => { + jest.clearAllMocks(); }); - test('Hide tooltip', () => { - const component = mount( - - - - ); - component.find('[data-test-subj="save-timeline-button-icon"]').first().simulate('click'); - expect(component.find('[data-test-subj="save-timeline-btn-tooltip"]').exists()).toEqual(false); + + // skipping this test because popover is not getting visible by RTL gestures. + // + // Raised a bug with eui team: https://github.com/elastic/eui/issues/6065 + xit('Show tooltip', async () => { + render(); + const saveTimelineIcon = screen.queryAllByTestId(TEST_ID.SAVE_TIMELINE_BTN)[0]; + + fireEvent.mouseOver(saveTimelineIcon); + + jest.runAllTimers(); + + await waitFor(() => { + expect(screen.getByRole('tooltip')).toBeVisible(); + }); }); - test('should show a button with pencil icon', () => { - const component = mount( - - - + + it('should show a button with pencil icon', () => { + render(); + + expect(screen.getByTestId(TEST_ID.SAVE_TIMELINE_BTN).firstChild).toHaveAttribute( + 'data-euiicon-type', + 'pencil' ); - expect( - component.find('[data-test-subj="save-timeline-button-icon"]').first().prop('iconType') - ).toEqual('pencil'); }); - test('should not show a modal when showOverlay equals false', () => { - const component = mount( + + it('should have edit timeline btn disabled with tooltip if user does not have write access', () => { + (useUserPrivileges as jest.Mock).mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: false }, + }); + render( ); - expect(component.find('[data-test-subj="save-timeline-modal"]').exists()).toEqual(false); + expect(screen.getByTestId(TEST_ID.SAVE_TIMELINE_BTN)).toBeDisabled(); }); - test('should show a modal when showOverlay equals true', () => { - const component = mount( - - - - ); - expect(component.find('[data-test-subj="save-timeline-btn-tooltip"]').exists()).toEqual(true); - expect(component.find('[data-test-subj="save-timeline-modal-comp"]').exists()).toEqual(false); - component.find('[data-test-subj="save-timeline-button-icon"]').first().simulate('click'); - expect(component.find('[data-test-subj="save-timeline-btn-tooltip"]').exists()).toEqual(false); - expect(component.find('[data-test-subj="save-timeline-modal-comp"]').exists()).toEqual(true); + + it('should not show modal if user does not have write access', async () => { + (useUserPrivileges as jest.Mock).mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: false }, + }); + render(); + + expect(screen.queryByTestId(TEST_ID.SAVE_TIMELINE_MODAL)).not.toBeInTheDocument(); + + const saveTimelineIcon = screen.getByTestId(TEST_ID.SAVE_TIMELINE_BTN); + + fireEvent.click(saveTimelineIcon); + + await waitFor(() => { + expect(screen.queryAllByTestId(TEST_ID.SAVE_TIMELINE_MODAL)).toHaveLength(0); + }); + }); + + it('should show a modal when user has crud privileges', async () => { + (useUserPrivileges as jest.Mock).mockReturnValue({ + kibanaSecuritySolutionsPrivileges: { crud: true }, + }); + render(); + expect(screen.queryByTestId(TEST_ID.SAVE_TIMELINE_MODAL)).not.toBeInTheDocument(); + + const saveTimelineIcon = screen.queryAllByTestId(TEST_ID.SAVE_TIMELINE_BTN)[0]; + + fireEvent.click(saveTimelineIcon); + + await waitFor(() => { + expect(screen.queryByTestId(TEST_ID.SAVE_TIMELINE_TOOLTIP)).not.toBeInTheDocument(); + expect(screen.queryAllByTestId(TEST_ID.SAVE_TIMELINE_MODAL)[0]).toBeVisible(); + }); }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx index 9a18872a59168..20657356063c7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/header/save_timeline_button.tsx @@ -8,13 +8,14 @@ import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import React, { useCallback, useMemo, useState } from 'react'; import { useDispatch } from 'react-redux'; +import { useUserPrivileges } from '../../../../common/components/user_privileges'; import { TimelineId } from '../../../../../common/types/timeline'; import { useDeepEqualSelector } from '../../../../common/hooks/use_selector'; import { timelineActions } from '../../../store/timeline'; import { getTimelineSaveModalByIdSelector } from './selectors'; import { TimelineTitleAndDescription } from './title_and_description'; -import { EDIT } from './translations'; +import * as timelineTranslations from './translations'; export interface SaveTimelineComponentProps { initialFocus: 'title' | 'description'; @@ -45,23 +46,37 @@ export const SaveTimelineButton = React.memo( setShowSaveTimelineOverlay(true); }, [setShowSaveTimelineOverlay]); + // Case: 1 + // check if user has crud privileges so that user can be allowed to edit the timeline + // Case: 2 + // TODO: User may have Crud privileges but they may not have access to timeline index. + // Do we need to check that? + const { + kibanaSecuritySolutionsPrivileges: { crud: hasKibanaCrud }, + } = useUserPrivileges(); + + const finalTooltipMsg = useMemo( + () => (hasKibanaCrud ? toolTip : timelineTranslations.CALL_OUT_UNAUTHORIZED_MSG), + [toolTip, hasKibanaCrud] + ); + const saveTimelineButtonIcon = useMemo( () => ( ), - [openSaveTimeline] + [openSaveTimeline, hasKibanaCrud] ); return (initialFocus === 'title' && show) || showSaveTimelineOverlay ? ( <> {saveTimelineButtonIcon} ( /> ) : ( - + {saveTimelineButtonIcon} ); From 7a36cf3ab57907de252225da284394f8c7dc0bcf Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Fri, 22 Jul 2022 17:47:05 +0200 Subject: [PATCH 12/78] [SecuritySolution] Introduce Insights and related alerts by process ancestry (#136009) * feat: introduce related alerts to highlighted fields * fix: `dataProvider` is `dataProviders` now * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * extend `_source` and add `fields` definition * allow to include alert ids when fetching prevalence info * fix: remove broken type import * feat: add insight accordions * feat: show investigate in TL buttons on related-x modules * test: move related_cases tests to new location * chore: remove unused translations * test: remove unused tests * chore: remove unused test data * feat: show limited data note * feat: add `sort` param * test: fix props in test * feat: add click-to-view to process ancestry accordion * test: fix mock import * chore: change order of insight items * chore: use compressed table * chore: update spacing * chore: add empty state to InsightsAccordion * chore: == > === * test: fix related cases test * chore: comments * test: remove unnecessary `describe` * test: add more tests * fix: remove unused props * chore: simplify the interface of * chore: move translations to their own file * feat: hide related alerts by process ancestry behind feature flag * test: add insights tests * test: add more tests * test: add flyout tests - Moves the old flyout test to a new file - Adds a new test case for the related alerts by session use case * chore: comments * fix: typo * feat: remove background color in empty state * test: the `auditbeat` archive is loaded by default - also: removing the `auditbeat` archive can lead to unwanted side-effects (TIL) * test: refactor cypress test - use `closeTimeline()` - move `openOverview()` to beforeEach * test: remove unnecessary call to `openOverview()` * fix: make sure related cases has a loading state * chore: remove unused file * chore: remove unused translations * chore: remove unused translations Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../query_signals_index_schema.test.ts | 52 +++++- .../request/query_signals_index_schema.ts | 4 +- .../common/experimental_features.ts | 5 + .../detection_alerts/alert_flyout.spec.ts | 80 ++++++++ .../detection_alerts/alerts_details.spec.ts | 22 +-- .../cypress/screens/alerts_details.ts | 4 + .../event_details/alert_summary_view.test.tsx | 9 +- .../event_details/event_details.tsx | 12 +- .../event_details/get_alert_summary_rows.tsx | 2 - .../insights/insight_accordion.test.tsx | 71 +++++++ .../insights/insight_accordion.tsx | 100 ++++++++++ .../event_details/insights/insights.test.tsx | 80 ++++++++ .../event_details/insights/insights.tsx | 127 +++++++++++++ ...elated_alerts_by_process_ancestry.test.tsx | 123 +++++++++++++ .../related_alerts_by_process_ancestry.tsx | 173 ++++++++++++++++++ .../related_alerts_by_session.test.tsx | 122 ++++++++++++ .../insights/related_alerts_by_session.tsx | 119 ++++++++++++ .../related_alerts_by_source_event.test.tsx | 122 ++++++++++++ .../related_alerts_by_source_event.tsx | 119 ++++++++++++ .../{ => insights}/related_cases.test.tsx | 51 ++++-- .../event_details/insights/related_cases.tsx | 129 +++++++++++++ .../insights/simple_alert_table.test.tsx | 111 +++++++++++ .../insights/simple_alert_table.tsx | 80 ++++++++ .../event_details/insights/translations.ts | 116 ++++++++++++ .../event_details/related_cases.tsx | 101 ---------- .../event_details/summary_view.test.tsx | 7 +- .../event_details/table/action_cell.tsx | 4 +- .../investigate_in_timeline_button.test.tsx | 61 +----- .../table/investigate_in_timeline_button.tsx | 63 +++---- .../event_details/table/prevalence_cell.tsx | 81 +++++--- .../table/use_action_cell_data_provider.ts | 31 ++-- .../components/event_details/translations.ts | 11 -- .../containers/alerts/use_alert_prevalence.ts | 27 ++- .../use_alert_prevalence_from_process_tree.ts | 110 +++++++++++ .../alerts/use_alerts_by_ids.test.tsx | 99 ++++++++++ .../containers/alerts/use_alerts_by_ids.ts | 65 +++++++ .../routes/signals/query_signals_route.ts | 11 +- .../translations/translations/fr-FR.json | 5 - .../translations/translations/ja-JP.json | 5 - .../translations/translations/zh-CN.json | 5 - .../es_archives/auditbeat/data.json | 7 +- 41 files changed, 2193 insertions(+), 333 deletions(-) create mode 100644 x-pack/plugins/security_solution/cypress/integration/detection_alerts/alert_flyout.spec.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/insight_accordion.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/insight_accordion.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.tsx rename x-pack/plugins/security_solution/public/common/components/event_details/{ => insights}/related_cases.test.tsx (64%) create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.tsx create mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/insights/translations.ts delete mode 100644 x-pack/plugins/security_solution/public/common/components/event_details/related_cases.tsx create mode 100644 x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence_from_process_tree.ts create mode 100644 x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.test.tsx create mode 100644 x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts index f2c1313f9e592..41677055d6adf 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.test.ts @@ -76,7 +76,19 @@ describe('query, aggs, size, _source and track_total_hits on signals index', () expect(message.schema).toEqual(payload); }); - test('_source only', () => { + test('_source only (as string)', () => { + const payload: QuerySignalsSchema = { + _source: 'field', + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('_source only (as string[])', () => { const payload: QuerySignalsSchema = { _source: ['field'], }; @@ -87,4 +99,42 @@ describe('query, aggs, size, _source and track_total_hits on signals index', () expect(getPaths(left(message.errors))).toEqual([]); expect(message.schema).toEqual(payload); }); + + test('_source only (as boolean)', () => { + const payload: QuerySignalsSchema = { + _source: false, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('fields only', () => { + const payload: QuerySignalsSchema = { + fields: ['test*'], + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('sort only', () => { + const payload: QuerySignalsSchema = { + sort: { + '@payload': 'desc', + }, + }; + + const decoded = querySignalsSchema.decode(payload); + const checked = exactCheck(payload, decoded); + const message = pipe(checked, foldLeftRight); + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); }); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts index 083c60a0a8527..7c0283f3f2a80 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/query_signals_index_schema.ts @@ -14,8 +14,10 @@ export const querySignalsSchema = t.exact( aggs: t.object, size: PositiveInteger, track_total_hits: t.boolean, - _source: t.array(t.string), + _source: t.union([t.boolean, t.string, t.array(t.string)]), + fields: t.array(t.string), runtime_mappings: t.unknown, + sort: t.object, }) ); diff --git a/x-pack/plugins/security_solution/common/experimental_features.ts b/x-pack/plugins/security_solution/common/experimental_features.ts index e29726ce1ceac..e7c0a711100fb 100644 --- a/x-pack/plugins/security_solution/common/experimental_features.ts +++ b/x-pack/plugins/security_solution/common/experimental_features.ts @@ -41,6 +41,11 @@ export const allowedExperimentalValues = Object.freeze({ * Enables the cloud security posture navigation inside the security solution */ cloudSecurityPostureNavigation: false, + + /** + * Enables the insights module for related alerts by process ancestry + */ + insightsRelatedAlertsByProcessAncestry: false, }); type ExperimentalConfigKeys = Array; diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alert_flyout.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alert_flyout.spec.ts new file mode 100644 index 0000000000000..6cde2ac1d10eb --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alert_flyout.spec.ts @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + ALERT_FLYOUT, + SUMMARY_VIEW_PREVALENCE_CELL, + SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON, + INSIGHTS_RELATED_ALERTS_BY_SESSION, + INSIGHTS_INVESTIGATE_IN_TIMELINE_BUTTON, +} from '../../screens/alerts_details'; +import { QUERY_TAB_BUTTON, TIMELINE_TITLE } from '../../screens/timeline'; + +import { expandFirstAlert } from '../../tasks/alerts'; +import { closeTimeline } from '../../tasks/timeline'; +import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; +import { cleanKibana } from '../../tasks/common'; +import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; +import { login, visitWithoutDateRange } from '../../tasks/login'; + +import { getNewRule } from '../../objects/rule'; + +import { ALERTS_URL } from '../../urls/navigation'; + +describe('Alert Flyout', () => { + before(() => { + cleanKibana(); + login(); + createCustomRuleEnabled(getNewRule(), 'rule1'); + visitWithoutDateRange(ALERTS_URL); + waitForAlertsToPopulate(); + expandFirstAlert(); + }); + + afterEach(() => { + closeTimeline(); + }); + + it('Opens a new timeline investigation (from a prevalence field)', () => { + cy.get(SUMMARY_VIEW_PREVALENCE_CELL) + .first() + .invoke('text') + .then((alertCount) => { + // Click on the first button that lets us investigate in timeline + cy.get(ALERT_FLYOUT).find(SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON).first().click(); + + // Make sure a new timeline is created and opened + cy.get(TIMELINE_TITLE).should('contain.text', 'Untitled timeline'); + + // The alert count in this timeline should match the count shown on the alert flyout + cy.get(QUERY_TAB_BUTTON).should('contain.text', alertCount); + }); + }); + + it('Opens a new timeline investigation (from an insights module)', () => { + cy.get(INSIGHTS_RELATED_ALERTS_BY_SESSION) + .click() + .invoke('text') + .then((relatedAlertsBySessionText) => { + // Extract the count from the text + const alertCount = relatedAlertsBySessionText.match(/(\d)/); + const actualCount = alertCount && alertCount[0]; + + // Make sure we can see the table + cy.contains('New Rule Test').should('be.visible'); + + // Click on the first button that lets us investigate in timeline + cy.get(ALERT_FLYOUT).find(INSIGHTS_INVESTIGATE_IN_TIMELINE_BUTTON).click(); + + // Make sure a new timeline is created and opened + cy.get(TIMELINE_TITLE).should('contain.text', 'Untitled timeline'); + + // The alert count in this timeline should match the count shown on the alert flyout + cy.get(QUERY_TAB_BUTTON).should('contain.text', actualCount); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts index 865be928e832e..d2162daed9250 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_alerts/alerts_details.spec.ts @@ -11,13 +11,10 @@ import { JSON_TEXT, TABLE_CONTAINER, TABLE_ROWS, - SUMMARY_VIEW_PREVALENCE_CELL, - SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON, } from '../../screens/alerts_details'; -import { QUERY_TAB_BUTTON, TIMELINE_TITLE } from '../../screens/timeline'; import { expandFirstAlert } from '../../tasks/alerts'; -import { openJsonView, openOverview, openTable } from '../../tasks/alerts_details'; +import { openJsonView, openTable } from '../../tasks/alerts_details'; import { createCustomRuleEnabled } from '../../tasks/api_calls/rules'; import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; @@ -87,21 +84,4 @@ describe('Alert details with unmapped fields', () => { expect($tableContainer[0].scrollLeft).to.equal(4); }); }); - - it('Opens a new timeline investigation', () => { - openOverview(); - - cy.get(SUMMARY_VIEW_PREVALENCE_CELL) - .invoke('text') - .then((alertCount) => { - // Click on the first button that lets us investigate in timeline - cy.get(ALERT_FLYOUT).find(SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON).click(); - - // Make sure a new timeline is created and opened - cy.get(TIMELINE_TITLE).should('contain.text', 'Untitled timeline'); - - // The alert count in this timeline should match the count shown on the alert flyout - cy.get(QUERY_TAB_BUTTON).should('contain.text', alertCount); - }); - }); }); diff --git a/x-pack/plugins/security_solution/cypress/screens/alerts_details.ts b/x-pack/plugins/security_solution/cypress/screens/alerts_details.ts index 16f4ec4e7e6ef..a4580105d673c 100644 --- a/x-pack/plugins/security_solution/cypress/screens/alerts_details.ts +++ b/x-pack/plugins/security_solution/cypress/screens/alerts_details.ts @@ -73,3 +73,7 @@ export const OVERVIEW_TAB = '[data-test-subj="overviewTab"]'; export const SUMMARY_VIEW_PREVALENCE_CELL = `${SUMMARY_VIEW} [data-test-subj='alert-prevalence']`; export const SUMMARY_VIEW_INVESTIGATE_IN_TIMELINE_BUTTON = `${SUMMARY_VIEW} [aria-label='Investigate in timeline']`; + +export const INSIGHTS_RELATED_ALERTS_BY_SESSION = `[data-test-subj='related-alerts-by-session']`; + +export const INSIGHTS_INVESTIGATE_IN_TIMELINE_BUTTON = `${INSIGHTS_RELATED_ALERTS_BY_SESSION} [aria-label='Investigate in timeline']`; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx index e0607df1c3462..fdcb74b6ee9b3 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx @@ -74,14 +74,7 @@ describe('AlertSummaryView', () => { ); - [ - 'host.name', - 'user.name', - i18n.RULE_TYPE, - 'query', - i18n.SOURCE_EVENT_ID, - i18n.SESSION_ID, - ].forEach((fieldId) => { + ['host.name', 'user.name', i18n.RULE_TYPE, 'query'].forEach((fieldId) => { expect(getByText(fieldId)); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx index 3c0102cd64513..d94979d705512 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/event_details.tsx @@ -41,7 +41,7 @@ import { Reason } from './reason'; import { InvestigationGuideView } from './investigation_guide_view'; import { Overview } from './overview'; import type { HostRisk } from '../../../risk_score/containers'; -import { RelatedCases } from './related_cases'; +import { Insights } from './insights/insights'; type EventViewTab = EuiTabbedContentTab; @@ -170,7 +170,6 @@ const EventDetailsComponent: React.FC = ({ /> - = ({ goToTable={goToTableTab} /> + + + {(enrichmentCount > 0 || hostRisk) && ( null; + +describe('InsightAccordion', () => { + it("shows a loading indicator when it's in the loading state", () => { + const loadingText = 'loading text'; + render( + + + + ); + + expect(screen.getByText(loadingText)).toBeInTheDocument(); + }); + + it("shows an error when it's in the error state", () => { + const errorText = 'error text'; + render( + + + + ); + + expect(screen.getByText(errorText)).toBeInTheDocument(); + }); + + it("shows the text and a disabled button when it's in the empty state", () => { + const text = 'the text'; + render( + + + + ); + + const button = screen.getByRole('button', { name: text }); + expect(button).toBeInTheDocument(); + expect(button).toHaveAttribute('aria-disabled'); + }); + + it('shows the text and renders the correct content', () => { + const text = 'the text'; + const contentText = 'content text'; + const contentRenderer = () => {contentText}; + render( + + + + ); + + expect(screen.getByText(text)).toBeInTheDocument(); + expect(screen.getByText(contentText)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/insight_accordion.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/insight_accordion.tsx new file mode 100644 index 0000000000000..f84b306f1bc93 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/insight_accordion.tsx @@ -0,0 +1,100 @@ +/* + * Copyright 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 { ReactNode } from 'react'; +import React from 'react'; +import { noop } from 'lodash/fp'; +import type { EuiAccordionProps } from '@elastic/eui'; +import { EuiAccordion, EuiIcon, useGeneratedHtmlId } from '@elastic/eui'; +import { euiStyled } from '@kbn/kibana-react-plugin/common'; + +const StyledAccordion = euiStyled(EuiAccordion)` + border: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; + padding: 10px 8px; + border-radius: 6px; +`; + +const EmptyAccordion = euiStyled(StyledAccordion)` + color: ${({ theme }) => theme.eui.euiColorDisabledText}; + pointer-events: none; +`; + +export type InsightAccordionState = 'loading' | 'error' | 'success' | 'empty'; + +interface Props { + prefix: string; + state: InsightAccordionState; + text: string; + renderContent: () => ReactNode; + onToggle?: EuiAccordionProps['onToggle']; +} + +/** + * A special accordion that is used in the Insights section on the alert flyout. + * It wraps logic and custom styling around the loading, error and success states of an insight section. + */ +export const InsightAccordion = React.memo( + ({ prefix, state, text, renderContent, onToggle = noop }) => { + const accordionId = useGeneratedHtmlId({ prefix }); + + switch (state) { + case 'loading': + // Don't render content when loading + return ( + + ); + case 'error': + // Display an alert icon and don't render content when there was an error + return ( + + + {text} + + } + onToggle={onToggle} + /> + ); + case 'empty': + // Since EuiAccordions don't have an empty state and they don't allow to style the arrow + // we're using a custom styled Accordion here and we're adding the faded-out button manually. + return ( + + + {text} + + } + buttonProps={{ + 'aria-disabled': true, + }} + arrowDisplay="none" + /> + ); + case 'success': + // The accordion can display the content now + return ( + + {renderContent()} + + ); + default: + return null; + } + } +); + +InsightAccordion.displayName = 'InsightAccordion'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.test.tsx new file mode 100644 index 0000000000000..7c9ee3200dcab --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.test.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../mock'; + +import { useKibana as mockUseKibana } from '../../../lib/kibana/__mocks__'; +import { useGetUserCasesPermissions } from '../../../lib/kibana'; +import { noCasesPermissions, readCasesPermissions } from '../../../../cases_test_utils'; +import { Insights } from './insights'; +import * as i18n from './translations'; + +const mockedUseKibana = mockUseKibana(); +jest.mock('../../../lib/kibana', () => { + const original = jest.requireActual('../../../lib/kibana'); + + return { + ...original, + useGetUserCasesPermissions: jest.fn(), + useToasts: jest.fn().mockReturnValue({ addWarning: jest.fn() }), + useKibana: () => ({ + ...mockedUseKibana, + services: { + ...mockedUseKibana.services, + cases: { + api: { + getRelatedCases: jest.fn(), + }, + }, + }, + }), + }; +}); +const mockUseGetUserCasesPermissions = useGetUserCasesPermissions as jest.Mock; + +describe('Insights', () => { + beforeEach(() => { + mockUseGetUserCasesPermissions.mockReturnValue(noCasesPermissions()); + }); + + it('does not render when there is no content to show', () => { + render( + + + + ); + + expect( + screen.queryByRole('heading', { + name: i18n.INSIGHTS, + }) + ).not.toBeInTheDocument(); + }); + + it('renders when there is at least one insight element to show', () => { + // One of the insights modules is the module showing related cases. + // It will show for all users that are able to read case data. + // Enabling that permission, will show the case insight module which + // is necessary to pass this test. + mockUseGetUserCasesPermissions.mockReturnValue(readCasesPermissions()); + + render( + + + + ); + + expect( + screen.queryByRole('heading', { + name: i18n.INSIGHTS, + }) + ).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.tsx new file mode 100644 index 0000000000000..7ffb3f6747214 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/insights.tsx @@ -0,0 +1,127 @@ +/* + * Copyright 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 { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { find } from 'lodash/fp'; + +import * as i18n from './translations'; + +import type { BrowserFields } from '../../../containers/source'; +import type { TimelineEventsDetailsItem } from '../../../../../common/search_strategy/timeline'; +import { useGetUserCasesPermissions } from '../../../lib/kibana'; +import { useIsExperimentalFeatureEnabled } from '../../../hooks/use_experimental_features'; +import { RelatedAlertsByProcessAncestry } from './related_alerts_by_process_ancestry'; +import { RelatedCases } from './related_cases'; +import { RelatedAlertsBySourceEvent } from './related_alerts_by_source_event'; +import { RelatedAlertsBySession } from './related_alerts_by_session'; + +interface Props { + browserFields: BrowserFields; + eventId: string; + data: TimelineEventsDetailsItem[]; + timelineId: string; + isReadOnly?: boolean; +} + +/** + * Displays several key insights for the associated alert. + */ +export const Insights = React.memo( + ({ browserFields, eventId, data, isReadOnly, timelineId }) => { + const isRelatedAlertsByProcessAncestryEnabled = useIsExperimentalFeatureEnabled( + 'insightsRelatedAlertsByProcessAncestry' + ); + const processEntityField = find({ category: 'process', field: 'process.entity_id' }, data); + const hasProcessEntityInfo = + isRelatedAlertsByProcessAncestryEnabled && processEntityField && processEntityField.values; + + const processSessionField = find( + { category: 'process', field: 'process.entry_leader.entity_id' }, + data + ); + const hasProcessSessionInfo = processSessionField && processSessionField.values; + + const sourceEventField = find( + { category: 'kibana', field: 'kibana.alert.original_event.id' }, + data + ); + const hasSourceEventInfo = sourceEventField && sourceEventField.values; + + const userCasesPermissions = useGetUserCasesPermissions(); + const hasCasesReadPermissions = userCasesPermissions.read; + + // Make sure that the alert has at least one of the associated fields + // or the user has the required permissions for features/fields that + // we can provide insights for + const canShowAtLeastOneInsight = + hasCasesReadPermissions || + hasProcessEntityInfo || + hasSourceEventInfo || + hasProcessSessionInfo; + + // If we're in read-only mode or don't have any insight-related data, + // don't render anything. + if (isReadOnly || !canShowAtLeastOneInsight) { + return null; + } + + return ( +
+ + + +
{i18n.INSIGHTS}
+
+
+ + {hasCasesReadPermissions && ( + + + + )} + + {sourceEventField && sourceEventField.values && ( + + + + )} + + {processSessionField && processSessionField.values && ( + + + + )} + + {isRelatedAlertsByProcessAncestryEnabled && + processEntityField && + processEntityField.values && ( + + + + )} +
+
+ ); + } +); + +Insights.displayName = 'Insights'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.test.tsx new file mode 100644 index 0000000000000..6237a9dbd43a1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.test.tsx @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; + +import { TestProviders } from '../../../mock'; + +import { useAlertPrevalenceFromProcessTree } from '../../../containers/alerts/use_alert_prevalence_from_process_tree'; +import { RelatedAlertsByProcessAncestry } from './related_alerts_by_process_ancestry'; +import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; +import { PROCESS_ANCESTRY, PROCESS_ANCESTRY_COUNT, PROCESS_ANCESTRY_ERROR } from './translations'; + +jest.mock('../../../containers/alerts/use_alert_prevalence_from_process_tree', () => ({ + useAlertPrevalenceFromProcessTree: jest.fn(), +})); +const mockUseAlertPrevalenceFromProcessTree = useAlertPrevalenceFromProcessTree as jest.Mock; + +describe('RelatedAlertsByProcessAncestry', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + it('shows an accordion and does not fetch data right away', () => { + render( + + + + ); + + expect(screen.getByText(PROCESS_ANCESTRY)).toBeInTheDocument(); + expect(mockUseAlertPrevalenceFromProcessTree).not.toHaveBeenCalled(); + }); + + it('shows a loading indicator and starts to fetch data when clicked', () => { + mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ + loading: true, + }); + + render( + + + + ); + + userEvent.click(screen.getByText(PROCESS_ANCESTRY)); + expect(mockUseAlertPrevalenceFromProcessTree).toHaveBeenCalled(); + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + }); + + it('shows an error message when the request fails', () => { + mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ + loading: false, + error: true, + }); + + render( + + + + ); + + userEvent.click(screen.getByText(PROCESS_ANCESTRY)); + expect(screen.getByText(PROCESS_ANCESTRY_ERROR)).toBeInTheDocument(); + }); + + it('renders the text with a count and a timeline button when the request works', async () => { + const mockAlertIds = ['1', '2']; + mockUseAlertPrevalenceFromProcessTree.mockReturnValue({ + loading: false, + error: false, + alertIds: mockAlertIds, + }); + + render( + + + + ); + + userEvent.click(screen.getByText(PROCESS_ANCESTRY)); + await waitFor(() => { + expect(screen.getByText(PROCESS_ANCESTRY_COUNT(2))).toBeInTheDocument(); + + expect( + screen.getByRole('button', { name: ACTION_INVESTIGATE_IN_TIMELINE }) + ).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.tsx new file mode 100644 index 0000000000000..7fb0de28b03fc --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_process_ancestry.tsx @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo, useCallback, useEffect, useState } from 'react'; +import { EuiSpacer, EuiLoadingSpinner } from '@elastic/eui'; + +import type { DataProvider } from '../../../../../common/types'; +import type { TimelineEventsDetailsItem } from '../../../../../common/search_strategy/timeline'; +import { getDataProvider } from '../table/use_action_cell_data_provider'; +import { useAlertPrevalenceFromProcessTree } from '../../../containers/alerts/use_alert_prevalence_from_process_tree'; +import { InsightAccordion } from './insight_accordion'; +import { SimpleAlertTable } from './simple_alert_table'; +import { InvestigateInTimelineButton } from '../table/investigate_in_timeline_button'; +import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; +import { PROCESS_ANCESTRY, PROCESS_ANCESTRY_COUNT, PROCESS_ANCESTRY_ERROR } from './translations'; + +interface Props { + data: TimelineEventsDetailsItem; + eventId: string; + timelineId?: string; +} + +interface Cache { + alertIds: string[]; +} + +/** + * Fetches and displays alerts that were generated in the associated process' + * process tree. + * Offers the ability to dive deeper into the investigation by opening + * the related alerts in a timeline investigation. + * + * In contrast to other insight accordions, this one does not fetch the + * count and alerts on mount since the call to fetch the process tree + * and its associated alerts is quite expensive. + * The component requires users to click on the accordion in order to + * initiate the fetch of the associated events. + * + * In order to achieve this, this component orchestrates two helper + * components: + * + * RelatedAlertsByProcessAncestry (empty cache) + * user clicks --> + * FetchAndNotifyCachedAlertsByProcessAncestry (fetches data, shows loading state) + * cache loaded --> + * ActualRelatedAlertsByProcessAncestry (displays data) + * + * The top-level component maintains a "cache" state that is used for + * state management and to prevent double-fetching in case the + * accordion is closed and re-opened. + * + * Due to the ephemeral nature of the data, it was decided to keep the + * state inside the component rather than to add it to Redux. + */ +export const RelatedAlertsByProcessAncestry = React.memo(({ data, eventId, timelineId }) => { + const [showContent, setShowContent] = useState(false); + const [cache, setCache] = useState>({}); + + const onToggle = useCallback((isOpen: boolean) => setShowContent(isOpen), []); + + // Makes sure the component is not fetching data before the accordion + // has been openend. + const renderContent = useCallback(() => { + if (!showContent) { + return null; + } else if (cache.alertIds) { + return ( + + ); + } + return ( + + ); + }, [showContent, cache, data, eventId, timelineId]); + + const isEmpty = !!cache.alertIds && cache.alertIds.length === 0; + + return ( + + ); +}); + +RelatedAlertsByProcessAncestry.displayName = 'RelatedAlertsByProcessAncestry'; + +/** + * Fetches data, displays a loading and error state and notifies about on success + */ +const FetchAndNotifyCachedAlertsByProcessAncestry: React.FC<{ + data: TimelineEventsDetailsItem; + timelineId?: string; + onCacheLoad: (cache: Cache) => void; +}> = ({ data, timelineId, onCacheLoad }) => { + const { loading, error, alertIds } = useAlertPrevalenceFromProcessTree({ + parentEntityId: data.values, + timelineId: timelineId ?? '', + signalIndexName: null, + }); + + useEffect(() => { + if (alertIds) { + onCacheLoad({ alertIds }); + } + }, [alertIds, onCacheLoad]); + + if (loading) { + return ; + } else if (error) { + return <>{PROCESS_ANCESTRY_ERROR}; + } + + return null; +}; + +FetchAndNotifyCachedAlertsByProcessAncestry.displayName = + 'FetchAndNotifyCachedAlertsByProcessAncestry'; + +/** + * Renders the alert table and the timeline button from a filled cache. + */ +const ActualRelatedAlertsByProcessAncestry: React.FC<{ + alertIds: string[]; + eventId: string; + timelineId?: string; +}> = ({ alertIds, eventId, timelineId }) => { + const dataProviders = useMemo(() => { + if (alertIds && alertIds.length) { + return alertIds.reduce((result, alertId, index) => { + const id = `${timelineId}-${eventId}-event.id-${index}-${alertId}`; + result.push(getDataProvider('_id', id, alertId)); + return result; + }, []); + } + return null; + }, [alertIds, eventId, timelineId]); + + if (!dataProviders) { + return null; + } + + return ( + <> + + + + {ACTION_INVESTIGATE_IN_TIMELINE} + + + ); +}; +ActualRelatedAlertsByProcessAncestry.displayName = 'ActualRelatedAlertsByProcessAncestry'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.test.tsx new file mode 100644 index 0000000000000..9bb60bec5a880 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.test.tsx @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen, waitFor } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../mock'; + +import { useActionCellDataProvider } from '../table/use_action_cell_data_provider'; +import { useAlertPrevalence } from '../../../containers/alerts/use_alert_prevalence'; +import { RelatedAlertsBySession } from './related_alerts_by_session'; +import { SESSION_LOADING, SESSION_ERROR, SESSION_COUNT } from './translations'; +import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; + +jest.mock('../table/use_action_cell_data_provider', () => ({ + useActionCellDataProvider: jest.fn(), +})); +const mockUseActionCellDataProvider = useActionCellDataProvider as jest.Mock; +jest.mock('../../../containers/alerts/use_alert_prevalence', () => ({ + useAlertPrevalence: jest.fn(), +})); +const mockUseAlertPrevalence = useAlertPrevalence as jest.Mock; + +const testEventId = '20398h209482'; +const testData = { + field: 'process.entry_leader.entity_id', + data: ['2938hr29348h9489r8'], + isObjectArray: false, +}; + +describe('RelatedAlertsBySession', () => { + it('shows a loading message when data is loading', () => { + mockUseAlertPrevalence.mockReturnValue({ + error: false, + count: undefined, + alertIds: undefined, + }); + render( + + + + ); + + expect(screen.getByText(SESSION_LOADING)).toBeInTheDocument(); + }); + + it('shows an error message when data failed to load', () => { + mockUseAlertPrevalence.mockReturnValue({ + error: true, + count: undefined, + alertIds: undefined, + }); + render( + + + + ); + + expect(screen.getByText(SESSION_ERROR)).toBeInTheDocument(); + }); + + it('shows an empty state when no alerts exist', () => { + mockUseAlertPrevalence.mockReturnValue({ + error: false, + count: 0, + alertIds: [], + }); + render( + + + + ); + + expect(screen.getByText(SESSION_COUNT(0))).toBeInTheDocument(); + }); + + it('shows the correct count and renders the timeline button', async () => { + mockUseAlertPrevalence.mockReturnValue({ + error: false, + count: 2, + alertIds: ['223', '2323'], + }); + mockUseActionCellDataProvider.mockReturnValue({ + dataProviders: [{}, {}], + }); + + render( + + + + ); + + await waitFor(() => { + expect(screen.getByText(SESSION_COUNT(2))).toBeInTheDocument(); + expect(screen.getByText(ACTION_INVESTIGATE_IN_TIMELINE)).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.tsx new file mode 100644 index 0000000000000..29f1a293346d9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_session.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { EuiSpacer } from '@elastic/eui'; + +import type { BrowserFields } from '../../../containers/source'; +import type { TimelineEventsDetailsItem } from '../../../../../common/search_strategy/timeline'; +import { useActionCellDataProvider } from '../table/use_action_cell_data_provider'; +import { useAlertPrevalence } from '../../../containers/alerts/use_alert_prevalence'; +import type { InsightAccordionState } from './insight_accordion'; +import { InsightAccordion } from './insight_accordion'; +import { InvestigateInTimelineButton } from '../table/investigate_in_timeline_button'; +import { SimpleAlertTable } from './simple_alert_table'; +import { getEnrichedFieldInfo } from '../helpers'; +import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; +import { SESSION_LOADING, SESSION_ERROR, SESSION_COUNT } from './translations'; + +interface Props { + browserFields: BrowserFields; + data: TimelineEventsDetailsItem; + eventId: string; + timelineId: string; +} + +/** + * Fetches the count of alerts that were generated in the same session + * and displays an accordion with a mini table representation of the + * related cases. + * Offers the ability to dive deeper into the investigation by opening + * the related alerts in a timeline investigation. + */ +export const RelatedAlertsBySession = React.memo( + ({ browserFields, data, eventId, timelineId }) => { + const { field, values } = data; + const { error, count, alertIds } = useAlertPrevalence({ + field, + value: values, + timelineId: timelineId ?? '', + signalIndexName: null, + includeAlertIds: true, + }); + + const { fieldFromBrowserField } = getEnrichedFieldInfo({ + browserFields, + contextId: timelineId, + eventId, + field: { id: data.field }, + timelineId, + item: data, + }); + + const cellData = useActionCellDataProvider({ + field, + values, + contextId: timelineId, + eventId, + fieldFromBrowserField, + fieldFormat: fieldFromBrowserField?.format, + fieldType: fieldFromBrowserField?.type, + }); + + const renderContent = useCallback(() => { + if (!alertIds || !cellData?.dataProviders) { + return null; + } + return ( + <> + + + + {ACTION_INVESTIGATE_IN_TIMELINE} + + + ); + }, [alertIds, cellData?.dataProviders]); + + let state: InsightAccordionState = 'loading'; + if (error) { + state = 'error'; + } else if (count === 0) { + state = 'empty'; + } else if (alertIds) { + state = 'success'; + } + + return ( + + ); + } +); + +RelatedAlertsBySession.displayName = 'RelatedAlertsBySession'; + +function getTextFromState(state: InsightAccordionState, count: number | undefined) { + switch (state) { + case 'loading': + return SESSION_LOADING; + case 'error': + return SESSION_ERROR; + case 'success': + case 'empty': + return SESSION_COUNT(count); + default: + return ''; + } +} diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.test.tsx new file mode 100644 index 0000000000000..b7d6eeb7c1e7c --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.test.tsx @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen, waitFor } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../mock'; + +import { useActionCellDataProvider } from '../table/use_action_cell_data_provider'; +import { useAlertPrevalence } from '../../../containers/alerts/use_alert_prevalence'; +import { RelatedAlertsBySourceEvent } from './related_alerts_by_source_event'; +import { SOURCE_EVENT_LOADING, SOURCE_EVENT_ERROR, SOURCE_EVENT_COUNT } from './translations'; +import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; + +jest.mock('../table/use_action_cell_data_provider', () => ({ + useActionCellDataProvider: jest.fn(), +})); +const mockUseActionCellDataProvider = useActionCellDataProvider as jest.Mock; +jest.mock('../../../containers/alerts/use_alert_prevalence', () => ({ + useAlertPrevalence: jest.fn(), +})); +const mockUseAlertPrevalence = useAlertPrevalence as jest.Mock; + +const testEventId = '20398h209482'; +const testData = { + field: 'kibana.alert.original_event.id', + data: ['2938hr29348h9489r8'], + isObjectArray: false, +}; + +describe('RelatedAlertsBySourceEvent', () => { + it('shows a loading message when data is loading', () => { + mockUseAlertPrevalence.mockReturnValue({ + error: false, + count: undefined, + alertIds: undefined, + }); + render( + + + + ); + + expect(screen.getByText(SOURCE_EVENT_LOADING)).toBeInTheDocument(); + }); + + it('shows an error message when data failed to load', () => { + mockUseAlertPrevalence.mockReturnValue({ + error: true, + count: undefined, + alertIds: undefined, + }); + render( + + + + ); + + expect(screen.getByText(SOURCE_EVENT_ERROR)).toBeInTheDocument(); + }); + + it('shows an empty state when no alerts exist', () => { + mockUseAlertPrevalence.mockReturnValue({ + error: false, + count: 0, + alertIds: [], + }); + render( + + + + ); + + expect(screen.getByText(SOURCE_EVENT_COUNT(0))).toBeInTheDocument(); + }); + + it('shows the correct count and renders the timeline button', async () => { + mockUseAlertPrevalence.mockReturnValue({ + error: false, + count: 2, + alertIds: ['223', '2323'], + }); + mockUseActionCellDataProvider.mockReturnValue({ + dataProviders: [{}, {}], + }); + + render( + + + + ); + + await waitFor(() => { + expect(screen.getByText(SOURCE_EVENT_COUNT(2))).toBeInTheDocument(); + expect(screen.getByText(ACTION_INVESTIGATE_IN_TIMELINE)).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.tsx new file mode 100644 index 0000000000000..1fc19ebc9095c --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_alerts_by_source_event.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { EuiSpacer } from '@elastic/eui'; + +import type { BrowserFields } from '../../../containers/source'; +import type { TimelineEventsDetailsItem } from '../../../../../common/search_strategy/timeline'; +import { useActionCellDataProvider } from '../table/use_action_cell_data_provider'; +import { useAlertPrevalence } from '../../../containers/alerts/use_alert_prevalence'; +import type { InsightAccordionState } from './insight_accordion'; +import { InsightAccordion } from './insight_accordion'; +import { InvestigateInTimelineButton } from '../table/investigate_in_timeline_button'; +import { SimpleAlertTable } from './simple_alert_table'; +import { getEnrichedFieldInfo } from '../helpers'; +import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; +import { SOURCE_EVENT_LOADING, SOURCE_EVENT_ERROR, SOURCE_EVENT_COUNT } from './translations'; + +interface Props { + browserFields: BrowserFields; + data: TimelineEventsDetailsItem; + eventId: string; + timelineId: string; +} + +/** + * Fetches the count of alerts that were generated by the same source + * event and displays an accordion with a mini table representation of + * the related cases. + * Offers the ability to dive deeper into the investigation by opening + * the related alerts in a timeline investigation. + */ +export const RelatedAlertsBySourceEvent = React.memo( + ({ browserFields, data, eventId, timelineId }) => { + const { field, values } = data; + const { error, count, alertIds } = useAlertPrevalence({ + field, + value: values, + timelineId: timelineId ?? '', + signalIndexName: null, + includeAlertIds: true, + }); + + const { fieldFromBrowserField } = getEnrichedFieldInfo({ + browserFields, + contextId: timelineId, + eventId, + field: { id: data.field }, + timelineId, + item: data, + }); + + const cellData = useActionCellDataProvider({ + field, + values, + contextId: timelineId, + eventId, + fieldFromBrowserField, + fieldFormat: fieldFromBrowserField?.format, + fieldType: fieldFromBrowserField?.type, + }); + + const renderContent = useCallback(() => { + if (!alertIds || !cellData?.dataProviders) { + return null; + } + return ( + <> + + + + {ACTION_INVESTIGATE_IN_TIMELINE} + + + ); + }, [alertIds, cellData?.dataProviders]); + + let state: InsightAccordionState = 'loading'; + if (error) { + state = 'error'; + } else if (count === 0) { + state = 'empty'; + } else if (alertIds) { + state = 'success'; + } + + return ( + + ); + } +); + +function getTextFromState(state: InsightAccordionState, count: number | undefined) { + switch (state) { + case 'loading': + return SOURCE_EVENT_LOADING; + case 'error': + return SOURCE_EVENT_ERROR; + case 'success': + case 'empty': + return SOURCE_EVENT_COUNT(count); + default: + return ''; + } +} + +RelatedAlertsBySourceEvent.displayName = 'RelatedAlertsBySourceEvent'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/related_cases.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.test.tsx similarity index 64% rename from x-pack/plugins/security_solution/public/common/components/event_details/related_cases.test.tsx rename to x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.test.tsx index bea14a70a8385..d9b83f8e66388 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/related_cases.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.test.tsx @@ -5,20 +5,21 @@ * 2.0. */ -import { render, screen } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import React from 'react'; -import { TestProviders } from '../../mock'; -import { useKibana as mockUseKibana } from '../../lib/kibana/__mocks__'; -import { useGetUserCasesPermissions } from '../../lib/kibana'; +import { TestProviders } from '../../../mock'; +import { useKibana as mockUseKibana } from '../../../lib/kibana/__mocks__'; +import { useGetUserCasesPermissions } from '../../../lib/kibana'; import { RelatedCases } from './related_cases'; -import { noCasesPermissions, readCasesPermissions } from '../../../cases_test_utils'; +import { noCasesPermissions, readCasesPermissions } from '../../../../cases_test_utils'; +import { CASES_LOADING, CASES_COUNT } from './translations'; const mockedUseKibana = mockUseKibana(); const mockGetRelatedCases = jest.fn(); -jest.mock('../../lib/kibana', () => { - const original = jest.requireActual('../../lib/kibana'); +jest.mock('../../../lib/kibana', () => { + const original = jest.requireActual('../../../lib/kibana'); return { ...original, @@ -58,6 +59,19 @@ describe('Related Cases', () => { (useGetUserCasesPermissions as jest.Mock).mockReturnValue(readCasesPermissions()); }); + describe('When related cases are loading', () => { + test('should show the loading message', () => { + mockGetRelatedCases.mockReturnValue([]); + render( + + + + ); + + expect(screen.getByText(CASES_LOADING)).toBeInTheDocument(); + }); + }); + describe('When related cases are unable to be retrieved', () => { test('should show 0 related cases when there are none', async () => { mockGetRelatedCases.mockReturnValue([]); @@ -67,7 +81,9 @@ describe('Related Cases', () => { ); - expect(await screen.findByText('0 cases.')).toBeInTheDocument(); + await waitFor(() => { + expect(screen.getByText(CASES_COUNT(0))).toBeInTheDocument(); + }); }); }); @@ -79,8 +95,10 @@ describe('Related Cases', () => { ); - expect(await screen.findByText('1 case:')).toBeInTheDocument(); - expect(await screen.findByTestId('case-details-link')).toHaveTextContent('Test Case'); + await waitFor(() => { + expect(screen.getByText(CASES_COUNT(1))).toBeInTheDocument(); + expect(screen.getByTestId('case-details-link')).toHaveTextContent('Test Case'); + }); }); }); @@ -95,11 +113,14 @@ describe('Related Cases', () => { ); - expect(await screen.findByText('2 cases:')).toBeInTheDocument(); - const cases = await screen.findAllByTestId('case-details-link'); - expect(cases).toHaveLength(2); - expect(cases[0]).toHaveTextContent('Test Case 1'); - expect(cases[1]).toHaveTextContent('Test Case 2'); + + await waitFor(() => { + expect(screen.getByText(CASES_COUNT(2))).toBeInTheDocument(); + const cases = screen.getAllByTestId('case-details-link'); + expect(cases).toHaveLength(2); + expect(cases[0]).toHaveTextContent('Test Case 1'); + expect(cases[1]).toHaveTextContent('Test Case 2'); + }); }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.tsx new file mode 100644 index 0000000000000..00c7ec4e2a9f0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/related_cases.tsx @@ -0,0 +1,129 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { useKibana, useToasts } from '../../../lib/kibana'; +import { CaseDetailsLink } from '../../links'; +import { APP_ID } from '../../../../../common/constants'; +import type { InsightAccordionState } from './insight_accordion'; +import { InsightAccordion } from './insight_accordion'; +import { CASES_LOADING, CASES_ERROR, CASES_ERROR_TOAST, CASES_COUNT } from './translations'; + +type RelatedCaseList = Array<{ id: string; title: string }>; + +interface Props { + eventId: string; +} + +/** + * Fetches and displays case links of cases that include the associated event (id). + */ +export const RelatedCases = React.memo(({ eventId }) => { + const { + services: { cases }, + } = useKibana(); + const toasts = useToasts(); + + const [relatedCases, setRelatedCases] = useState(undefined); + const [areCasesLoading, setAreCasesLoading] = useState(true); + const [hasError, setHasError] = useState(false); + + const renderContent = useCallback(() => renderCaseContent(relatedCases), [relatedCases]); + + const getRelatedCases = useCallback(async () => { + let relatedCaseList: RelatedCaseList = []; + try { + if (eventId) { + relatedCaseList = + (await cases.api.getRelatedCases(eventId, { + owner: APP_ID, + })) ?? []; + } + } catch (error) { + setHasError(true); + toasts.addWarning(CASES_ERROR_TOAST(error)); + } + setRelatedCases(relatedCaseList); + setAreCasesLoading(false); + }, [eventId, cases.api, toasts]); + + useEffect(() => { + getRelatedCases(); + }, [eventId, getRelatedCases]); + + let state: InsightAccordionState = 'loading'; + if (hasError) { + state = 'error'; + } else if (!areCasesLoading && relatedCases?.length === 0) { + state = 'empty'; + } else if (relatedCases) { + state = 'success'; + } + + return ( + + ); +}); + +function renderCaseContent(relatedCases: RelatedCaseList = []) { + const caseCount = relatedCases.length; + return ( + + + + + ), + }} + /> + {relatedCases.map(({ id, title }, index) => + id && title ? ( + + {' '} + + {title} + + {relatedCases[index + 1] ? ',' : ''} + + ) : ( + <> + ) + )} + + ); +} + +RelatedCases.displayName = 'RelatedCases'; + +function getTextFromState(state: InsightAccordionState, caseCount = 0) { + switch (state) { + case 'loading': + return CASES_LOADING; + case 'error': + return CASES_ERROR; + case 'success': + case 'empty': + return CASES_COUNT(caseCount); + default: + return ''; + } +} diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.test.tsx new file mode 100644 index 0000000000000..45a3e6b68a5c3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.test.tsx @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { render, screen } from '@testing-library/react'; +import React from 'react'; + +import { TestProviders } from '../../../mock'; + +import { useAlertsByIds } from '../../../containers/alerts/use_alerts_by_ids'; +import { SimpleAlertTable } from './simple_alert_table'; + +jest.mock('../../../containers/alerts/use_alerts_by_ids', () => ({ + useAlertsByIds: jest.fn(), +})); +const mockUseAlertsByIds = useAlertsByIds as jest.Mock; + +const testIds = ['wer34r34', '234234']; +const tooManyTestIds = [ + '234', + '234', + '234', + '234', + '234', + '234', + '234', + '234', + '234', + '234', + '234', +]; +const testResponse = [ + { + fields: { + 'kibana.alert.rule.name': ['test rule name'], + '@timestamp': ['2022-07-18T15:07:21.753Z'], + 'kibana.alert.severity': ['high'], + }, + }, +]; + +describe('SimpleAlertTable', () => { + it('shows a loading indicator when the data is loading', () => { + mockUseAlertsByIds.mockReturnValue({ + loading: true, + error: false, + }); + render( + + + + ); + + expect(screen.getByRole('progressbar')).toBeInTheDocument(); + }); + + it('shows an error message when there was an error fetching the alerts', () => { + mockUseAlertsByIds.mockReturnValue({ + loading: false, + error: true, + }); + render( + + + + ); + + expect(screen.getByText(/Failed/)).toBeInTheDocument(); + }); + + it('shows the results', () => { + mockUseAlertsByIds.mockReturnValue({ + loading: false, + error: false, + data: testResponse, + }); + render( + + + + ); + + // Renders to table headers + expect(screen.getByRole('columnheader', { name: 'Rule' })).toBeInTheDocument(); + expect(screen.getByRole('columnheader', { name: '@timestamp' })).toBeInTheDocument(); + expect(screen.getByRole('columnheader', { name: 'Severity' })).toBeInTheDocument(); + + // Renders the row + expect(screen.getByText('test rule name')).toBeInTheDocument(); + expect(screen.getByText(/Jul 18/)).toBeInTheDocument(); + expect(screen.getByText('High')).toBeInTheDocument(); + }); + + it('shows a note about limited results', () => { + mockUseAlertsByIds.mockReturnValue({ + loading: false, + error: false, + data: testResponse, + }); + render( + + + + ); + + expect(screen.getByText(/Showing only/)).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.tsx new file mode 100644 index 0000000000000..ace9d7d683fbe --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/simple_alert_table.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import type { EuiBasicTableColumn } from '@elastic/eui'; +import type { Severity } from '@kbn/securitysolution-io-ts-alerting-types'; +import { EuiBasicTable, EuiLoadingContent, EuiSpacer } from '@elastic/eui'; + +import { PreferenceFormattedDate } from '../../formatted_date'; +import { SeverityBadge } from '../../../../detections/components/rules/severity_badge'; +import { useAlertsByIds } from '../../../containers/alerts/use_alerts_by_ids'; +import { SIMPLE_ALERT_TABLE_ERROR, SIMPLE_ALERT_TABLE_LIMITED } from './translations'; + +const TABLE_FIELDS = ['@timestamp', 'kibana.alert.rule.name', 'kibana.alert.severity']; + +const columns: Array>> = [ + { + field: 'kibana.alert.rule.name', + name: 'Rule', + }, + { + field: '@timestamp', + name: '@timestamp', + render: (timestamp: string) => , + }, + { + field: 'kibana.alert.severity', + name: 'Severity', + render: (severity: Severity) => , + }, +]; + +/** 10 alert rows in this table has been deemed a balanced amount for the flyout */ +const alertLimit = 10; + +/** + * Displays a simplified alert table for the given alert ids. + * It will only fetch the latest 10 ids and in case more ids + * are passed in, it will add a note about omitted alerts. + */ +export const SimpleAlertTable = React.memo<{ alertIds: string[] }>(({ alertIds }) => { + const sampledData = useMemo(() => alertIds.slice(0, alertLimit), [alertIds]); + + const { loading, error, data } = useAlertsByIds({ + alertIds: sampledData, + fields: TABLE_FIELDS, + }); + const mappedData = useMemo(() => { + if (!data) { + return undefined; + } + return data.map((doc) => doc.fields); + }, [data]); + + if (loading) { + return ; + } else if (error) { + return <>{SIMPLE_ALERT_TABLE_ERROR}; + } else if (mappedData) { + const showLimitedDataNote = alertIds.length > alertLimit; + return ( + <> + {showLimitedDataNote && ( +
+ {SIMPLE_ALERT_TABLE_LIMITED} + +
+ )} + + + ); + } + return null; +}); + +SimpleAlertTable.displayName = 'SimpleAlertTable'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/insights/translations.ts b/x-pack/plugins/security_solution/public/common/components/event_details/insights/translations.ts new file mode 100644 index 0000000000000..29825ee47cdb3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/event_details/insights/translations.ts @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const INSIGHTS = i18n.translate('xpack.securitySolution.alertDetails.overview.insights', { + defaultMessage: 'Insights', +}); + +export const PROCESS_ANCESTRY = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry', + { + defaultMessage: 'Related alerts by process ancestry', + } +); + +export const PROCESS_ANCESTRY_COUNT = (count: number) => + i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry_count', + { + defaultMessage: '{count} {count, plural, =1 {alert} other {alerts}} by process ancestry', + values: { count }, + } + ); + +export const PROCESS_ANCESTRY_ERROR = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_process_ancestry_error', + { + defaultMessage: 'Failed to fetch alerts.', + } +); + +export const SESSION_LOADING = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_source_event_loading', + { defaultMessage: 'Loading related alerts by source event' } +); + +export const SESSION_ERROR = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_session_error', + { + defaultMessage: 'Failed to load related alerts by session', + } +); + +export const SESSION_COUNT = (count?: number) => + i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_session_count', + { + defaultMessage: '{count} {count, plural, =1 {alert} other {alerts}} related by session', + values: { count }, + } + ); +export const SOURCE_EVENT_LOADING = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_source_event_loading', + { defaultMessage: 'Loading related alerts by source event' } +); + +export const SOURCE_EVENT_ERROR = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_alerts_by_source_event_error', + { + defaultMessage: 'Failed to load related alerts by source event', + } +); + +export const SOURCE_EVENT_COUNT = (count?: number) => + i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights_related_alerts_by_source_event_count', + { + defaultMessage: '{count} {count, plural, =1 {alert} other {alerts}} related by source event', + values: { count }, + } + ); + +export const CASES_LOADING = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_cases_loading', + { + defaultMessage: 'Loading related cases', + } +); + +export const CASES_ERROR = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.insights.related_cases_error', + { + defaultMessage: 'Failed to load related cases', + } +); + +export const CASES_COUNT = (count: number) => + i18n.translate('xpack.securitySolution.alertDetails.overview.insights.related_cases_count', { + defaultMessage: '{count} {count, plural, =1 {case} other {cases}} related to this alert', + values: { count }, + }); + +export const CASES_ERROR_TOAST = (error: string) => + i18n.translate('xpack.securitySolution.alertDetails.overview.insights.relatedCasesFailure', { + defaultMessage: 'Unable to load related cases: "{error}"', + values: { error }, + }); + +export const SIMPLE_ALERT_TABLE_ERROR = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.simpleAlertTable.error', + { + defaultMessage: 'Failed to load the alerts.', + } +); + +export const SIMPLE_ALERT_TABLE_LIMITED = i18n.translate( + 'xpack.securitySolution.alertDetails.overview.limitedAlerts', + { + defaultMessage: 'Showing only the latest 10 alerts. View the rest of alerts in timeline.', + } +); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/related_cases.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/related_cases.tsx deleted file mode 100644 index 3d8943af1e57c..0000000000000 --- a/x-pack/plugins/security_solution/public/common/components/event_details/related_cases.tsx +++ /dev/null @@ -1,101 +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, { useCallback, useState, useEffect } from 'react'; -import { EuiFlexItem, EuiLoadingContent, EuiSpacer } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { useGetUserCasesPermissions, useKibana, useToasts } from '../../lib/kibana'; -import { CaseDetailsLink } from '../links'; -import { APP_ID } from '../../../../common/constants'; - -interface Props { - eventId: string; - isReadOnly?: boolean; -} - -type RelatedCaseList = Array<{ id: string; title: string }>; - -export const RelatedCases: React.FC = React.memo(({ eventId, isReadOnly }) => { - const { - services: { cases }, - } = useKibana(); - const toasts = useToasts(); - const userCasesPermissions = useGetUserCasesPermissions(); - const [relatedCases, setRelatedCases] = useState([]); - const [areCasesLoading, setAreCasesLoading] = useState(true); - const [hasError, setHasError] = useState(false); - const hasCasesReadPermissions = userCasesPermissions.read; - - const getRelatedCases = useCallback(async () => { - let relatedCaseList: RelatedCaseList = []; - try { - if (eventId) { - relatedCaseList = - (await cases.api.getRelatedCases(eventId, { - owner: APP_ID, - })) ?? []; - } - } catch (error) { - setHasError(true); - toasts.addWarning( - i18n.translate('xpack.securitySolution.alertDetails.overview.relatedCasesFailure', { - defaultMessage: 'Unable to load related cases: "{error}"', - values: { error }, - }) - ); - } - setRelatedCases(relatedCaseList); - setAreCasesLoading(false); - }, [eventId, cases.api, toasts]); - - useEffect(() => { - getRelatedCases(); - }, [eventId, getRelatedCases]); - - if (hasError || !hasCasesReadPermissions || isReadOnly) return null; - - return areCasesLoading ? ( - - ) : ( - <> - - - - {' '} - - - - {relatedCases?.map(({ id, title }, index) => - id && title ? ( - - {' '} - - {title} - - {relatedCases[index + 1] ? ',' : ''} - - ) : ( - <> - ) - )} - - - - ); -}); - -RelatedCases.displayName = 'RelatedCases'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx index 46f20edbeb629..d116be57e1ac8 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/summary_view.test.tsx @@ -52,10 +52,11 @@ const enrichedHostIpData: AlertSummaryRow['description'] = { values: [...hostIpValues], }; +const mockCount = 90019001; jest.mock('../../containers/alerts/use_alert_prevalence', () => ({ useAlertPrevalence: () => ({ loading: false, - count: 1, + count: mockCount, error: false, }), })); @@ -94,7 +95,7 @@ describe('Summary View', () => { }); // Shows alert prevalence information - expect(screen.getByTestId('alert-prevalence')).toBeInTheDocument(); + expect(screen.getByText(mockCount)).toBeInTheDocument(); // Shows the Investigate in timeline button expect(screen.getByLabelText('Investigate in timeline')).toBeInTheDocument(); }); @@ -121,7 +122,7 @@ describe('Summary View', () => { ); // Does not render the prevalence and timeline items - expect(screen.queryByTestId('alert-prevalence')).not.toBeInTheDocument(); + expect(screen.queryByText(mockCount)).not.toBeInTheDocument(); expect(screen.queryByLabelText('Investigate in timeline')).not.toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/action_cell.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/action_cell.tsx index 748e613182d24..b8c0331ee8541 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/action_cell.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/action_cell.tsx @@ -73,7 +73,7 @@ export const ActionCell: React.FC = React.memo( applyWidthAndPadding={applyWidthAndPadding} closeTopN={closeTopN} dataType={data.type} - dataProvider={actionCellConfig?.dataProvider} + dataProvider={actionCellConfig?.dataProviders} enableOverflowButton={true} field={data.field} isAggregatable={aggregatable} @@ -86,7 +86,7 @@ export const ActionCell: React.FC = React.memo( timelineId={timelineId ?? timelineIdFind} toggleColumn={toggleColumn} toggleTopN={toggleTopN} - values={actionCellConfig?.stringValues} + values={actionCellConfig?.values} /> ); } diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.test.tsx index 3f2c363660d60..1c364e97fbd10 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.test.tsx @@ -8,77 +8,26 @@ import { render, screen } from '@testing-library/react'; import React from 'react'; -import type { BrowserField } from '../../../containers/source'; import { InvestigateInTimelineButton } from './investigate_in_timeline_button'; import { TestProviders } from '../../../mock'; -import type { EventFieldsData } from '../types'; -import { TimelineId } from '../../../../../common/types'; +import { getDataProvider } from './use_action_cell_data_provider'; import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; jest.mock('../../../lib/kibana'); -const eventId = 'TUWyf3wBFCFU0qRJTauW'; - -const hostIpFieldFromBrowserField: BrowserField = { - aggregatable: true, - category: 'host', - description: 'Host ip addresses.', - example: '127.0.0.1', - fields: {}, - format: '', - indexes: ['auditbeat-*', 'filebeat-*', 'logs-*', 'winlogbeat-*'], - name: 'host.ip', - readFromDocValues: false, - searchable: true, - type: 'ip', -}; - -const hostIpData: EventFieldsData = { - ...hostIpFieldFromBrowserField, - ariaRowindex: 35, - field: 'host.ip', - fields: {}, - format: '', - isObjectArray: false, - originalValue: ['127.0.0.1', '::1', '10.1.2.3', '2001:0DB8:AC10:FE01::'], - values: ['127.0.0.1', '::1', '10.1.2.3', '2001:0DB8:AC10:FE01::'], -}; - describe('InvestigateInTimelineButton', () => { describe('When all props are provided', () => { test('it should display the add to timeline button', () => { - render( - - - + const dataProviders = ['127.0.0.1', '::1', '10.1.2.3', '2001:0DB8:AC10:FE01::'].map( + (ipValue) => getDataProvider('host.ip', '', ipValue) ); - expect(screen.queryByLabelText(ACTION_INVESTIGATE_IN_TIMELINE)).toBeInTheDocument(); - }); - }); - - describe('When browser field data necessary for timeline is unavailable', () => { - test('it should not render', () => { render( - + ); - expect(screen.queryByLabelText(ACTION_INVESTIGATE_IN_TIMELINE)).not.toBeInTheDocument(); + expect(screen.queryByLabelText(ACTION_INVESTIGATE_IN_TIMELINE)).toBeInTheDocument(); }); }); }); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.tsx index 49228be748504..9b31b64375445 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/investigate_in_timeline_button.tsx @@ -6,51 +6,38 @@ */ import React from 'react'; -import { EuiButtonEmpty } from '@elastic/eui'; -import { isEmpty } from 'lodash'; +import { EuiButton, EuiButtonEmpty } from '@elastic/eui'; import { useDispatch } from 'react-redux'; -import type { AlertSummaryRow } from '../helpers'; import { inputsActions } from '../../../store/inputs'; import { updateProviders } from '../../../../timelines/store/timeline/actions'; import { sourcererActions } from '../../../store/actions'; import { SourcererScopeName } from '../../../store/sourcerer/model'; +import type { DataProvider } from '../../../../../common/types'; import { TimelineId, TimelineType } from '../../../../../common/types/timeline'; -import { useActionCellDataProvider } from './use_action_cell_data_provider'; import { useCreateTimeline } from '../../../../timelines/components/timeline/properties/use_create_timeline'; import { ACTION_INVESTIGATE_IN_TIMELINE } from '../../../../detections/components/alerts_table/translations'; -export const InvestigateInTimelineButton = React.memo< - React.PropsWithChildren ->(({ data, eventId, fieldFromBrowserField, linkValue, timelineId, values, children }) => { +export const InvestigateInTimelineButton: React.FunctionComponent<{ + asEmptyButton: boolean; + dataProviders: DataProvider[]; +}> = ({ asEmptyButton, children, dataProviders }) => { const dispatch = useDispatch(); - const actionCellConfig = useActionCellDataProvider({ - contextId: timelineId, - eventId, - field: data.field, - fieldFormat: data.format, - fieldFromBrowserField, - fieldType: data.type, - isObjectArray: data.isObjectArray, - linkValue, - values, - }); - const clearTimeline = useCreateTimeline({ timelineId: TimelineId.active, timelineType: TimelineType.default, }); const configureAndOpenTimeline = React.useCallback(() => { - if (actionCellConfig?.dataProvider) { + if (dataProviders) { // Reset the current timeline clearTimeline(); // Update the timeline's providers to match the current prevalence field query dispatch( updateProviders({ id: TimelineId.active, - providers: actionCellConfig.dataProvider, + providers: dataProviders, }) ); // Only show detection alerts @@ -65,24 +52,22 @@ export const InvestigateInTimelineButton = React.memo< // Unlock the time range from the global time range dispatch(inputsActions.removeGlobalLinkTo()); } - }, [dispatch, clearTimeline, actionCellConfig]); - - const showButton = values != null && !isEmpty(actionCellConfig?.dataProvider); + }, [dispatch, clearTimeline, dataProviders]); - if (showButton) { - return ( - - {children} - - ); - } else { - return null; - } -}); + return asEmptyButton ? ( + + {children} + + ) : ( + + {children} + + ); +}; InvestigateInTimelineButton.displayName = 'InvestigateInTimelineButton'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.tsx index 5fb127ccadb93..1303e31115984 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/prevalence_cell.tsx @@ -11,40 +11,61 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import type { AlertSummaryRow } from '../helpers'; import { getEmptyTagValue } from '../../empty_value'; import { InvestigateInTimelineButton } from './investigate_in_timeline_button'; +import { useActionCellDataProvider } from './use_action_cell_data_provider'; import { useAlertPrevalence } from '../../../containers/alerts/use_alert_prevalence'; -const PrevalenceCell = React.memo( - ({ data, eventId, fieldFromBrowserField, linkValue, timelineId, values }) => { - const { loading, count } = useAlertPrevalence({ - field: data.field, - timelineId, - value: values, - signalIndexName: null, - }); +/** + * Renders a Prevalence cell based on a regular alert prevalence query + */ +const PrevalenceCell: React.FC = ({ + data, + eventId, + fieldFromBrowserField, + linkValue, + timelineId, + values, +}) => { + const { loading, count } = useAlertPrevalence({ + field: data.field, + timelineId, + value: values, + signalIndexName: null, + }); + + const cellDataProviders = useActionCellDataProvider({ + contextId: timelineId, + eventId, + field: data.field, + fieldFormat: data.format, + fieldFromBrowserField, + fieldType: data.type, + isObjectArray: data.isObjectArray, + linkValue, + values, + }); - if (loading) { - return ; - } else if (typeof count === 'number') { - return ( - - {count} - - ); - } else { - return getEmptyTagValue(); - } + if (loading) { + return ; + } else if ( + typeof count === 'number' && + cellDataProviders?.dataProviders && + cellDataProviders?.dataProviders.length + ) { + return ( + + {count} + + ); + } else { + return getEmptyTagValue(); } -); +}; PrevalenceCell.displayName = 'PrevalenceCell'; -export const PrevalenceCellRenderer = (data: AlertSummaryRow['description']) => { - return ; -}; +export const PrevalenceCellRenderer = (data: AlertSummaryRow['description']) => ( + +); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/table/use_action_cell_data_provider.ts b/x-pack/plugins/security_solution/public/common/components/event_details/table/use_action_cell_data_provider.ts index ad2290015554d..794ec46b7a223 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/table/use_action_cell_data_provider.ts +++ b/x-pack/plugins/security_solution/public/common/components/event_details/table/use_action_cell_data_provider.ts @@ -43,6 +43,11 @@ export interface UseActionCellDataProvider { values: string[] | null | undefined; } +export interface ActionCellValuesAndDataProvider { + values: string[]; + dataProviders: DataProvider[]; +} + export const getDataProvider = (field: string, id: string, value: string): DataProvider => ({ and: [], enabled: true, @@ -67,28 +72,22 @@ export const useActionCellDataProvider = ({ isObjectArray, linkValue, values, -}: UseActionCellDataProvider): { - stringValues: string[]; - dataProvider: DataProvider[]; -} | null => { +}: UseActionCellDataProvider): ActionCellValuesAndDataProvider | null => { const cellData = useMemo(() => { if (values === null || values === undefined) return null; const arrayValues = Array.isArray(values) ? values : [values]; - return arrayValues.reduce<{ - stringValues: string[]; - dataProvider: DataProvider[]; - }>( + return arrayValues.reduce( (memo, value, index) => { let id: string = ''; let valueAsString: string = isString(value) ? value : `${values}`; const appendedUniqueId = `${contextId}-${eventId}-${field}-${index}-${value}`; if (fieldFromBrowserField == null) { - memo.stringValues.push(valueAsString); + memo.values.push(valueAsString); return memo; } if (isObjectArray || fieldType === GEO_FIELD_TYPE || [MESSAGE_FIELD_NAME].includes(field)) { - memo.stringValues.push(valueAsString); + memo.values.push(valueAsString); return memo; } else if (fieldType === IP_FIELD_TYPE) { id = `formatted-ip-data-provider-${contextId}-${field}-${value}-${eventId}`; @@ -101,10 +100,10 @@ export const useActionCellDataProvider = ({ } if (isArray(addresses)) { valueAsString = addresses.join(','); - addresses.forEach((ip) => memo.dataProvider.push(getDataProvider(field, id, ip))); + addresses.forEach((ip) => memo.dataProviders.push(getDataProvider(field, id, ip))); } - memo.dataProvider.push(getDataProvider(field, id, addresses)); - memo.stringValues.push(valueAsString); + memo.dataProviders.push(getDataProvider(field, id, addresses)); + memo.values.push(valueAsString); return memo; } } else if (PORT_NAMES.some((portName) => field === portName)) { @@ -137,11 +136,11 @@ export const useActionCellDataProvider = ({ } else { id = `event-details-value-default-draggable-${appendedUniqueId}`; } - memo.stringValues.push(valueAsString); - memo.dataProvider.push(getDataProvider(field, id, value)); + memo.values.push(valueAsString); + memo.dataProviders.push(getDataProvider(field, id, value)); return memo; }, - { stringValues: [], dataProvider: [] } + { values: [], dataProviders: [] } ); }, [ contextId, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts b/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts index 3b8cef529cca9..a13111e73248f 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/event_details/translations.ts @@ -106,13 +106,6 @@ export const RULE_TYPE = i18n.translate('xpack.securitySolution.detections.alert defaultMessage: 'Rule type', }); -export const SOURCE_EVENT_ID = i18n.translate( - 'xpack.securitySolution.detections.alerts.sourceEventId', - { - defaultMessage: 'Source event id', - } -); - export const MULTI_FIELD_TOOLTIP = i18n.translate( 'xpack.securitySolution.eventDetails.multiFieldTooltipContent', { @@ -138,7 +131,3 @@ export const REASON = i18n.translate('xpack.securitySolution.eventDetails.reason export const VIEW_ALL_FIELDS = i18n.translate('xpack.securitySolution.eventDetails.viewAllFields', { defaultMessage: 'View all fields in table', }); - -export const SESSION_ID = i18n.translate('xpack.securitySolution.eventDetails.sessionId', { - defaultMessage: 'Session ID', -}); diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts index 242a5bd440b81..d2ecd804e0959 100644 --- a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence.ts @@ -22,12 +22,14 @@ interface UseAlertPrevalenceOptions { value: string | string[] | undefined | null; timelineId: string; signalIndexName: string | null; + includeAlertIds?: boolean; } interface UserAlertPrevalenceResult { loading: boolean; count: undefined | number; error: boolean; + alertIds?: string[]; } export const useAlertPrevalence = ({ @@ -35,6 +37,7 @@ export const useAlertPrevalence = ({ value, timelineId, signalIndexName, + includeAlertIds = false, }: UseAlertPrevalenceOptions): UserAlertPrevalenceResult => { const timelineTime = useDeepEqualSelector((state) => inputsSelectors.timelineTimeRangeSelector(state) @@ -42,16 +45,18 @@ export const useAlertPrevalence = ({ const globalTime = useGlobalTime(); const { to, from } = timelineId === TimelineId.active ? timelineTime : globalTime; - const [initialQuery] = useState(() => generateAlertPrevalenceQuery(field, value, from, to)); + const [initialQuery] = useState(() => + generateAlertPrevalenceQuery(field, value, from, to, includeAlertIds) + ); - const { loading, data, setQuery } = useQueryAlerts<{}, AlertPrevalenceAggregation>({ + const { loading, data, setQuery } = useQueryAlerts<{ _id: string }, AlertPrevalenceAggregation>({ query: initialQuery, indexName: signalIndexName, }); useEffect(() => { - setQuery(generateAlertPrevalenceQuery(field, value, from, to)); - }, [setQuery, field, value, from, to]); + setQuery(generateAlertPrevalenceQuery(field, value, from, to, includeAlertIds)); + }, [setQuery, field, value, from, to, includeAlertIds]); let count: undefined | number; if (data) { @@ -68,11 +73,13 @@ export const useAlertPrevalence = ({ } const error = !loading && count === undefined; + const alertIds = data?.hits.hits.map(({ _id }) => _id); return { loading, count, error, + alertIds, }; }; @@ -80,8 +87,14 @@ const generateAlertPrevalenceQuery = ( field: string, value: string | string[] | undefined | null, from: string, - to: string + to: string, + includeAlertIds: boolean ) => { + // if we don't want the alert ids included, we set size to 0 to reduce the response payload + const size = includeAlertIds ? { size: DEFAULT_MAX_TABLE_QUERY_SIZE } : { size: 0 }; + // in that case, we also want to make sure we're sorting the results by timestamp + const sort = includeAlertIds ? { sort: { '@timestamp': 'desc' } } : {}; + const actualValue = Array.isArray(value) && value.length === 1 ? value[0] : value; let query; query = { @@ -125,7 +138,9 @@ const generateAlertPrevalenceQuery = ( } return { - size: 0, + ...size, + ...sort, + _source: false, aggs: { [ALERT_PREVALENCE_AGG]: { terms: { diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence_from_process_tree.ts b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence_from_process_tree.ts new file mode 100644 index 0000000000000..059724e683aa5 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alert_prevalence_from_process_tree.ts @@ -0,0 +1,110 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useState } from 'react'; + +import { useQuery } from 'react-query'; +import { useHttp } from '../../lib/kibana'; + +// import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../common/constants'; + +// import { useGlobalTime } from '../use_global_time'; +// import { TimelineId } from '../../../../common/types'; +// import { useDeepEqualSelector } from '../../hooks/use_selector'; +// import { inputsSelectors } from '../../store'; + +export const DETECTIONS_ALERTS_COUNT_ID = 'detections-alerts-count'; + +interface UseAlertPrevalenceOptions { + parentEntityId: string | string[] | undefined | null; + timelineId: string; + signalIndexName: string | null; +} + +interface UserAlertPrevalenceFromProcessTreeResult { + loading: boolean; + alertIds: undefined | string[]; + count?: number; + error: boolean; +} + +interface ProcessTreeAlertPrevalenceResponse { + alertIds: string[]; +} + +export function useAlertPrevalenceFromProcessTreeActual( + processEntityId: string +): UserAlertPrevalenceFromProcessTreeResult { + const http = useHttp(); + const query = useQuery( + ['getAlertPrevalenceFromProcessTree', processEntityId], + () => { + return http.get('/TBD', { + query: { processEntityId }, + }); + } + ); + + if (query.isLoading) { + return { + loading: true, + error: false, + alertIds: undefined, + }; + } else if (query.data) { + return { + loading: false, + error: false, + alertIds: query.data.alertIds, + }; + } else { + return { + loading: false, + error: true, + alertIds: undefined, + }; + } +} + +export const useAlertPrevalenceFromProcessTree = ({ + parentEntityId, + timelineId, + signalIndexName, +}: UseAlertPrevalenceOptions): UserAlertPrevalenceFromProcessTreeResult => { + // const timelineTime = useDeepEqualSelector((state) => + // inputsSelectors.timelineTimeRangeSelector(state) + // ); + // const globalTime = useGlobalTime(); + + // const { to, from } = timelineId === TimelineId.active ? timelineTime : globalTime; + const [{ loading, alertIds }, setResult] = useState<{ loading: boolean; alertIds?: string[] }>({ + loading: true, + alertIds: undefined, + }); + useEffect(() => { + const t = setTimeout(() => { + setResult({ + loading: false, + alertIds: [ + '489ef2e50e7bb6366c5eaa1b17873e56fda738134685ca54b997a2546834f08c', + '4b8e7111166034f94f62a009fa22ad42bfbb8edc86cda03055d14a9f2dd21f48', + '0347030aa3593566a7fcd77769c798efaf02f84a3196fd586b4700c0c9ae5872', + ], + }); + }, Math.random() * 1500 + 500); + return () => { + clearTimeout(t); + }; + }, []); + + return { + loading, + alertIds, + count: alertIds ? alertIds.length : undefined, + error: false, + }; +}; diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.test.tsx b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.test.tsx new file mode 100644 index 0000000000000..5911fc854b540 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.test.tsx @@ -0,0 +1,99 @@ +/* + * Copyright 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 { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; +import { useAlertsByIds } from './use_alerts_by_ids'; + +jest.mock('../../../detections/containers/detection_engine/alerts/use_query', () => ({ + useQueryAlerts: jest.fn(), +})); +const mockUseQueryAlerts = useQueryAlerts as jest.Mock; + +const alertIds = ['1', '2', '3']; +const testResult = { + hits: { + hits: [{ result: 1 }, { result: 2 }], + }, +}; + +describe('useAlertsByIds', () => { + beforeEach(() => { + mockUseQueryAlerts.mockReset(); + }); + + it('passes down the loading state', () => { + mockUseQueryAlerts.mockReturnValue({ + loading: true, + setQuery: jest.fn(), + }); + + const { result } = renderHook(() => useAlertsByIds({ alertIds })); + + expect(result.current).toEqual({ loading: true, error: false }); + }); + + it('calculates the error state', () => { + mockUseQueryAlerts.mockReturnValue({ + loading: false, + data: undefined, + setQuery: jest.fn(), + }); + + const { result } = renderHook(() => useAlertsByIds({ alertIds })); + + expect(result.current).toEqual({ loading: false, error: true, data: undefined }); + }); + + it('returns the results', () => { + mockUseQueryAlerts.mockReturnValue({ + loading: false, + data: testResult, + setQuery: jest.fn(), + }); + + const { result } = renderHook(() => useAlertsByIds({ alertIds })); + + expect(result.current).toEqual({ loading: false, error: false, data: testResult.hits.hits }); + }); + + it('constructs the correct query', () => { + mockUseQueryAlerts.mockReturnValue({ + loading: true, + setQuery: jest.fn(), + }); + + renderHook(() => useAlertsByIds({ alertIds })); + + expect(mockUseQueryAlerts).toHaveBeenCalledWith({ + query: expect.objectContaining({ + fields: ['*'], + _source: false, + query: { + ids: { + values: alertIds, + }, + }, + }), + }); + }); + + it('requests the specified fields', () => { + const testFields = ['test.*']; + mockUseQueryAlerts.mockReturnValue({ + loading: true, + setQuery: jest.fn(), + }); + + renderHook(() => useAlertsByIds({ alertIds, fields: testFields })); + + expect(mockUseQueryAlerts).toHaveBeenCalledWith({ + query: expect.objectContaining({ fields: testFields }), + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.ts new file mode 100644 index 0000000000000..dded0a046e8e8 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/containers/alerts/use_alerts_by_ids.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 { useEffect, useState } from 'react'; + +import { useQueryAlerts } from '../../../detections/containers/detection_engine/alerts/use_query'; + +interface UseAlertByIdsOptions { + alertIds: string[]; + fields?: string[]; +} + +interface Hit { + fields: Record; +} + +interface UserAlertByIdsResult { + loading: boolean; + error: boolean; + data?: Hit[]; +} + +/** + * Fetches the alert documents associated to the ids that are passed. + * By default it fetches all fields but they can be limited by passing + * the `fields` parameter. + */ +export const useAlertsByIds = ({ + alertIds, + fields = ['*'], +}: UseAlertByIdsOptions): UserAlertByIdsResult => { + const [initialQuery] = useState(() => generateAlertByIdsQuery(alertIds, fields)); + + const { loading, data, setQuery } = useQueryAlerts({ + query: initialQuery, + }); + + useEffect(() => { + setQuery(generateAlertByIdsQuery(alertIds, fields)); + }, [setQuery, alertIds, fields]); + + const error = !loading && data === undefined; + + return { + loading, + error, + data: data?.hits.hits, + }; +}; + +const generateAlertByIdsQuery = (alertIds: string[], fields: string[]) => { + return { + fields, + _source: false, + query: { + ids: { + values: alertIds, + }, + }, + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts index 1fe70f170b0fa..94a8ec8b3b870 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { MappingRuntimeFields, Sort } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { transformError } from '@kbn/securitysolution-es-utils'; import type { IRuleDataClient } from '@kbn/rule-registry-plugin/server'; import type { SecuritySolutionPluginRouter } from '../../../../types'; @@ -34,14 +34,17 @@ export const querySignalsRoute = ( }, async (context, request, response) => { // eslint-disable-next-line @typescript-eslint/naming-convention - const { query, aggs, _source, track_total_hits, size, runtime_mappings } = request.body; + const { query, aggs, _source, fields, track_total_hits, size, runtime_mappings, sort } = + request.body; const siemResponse = buildSiemResponse(response); if ( query == null && aggs == null && _source == null && + fields == null && track_total_hits == null && - size == null + size == null && + sort == null ) { return siemResponse.error({ statusCode: 400, @@ -57,9 +60,11 @@ export const querySignalsRoute = ( // Note: I use a spread operator to please TypeScript with aggs: { ...aggs } aggs: { ...aggs }, _source, + fields, track_total_hits, size, runtime_mappings: runtime_mappings as MappingRuntimeFields, + sort: sort as Sort, }, ignore_unavailable: true, }); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 30ad26e5de0d9..15972429c1e9c 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -24062,9 +24062,6 @@ "xpack.securitySolution.alertDetails.overview.hostRiskDataTitle": "Données de risque de l’hôte", "xpack.securitySolution.alertDetails.overview.hostsRiskScoreLink": "Score de risque de l’hôte", "xpack.securitySolution.alertDetails.overview.investigationGuide": "Guide d'investigation", - "xpack.securitySolution.alertDetails.overview.relatedCasesCount": "{caseCount} {caseCount, plural, =0 {cas.} =1 {cas :} other {cas :}}", - "xpack.securitySolution.alertDetails.overview.relatedCasesFailure": "Impossible de charger les cas connexes : \"{error}\".", - "xpack.securitySolution.alertDetails.overview.relatedCasesFound": "Alerte détectée dans", "xpack.securitySolution.alertDetails.refresh": "Actualiser", "xpack.securitySolution.alertDetails.summary.readLess": "Lire moins", "xpack.securitySolution.alertDetails.summary.readMore": "En savoir plus", @@ -25663,7 +25660,6 @@ "xpack.securitySolution.detectionResponse.viewRecentCases": "Afficher les cas récents", "xpack.securitySolution.detections.alerts.agentStatus": "Statut de l'agent", "xpack.securitySolution.detections.alerts.ruleType": "Type de règle", - "xpack.securitySolution.detections.alerts.sourceEventId": "ID événement source", "xpack.securitySolution.detections.hostIsolation.impactedCases": "Cette action sera ajoutée aux {cases}.", "xpack.securitySolution.documentationLinks.ariaLabelEnding": "cliquez pour ouvrir la documentation dans un nouvel onglet", "xpack.securitySolution.documentationLinks.detectionsRequirements.text": "Prérequis et exigences des détections", @@ -26249,7 +26245,6 @@ "xpack.securitySolution.eventDetails.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs dans un même champ", "xpack.securitySolution.eventDetails.nestedColumnCheckboxAriaLabel": "Le champ {field} est un objet, et il est composé de champs imbriqués qui peuvent être ajoutés en tant que colonne", "xpack.securitySolution.eventDetails.reason": "Raison", - "xpack.securitySolution.eventDetails.sessionId": "ID session", "xpack.securitySolution.eventDetails.table": "Tableau", "xpack.securitySolution.eventDetails.table.actions": "Actions", "xpack.securitySolution.eventDetails.value": "Valeur", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f9f15aed0c938..e53a85804b10c 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -24142,9 +24142,6 @@ "xpack.securitySolution.alertDetails.overview.hostRiskDataTitle": "ホストリスクデータ", "xpack.securitySolution.alertDetails.overview.hostsRiskScoreLink": "ホストリスクスコア", "xpack.securitySolution.alertDetails.overview.investigationGuide": "調査ガイド", - "xpack.securitySolution.alertDetails.overview.relatedCasesCount": "{caseCount} {caseCount, plural, other {個のケース:}}", - "xpack.securitySolution.alertDetails.overview.relatedCasesFailure": "関連するケースを読み込めません:\"{error}\"", - "xpack.securitySolution.alertDetails.overview.relatedCasesFound": "このアラートは次の場所で見つかりました", "xpack.securitySolution.alertDetails.refresh": "更新", "xpack.securitySolution.alertDetails.summary.readLess": "表示を減らす", "xpack.securitySolution.alertDetails.summary.readMore": "続きを読む", @@ -25744,7 +25741,6 @@ "xpack.securitySolution.detectionResponse.viewRecentCases": "最近のケースを表示", "xpack.securitySolution.detections.alerts.agentStatus": "エージェントステータス", "xpack.securitySolution.detections.alerts.ruleType": "ルールタイプ", - "xpack.securitySolution.detections.alerts.sourceEventId": "ソースイベントID", "xpack.securitySolution.detections.hostIsolation.impactedCases": "このアクションは{cases}に追加されます。", "xpack.securitySolution.documentationLinks.ariaLabelEnding": "クリックすると、新しいタブでドキュメントを開きます", "xpack.securitySolution.documentationLinks.detectionsRequirements.text": "検出の前提条件と要件", @@ -26329,7 +26325,6 @@ "xpack.securitySolution.eventDetails.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", "xpack.securitySolution.eventDetails.nestedColumnCheckboxAriaLabel": "{field}フィールドはオブジェクトであり、列として追加できるネストされたフィールドに分解されます", "xpack.securitySolution.eventDetails.reason": "理由", - "xpack.securitySolution.eventDetails.sessionId": "セッションID", "xpack.securitySolution.eventDetails.table": "表", "xpack.securitySolution.eventDetails.table.actions": "アクション", "xpack.securitySolution.eventDetails.value": "値", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e5981b5a62bc5..78d5e28908baa 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -24168,9 +24168,6 @@ "xpack.securitySolution.alertDetails.overview.hostRiskDataTitle": "主机风险数据", "xpack.securitySolution.alertDetails.overview.hostsRiskScoreLink": "主机风险分数", "xpack.securitySolution.alertDetails.overview.investigationGuide": "调查指南", - "xpack.securitySolution.alertDetails.overview.relatedCasesCount": "{caseCount} 个{caseCount, plural, other {案例:}}", - "xpack.securitySolution.alertDetails.overview.relatedCasesFailure": "无法加载相关案例:“{error}”", - "xpack.securitySolution.alertDetails.overview.relatedCasesFound": "发现此告警位于", "xpack.securitySolution.alertDetails.refresh": "刷新", "xpack.securitySolution.alertDetails.summary.readLess": "阅读更少内容", "xpack.securitySolution.alertDetails.summary.readMore": "阅读更多内容", @@ -25770,7 +25767,6 @@ "xpack.securitySolution.detectionResponse.viewRecentCases": "查看最近案例", "xpack.securitySolution.detections.alerts.agentStatus": "代理状态", "xpack.securitySolution.detections.alerts.ruleType": "规则类型", - "xpack.securitySolution.detections.alerts.sourceEventId": "源事件 ID", "xpack.securitySolution.detections.hostIsolation.impactedCases": "此操作将添加到 {cases}。", "xpack.securitySolution.documentationLinks.ariaLabelEnding": "单击以在新选项卡中打开文档", "xpack.securitySolution.documentationLinks.detectionsRequirements.text": "检测先决条件和要求", @@ -26356,7 +26352,6 @@ "xpack.securitySolution.eventDetails.multiFieldTooltipContent": "多字段的每个字段可以有多个值", "xpack.securitySolution.eventDetails.nestedColumnCheckboxAriaLabel": "{field} 字段是对象,并分解为可以添加为列的嵌套字段", "xpack.securitySolution.eventDetails.reason": "原因", - "xpack.securitySolution.eventDetails.sessionId": "会话 ID", "xpack.securitySolution.eventDetails.table": "表", "xpack.securitySolution.eventDetails.table.actions": "操作", "xpack.securitySolution.eventDetails.value": "值", diff --git a/x-pack/test/security_solution_cypress/es_archives/auditbeat/data.json b/x-pack/test/security_solution_cypress/es_archives/auditbeat/data.json index 974ecde3a48dd..6d62f1654a333 100644 --- a/x-pack/test/security_solution_cypress/es_archives/auditbeat/data.json +++ b/x-pack/test/security_solution_cypress/es_archives/auditbeat/data.json @@ -83,7 +83,12 @@ "args" : [ "-zsh" ], - "entity_id" : "q6pltOhTWlQx3BCD" + "entity_id" : "q6pltOhTWlQx3BCD", + "entry_leader": { + "entity_id": "q6pltOhTWlQx3BCD", + "name": "fake entry", + "pid": 2342342 + } }, "message" : "Process zsh (PID: 27884) by user test STARTED", "user" : { From 34af4dc140bcb3cab9d65aa21073a32e1a1506ca Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Fri, 22 Jul 2022 08:53:35 -0700 Subject: [PATCH 13/78] [DOCS] Add link to xMatters connector (#136870) --- docs/management/action-types.asciidoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/management/action-types.asciidoc b/docs/management/action-types.asciidoc index b2bf5f2bbe308..d85c03f240287 100644 --- a/docs/management/action-types.asciidoc +++ b/docs/management/action-types.asciidoc @@ -58,6 +58,10 @@ a| <> a| <> | Send a request to a web service. + +a| <> + +| Send actionable alerts to on-call xMatters resources. |=== [NOTE] From 7c8dff7af1818d0a580a474a4d1b307fd316e260 Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Fri, 22 Jul 2022 08:55:37 -0700 Subject: [PATCH 14/78] [DOCS] Replace ML API page with automated output (#136583) --- .../machine-learning/ml_apis_v2_defs.asciidoc | 240 ++++++++++++++++++ .../machine-learning/ml_apis_v2_docs.asciidoc | 86 +++++++ docs/api/machine-learning/sync.asciidoc | 89 ------- docs/redirects.asciidoc | 10 + docs/user/api.asciidoc | 3 +- 5 files changed, 338 insertions(+), 90 deletions(-) create mode 100644 docs/api/machine-learning/ml_apis_v2_defs.asciidoc create mode 100644 docs/api/machine-learning/ml_apis_v2_docs.asciidoc delete mode 100644 docs/api/machine-learning/sync.asciidoc diff --git a/docs/api/machine-learning/ml_apis_v2_defs.asciidoc b/docs/api/machine-learning/ml_apis_v2_defs.asciidoc new file mode 100644 index 0000000000000..691557bfb9634 --- /dev/null +++ b/docs/api/machine-learning/ml_apis_v2_defs.asciidoc @@ -0,0 +1,240 @@ +[[Machine_learning_APIs-definitions]] +== Definitions + +* <> +* <> +* <> +* <> +* <> +* <> + +[[MLSyncResponse]] +=== `MLSyncResponse` + +The sync machine learning saved objects API returns this list of machine learning saved objects that required synchronization. + + +==== Properties + +`datafeedsAdded` (++map[string,++<>++]++):: +If a saved object for an anomaly detection job is missing a datafeed identifier, it is added when you run the sync machine learning saved objects API. + + +`datafeedsRemoved` (++map[string,++<>++]++):: +If a saved object for an anomaly detection job references a datafeed that no longer exists, it is deleted when you run the sync machine learning saved objects API. + + +`savedObjectsCreated` (<>):: +If saved objects are missing for machine learning jobs or trained models, they are created when you run the sync machine learning saved objects API. + + +`savedObjectsDeleted` (<>):: +If saved objects exist for machine learning jobs or trained models that no longer exist, they are deleted when you run the sync machine learning saved objects API. + + +==== Example + +[source,json] +-------- +{ + "datafeedsAdded" : { + "some_property" : { + "success" : true + } + }, + "datafeedsRemoved" : { + "some_property" : { + "success" : true + } + }, + "savedObjectsCreated" : { + "anomaly-detector" : { + "some_property" : { + "success" : true + } + }, + "data-frame-analytics" : { + "some_property" : { + "success" : true + } + }, + "trained-model" : { + "some_property" : { + "success" : true + } + } + }, + "savedObjectsDeleted" : { + "anomaly-detector" : { + "some_property" : { + "success" : true + } + }, + "data-frame-analytics" : { + "some_property" : { + "success" : true + } + }, + "trained-model" : { + "some_property" : { + "success" : true + } + } + } +} + +-------- + +[[MLSyncResponse-Datafeeds]] +=== `MLSyncResponse-Datafeeds` + +The sync machine learning saved objects API response contains this object when there are datafeeds affected by the synchronization. There is an object for each relevant datafeed, which contains the synchronization status. + + +==== Properties + +`success` (+boolean+):: +The success or failure of the synchronization. + + +==== Example + +[source,json] +-------- +{ + "success" : true +} + +-------- + +[[MLSyncResponse-Jobs]] +=== `MLSyncResponse-Jobs` + +The sync machine learning saved objects API response contains this object when there are machine learning jobs affected by the synchronization. There is an object for each relevant job, which contains the synchronization status. + + +==== Properties + +`success` (+boolean+):: +The success or failure of the synchronization. + + +==== Example + +[source,json] +-------- +{ + "success" : true +} + +-------- + +[[MLSyncResponse-Models]] +=== `MLSyncResponse-Models` + +The sync machine learning saved objects API response contains this object when there are trained models affected by the synchronization. There is an object for each relevant trained model, which contains the synchronization status. + + +==== Properties + +`success` (+boolean+):: +The success or failure of the synchronization. + + +==== Example + +[source,json] +-------- +{ + "success" : true +} + +-------- + +[[MLSyncResponse-SavedObjectsCreated]] +=== `MLSyncResponse-SavedObjectsCreated` + +If saved objects are missing for machine learning jobs or trained models, they are created when you run the sync machine learning saved objects API. + + +==== Properties + +`anomaly-detector` (++map[string,++<>++]++):: +This object is present if there are anomaly detection jobs affected by the synchronization. + + +`data-frame-analytics` (++map[string,++<>++]++):: +This object is present if there are data frame analytics jobs affected by the synchronization. + + +`trained-model` (++map[string,++<>++]++):: +This object is present if there are trained models affected by the synchronization. + + +==== Example + +[source,json] +-------- +{ + "anomaly-detector" : { + "some_property" : { + "success" : true + } + }, + "data-frame-analytics" : { + "some_property" : { + "success" : true + } + }, + "trained-model" : { + "some_property" : { + "success" : true + } + } +} + +-------- + +[[MLSyncResponse-SavedObjectsDeleted]] +=== `MLSyncResponse-SavedObjectsDeleted` + +If saved objects exist for machine learning jobs or trained models that no longer exist, they are deleted when you run the sync machine learning saved objects API. + + +==== Properties + +`anomaly-detector` (++map[string,++<>++]++):: +This object is present if there are anomaly detection jobs affected by the synchronization. + + +`data-frame-analytics` (++map[string,++<>++]++):: +This object is present if there are data frame analytics jobs affected by the synchronization. + + +`trained-model` (++map[string,++<>++]++):: +This object is present if there are trained models affected by the synchronization. + + +==== Example + +[source,json] +-------- +{ + "anomaly-detector" : { + "some_property" : { + "success" : true + } + }, + "data-frame-analytics" : { + "some_property" : { + "success" : true + } + }, + "trained-model" : { + "some_property" : { + "success" : true + } + } +} + +-------- diff --git a/docs/api/machine-learning/ml_apis_v2_docs.asciidoc b/docs/api/machine-learning/ml_apis_v2_docs.asciidoc new file mode 100644 index 0000000000000..5bf8a3b8fc36b --- /dev/null +++ b/docs/api/machine-learning/ml_apis_v2_docs.asciidoc @@ -0,0 +1,86 @@ +[[Machine_learning_APIs]] +== Machine learning APIs + +* <> +* <> + +[[ml-sync-default]] +=== Sync machine learning saved objects in the default space + +Synchronizes Kibana saved objects for machine learning jobs and trained models in the default space. You must have `all` privileges for the *Machine Learning* feature in the *Analytics* section of the Kibana feature privileges. This API runs automatically when you start Kibana and periodically thereafter. + + +==== Request + +`GET /api/ml/saved_objects/sync` + +==== Query parameters + +[options="header"] +|========== +|Name |Type |Required |Description +|`simulate` |+boolean+; default: ++false++ |N |When true, simulates the synchronization by returning only the list actions that would be performed. + +|========== +==== Responses + +`200`:: ++ +-- +(<>) + +Indicates a successful call. + +-- + +==== Request example + +[source,json] +-------- +curl -XGET https://localhost:5601/api/ml/saved_objects/sync \ +-u USER:PASSWORD +-------- +[[ml-sync]] +=== Sync machine learning saved objects + +Synchronizes Kibana saved objects for machine learning jobs and trained models. You must have `all` privileges for the *Machine Learning* feature in the *Analytics* section of the Kibana feature privileges. This API runs automatically when you start Kibana and periodically thereafter. + + +==== Request + +`GET /s/{spaceId}/api/ml/saved_objects/sync` + +==== Path parameters + +[options="header"] +|========== +|Name |Type |Required |Description +|`spaceId` |+string+ |Y |An identifier for the space. + +|========== +==== Query parameters + +[options="header"] +|========== +|Name |Type |Required |Description +|`simulate` |+boolean+; default: ++false++ |N |When true, simulates the synchronization by returning only the list actions that would be performed. + +|========== +==== Responses + +`200`:: ++ +-- +(<>) + +Indicates a successful call. + +-- + +==== Request example + +[source,json] +-------- +curl -XGET https://localhost:5601/s/{spaceId}/api/ml/saved_objects/sync \ +-u USER:PASSWORD +-------- \ No newline at end of file diff --git a/docs/api/machine-learning/sync.asciidoc b/docs/api/machine-learning/sync.asciidoc deleted file mode 100644 index 798c04908bdd5..0000000000000 --- a/docs/api/machine-learning/sync.asciidoc +++ /dev/null @@ -1,89 +0,0 @@ -[[machine-learning-api-sync]] -=== Sync {ml} saved objects API -++++ -Sync {ml} saved objects -++++ - -Synchronizes {kib} saved objects for {ml} jobs and trained models. - -[[machine-learning-api-sync-request]] -==== {api-request-title} - -`GET :/api/ml/saved_objects/sync` - -`GET :/s//api/ml/saved_objects/sync` - -[[machine-learning-api-sync-prereq]] -==== {api-prereq-title} - -You must have `all` privileges for the *Machine Learning* feature in the *Analytics* section of the -<>. - -[[machine-learning-api-sync-desc]] -==== {api-description-title} - -This API runs automatically when you start {kib} and periodically thereafter. - -[[machine-learning-api-sync-path-params]] -==== {api-path-parms-title} - -`space_id`:: -(Optional, string) An identifier for the space. If `space_id` is not provided in -the URL the default space is used. - -[[machine-learning-api-sync-query-params]] -==== {api-query-parms-title} - -`simulate`:: -(Optional, boolean) When `true`, simulates the synchronization by only returning -the list actions that _would_ be performed. - -[[machine-learning-api-sync-response-body]] -==== {api-response-body-title} - -`datafeedsAdded`:: -(array) If a saved object for an {anomaly-job} is missing a {dfeed} identifier, -it is added. This list contains the {dfeed} identifiers and indicates whether -the synchronization was successful. - -`datafeedsRemoved`:: -(array) If a saved object for an anomaly detection job references a datafeed -that no longer exists, it is deleted. This list contains the {dfeed} identifiers -and indicates whether the synchronization was successful. - -`savedObjectsCreated`:: -(array) If saved objects are missing for {ml} jobs or trained models, they are -created. This list contains the job and model identifiers and indicates whether -the synchronization was successful. - -`savedObjectsDeleted`:: -(array) If saved objects exist for {ml} jobs or trained models that no longer -exist, they are deleted. This list contains the job and model identifiers and -indicates whether the synchronization was successful. - -[[machine-learning-api-sync-codes]] -==== {api-response-codes-title} - -`200`:: - Indicates a successful call. - -[[machine-learning-api-sync-example]] -==== {api-examples-title} - -Retrieve the list of {ml} saved objects that require synchronization: - -[source,sh] --------------------------------------------------- -GET api/ml/saved_objects/sync?simulate=true --------------------------------------------------- -// KIBANA - -If there are two jobs that need to be synchronized, for example, the API returns -the following response: - -[source,sh] --------------------------------------------------- -{"savedObjectsCreated":{"anomaly_detector":{"myjob1":{"success":true},"myjob2":{"success":true}}},"savedObjectsDeleted":{},"datafeedsAdded":{},"datafeedsRemoved":{}} --------------------------------------------------- - -To perform the synchronization, re-run the API and omit the `simulate` parameter. \ No newline at end of file diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index 934ebfc3e4b08..6ea58760538cb 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -415,3 +415,13 @@ This page has been deleted. Refer to <>. == Advanced Osquery This page has been deleted. Refer to <>. + +[role="exclude",id="machine-learning-api-sync"] +== Sync machine learning saved objects API + +This page has been deleted. Refer to <> and <>. + +[role="exclude",id="machine-learning-api"] +== Machine learning APIs + +This page has been deleted. Refer to <>. \ No newline at end of file diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index 0cfd4620b7cb5..2d967ed956b19 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -100,7 +100,8 @@ include::{kib-repo-dir}/api/actions-and-connectors.asciidoc[] include::{kib-repo-dir}/api/cases.asciidoc[] include::{kib-repo-dir}/api/dashboard-api.asciidoc[] include::{kib-repo-dir}/api/logstash-configuration-management.asciidoc[] -include::{kib-repo-dir}/api/machine-learning.asciidoc[] +include::{kib-repo-dir}/api/machine-learning/ml_apis_v2_docs.asciidoc[] +include::{kib-repo-dir}/api/machine-learning/ml_apis_v2_defs.asciidoc[leveloffset=+1] include::{kib-repo-dir}/api/short-urls.asciidoc[] include::{kib-repo-dir}/api/task-manager/health.asciidoc[] include::{kib-repo-dir}/api/upgrade-assistant.asciidoc[] From 0069fd71687e032f1426a0e946b6a6219f7f5164 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Fri, 22 Jul 2022 18:24:47 +0200 Subject: [PATCH 15/78] [Lens] Fix flaky drag and drop tests (#136922) * fix flaky tests * fix code * fix forgotten place --- .../apps/lens/group3/drag_and_drop.ts | 39 ++++++++++++------- .../test/functional/page_objects/lens_page.ts | 10 +++-- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts b/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts index bfb573636383d..adb1c42e814d5 100644 --- a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts +++ b/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const listingTable = getService('listingTable'); const xyChartContainer = 'xyVisChart'; - // Failing: See https://github.com/elastic/kibana/issues/136797 - describe.skip('lens drag and drop tests', () => { + describe('lens drag and drop tests', () => { describe('basic drag and drop', () => { it('should construct the basic split xy chart', async () => { await PageObjects.visualize.navigateToNewVisualization(); @@ -145,7 +144,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lnsXY_xDimensionPanel > lns-dimensionTrigger', 'lnsXY_splitDimensionPanel', - 'duplicate' + 'duplicate', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_splitDimensionPanel')).to.eql( '@timestamp [1]' @@ -157,7 +157,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lnsXY_splitDimensionPanel > lns-dimensionTrigger', 'lnsXY_yDimensionPanel', - 'swap' + 'swap', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_yDimensionPanel')).to.eql( 'Value count of @timestamp' @@ -175,7 +176,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lnsXY_splitDimensionPanel > lns-dimensionTrigger', 'lnsXY_xDimensionPanel', - 'combine' + 'combine', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel')).to.eql( 'Top values of clientip + 1 other' @@ -189,7 +191,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragFieldToExtraDropType( '@message.raw', 'lnsXY_xDimensionPanel', - 'combine' + 'combine', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel')).to.eql( 'Top values of clientip + 1 other' @@ -203,7 +206,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragFieldToExtraDropType( '@message.raw', 'lnsXY_xDimensionPanel', - 'combine' + 'combine', + xyChartContainer ); await PageObjects.lens.dragFieldToDimensionTrigger( @@ -213,12 +217,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragFieldToExtraDropType( 'geo.src', 'lnsXY_splitDimensionPanel', - 'combine' + 'combine', + xyChartContainer ); await PageObjects.lens.dragDimensionToExtraDropType( 'lnsXY_splitDimensionPanel > lns-dimensionTrigger', 'lnsXY_xDimensionPanel', - 'combine' + 'combine', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel')).to.eql( @@ -356,7 +362,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lns-layerPanel-0 > lnsXY_xDimensionPanel > lns-dimensionTrigger', 'lns-layerPanel-1 > lnsXY_xDimensionPanel', - 'duplicate' + 'duplicate', + xyChartContainer ); await PageObjects.lens.assertFocusedDimension('@timestamp [1]'); @@ -364,7 +371,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lns-layerPanel-0 > lnsXY_yDimensionPanel > lns-dimensionTrigger', 'lns-layerPanel-1 > lnsXY_yDimensionPanel', - 'duplicate' + 'duplicate', + xyChartContainer ); await PageObjects.lens.assertFocusedDimension('Average of bytes [1]'); @@ -388,7 +396,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lns-layerPanel-0 > lnsXY_yDimensionPanel > lns-dimensionTrigger', 'lns-layerPanel-1 > lnsXY_yDimensionPanel', - 'duplicate' + 'duplicate', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggersTexts('lns-layerPanel-0')).to.eql([ @@ -440,7 +449,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lns-layerPanel-1 > lnsXY_splitDimensionPanel > lns-dimensionTrigger', 'lns-layerPanel-0 > lnsXY_splitDimensionPanel', - 'swap' + 'swap', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggersTexts('lns-layerPanel-0')).to.eql([ @@ -457,7 +467,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.lens.dragDimensionToExtraDropType( 'lns-layerPanel-0 > lnsXY_splitDimensionPanel > lns-dimensionTrigger', 'lns-layerPanel-1 > lnsXY_splitDimensionPanel', - 'combine' + 'combine', + xyChartContainer ); expect(await PageObjects.lens.getDimensionTriggersTexts('lns-layerPanel-0')).to.eql([ diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 24395c59317a8..4f390b4c47ab4 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1288,7 +1288,8 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont async dragFieldToExtraDropType( field: string, to: string, - type: 'duplicate' | 'swap' | 'combine' + type: 'duplicate' | 'swap' | 'combine', + visDataTestSubj?: string | undefined ) { const from = `lnsFieldListPanelField-${field}`; await this.dragEnterDrop( @@ -1296,7 +1297,7 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont testSubjects.getCssSelector(`${to} > lnsDragDrop`), testSubjects.getCssSelector(`${to} > lnsDragDrop-${type}`) ); - await PageObjects.header.waitUntilLoadingHasFinished(); + await this.waitForVisualization(visDataTestSubj); }, /** @@ -1309,14 +1310,15 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont async dragDimensionToExtraDropType( from: string, to: string, - type: 'duplicate' | 'swap' | 'combine' + type: 'duplicate' | 'swap' | 'combine', + visDataTestSubj?: string | undefined ) { await this.dragEnterDrop( testSubjects.getCssSelector(from), testSubjects.getCssSelector(`${to} > lnsDragDrop`), testSubjects.getCssSelector(`${to} > lnsDragDrop-${type}`) ); - await PageObjects.header.waitUntilLoadingHasFinished(); + await this.waitForVisualization(visDataTestSubj); }, async switchToQuickFunctions() { From 4ad72fc8768e16014696ea8eb1d31f7fe8f9a12a Mon Sep 17 00:00:00 2001 From: Muhammad Ibragimov <53621505+mibragimov@users.noreply.github.com> Date: Fri, 22 Jul 2022 21:27:25 +0500 Subject: [PATCH 16/78] [Console] Fix syntax highlighting for triple quotes (#136719) * [Console] Fix syntax highlighting for triple quotes * Add tests Co-authored-by: Muhammad Ibragimov --- .../legacy_core_editor/mode/worker/worker.js | 4 +- test/functional/apps/console/_xjson.ts | 50 +++++++++++++++++++ test/functional/apps/console/index.js | 1 + test/functional/page_objects/console_page.ts | 14 +----- 4 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 test/functional/apps/console/_xjson.ts diff --git a/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js b/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js index 35faba08d8739..c7938437164f7 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js +++ b/src/plugins/console/public/application/models/legacy_core_editor/mode/worker/worker.js @@ -1950,8 +1950,8 @@ ace.define( uffff; if (ch === '"') { - let c = '""'; - if (text.substring(at, c.length) === c) { + // If the current and the next characters are equal to "", empty string or start of triple quoted strings + if (peek(0) === '"' && peek(1) === '"') { // literal next('"'); next('"'); diff --git a/test/functional/apps/console/_xjson.ts b/test/functional/apps/console/_xjson.ts new file mode 100644 index 0000000000000..386cda8ef32ea --- /dev/null +++ b/test/functional/apps/console/_xjson.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default ({ getService, getPageObjects }: FtrProviderContext) => { + const retry = getService('retry'); + const log = getService('log'); + const PageObjects = getPageObjects(['common', 'console', 'header']); + + describe("Console's XJSON features", function testXjson() { + this.tags('includeFirefox'); + before(async () => { + log.debug('navigateTo console'); + await PageObjects.common.navigateToApp('console'); + await retry.try(async () => { + await PageObjects.console.collapseHelp(); + }); + }); + + beforeEach(async () => { + await PageObjects.console.clearTextArea(); + }); + + describe('with triple quoted strings', () => { + it('should allow escaping quotation mark by wrapping it in triple quotes', async () => { + await PageObjects.console.enterRequest( + '\nPOST test/_doc/1 \n{\n "foo": """look "escaped" quotes"""' + ); + await PageObjects.console.clickPlay(); + await PageObjects.header.waitUntilLoadingHasFinished(); + expect(await PageObjects.console.hasErrorMarker()).to.be(false); + }); + }); + + describe('with invalid syntax', () => { + it('should trigger validation errors', async () => { + await PageObjects.console.enterRequest('\nGET test/doc/1 \n{\n "foo": \'\''); + expect(await PageObjects.console.hasInvalidSyntax()).to.be(true); + expect(await PageObjects.console.hasErrorMarker()).to.be(true); + }); + }); + }); +}; diff --git a/test/functional/apps/console/index.js b/test/functional/apps/console/index.js index 6222110ba489e..5e624f2d7ba81 100644 --- a/test/functional/apps/console/index.js +++ b/test/functional/apps/console/index.js @@ -22,6 +22,7 @@ export default function ({ getService, loadTestFile }) { loadTestFile(require.resolve('./_vector_tile')); loadTestFile(require.resolve('./_comments')); loadTestFile(require.resolve('./_variables')); + loadTestFile(require.resolve('./_xjson')); } }); } diff --git a/test/functional/page_objects/console_page.ts b/test/functional/page_objects/console_page.ts index e242e70b966a1..de1f02df42157 100644 --- a/test/functional/page_objects/console_page.ts +++ b/test/functional/page_objects/console_page.ts @@ -238,21 +238,11 @@ export class ConsolePageObject extends FtrService { } public async hasInvalidSyntax() { - try { - const requestEditor = await this.getRequestEditor(); - return Boolean(await requestEditor.findByCssSelector('.ace_invalid')); - } catch (e) { - return false; - } + return await this.find.existsByCssSelector('.ace_invalid'); } public async hasErrorMarker() { - try { - const requestEditor = await this.getRequestEditor(); - return Boolean(await requestEditor.findByCssSelector('.ace_error')); - } catch (e) { - return false; - } + return await this.find.existsByCssSelector('.ace_error'); } public async clickFoldWidget() { From 63c7beeb31a8caae9f3b9efce6ca8624f806734f Mon Sep 17 00:00:00 2001 From: Mat Schaffer Date: Sat, 23 Jul 2022 01:59:44 +0900 Subject: [PATCH 17/78] Skip ESTF failures (#136912) * Skip ESTF failures * Right, can't tag stabby lambdas --- .../test/api_integration/apis/monitoring/apm/instance_mb.js | 5 ++++- .../test/api_integration/apis/monitoring/apm/instances_mb.js | 5 ++++- x-pack/test/api_integration/apis/monitoring/cluster/list.js | 5 ++++- .../test/api_integration/apis/monitoring/cluster/list_mb.js | 5 ++++- .../apis/monitoring/standalone_cluster/cluster.js | 5 ++++- 5 files changed, 20 insertions(+), 5 deletions(-) diff --git a/x-pack/test/api_integration/apis/monitoring/apm/instance_mb.js b/x-pack/test/api_integration/apis/monitoring/apm/instance_mb.js index 4ab87ffdc7d51..966a4850c2162 100644 --- a/x-pack/test/api_integration/apis/monitoring/apm/instance_mb.js +++ b/x-pack/test/api_integration/apis/monitoring/apm/instance_mb.js @@ -12,7 +12,10 @@ import { getLifecycleMethods } from '../data_stream'; export default function ({ getService }) { const supertest = getService('supertest'); - describe('instance detail mb', () => { + describe('instance detail mb', function () { + // Archive contains non-cgroup data which collides with the in-cgroup services present by default on cloud deployments + this.tags(['skipCloud']); + const { setup, tearDown } = getLifecycleMethods(getService); const archive = 'x-pack/test/functional/es_archives/monitoring/apm_mb'; const timeRange = { diff --git a/x-pack/test/api_integration/apis/monitoring/apm/instances_mb.js b/x-pack/test/api_integration/apis/monitoring/apm/instances_mb.js index 33fc109715215..69c194656961e 100644 --- a/x-pack/test/api_integration/apis/monitoring/apm/instances_mb.js +++ b/x-pack/test/api_integration/apis/monitoring/apm/instances_mb.js @@ -11,7 +11,10 @@ import { getLifecycleMethods } from '../data_stream'; export default function ({ getService }) { const supertest = getService('supertest'); - describe('list mb', () => { + describe('list mb', function () { + // Archive contains non-cgroup data which collides with the in-cgroup services present by default on cloud deployments + this.tags(['skipCloud']); + const { setup, tearDown } = getLifecycleMethods(getService); const archive = 'x-pack/test/functional/es_archives/monitoring/apm_mb'; const timeRange = { diff --git a/x-pack/test/api_integration/apis/monitoring/cluster/list.js b/x-pack/test/api_integration/apis/monitoring/cluster/list.js index 6859f13b7b66a..93789138bd7d2 100644 --- a/x-pack/test/api_integration/apis/monitoring/cluster/list.js +++ b/x-pack/test/api_integration/apis/monitoring/cluster/list.js @@ -12,7 +12,10 @@ export default function ({ getService }) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - describe('list', () => { + describe('list', function () { + // Archive contains non-cgroup data which collides with the in-cgroup services present by default on cloud deployments + this.tags(['skipCloud']); + describe('with trial license clusters', () => { const archive = 'x-pack/test/functional/es_archives/monitoring/multicluster'; const timeRange = { diff --git a/x-pack/test/api_integration/apis/monitoring/cluster/list_mb.js b/x-pack/test/api_integration/apis/monitoring/cluster/list_mb.js index 13b5310bc1fe6..946a5c4fb5e77 100644 --- a/x-pack/test/api_integration/apis/monitoring/cluster/list_mb.js +++ b/x-pack/test/api_integration/apis/monitoring/cluster/list_mb.js @@ -13,7 +13,10 @@ export default function ({ getService }) { const supertest = getService('supertest'); const { setup, tearDown } = getLifecycleMethods(getService); - describe('list mb', () => { + describe('list mb', function () { + // Archive contains non-cgroup data which collides with the in-cgroup services present by default on cloud deployments + this.tags(['skipCloud']); + describe('with trial license clusters', () => { const archive = 'x-pack/test/functional/es_archives/monitoring/multicluster_mb'; const timeRange = { diff --git a/x-pack/test/api_integration/apis/monitoring/standalone_cluster/cluster.js b/x-pack/test/api_integration/apis/monitoring/standalone_cluster/cluster.js index 4653e7232b920..5c288aac88374 100644 --- a/x-pack/test/api_integration/apis/monitoring/standalone_cluster/cluster.js +++ b/x-pack/test/api_integration/apis/monitoring/standalone_cluster/cluster.js @@ -12,7 +12,10 @@ export default function ({ getService }) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); - describe('cluster', () => { + describe('cluster', function () { + // Archive contains non-cgroup data which collides with the in-cgroup services present by default on cloud deployments + this.tags(['skipCloud']); + const archive = 'x-pack/test/functional/es_archives/monitoring/standalone_cluster'; const timeRange = { min: '2019-02-04T16:52:11.741Z', From 4bc0cb7caecbc460e715fd86865ece9371a5c796 Mon Sep 17 00:00:00 2001 From: Abdon Pijpelink Date: Fri, 22 Jul 2022 19:03:39 +0200 Subject: [PATCH 18/78] [DOCS] Update link to common cluster issues page (#136965) --- docs/setup/upgrade/resolving-migration-failures.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/setup/upgrade/resolving-migration-failures.asciidoc b/docs/setup/upgrade/resolving-migration-failures.asciidoc index 0af9fafa36d77..3d3a80fb423ca 100644 --- a/docs/setup/upgrade/resolving-migration-failures.asciidoc +++ b/docs/setup/upgrade/resolving-migration-failures.asciidoc @@ -177,7 +177,7 @@ If the cluster exceeded the low watermark for disk usage, the output should cont -------------------------------------------- "The node is above the low watermark cluster setting [cluster.routing.allocation.disk.watermark.low=85%], using more disk space than the maximum allowed [85.0%], actual free: [11.692661332965082%]" -------------------------------------------- -Refer to the {es} guide for how to {ref}/fix-common-cluster-issues.html[fix common cluster issues]. +Refer to the {es} guide for how to {ref}/disk-usage-exceeded.html[fix common cluster issues]. If routing allocation is the issue, the `_cluster/allocation/explain` API will return an entry similar to this: From 0fe480c87b41b421ebd60c3c5dd83d87904259b3 Mon Sep 17 00:00:00 2001 From: Marshall Main <55718608+marshallmain@users.noreply.github.com> Date: Fri, 22 Jul 2022 10:11:27 -0700 Subject: [PATCH 19/78] [Security Solution][Alerts] New terms security rule type (#134526) * WIP new value rule type * Finish implementation and add integration tests * Remove experimental value list exception implementation * Reorganize aggregation and runtime mapping builders * Add new terms field to UI and tests * Add new fields in more places * Add Cypress test for new terms rule creation * Change historyWindowStart references on UI to historyWindowSize * Fix more tests that break when more rule types are added * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * Fix UI form schema description * Test implementation for phased new terms search implementation * New terms using composite agg for history search phase * Implementation using terms agg for phase 2 * Add alert creation logic back, add more unit tests * Update buildNewTermsAggregation snapshot * Type and test fixes * Fix merge * More merge conflict fixes * Mock and test fixes * API test fix * More test fixes * Try fixing cypress test * Fix cypress test again * Fix new terms field text * Add new terms rule type to patch converter function * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' * UX feedback: rule card icon and field box description * Fix types post merge main * Remove duplicate switch case * Add special investigate in timeline action for new terms alerts * PR comments: naming, improved schema error message * PR comments: update cypress test, fix copied error messages * Add README in new terms folder Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../src/type/index.ts | 1 + .../src/index.ts | 1 + .../src/limited_size_array/index.test.ts | 112 +++++ .../src/limited_size_array/index.ts | 46 ++ .../src/rule_type_constants.ts | 1 + .../src/rule_type_mappings.ts | 2 + .../create_persistence_rule_type_wrapper.ts | 15 +- .../server/utils/persistence_types.ts | 4 +- .../schemas/alerts/{8.3.0 => 8.4.0}/index.ts | 35 +- .../detection_engine/schemas/alerts/index.ts | 34 +- .../schemas/common/schemas.ts | 8 + .../schemas/request/rule_schemas.mock.ts | 40 ++ .../schemas/request/rule_schemas.ts | 33 ++ .../common/detection_engine/utils.ts | 1 + .../common/field_maps/field_names.ts | 1 + .../detection_rules/new_terms_rule.spec.ts | 157 +++++++ .../security_solution/cypress/objects/rule.ts | 25 ++ .../cypress/screens/create_new_rule.ts | 12 +- .../cypress/screens/rule_details.ts | 4 + .../cypress/tasks/create_new_rule.ts | 33 +- .../event_details/alert_summary_view.test.tsx | 34 ++ .../event_details/get_alert_summary_rows.tsx | 10 +- .../components/alerts_table/actions.tsx | 175 ++++++++ .../components/alerts_table/translations.ts | 7 + .../rules/description_step/helpers.tsx | 8 + .../rules/description_step/translations.tsx | 7 + .../rules/new_terms_fields/index.tsx | 43 ++ .../rules/new_terms_fields/translations.ts | 15 + .../rules/rule_preview/index.test.tsx | 2 + .../components/rules/rule_preview/index.tsx | 6 + .../rules/rule_preview/use_preview_route.tsx | 10 + .../rules/schedule_item_form/index.tsx | 11 +- .../rules/schedule_item_form/translations.ts | 7 + .../rules/select_rule_type/index.tsx | 23 + .../rules/select_rule_type/translations.ts | 14 + .../rules/step_about_rule/index.test.tsx | 2 + .../rules/step_define_rule/index.tsx | 37 ++ .../rules/step_define_rule/schema.tsx | 72 +++ .../detection_engine/rules/types.ts | 2 + .../rules/all/__mocks__/mock.ts | 4 + .../detection_engine/rules/create/helpers.ts | 81 +++- .../detection_engine/rules/helpers.test.tsx | 6 + .../pages/detection_engine/rules/helpers.tsx | 14 + .../pages/detection_engine/rules/types.ts | 2 + .../routes/rules/preview_rules_route.ts | 15 + .../create_security_rule_type_wrapper.ts | 1 + .../factories/bulk_create_factory.ts | 12 +- .../factories/utils/build_bulk_body.ts | 10 +- .../utils/wrap_new_terms_alerts.test.ts | 79 ++++ .../factories/utils/wrap_new_terms_alerts.ts | 69 +++ .../lib/detection_engine/rule_types/index.ts | 1 + .../rule_types/new_terms/README.md | 29 ++ .../build_new_terms_aggregation.test.ts.snap | 137 ++++++ ...ild_timestamp_runtime_mapping.test.ts.snap | 21 + .../build_new_terms_aggregation.test.ts | 73 +++ .../new_terms/build_new_terms_aggregation.ts | 140 ++++++ .../build_timestamp_runtime_mapping.test.ts | 18 + .../build_timestamp_runtime_mapping.ts | 34 ++ .../new_terms/create_new_terms_alert_type.ts | 345 ++++++++++++++ .../lib/detection_engine/rule_types/types.ts | 1 + ...ich_filter_with_rule_type_mappings.test.ts | 4 +- .../schemas/rule_converters.test.ts | 24 + .../schemas/rule_converters.ts | 51 +++ .../schemas/rule_schemas.mock.ts | 23 + .../detection_engine/schemas/rule_schemas.ts | 19 + .../signals/build_events_query.ts | 1 + .../detection_engine/signals/get_filter.ts | 1 + .../signals/reason_formatters.ts | 5 +- .../signals/search_after_bulk_create.test.ts | 18 + .../lib/detection_engine/signals/types.ts | 3 +- .../security_solution/server/plugin.ts | 2 + .../group1/create_new_terms.ts | 422 ++++++++++++++++++ .../security_and_spaces/group1/index.ts | 1 + .../utils/get_open_signals.ts | 5 +- .../remove_server_generated_properties.ts | 1 - .../timestamp_fallback/data.json | 65 +++ .../timestamp_fallback/mappings.json | 37 ++ 77 files changed, 2764 insertions(+), 60 deletions(-) create mode 100644 packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.test.ts create mode 100644 packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts rename x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/{8.3.0 => 8.4.0}/index.ts (67%) create mode 100644 x-pack/plugins/security_solution/cypress/integration/detection_rules/new_terms_rule.spec.ts create mode 100644 x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/index.tsx create mode 100644 x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/translations.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/README.md create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_new_terms_aggregation.test.ts.snap create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_timestamp_runtime_mapping.test.ts.snap create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.test.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.ts create mode 100644 x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts create mode 100644 x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_new_terms.ts create mode 100644 x-pack/test/functional/es_archives/security_solution/timestamp_fallback/data.json create mode 100644 x-pack/test/functional/es_archives/security_solution/timestamp_fallback/mappings.json diff --git a/packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts b/packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts index 0e74037878992..ee9b410746da0 100644 --- a/packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts +++ b/packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts @@ -15,6 +15,7 @@ export const type = t.keyof({ saved_query: null, threshold: null, threat_match: null, + new_terms: null, }); export type Type = t.TypeOf; diff --git a/packages/kbn-securitysolution-io-ts-types/src/index.ts b/packages/kbn-securitysolution-io-ts-types/src/index.ts index 0bb99e4c766e7..01f9b32ca31af 100644 --- a/packages/kbn-securitysolution-io-ts-types/src/index.ts +++ b/packages/kbn-securitysolution-io-ts-types/src/index.ts @@ -18,6 +18,7 @@ export * from './empty_string_array'; export * from './enumeration'; export * from './iso_date_string'; export * from './import_query_schema'; +export * from './limited_size_array'; export * from './non_empty_array'; export * from './non_empty_or_nullable_string_array'; export * from './non_empty_string_array'; diff --git a/packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.test.ts b/packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.test.ts new file mode 100644 index 0000000000000..72982fe54e241 --- /dev/null +++ b/packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.test.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import * as t from 'io-ts'; + +import { pipe } from 'fp-ts/lib/pipeable'; +import { left } from 'fp-ts/lib/Either'; +import { LimitedSizeArray } from '.'; +import { foldLeftRight, getPaths } from '@kbn/securitysolution-io-ts-utils'; + +const testSchema = t.keyof({ + valid: true, + also_valid: true, +}); +type TestSchema = t.TypeOf; + +const limitedSizeArraySchema = LimitedSizeArray({ + codec: testSchema, + minSize: 1, + maxSize: 2, + name: 'TestSchemaArray', +}); + +describe('limited size array', () => { + test('it should generate the correct name for limited size array', () => { + const newTestSchema = LimitedSizeArray({ codec: testSchema }); + expect(newTestSchema.name).toEqual('LimitedSizeArray<"valid" | "also_valid">'); + }); + + test('it should use a supplied name override', () => { + const newTestSchema = LimitedSizeArray({ codec: testSchema, name: 'someName' }); + expect(newTestSchema.name).toEqual('someName'); + }); + + test('it should not validate an array smaller than min size', () => { + const payload: string[] = []; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Array size (0) is out of bounds: min: 1, max: 2', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should validate an array of testSchema that is within min and max size', () => { + const payload: TestSchema[] = ['valid']; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should validate an array of valid testSchema strings that is within min and max size', () => { + const payload: TestSchema[] = ['valid', 'also_valid']; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([]); + expect(message.schema).toEqual(payload); + }); + + test('it should not validate an array bigger than max size', () => { + const payload: TestSchema[] = ['valid', 'also_valid', 'also_valid']; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Array size (3) is out of bounds: min: 1, max: 2', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an array with a number', () => { + const payload = ['valid', 123]; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "123" supplied to "TestSchemaArray"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should not validate an array with an invalid string', () => { + const payload = ['valid', 'invalid']; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "invalid" supplied to "TestSchemaArray"', + ]); + expect(message.schema).toEqual({}); + }); + + test('it should not validate a null value', () => { + const payload = null; + const decoded = limitedSizeArraySchema.decode(payload); + const message = pipe(decoded, foldLeftRight); + + expect(getPaths(left(message.errors))).toEqual([ + 'Invalid value "null" supplied to "TestSchemaArray"', + ]); + expect(message.schema).toEqual({}); + }); +}); diff --git a/packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts b/packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts new file mode 100644 index 0000000000000..54d0aa9dfe2fc --- /dev/null +++ b/packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.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 * as t from 'io-ts'; +import { Either } from 'fp-ts/lib/Either'; + +export const LimitedSizeArray = ({ + codec, + minSize, + maxSize, + name = `LimitedSizeArray<${codec.name}>`, +}: { + codec: C; + minSize?: number; + maxSize?: number; + name?: string; +}) => { + const arrType = t.array(codec); + type ArrType = t.TypeOf; + return new t.Type( + name, + arrType.is, + (input, context): Either => { + if ( + Array.isArray(input) && + ((minSize && input.length < minSize) || (maxSize && input.length > maxSize)) + ) { + return t.failure( + input, + context, + `Array size (${input.length}) is out of bounds: min: ${ + minSize ?? 'not specified' + }, max: ${maxSize ?? 'not specified'}` + ); + } else { + return arrType.validate(input, context); + } + }, + t.identity + ); +}; diff --git a/packages/kbn-securitysolution-rules/src/rule_type_constants.ts b/packages/kbn-securitysolution-rules/src/rule_type_constants.ts index baf355897b7b5..b97c71caaefe5 100644 --- a/packages/kbn-securitysolution-rules/src/rule_type_constants.ts +++ b/packages/kbn-securitysolution-rules/src/rule_type_constants.ts @@ -21,3 +21,4 @@ export const ML_RULE_TYPE_ID = `${RULE_TYPE_PREFIX}.mlRule` as const; export const QUERY_RULE_TYPE_ID = `${RULE_TYPE_PREFIX}.queryRule` as const; export const SAVED_QUERY_RULE_TYPE_ID = `${RULE_TYPE_PREFIX}.savedQueryRule` as const; export const THRESHOLD_RULE_TYPE_ID = `${RULE_TYPE_PREFIX}.thresholdRule` as const; +export const NEW_TERMS_RULE_TYPE_ID = `${RULE_TYPE_PREFIX}.newTermsRule` as const; diff --git a/packages/kbn-securitysolution-rules/src/rule_type_mappings.ts b/packages/kbn-securitysolution-rules/src/rule_type_mappings.ts index 6036c6418e20c..d7919ae013eca 100644 --- a/packages/kbn-securitysolution-rules/src/rule_type_mappings.ts +++ b/packages/kbn-securitysolution-rules/src/rule_type_mappings.ts @@ -10,6 +10,7 @@ import { EQL_RULE_TYPE_ID, INDICATOR_RULE_TYPE_ID, ML_RULE_TYPE_ID, + NEW_TERMS_RULE_TYPE_ID, QUERY_RULE_TYPE_ID, SAVED_QUERY_RULE_TYPE_ID, THRESHOLD_RULE_TYPE_ID, @@ -25,6 +26,7 @@ export const ruleTypeMappings = { saved_query: SAVED_QUERY_RULE_TYPE_ID, threat_match: INDICATOR_RULE_TYPE_ID, threshold: THRESHOLD_RULE_TYPE_ID, + new_terms: NEW_TERMS_RULE_TYPE_ID, }; type RuleTypeMappings = typeof ruleTypeMappings; diff --git a/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts b/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts index 7d8c6921d9f1f..a1ce484016211 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts @@ -22,7 +22,7 @@ export const createPersistenceRuleTypeWrapper: CreatePersistenceRuleTypeWrapper ...options, services: { ...options.services, - alertWithPersistence: async (alerts, refresh) => { + alertWithPersistence: async (alerts, refresh, maxAlerts = undefined) => { const numAlerts = alerts.length; logger.debug(`Found ${numAlerts} alerts.`); @@ -82,7 +82,13 @@ export const createPersistenceRuleTypeWrapper: CreatePersistenceRuleTypeWrapper } if (filteredAlerts.length === 0) { - return { createdAlerts: [], errors: {} }; + return { createdAlerts: [], errors: {}, alertsWereTruncated: false }; + } + + let alertsWereTruncated = false; + if (maxAlerts && filteredAlerts.length > maxAlerts) { + filteredAlerts.length = maxAlerts; + alertsWereTruncated = true; } const augmentedAlerts = filteredAlerts.map((alert) => { @@ -105,7 +111,7 @@ export const createPersistenceRuleTypeWrapper: CreatePersistenceRuleTypeWrapper }); if (response == null) { - return { createdAlerts: [], errors: {} }; + return { createdAlerts: [], errors: {}, alertsWereTruncated }; } return { @@ -120,10 +126,11 @@ export const createPersistenceRuleTypeWrapper: CreatePersistenceRuleTypeWrapper }) .filter((_, idx) => response.body.items[idx].create?.status === 201), errors: errorAggregator(response.body, [409]), + alertsWereTruncated, }; } else { logger.debug('Writing is disabled.'); - return { createdAlerts: [], errors: {} }; + return { createdAlerts: [], errors: {}, alertsWereTruncated: false }; } }, }, diff --git a/x-pack/plugins/rule_registry/server/utils/persistence_types.ts b/x-pack/plugins/rule_registry/server/utils/persistence_types.ts index 5390b275f73b7..9e5570ffa1afd 100644 --- a/x-pack/plugins/rule_registry/server/utils/persistence_types.ts +++ b/x-pack/plugins/rule_registry/server/utils/persistence_types.ts @@ -24,12 +24,14 @@ export type PersistenceAlertService = ( _id: string; _source: T; }>, - refresh: boolean | 'wait_for' + refresh: boolean | 'wait_for', + maxAlerts?: number ) => Promise>; export interface PersistenceAlertServiceResult { createdAlerts: Array & { _id: string; _index: string }>; errors: BulkResponseErrorAggregation; + alertsWereTruncated: boolean; } export interface PersistenceServices { diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/8.3.0/index.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/8.4.0/index.ts similarity index 67% rename from x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/8.3.0/index.ts rename to x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/8.4.0/index.ts index 96cc39fc95a29..703e324a4fb24 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/8.3.0/index.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/8.4.0/index.ts @@ -10,6 +10,7 @@ import type { AlertWithCommonFields800 } from '@kbn/rule-registry-plugin/common/ import type { ALERT_GROUP_ID, ALERT_GROUP_INDEX, + ALERT_NEW_TERMS, ALERT_RULE_INDICES, } from '../../../../field_maps/field_names'; import type { @@ -19,38 +20,48 @@ import type { EqlShellAlert800, } from '../8.0.0'; -export type { Ancestor800 as Ancestor830 }; +export type { Ancestor800 as Ancestor840 }; -/* DO NOT MODIFY THIS SCHEMA TO ADD NEW FIELDS. These types represent the alerts that shipped in 8.3.0. -Any changes to these types should be bug fixes so the types more accurately represent the alerts from 8.3.0. +/* DO NOT MODIFY THIS SCHEMA TO ADD NEW FIELDS. These types represent the alerts that shipped in 8.4.0. +Any changes to these types should be bug fixes so the types more accurately represent the alerts from 8.4.0. If you are adding new fields for a new release of Kibana, create a new sibling folder to this one for the version to be released and add the field(s) to the schema in that folder. Then, update `../index.ts` to import from the new folder that has the latest schemas, add the new schemas to the union of all alert schemas, and re-export the new schemas as the `*Latest` schemas. */ -export interface BaseFields830 extends BaseFields800 { +export interface BaseFields840 extends BaseFields800 { [ALERT_RULE_INDICES]: string[]; } -export interface WrappedFields830 { +export interface WrappedFields840 { _id: string; _index: string; _source: T & { [ALERT_UUID]: string }; } -export type GenericAlert830 = AlertWithCommonFields800; +export type GenericAlert840 = AlertWithCommonFields800; -// This is the type of the final generated alert including base fields, common fields -// added by the alertWithPersistence function, and arbitrary fields copied from source documents -export type DetectionAlert830 = GenericAlert830 | EqlShellAlert800 | EqlBuildingBlockAlert800; - -export interface EqlShellFields830 extends BaseFields830 { +export interface EqlShellFields840 extends BaseFields840 { [ALERT_GROUP_ID]: string; [ALERT_UUID]: string; } -export interface EqlBuildingBlockFields830 extends BaseFields830 { +export interface EqlBuildingBlockFields840 extends BaseFields840 { [ALERT_GROUP_ID]: string; [ALERT_GROUP_INDEX]: number; [ALERT_BUILDING_BLOCK_TYPE]: 'default'; } + +export interface NewTermsFields840 extends BaseFields840 { + [ALERT_NEW_TERMS]: Array; +} + +export type NewTermsAlert840 = AlertWithCommonFields800; + +// This is the type of the final generated alert including base fields, common fields +// added by the alertWithPersistence function, and arbitrary fields copied from source documents +export type DetectionAlert840 = + | GenericAlert840 + | EqlShellAlert800 + | EqlBuildingBlockAlert800 + | NewTermsAlert840; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/index.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/index.ts index 15b80f441e77c..a1a0a9079234a 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/index.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts/index.ts @@ -5,26 +5,28 @@ * 2.0. */ -import type { - EqlBuildingBlockFields830, - EqlShellFields830, - WrappedFields830, - DetectionAlert830, - BaseFields830, - Ancestor830, -} from './8.3.0'; - import type { DetectionAlert800 } from './8.0.0'; +import type { + Ancestor840, + BaseFields840, + DetectionAlert840, + WrappedFields840, + EqlBuildingBlockFields840, + EqlShellFields840, + NewTermsFields840, +} from './8.4.0'; + // When new Alert schemas are created for new Kibana versions, add the DetectionAlert type from the new version // here, e.g. `export type DetectionAlert = DetectionAlert800 | DetectionAlert820` if a new schema is created in 8.2.0 -export type DetectionAlert = DetectionAlert800 | DetectionAlert830; +export type DetectionAlert = DetectionAlert800 | DetectionAlert840; export type { - Ancestor830 as AncestorLatest, - BaseFields830 as BaseFieldsLatest, - DetectionAlert830 as DetectionAlertLatest, - WrappedFields830 as WrappedFieldsLatest, - EqlBuildingBlockFields830 as EqlBuildingBlockFieldsLatest, - EqlShellFields830 as EqlShellFieldsLatest, + Ancestor840 as AncestorLatest, + BaseFields840 as BaseFieldsLatest, + DetectionAlert840 as DetectionAlertLatest, + WrappedFields840 as WrappedFieldsLatest, + EqlBuildingBlockFields840 as EqlBuildingBlockFieldsLatest, + EqlShellFields840 as EqlShellFieldsLatest, + NewTermsFields840 as NewTermsFieldsLatest, }; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts index 7c113bc2496dc..4f583dba23abf 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/common/schemas.ts @@ -14,6 +14,7 @@ import { PositiveInteger, PositiveIntegerGreaterThanZero, UUID, + LimitedSizeArray, } from '@kbn/securitysolution-io-ts-types'; import * as t from 'io-ts'; @@ -281,6 +282,13 @@ export const thresholdWithCardinality = t.intersection([ ]); export type ThresholdWithCardinality = t.TypeOf; +// New terms rule type currently only supports a single term, but should support more in the future +export const newTermsFields = LimitedSizeArray({ codec: t.string, minSize: 1, maxSize: 1 }); +export type NewTermsFields = t.TypeOf; + +export const historyWindowStart = NonEmptyString; +export type HistoryWindowStart = t.TypeOf; + export const created_at = IsoDateString; export const updated_at = IsoDateString; diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.mock.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.mock.ts index 1daf997273253..5edc868a8836c 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.mock.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.mock.ts @@ -14,6 +14,8 @@ import type { SavedQueryCreateSchema, ThreatMatchCreateSchema, ThresholdCreateSchema, + NewTermsCreateSchema, + NewTermsUpdateSchema, } from './rule_schemas'; export const getCreateRulesSchemaMock = (ruleId = 'rule-1'): QueryCreateSchema => ({ @@ -128,6 +130,26 @@ export const getCreateThresholdRulesSchemaMock = (ruleId = 'rule-1'): ThresholdC }, }); +export const getCreateNewTermsRulesSchemaMock = ( + ruleId = 'rule-1', + enabled = false +): NewTermsCreateSchema => ({ + description: 'Detecting root and admin users', + enabled, + index: ['auditbeat-*'], + name: 'Query with a rule id', + query: '*', + severity: 'high', + type: 'new_terms', + risk_score: 55, + language: 'kuery', + rule_id: ruleId, + interval: '5m', + from: 'now-6m', + new_terms_fields: ['user.name'], + history_window_start: 'now-7d', +}); + export const getUpdateRulesSchemaMock = ( id = '04128c15-0d1b-4716-a4c5-46997ac7f3bd' ): QueryUpdateSchema => ({ @@ -153,3 +175,21 @@ export const getUpdateMachineLearningSchemaMock = ( anomaly_threshold: 58, machine_learning_job_id: 'typical-ml-job-id', }); + +export const getUpdateNewTermsSchemaMock = ( + id = '04128c15-0d1b-4716-a4c5-46997ac7f3bd' +): NewTermsUpdateSchema => ({ + description: 'Detecting root and admin users', + index: ['auditbeat-*'], + name: 'Query with a rule id', + query: '*', + severity: 'high', + type: 'new_terms', + risk_score: 55, + language: 'kuery', + id, + interval: '5m', + from: 'now-6m', + new_terms_fields: ['user.name'], + history_window_start: 'now-7d', +}); diff --git a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.ts b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.ts index 6be7446092d4a..95dc6e7f4e65d 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/schemas/request/rule_schemas.ts @@ -74,6 +74,8 @@ import { RelatedIntegrationArray, RequiredFieldArray, SetupGuide, + newTermsFields, + historyWindowStart, } from '../common'; export const createSchema = < @@ -358,6 +360,30 @@ const { } = buildAPISchemas(machineLearningRuleParams); export { machineLearningCreateParams }; + +const newTermsRuleParams = { + required: { + type: t.literal('new_terms'), + query, + new_terms_fields: newTermsFields, + history_window_start: historyWindowStart, + }, + optional: { + index, + data_view_id, + filters, + }, + defaultable: { + language: t.keyof({ kuery: null, lucene: null }), + }, +}; +const { + create: newTermsCreateParams, + patch: newTermsPatchParams, + response: newTermsResponseParams, +} = buildAPISchemas(newTermsRuleParams); + +export { newTermsCreateParams }; // --------------------------------------- // END type specific parameter definitions @@ -368,6 +394,7 @@ export const createTypeSpecific = t.union([ savedQueryCreateParams, thresholdCreateParams, machineLearningCreateParams, + newTermsCreateParams, ]); export type CreateTypeSpecific = t.TypeOf; @@ -381,6 +408,7 @@ export type ThresholdCreateSchema = CreateSchema >; +export type NewTermsCreateSchema = CreateSchema>; export const createRulesSchema = t.intersection([sharedCreateSchema, createTypeSpecific]); export type CreateRulesSchema = t.TypeOf; @@ -396,6 +424,7 @@ export type QueryUpdateSchema = UpdateSchema> export type MachineLearningUpdateSchema = UpdateSchema< t.TypeOf >; +export type NewTermsUpdateSchema = UpdateSchema>; export const patchTypeSpecific = t.union([ eqlPatchParams, @@ -404,6 +433,7 @@ export const patchTypeSpecific = t.union([ savedQueryPatchParams, thresholdPatchParams, machineLearningPatchParams, + newTermsPatchParams, ]); export { eqlPatchParams, @@ -412,6 +442,7 @@ export { savedQueryPatchParams, thresholdPatchParams, machineLearningPatchParams, + newTermsPatchParams, }; export type EqlPatchParams = t.TypeOf; @@ -420,6 +451,7 @@ export type QueryPatchParams = t.TypeOf; export type SavedQueryPatchParams = t.TypeOf; export type ThresholdPatchParams = t.TypeOf; export type MachineLearningPatchParams = t.TypeOf; +export type NewTermsPatchParams = t.TypeOf; const responseTypeSpecific = t.union([ eqlResponseParams, @@ -428,6 +460,7 @@ const responseTypeSpecific = t.union([ savedQueryResponseParams, thresholdResponseParams, machineLearningResponseParams, + newTermsResponseParams, ]); export type ResponseTypeSpecific = t.TypeOf; diff --git a/x-pack/plugins/security_solution/common/detection_engine/utils.ts b/x-pack/plugins/security_solution/common/detection_engine/utils.ts index 2095f2f8d2d9b..afa5a3950921b 100644 --- a/x-pack/plugins/security_solution/common/detection_engine/utils.ts +++ b/x-pack/plugins/security_solution/common/detection_engine/utils.ts @@ -45,6 +45,7 @@ export const isQueryRule = (ruleType: Type | undefined): boolean => export const isThreatMatchRule = (ruleType: Type | undefined): boolean => ruleType === 'threat_match'; export const isMlRule = (ruleType: Type | undefined): boolean => ruleType === 'machine_learning'; +export const isNewTermsRule = (ruleType: Type | undefined): boolean => ruleType === 'new_terms'; export const normalizeThresholdField = ( thresholdField: string | string[] | null | undefined diff --git a/x-pack/plugins/security_solution/common/field_maps/field_names.ts b/x-pack/plugins/security_solution/common/field_maps/field_names.ts index 5c85b278508f9..6a7b4efff8a7c 100644 --- a/x-pack/plugins/security_solution/common/field_maps/field_names.ts +++ b/x-pack/plugins/security_solution/common/field_maps/field_names.ts @@ -15,6 +15,7 @@ export const ALERT_GROUP_INDEX = `${ALERT_NAMESPACE}.group.index` as const; export const ALERT_ORIGINAL_TIME = `${ALERT_NAMESPACE}.original_time` as const; export const ALERT_THRESHOLD_RESULT = `${ALERT_NAMESPACE}.threshold_result` as const; export const ALERT_THRESHOLD_RESULT_COUNT = `${ALERT_THRESHOLD_RESULT}.count` as const; +export const ALERT_NEW_TERMS = `${ALERT_NAMESPACE}.new_terms` as const; export const ALERT_ORIGINAL_EVENT = `${ALERT_NAMESPACE}.original_event` as const; export const ALERT_ORIGINAL_EVENT_ACTION = `${ALERT_ORIGINAL_EVENT}.action` as const; diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/new_terms_rule.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/new_terms_rule.spec.ts new file mode 100644 index 0000000000000..08e05910ba5d2 --- /dev/null +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/new_terms_rule.spec.ts @@ -0,0 +1,157 @@ +/* + * Copyright 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 { formatMitreAttackDescription } from '../../helpers/rules'; +import { getNewTermsRule, getIndexPatterns } from '../../objects/rule'; + +import { ALERT_DATA_GRID } from '../../screens/alerts'; +import { + CUSTOM_RULES_BTN, + RISK_SCORE, + RULE_NAME, + RULES_ROW, + RULES_TABLE, + RULE_SWITCH, + SEVERITY, +} from '../../screens/alerts_detection_rules'; +import { + ABOUT_DETAILS, + ABOUT_INVESTIGATION_NOTES, + ABOUT_RULE_DESCRIPTION, + ADDITIONAL_LOOK_BACK_DETAILS, + CUSTOM_QUERY_DETAILS, + DEFINITION_DETAILS, + FALSE_POSITIVES_DETAILS, + removeExternalLinkText, + INDEX_PATTERNS_DETAILS, + INVESTIGATION_NOTES_MARKDOWN, + INVESTIGATION_NOTES_TOGGLE, + MITRE_ATTACK_DETAILS, + REFERENCE_URLS_DETAILS, + RISK_SCORE_DETAILS, + RULE_NAME_HEADER, + RULE_TYPE_DETAILS, + RUNS_EVERY_DETAILS, + SCHEDULE_DETAILS, + SEVERITY_DETAILS, + TAGS_DETAILS, + TIMELINE_TEMPLATE_DETAILS, + NEW_TERMS_HISTORY_WINDOW_DETAILS, + NEW_TERMS_FIELDS_DETAILS, +} from '../../screens/rule_details'; + +import { getDetails } from '../../tasks/rule_details'; +import { goToRuleDetails } from '../../tasks/alerts_detection_rules'; +import { createTimeline } from '../../tasks/api_calls/timelines'; +import { cleanKibana, deleteAlertsAndRules } from '../../tasks/common'; +import { + createAndEnableRule, + fillAboutRuleAndContinue, + fillDefineNewTermsRuleAndContinue, + fillScheduleRuleAndContinue, + selectNewTermsRuleType, + waitForAlertsToPopulate, + waitForTheRuleToBeExecuted, +} from '../../tasks/create_new_rule'; +import { login, visit } from '../../tasks/login'; + +import { RULE_CREATION } from '../../urls/navigation'; + +describe('New Terms rules', () => { + before(() => { + cleanKibana(); + login(); + }); + describe('Detection rules, New Terms', () => { + const expectedUrls = getNewTermsRule().referenceUrls.join(''); + const expectedFalsePositives = getNewTermsRule().falsePositivesExamples.join(''); + const expectedTags = getNewTermsRule().tags.join(''); + const expectedMitre = formatMitreAttackDescription(getNewTermsRule().mitre); + const expectedNumberOfRules = 1; + + beforeEach(() => { + deleteAlertsAndRules(); + createTimeline(getNewTermsRule().timeline).then((response) => { + cy.wrap({ + ...getNewTermsRule(), + timeline: { + ...getNewTermsRule().timeline, + id: response.body.data.persistTimeline.timeline.savedObjectId, + }, + }).as('rule'); + }); + }); + + it('Creates and enables a new terms rule', function () { + visit(RULE_CREATION); + selectNewTermsRuleType(); + fillDefineNewTermsRuleAndContinue(this.rule); + fillAboutRuleAndContinue(this.rule); + fillScheduleRuleAndContinue(this.rule); + createAndEnableRule(); + + cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); + + cy.get(RULES_TABLE).then(($table) => { + cy.wrap($table.find(RULES_ROW).length).should('eql', expectedNumberOfRules); + }); + + cy.get(RULE_NAME).should('have.text', this.rule.name); + cy.get(RISK_SCORE).should('have.text', this.rule.riskScore); + cy.get(SEVERITY).should('have.text', this.rule.severity); + cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'true'); + + goToRuleDetails(); + + cy.get(RULE_NAME_HEADER).should('contain', `${this.rule.name}`); + cy.get(ABOUT_RULE_DESCRIPTION).should('have.text', this.rule.description); + cy.get(ABOUT_DETAILS).within(() => { + getDetails(SEVERITY_DETAILS).should('have.text', this.rule.severity); + getDetails(RISK_SCORE_DETAILS).should('have.text', this.rule.riskScore); + getDetails(REFERENCE_URLS_DETAILS).should((details) => { + expect(removeExternalLinkText(details.text())).equal(expectedUrls); + }); + getDetails(FALSE_POSITIVES_DETAILS).should('have.text', expectedFalsePositives); + getDetails(MITRE_ATTACK_DETAILS).should((mitre) => { + expect(removeExternalLinkText(mitre.text())).equal(expectedMitre); + }); + getDetails(TAGS_DETAILS).should('have.text', expectedTags); + }); + cy.get(INVESTIGATION_NOTES_TOGGLE).click({ force: true }); + cy.get(ABOUT_INVESTIGATION_NOTES).should('have.text', INVESTIGATION_NOTES_MARKDOWN); + cy.get(DEFINITION_DETAILS).within(() => { + getDetails(INDEX_PATTERNS_DETAILS).should('have.text', getIndexPatterns().join('')); + getDetails(CUSTOM_QUERY_DETAILS).should('have.text', this.rule.customQuery); + getDetails(RULE_TYPE_DETAILS).should('have.text', 'New Terms'); + getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); + getDetails(NEW_TERMS_FIELDS_DETAILS).should('have.text', 'host.name'); + getDetails(NEW_TERMS_HISTORY_WINDOW_DETAILS).should('have.text', '50000h'); + }); + cy.get(SCHEDULE_DETAILS).within(() => { + getDetails(RUNS_EVERY_DETAILS).should( + 'have.text', + `${this.rule.runsEvery.interval}${this.rule.runsEvery.type}` + ); + getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should( + 'have.text', + `${this.rule.lookBack.interval}${this.rule.lookBack.type}` + ); + }); + + waitForTheRuleToBeExecuted(); + waitForAlertsToPopulate(); + + cy.get(ALERT_DATA_GRID) + .invoke('text') + .then((text) => { + expect(text).contains(this.rule.name); + expect(text).contains(this.rule.severity.toLowerCase()); + expect(text).contains(this.rule.riskScore); + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/cypress/objects/rule.ts b/x-pack/plugins/security_solution/cypress/objects/rule.ts index 864c2aec57210..17ffdf52486f5 100644 --- a/x-pack/plugins/security_solution/cypress/objects/rule.ts +++ b/x-pack/plugins/security_solution/cypress/objects/rule.ts @@ -83,6 +83,11 @@ export interface ThreatIndicatorRule extends CustomRule { matchedIndex?: string; } +export interface NewTermsRule extends CustomRule { + newTermsFields: string[]; + historyWindowSize: Interval; +} + export interface MachineLearningRule { machineLearningJobs: string[]; anomalyScoreThreshold: number; @@ -318,6 +323,26 @@ export const getNewThresholdRule = (): ThresholdRule => ({ maxSignals: 100, }); +export const getNewTermsRule = (): NewTermsRule => ({ + customQuery: 'host.name: *', + index: getIndexPatterns(), + name: 'New Terms Rule', + description: 'The new rule description.', + severity: 'High', + riskScore: '17', + tags: ['test', 'newRule'], + referenceUrls: ['http://example.com/', 'https://example.com/'], + falsePositivesExamples: ['False1', 'False2'], + mitre: [getMitre1(), getMitre2()], + note: '# test markdown', + newTermsFields: ['host.name'], + historyWindowSize: getLookBack(), + runsEvery: getRunsEvery(), + lookBack: getLookBack(), + timeline: getTimeline(), + maxSignals: 100, +}); + export const getMachineLearningRule = (): MachineLearningRule => ({ machineLearningJobs: [ 'v3_linux_anomalous_process_all_hosts', diff --git a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts index 7df37c218cb86..d803a32c63aac 100644 --- a/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/screens/create_new_rule.ts @@ -218,8 +218,18 @@ export const TAGS_INPUT = export const TAGS_CLEAR_BUTTON = '[data-test-subj="detectionEngineStepAboutRuleTags"] [data-test-subj="comboBoxClearButton"]'; -export const THRESHOLD_FIELD_SELECTION = '.euiFilterSelectItem'; +export const EUI_FILTER_SELECT_ITEM = '.euiFilterSelectItem'; export const THRESHOLD_INPUT_AREA = '[data-test-subj="thresholdInput"]'; export const THRESHOLD_TYPE = '[data-test-subj="thresholdRuleType"]'; + +export const NEW_TERMS_TYPE = '[data-test-subj="newTermsRuleType"]'; + +export const NEW_TERMS_INPUT_AREA = '[data-test-subj="newTermsInput"]'; + +export const NEW_TERMS_HISTORY_SIZE = + '[data-test-subj="detectionEngineStepDefineRuleHistoryWindowSize"] [data-test-subj="interval"]'; + +export const NEW_TERMS_HISTORY_TIME_TYPE = + '[data-test-subj="detectionEngineStepDefineRuleHistoryWindowSize"] [data-test-subj="timeType"]'; diff --git a/x-pack/plugins/security_solution/cypress/screens/rule_details.ts b/x-pack/plugins/security_solution/cypress/screens/rule_details.ts index 0e2e5a1509bf7..a541cf5cb2bc6 100644 --- a/x-pack/plugins/security_solution/cypress/screens/rule_details.ts +++ b/x-pack/plugins/security_solution/cypress/screens/rule_details.ts @@ -55,6 +55,10 @@ export const MACHINE_LEARNING_JOB_STATUS = '[data-test-subj="machineLearningJobS export const MITRE_ATTACK_DETAILS = 'MITRE ATT&CK'; +export const NEW_TERMS_FIELDS_DETAILS = 'Fields'; + +export const NEW_TERMS_HISTORY_WINDOW_DETAILS = 'History Window Size'; + export const FIELDS_BROWSER_BTN = '[data-test-subj="events-viewer-panel"] [data-test-subj="show-field-browser"]'; diff --git a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts index a1fd41d9703d1..5e5de7301362b 100644 --- a/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts +++ b/x-pack/plugins/security_solution/cypress/tasks/create_new_rule.ts @@ -13,6 +13,7 @@ import type { OverrideRule, ThreatIndicatorRule, ThresholdRule, + NewTermsRule, } from '../objects/rule'; import { getMachineLearningRule } from '../objects/rule'; import { @@ -82,7 +83,7 @@ import { THREAT_MATCH_INDICATOR_INDICATOR_INDEX, THREAT_MATCH_OR_BUTTON, THREAT_MATCH_QUERY_INPUT, - THRESHOLD_FIELD_SELECTION, + EUI_FILTER_SELECT_ITEM, THRESHOLD_INPUT_AREA, THRESHOLD_TYPE, CONNECTOR_NAME_INPUT, @@ -93,6 +94,10 @@ import { EMAIL_CONNECTOR_PASSWORD_INPUT, EMAIL_CONNECTOR_SERVICE_SELECTOR, PREVIEW_HISTOGRAM, + NEW_TERMS_TYPE, + NEW_TERMS_HISTORY_SIZE, + NEW_TERMS_HISTORY_TIME_TYPE, + NEW_TERMS_INPUT_AREA, } from '../screens/create_new_rule'; import { TOAST_ERROR } from '../screens/shared'; import { SERVER_SIDE_EVENT_COUNT } from '../screens/timeline'; @@ -286,7 +291,7 @@ export const fillDefineThresholdRule = (rule: ThresholdRule) => { .find(INPUT) .then((inputs) => { cy.wrap(inputs[thresholdField]).type(rule.thresholdField); - cy.get(THRESHOLD_FIELD_SELECTION).click({ force: true }); + cy.get(EUI_FILTER_SELECT_ITEM).click({ force: true }); cy.wrap(inputs[threshold]).clear().type(rule.threshold); }); }; @@ -306,7 +311,7 @@ export const fillDefineThresholdRuleAndContinue = (rule: ThresholdRule) => { .then((inputs) => { cy.wrap(inputs[thresholdField]).click(); cy.wrap(inputs[thresholdField]).pipe(typeThresholdField); - cy.get(THRESHOLD_FIELD_SELECTION).click({ force: true }); + cy.get(EUI_FILTER_SELECT_ITEM).click({ force: true }); cy.wrap(inputs[threshold]).clear().type(rule.threshold); }); cy.get(DEFINE_CONTINUE_BUTTON).should('exist').click({ force: true }); @@ -341,6 +346,24 @@ export const fillDefineEqlRuleAndContinue = (rule: CustomRule) => { cy.get(`${RULES_CREATION_FORM} ${EQL_QUERY_INPUT}`).should('not.exist'); }; +export const fillDefineNewTermsRuleAndContinue = (rule: NewTermsRule) => { + cy.get(IMPORT_QUERY_FROM_SAVED_TIMELINE_LINK).click(); + cy.get(TIMELINE(rule.timeline.id)).click(); + cy.get(CUSTOM_QUERY_INPUT).should('have.value', rule.customQuery); + cy.get(NEW_TERMS_INPUT_AREA).find(INPUT).click().type(rule.newTermsFields[0], { delay: 35 }); + cy.get(EUI_FILTER_SELECT_ITEM).click({ force: true }); + cy.get(NEW_TERMS_INPUT_AREA) + .find(NEW_TERMS_HISTORY_SIZE) + .type('{selectAll}') + .type(rule.historyWindowSize.interval); + cy.get(NEW_TERMS_INPUT_AREA) + .find(NEW_TERMS_HISTORY_TIME_TYPE) + .select(rule.historyWindowSize.timeType); + cy.get(DEFINE_CONTINUE_BUTTON).should('exist').click({ force: true }); + + cy.get(CUSTOM_QUERY_INPUT).should('not.exist'); +}; + /** * Fills in the indicator match rows for tests by giving it an optional rowNumber, * a indexField, a indicatorIndexField, and an optional validRows which indicates @@ -525,6 +548,10 @@ export const selectThresholdRuleType = () => { cy.get(THRESHOLD_TYPE).click({ force: true }); }; +export const selectNewTermsRuleType = () => { + cy.get(NEW_TERMS_TYPE).click({ force: true }); +}; + export const previewResults = () => { cy.get(QUERY_PREVIEW_BUTTON).click(); }; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx index fdcb74b6ee9b3..54a1b2fdfba8d 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx @@ -685,6 +685,40 @@ describe('AlertSummaryView', () => { }); }); + test('New terms events have special fields', () => { + const enhancedData = [ + ...mockAlertDetailsData.map((item) => { + if (item.category === 'kibana' && item.field === 'kibana.alert.rule.type') { + return { + ...item, + values: ['new_terms'], + originalValue: ['new_terms'], + }; + } + return item; + }), + { + category: 'kibana', + field: 'kibana.alert.new_terms', + values: ['127.0.0.1'], + originalValue: ['127.0.0.1'], + }, + ] as TimelineEventsDetailsItem[]; + const renderProps = { + ...props, + data: enhancedData, + }; + const { getByText } = render( + + + + ); + + ['New Terms'].forEach((fieldId) => { + expect(getByText(fieldId)); + }); + }); + test("doesn't render empty fields", async () => { const renderProps = { ...props, diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx index a6e094a600e6d..d9b88ecf12a83 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/get_alert_summary_rows.tsx @@ -15,8 +15,9 @@ import { ALERTS_HEADERS_THRESHOLD_COUNT, ALERTS_HEADERS_THRESHOLD_TERMS, ALERTS_HEADERS_RULE_DESCRIPTION, + ALERTS_HEADERS_NEW_TERMS, } from '../../../detections/components/alerts_table/translations'; -import { ALERT_THRESHOLD_RESULT } from '../../../../common/field_maps/field_names'; +import { ALERT_NEW_TERMS, ALERT_THRESHOLD_RESULT } from '../../../../common/field_maps/field_names'; import { AGENT_STATUS_FIELD_NAME } from '../../../timelines/components/timeline/body/renderers/constants'; import type { AlertSummaryRow } from './helpers'; import { getEnrichedFieldInfo } from './helpers'; @@ -168,6 +169,13 @@ function getFieldsByRuleType(ruleType?: string): EventSummaryField[] { legacyId: 'signal.rule.threat_query', }, ]; + case 'new_terms': + return [ + { + id: ALERT_NEW_TERMS, + label: ALERTS_HEADERS_NEW_TERMS, + }, + ]; default: return []; } diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx index 81925ec0eed56..021ba755dba80 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/actions.tsx @@ -27,12 +27,15 @@ import { import type { ExceptionListItemSchema } from '@kbn/securitysolution-io-ts-list-types'; import { buildExceptionFilter } from '@kbn/securitysolution-list-utils'; +import type { TGridModel } from '@kbn/timelines-plugin/public'; + import { lastValueFrom } from 'rxjs'; import { ALERT_ORIGINAL_TIME, ALERT_GROUP_ID, ALERT_RULE_TIMELINE_ID, ALERT_THRESHOLD_RESULT, + ALERT_NEW_TERMS, } from '../../../../common/field_maps/field_names'; import type { TimelineResult } from '../../../../common/types/timeline'; import { TimelineId, TimelineStatus, TimelineType } from '../../../../common/types/timeline'; @@ -272,6 +275,14 @@ export const isThresholdAlert = (ecsData: Ecs): boolean => { ); }; +export const isNewTermsAlert = (ecsData: Ecs): boolean => { + const ruleType = getField(ecsData, ALERT_RULE_TYPE); + return ( + ruleType === 'new_terms' || + (Array.isArray(ruleType) && ruleType.length > 0 && ruleType[0] === 'new_terms') + ); +}; + export const buildAlertsKqlFilter = ( key: '_id' | 'signal.group.id' | 'kibana.alert.group.id', alertIds: string[] @@ -506,6 +517,155 @@ const createThresholdTimeline = async ( } }; +const getNewTermsData = (ecsData: Ecs | Ecs[]) => { + const normalizedEcsData: Ecs = Array.isArray(ecsData) ? ecsData[0] : ecsData; + const originalTimeValue = getField(normalizedEcsData, ALERT_ORIGINAL_TIME); + const newTermsField = getField(normalizedEcsData, `${ALERT_RULE_PARAMETERS}.new_terms_fields`)[0]; + const newTermsValue = getField(normalizedEcsData, ALERT_NEW_TERMS)[0]; + const newTermsFieldId = newTermsField.replace('.', '-'); + const dataProviderPartial = { + id: `send-alert-to-timeline-action-default-draggable-event-details-value-formatted-field-value-${TimelineId.active}-${newTermsFieldId}-${newTermsValue}`, + name: newTermsField, + enabled: true, + excluded: false, + kqlQuery: '', + queryMatch: { + field: newTermsField, + value: newTermsValue, + operator: ':' as const, + }, + and: [], + }; + return { + from: originalTimeValue, + to: moment().toISOString(), + dataProviders: [dataProviderPartial], + }; +}; + +const createNewTermsTimeline = async ( + ecsData: Ecs, + createTimeline: ({ from, timeline, to }: CreateTimelineProps) => void, + noteContent: string, + templateValues: { + filters?: Filter[]; + query?: string; + dataProviders?: DataProvider[]; + columns?: TGridModel['columns']; + }, + getExceptions: (ecs: Ecs) => Promise +) => { + try { + const alertResponse = await KibanaServices.get().http.fetch< + estypes.SearchResponse<{ '@timestamp': string; [key: string]: unknown }> + >(DETECTION_ENGINE_QUERY_SIGNALS_URL, { + method: 'POST', + body: JSON.stringify(buildAlertsQuery([ecsData._id])), + }); + const formattedAlertData = + alertResponse?.hits.hits.reduce((acc, { _id, _index, _source = {} }) => { + return [ + ...acc, + { + ...formatAlertToEcsSignal(_source), + _id, + _index, + timestamp: _source['@timestamp'], + }, + ]; + }, []) ?? []; + + const alertDoc = formattedAlertData[0]; + const params = getField(alertDoc, ALERT_RULE_PARAMETERS); + const filters: Filter[] = + (params as MightHaveFilters).filters ?? + (alertDoc.signal?.rule as MightHaveFilters)?.filters ?? + []; + // https://github.com/elastic/kibana/issues/126574 - if the provided filter has no `meta` field + // we expect an empty object to be inserted before calling `createTimeline` + const augmentedFilters = filters.map((filter) => { + return filter.meta != null ? filter : { ...filter, meta: {} }; + }); + const language = params.language ?? alertDoc.signal?.rule?.language ?? 'kuery'; + const query = params.query ?? alertDoc.signal?.rule?.query ?? ''; + const indexNames = params.index ?? alertDoc.signal?.rule?.index ?? []; + + const { from, to, dataProviders } = getNewTermsData(alertDoc); + const exceptions = await getExceptions(ecsData); + const exceptionsFilter = + buildExceptionFilter({ + lists: exceptions, + excludeExceptions: true, + chunkSize: 10000, + alias: 'Exceptions', + }) ?? []; + const allFilters = (templateValues.filters ?? augmentedFilters).concat(exceptionsFilter); + return createTimeline({ + from, + notes: null, + timeline: { + ...timelineDefaults, + columns: templateValues.columns ?? timelineDefaults.columns, + description: `_id: ${alertDoc._id}`, + filters: allFilters, + dataProviders: templateValues.dataProviders ?? dataProviders, + id: TimelineId.active, + indexNames, + dateRange: { + start: from, + end: to, + }, + eventType: 'all', + kqlQuery: { + filterQuery: { + kuery: { + kind: language, + expression: templateValues.query ?? query, + }, + serializedQuery: templateValues.query ?? query, + }, + }, + }, + to, + ruleNote: noteContent, + }); + } catch (error) { + const { toasts } = KibanaServices.get().notifications; + toasts.addError(error, { + toastMessage: i18n.translate( + 'xpack.securitySolution.detectionEngine.alerts.createNewTermsTimelineFailure', + { + defaultMessage: 'Failed to create timeline for document _id: {id}', + values: { id: ecsData._id }, + } + ), + title: i18n.translate( + 'xpack.securitySolution.detectionEngine.alerts.createNewTermsTimelineFailureTitle', + { + defaultMessage: 'Failed to create new terms alert timeline', + } + ), + }); + const from = DEFAULT_FROM_MOMENT.toISOString(); + const to = DEFAULT_TO_MOMENT.toISOString(); + return createTimeline({ + from, + notes: null, + timeline: { + ...timelineDefaults, + id: TimelineId.active, + indexNames: [], + dateRange: { + start: from, + end: to, + }, + eventType: 'all', + }, + to, + }); + } +}; + export const sendAlertToTimelineAction = async ({ createTimeline, ecsData: ecs, @@ -585,6 +745,19 @@ export const sendAlertToTimelineAction = async ({ }, getExceptions ); + } else if (isNewTermsAlert(ecsData)) { + return createNewTermsTimeline( + ecsData, + createTimeline, + noteContent, + { + filters, + query, + dataProviders, + columns: timeline.columns, + }, + getExceptions + ); } else { return createTimeline({ from, @@ -639,6 +812,8 @@ export const sendAlertToTimelineAction = async ({ } } else if (isThresholdAlert(ecsData)) { return createThresholdTimeline(ecsData, createTimeline, noteContent, {}, getExceptions); + } else if (isNewTermsAlert(ecsData)) { + return createNewTermsTimeline(ecsData, createTimeline, noteContent, {}, getExceptions); } else { let { dataProviders, filters } = buildTimelineDataProviderOrFilter(alertIds ?? [], ecsData._id); if (isEqlAlertWithGroupId(ecsData)) { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts index b77cd6dd29bf8..efbe86244ab58 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/translations.ts @@ -116,6 +116,13 @@ export const ALERTS_HEADERS_THRESHOLD_CARDINALITY = i18n.translate( } ); +export const ALERTS_HEADERS_NEW_TERMS = i18n.translate( + 'xpack.securitySolution.eventsViewer.alerts.defaultHeaders.newTerms', + { + defaultMessage: 'New Terms', + } +); + export const ACTION_INVESTIGATE_IN_TIMELINE = i18n.translate( 'xpack.securitySolution.detectionEngine.alerts.actions.investigateInTimelineTitle', { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx index 4682e2be0db3a..8de70a8d36c10 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/helpers.tsx @@ -494,6 +494,14 @@ export const buildRuleTypeDescription = (label: string, ruleType: Type): ListIte }, ]; } + case 'new_terms': { + return [ + { + title: label, + description: i18n.NEW_TERMS_TYPE_DESCRIPTION, + }, + ]; + } default: return assertUnreachable(ruleType); } diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx index 9f688aec63719..eea283c93cfe4 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/description_step/translations.tsx @@ -70,6 +70,13 @@ export const THREAT_MATCH_TYPE_DESCRIPTION = i18n.translate( } ); +export const NEW_TERMS_TYPE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.newTermsRuleTypeDescription', + { + defaultMessage: 'New Terms', + } +); + export const ML_JOB_STARTED = i18n.translate( 'xpack.securitySolution.detectionEngine.ruleDescription.mlJobStartedDescription', { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/index.tsx new file mode 100644 index 0000000000000..52bb11a029e62 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/index.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; + +import type { FieldHook } from '../../../../shared_imports'; +import { Field } from '../../../../shared_imports'; +import type { BrowserFields } from '../../../../common/containers/source'; +import { getCategorizedFieldNames } from '../../../../timelines/components/edit_data_provider/helpers'; +import { NEW_TERMS_FIELD_PLACEHOLDER } from './translations'; + +interface NewTermsFieldsProps { + browserFields: BrowserFields; + field: FieldHook; +} + +const FIELD_COMBO_BOX_WIDTH = 410; + +const fieldDescribedByIds = 'detectionEngineStepDefineRuleNewTermsField'; + +export const NewTermsFieldsComponent: React.FC = ({ + browserFields, + field, +}: NewTermsFieldsProps) => { + const fieldEuiFieldProps = useMemo( + () => ({ + fullWidth: true, + noSuggestions: false, + options: getCategorizedFieldNames(browserFields), + placeholder: NEW_TERMS_FIELD_PLACEHOLDER, + onCreateOption: undefined, + style: { width: `${FIELD_COMBO_BOX_WIDTH}px` }, + }), + [browserFields] + ); + return ; +}; + +export const NewTermsFields = React.memo(NewTermsFieldsComponent); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/translations.ts new file mode 100644 index 0000000000000..1bf73b4a46b48 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/components/rules/new_terms_fields/translations.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 { i18n } from '@kbn/i18n'; + +export const NEW_TERMS_FIELD_PLACEHOLDER = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsField.placeholderText', + { + defaultMessage: 'Select a field', + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.test.tsx index e47bcc7c6c1b4..200abf294e47b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.test.tsx @@ -59,6 +59,8 @@ const defaultProps: RulePreviewProps = { anomalyThreshold: 50, machineLearningJobId: ['test-ml-job-id'], eqlOptions: {}, + newTermsFields: ['host.ip'], + historyWindowSize: '7d', }; describe('PreviewQuery', () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.tsx index d9cc431a878f2..b7bc9d5593cf3 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/index.tsx @@ -52,6 +52,8 @@ export interface RulePreviewProps { machineLearningJobId: string[]; anomalyThreshold: number; eqlOptions: EqlOptionsSelected; + newTermsFields: string[]; + historyWindowSize: string; } const Select = styled(EuiSelect)` @@ -77,6 +79,8 @@ const RulePreviewComponent: React.FC = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, }) => { const { spaces } = useKibana().services; const { loading: isMlLoading, jobs } = useSecurityJobs(false); @@ -121,6 +125,8 @@ const RulePreviewComponent: React.FC = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, }); // Resets the timeFrame to default when rule type is changed because not all time frames are supported by all rule types diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_route.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_route.tsx index b6717effe1708..5b0251669e445 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_route.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_route.tsx @@ -29,6 +29,8 @@ interface PreviewRouteParams { machineLearningJobId: string[]; anomalyThreshold: number; eqlOptions: EqlOptionsSelected; + newTermsFields: string[]; + historyWindowSize: string; } export const usePreviewRoute = ({ @@ -45,6 +47,8 @@ export const usePreviewRoute = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, }: PreviewRouteParams) => { const [isRequestTriggered, setIsRequestTriggered] = useState(false); @@ -86,6 +90,8 @@ export const usePreviewRoute = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, ]); useEffect(() => { @@ -104,6 +110,8 @@ export const usePreviewRoute = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, }) ); } @@ -123,6 +131,8 @@ export const usePreviewRoute = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, ]); return { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/index.tsx index 5f86d0cccc1e6..e38421f520208 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/index.tsx @@ -28,12 +28,14 @@ interface ScheduleItemProps { idAria: string; isDisabled: boolean; minimumValue?: number; + timeTypes?: string[]; } const timeTypeOptions = [ { value: 's', text: I18n.SECONDS }, { value: 'm', text: I18n.MINUTES }, { value: 'h', text: I18n.HOURS }, + { value: 'd', text: I18n.DAYS }, ]; // move optional label to the end of input @@ -79,8 +81,9 @@ export const ScheduleItem = ({ idAria, isDisabled, minimumValue = 0, + timeTypes = ['s', 'm', 'h'], }: ScheduleItemProps) => { - const [timeType, setTimeType] = useState('s'); + const [timeType, setTimeType] = useState(timeTypes[0]); const [timeVal, setTimeVal] = useState(0); const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage(field); const { value, setValue } = field; @@ -117,13 +120,13 @@ export const ScheduleItem = ({ if ( !isEmpty(filterTimeType) && filterTimeType != null && - ['s', 'm', 'h'].includes(filterTimeType[0]) && + timeTypes.includes(filterTimeType[0]) && filterTimeType[0] !== timeType ) { setTimeType(filterTimeType[0]); } } - }, [timeType, timeVal, value]); + }, [timeType, timeTypes, timeVal, value]); // EUI missing some props const rest = { disabled: isDisabled }; @@ -155,7 +158,7 @@ export const ScheduleItem = ({ append={ timeTypes.includes(type.value))} onChange={onChangeTimeType} value={timeType} data-test-subj="timeType" diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/translations.ts index 56943492095e0..c460d2f7198b3 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/schedule_item_form/translations.ts @@ -27,3 +27,10 @@ export const HOURS = i18n.translate( defaultMessage: 'Hours', } ); + +export const DAYS = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepScheduleRuleForm.daysOptionDescription', + { + defaultMessage: 'Days', + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/index.tsx index 745d2b31995cc..01569edd6907d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/index.tsx @@ -15,6 +15,7 @@ import { isEqlRule, isQueryRule, isThreatMatchRule, + isNewTermsRule, } from '../../../../../common/detection_engine/utils'; import type { FieldHook } from '../../../../shared_imports'; import { useKibana } from '../../../../common/lib/kibana'; @@ -48,6 +49,7 @@ export const SelectRuleType: React.FC = ({ const setQuery = useCallback(() => setType('query'), [setType]); const setThreshold = useCallback(() => setType('threshold'), [setType]); const setThreatMatch = useCallback(() => setType('threat_match'), [setType]); + const setNewTerms = useCallback(() => setType('new_terms'), [setType]); const licensingUrl = useKibana().services.application.getUrlForApp('kibana', { path: '#/management/stack/license_management', }); @@ -93,6 +95,14 @@ export const SelectRuleType: React.FC = ({ [ruleType, setThreatMatch] ); + const newTermsSelectableConfig = useMemo( + () => ({ + onClick: setNewTerms, + isSelected: isNewTermsRule(ruleType), + }), + [ruleType, setNewTerms] + ); + return ( = ({ /> )} + {(!isUpdateView || newTermsSelectableConfig.isSelected) && ( + + } + selectable={newTermsSelectableConfig} + layout="horizontal" + /> + + )} ); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/translations.ts b/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/translations.ts index 1801b47c862c4..a5701441f924c 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/translations.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/select_rule_type/translations.ts @@ -78,3 +78,17 @@ export const THREAT_MATCH_TYPE_DESCRIPTION = i18n.translate( 'Use indicators from intelligence sources to detect matching events and alerts.', } ); + +export const NEW_TERMS_TYPE_TITLE = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.ruleTypeField.newTermsTitle', + { + defaultMessage: 'New Terms', + } +); + +export const NEW_TERMS_TYPE_DESCRIPTION = i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.ruleTypeField.newTermsDescription', + { + defaultMessage: 'Find documents with values appearing for the first time.', + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx index 40ffc91be47aa..1b92ac0667a7c 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule/index.test.tsx @@ -54,6 +54,8 @@ export const stepDefineStepMLRule: DefineStepRule = { threatMapping: [], timeline: { id: null, title: null }, eqlOptions: {}, + newTermsFields: ['host.ip'], + historyWindowSize: '7d', }; describe('StepAboutRuleComponent', () => { diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx index 5a325dda715c0..3f3605d29720d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/index.tsx @@ -63,6 +63,7 @@ import { schema } from './schema'; import * as i18n from './translations'; import { isEqlRule, + isNewTermsRule, isThreatMatchRule, isThresholdRule, } from '../../../../../common/detection_engine/utils'; @@ -73,6 +74,8 @@ import type { BrowserField, BrowserFields } from '../../../../common/containers/ import { useFetchIndex } from '../../../../common/containers/source'; import { RulePreview } from '../rule_preview'; import { getIsRulePreviewDisabled } from '../rule_preview/helpers'; +import { NewTermsFields } from '../new_terms_fields'; +import { ScheduleItem } from '../schedule_item_form'; import { DocLink } from '../../../../common/components/links_to_docs/doc_link'; const DATA_VIEW_SELECT_ID = 'dataView'; @@ -127,6 +130,8 @@ export const stepDefineDefaultValue: DefineStepRule = { title: DEFAULT_TIMELINE_TITLE, }, eqlOptions: {}, + newTermsFields: [], + historyWindowSize: '7d', }; /** @@ -208,6 +213,8 @@ const StepDefineRuleComponent: FC = ({ threatMapping: formThreatMapping, machineLearningJobId: formMachineLearningJobId, anomalyThreshold: formAnomalyThreshold, + newTermsFields: formNewTermsFields, + historyWindowSize: formHistoryWindowSize, }, ] = useFormData({ form, @@ -225,6 +232,8 @@ const StepDefineRuleComponent: FC = ({ 'threatMapping', 'machineLearningJobId', 'anomalyThreshold', + 'newTermsFields', + 'historyWindowSize', ], }); @@ -235,6 +244,8 @@ const StepDefineRuleComponent: FC = ({ const threatIndex = formThreatIndex || initialState.threatIndex; const machineLearningJobId = formMachineLearningJobId ?? initialState.machineLearningJobId; const anomalyThreshold = formAnomalyThreshold ?? initialState.anomalyThreshold; + const newTermsFields = formNewTermsFields ?? initialState.newTermsFields; + const historyWindowSize = formHistoryWindowSize ?? initialState.historyWindowSize; const ruleType = formRuleType || initialState.ruleType; // if 'index' is selected, use these browser fields @@ -738,6 +749,30 @@ const StepDefineRuleComponent: FC = ({ + + <> + + + + = ({ machineLearningJobId={machineLearningJobId} anomalyThreshold={anomalyThreshold} eqlOptions={optionsSelected} + newTermsFields={newTermsFields} + historyWindowSize={historyWindowSize} /> diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/schema.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/schema.tsx index d8fc81ad12487..71021bbfcb0cc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/schema.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_define_rule/schema.tsx @@ -18,6 +18,7 @@ import { } from '../../../../common/components/threat_match/helpers'; import { isEqlRule, + isNewTermsRule, isThreatMatchRule, isThresholdRule, } from '../../../../../common/detection_engine/utils'; @@ -548,4 +549,75 @@ export const schema: FormSchema = { }, ], }, + newTermsFields: { + type: FIELD_TYPES.COMBO_BOX, + label: i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsLabel', + { + defaultMessage: 'Fields', + } + ), + helpText: i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepAboutRule.fieldNewTermsFieldHelpText', + { + defaultMessage: 'Select a field to check for new terms.', + } + ), + validations: [ + { + validator: ( + ...args: Parameters + ): ReturnType> | undefined => { + const [{ formData }] = args; + const needsValidation = isNewTermsRule(formData.ruleType); + if (!needsValidation) { + return; + } + + return fieldValidators.emptyField( + i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.newTermsFieldsMin', + { + defaultMessage: 'Number of fields must be 1.', + } + ) + )(...args); + }, + }, + { + validator: ( + ...args: Parameters + ): ReturnType> | undefined => { + const [{ formData }] = args; + const needsValidation = isNewTermsRule(formData.ruleType); + if (!needsValidation) { + return; + } + return fieldValidators.maxLengthField({ + length: 1, + message: i18n.translate( + 'xpack.securitySolution.detectionEngine.validations.stepDefineRule.newTermsFieldsMax', + { + defaultMessage: 'Number of fields must be 1.', + } + ), + })(...args); + }, + }, + ], + }, + historyWindowSize: { + label: i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepDefineRule.historyWindowSizeLabel', + { + defaultMessage: 'History Window Size', + } + ), + helpText: i18n.translate( + 'xpack.securitySolution.detectionEngine.createRule.stepScheduleRule.historyWindowSizeHelpText', + { + defaultMessage: "New terms rules only alert if terms don't appear in historical data.", + } + ), + }, }; diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts index 3abf94e6b4127..31c0b8da55cbf 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/types.ts @@ -145,6 +145,8 @@ export const RuleSchema = t.intersection([ license, meta: MetaRule, machine_learning_job_id: t.array(t.string), + new_terms_fields: t.array(t.string), + history_window_start: t.string, output_index: t.string, query: t.string, rule_name_override, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts index ff2ad222c3c61..243b5195788b3 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/__mocks__/mock.ts @@ -161,6 +161,8 @@ export const mockRuleWithEverything = (id: string): Rule => ({ timestamp_override_fallback_disabled: false, note: '# this is some markdown documentation', version: 1, + new_terms_fields: ['host.name'], + history_window_start: 'now-7d', }); // TODO: update types mapping @@ -214,6 +216,8 @@ export const mockDefineStepRule = (): DefineStepRule => ({ }, }, eqlOptions: {}, + newTermsFields: ['host.ip'], + historyWindowSize: '7d', }); export const mockScheduleStepRule = (): ScheduleStepRule => ({ diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts index 4c4a7087cb218..a3da3f49587d3 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/create/helpers.ts @@ -97,6 +97,8 @@ export interface RuleFields { threatMapping?: unknown; threatLanguage?: unknown; eqlOptions: unknown; + newTermsFields?: unknown; + historyWindowSize?: unknown; } type QueryRuleFields = Omit< @@ -108,6 +110,8 @@ type QueryRuleFields = Omit< | 'threatQueryBar' | 'threatMapping' | 'eqlOptions' + | 'newTermsFields' + | 'historyWindowSize' >; type EqlQueryRuleFields = Omit< T, @@ -117,6 +121,8 @@ type EqlQueryRuleFields = Omit< | 'threatIndex' | 'threatQueryBar' | 'threatMapping' + | 'newTermsFields' + | 'historyWindowSize' >; type ThresholdRuleFields = Omit< T, @@ -126,6 +132,8 @@ type ThresholdRuleFields = Omit< | 'threatQueryBar' | 'threatMapping' | 'eqlOptions' + | 'newTermsFields' + | 'historyWindowSize' >; type MlRuleFields = Omit< T, @@ -136,10 +144,27 @@ type MlRuleFields = Omit< | 'threatQueryBar' | 'threatMapping' | 'eqlOptions' + | 'newTermsFields' + | 'historyWindowSize' >; type ThreatMatchRuleFields = Omit< T, - 'anomalyThreshold' | 'machineLearningJobId' | 'threshold' | 'eqlOptions' + | 'anomalyThreshold' + | 'machineLearningJobId' + | 'threshold' + | 'eqlOptions' + | 'newTermsFields' + | 'historyWindowSize' +>; +type NewTermsRuleFields = Omit< + T, + | 'anomalyThreshold' + | 'machineLearningJobId' + | 'threshold' + | 'threatIndex' + | 'threatQueryBar' + | 'threatMapping' + | 'eqlOptions' >; const isMlFields = ( @@ -149,6 +174,7 @@ const isMlFields = ( | MlRuleFields | ThresholdRuleFields | ThreatMatchRuleFields + | NewTermsRuleFields ): fields is MlRuleFields => has('anomalyThreshold', fields); const isThresholdFields = ( @@ -158,6 +184,7 @@ const isThresholdFields = ( | MlRuleFields | ThresholdRuleFields | ThreatMatchRuleFields + | NewTermsRuleFields ): fields is ThresholdRuleFields => has('threshold', fields); const isThreatMatchFields = ( @@ -167,8 +194,19 @@ const isThreatMatchFields = ( | MlRuleFields | ThresholdRuleFields | ThreatMatchRuleFields + | NewTermsRuleFields ): fields is ThreatMatchRuleFields => has('threatIndex', fields); +const isNewTermsFields = ( + fields: + | QueryRuleFields + | EqlQueryRuleFields + | MlRuleFields + | ThresholdRuleFields + | ThreatMatchRuleFields + | NewTermsRuleFields +): fields is NewTermsRuleFields => has('newTermsFields', fields); + const isEqlFields = ( fields: | QueryRuleFields @@ -176,6 +214,7 @@ const isEqlFields = ( | MlRuleFields | ThresholdRuleFields | ThreatMatchRuleFields + | NewTermsRuleFields ): fields is EqlQueryRuleFields => has('eqlOptions', fields); export const filterRuleFieldsForType = >( @@ -186,7 +225,8 @@ export const filterRuleFieldsForType = >( | EqlQueryRuleFields | MlRuleFields | ThresholdRuleFields - | ThreatMatchRuleFields => { + | ThreatMatchRuleFields + | NewTermsRuleFields => { switch (type) { case 'machine_learning': const { @@ -197,6 +237,8 @@ export const filterRuleFieldsForType = >( threatQueryBar, threatMapping, eqlOptions, + newTermsFields, + historyWindowSize, ...mlRuleFields } = fields; return mlRuleFields; @@ -208,6 +250,8 @@ export const filterRuleFieldsForType = >( threatQueryBar: _removedThreatQueryBar, threatMapping: _removedThreatMapping, eqlOptions: _eqlOptions, + newTermsFields: removedNewTermsFields, + historyWindowSize: removedHistoryWindowSize, ...thresholdRuleFields } = fields; return thresholdRuleFields; @@ -217,6 +261,8 @@ export const filterRuleFieldsForType = >( machineLearningJobId: _removedMachineLearningJobId, threshold: _removedThreshold, eqlOptions: __eqlOptions, + newTermsFields: _removedNewTermsFields, + historyWindowSize: _removedHistoryWindowSize, ...threatMatchRuleFields } = fields; return threatMatchRuleFields; @@ -230,6 +276,8 @@ export const filterRuleFieldsForType = >( threatQueryBar: __removedThreatQueryBar, threatMapping: __removedThreatMapping, eqlOptions: ___eqlOptions, + newTermsFields: __removedNewTermsFields, + historyWindowSize: __removedHistoryWindowSize, ...queryRuleFields } = fields; return queryRuleFields; @@ -241,9 +289,23 @@ export const filterRuleFieldsForType = >( threatIndex: ___removedThreatIndex, threatQueryBar: ___removedThreatQueryBar, threatMapping: ___removedThreatMapping, + newTermsFields: ___removedNewTermsFields, + historyWindowSize: ___removedHistoryWindowSize, ...eqlRuleFields } = fields; return eqlRuleFields; + case 'new_terms': + const { + anomalyThreshold: ___a, + machineLearningJobId: ___m, + threshold: ___t, + threatIndex: ____removedThreatIndex, + threatQueryBar: ____removedThreatQueryBar, + threatMapping: ____removedThreatMapping, + eqlOptions: ____eqlOptions, + ...newTermsRuleFields + } = fields; + return newTermsRuleFields; } assertUnreachable(type); }; @@ -339,6 +401,15 @@ export const formatDefineStepData = (defineStepData: DefineStepRule): DefineStep event_category_override: ruleFields.eqlOptions?.eventCategoryField, tiebreaker_field: ruleFields.eqlOptions?.tiebreakerField, } + : isNewTermsFields(ruleFields) + ? { + index: ruleFields.index, + filters: ruleFields.queryBar?.filters, + language: ruleFields.queryBar?.query?.language, + query: ruleFields.queryBar?.query?.query as string, + new_terms_fields: ruleFields.newTermsFields, + history_window_start: `now-${ruleFields.historyWindowSize}`, + } : { index: ruleFields.index, filters: ruleFields.queryBar?.filters, @@ -491,6 +562,8 @@ export const formatPreviewRule = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, }: { index: string[]; dataViewId?: string; @@ -504,6 +577,8 @@ export const formatPreviewRule = ({ machineLearningJobId: string[]; anomalyThreshold: number; eqlOptions: EqlOptionsSelected; + newTermsFields: string[]; + historyWindowSize: string; }): CreateRulesSchema => { const defineStepData = { ...stepDefineDefaultValue, @@ -518,6 +593,8 @@ export const formatPreviewRule = ({ machineLearningJobId, anomalyThreshold, eqlOptions, + newTermsFields, + historyWindowSize, }; const aboutStepData = { ...stepAboutDefaultValue, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx index 84801163674fe..be2cce0b1486c 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx @@ -110,6 +110,8 @@ describe('rule helpers', () => { eventCategoryField: undefined, tiebreakerField: undefined, }, + newTermsFields: ['host.name'], + historyWindowSize: '7d', }; const aboutRuleStepData: AboutStepRule = { @@ -248,6 +250,8 @@ describe('rule helpers', () => { eventCategoryField: undefined, tiebreakerField: undefined, }, + newTermsFields: [], + historyWindowSize: '7d', }; expect(result).toEqual(expected); @@ -297,6 +301,8 @@ describe('rule helpers', () => { eventCategoryField: undefined, tiebreakerField: undefined, }, + newTermsFields: [], + historyWindowSize: '7d', }; expect(result).toEqual(expected); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx index 6a8207371e230..4ae39c29909d9 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.tsx @@ -78,6 +78,7 @@ export const getActionsStepsData = ( }; }; +/* eslint-disable complexity */ export const getDefineStepsData = (rule: Rule): DefineStepRule => ({ ruleType: rule.type, anomalyThreshold: rule.anomaly_threshold ?? 50, @@ -119,8 +120,20 @@ export const getDefineStepsData = (rule: Rule): DefineStepRule => ({ eventCategoryField: rule.event_category_override, tiebreakerField: rule.tiebreaker_field, }, + newTermsFields: rule.new_terms_fields ?? [], + historyWindowSize: rule.history_window_start + ? convertHistoryStartToSize(rule.history_window_start) + : '7d', }); +const convertHistoryStartToSize = (relativeTime: string) => { + if (relativeTime.startsWith('now-')) { + return relativeTime.substring(4); + } else { + return relativeTime; + } +}; + export const getScheduleStepsData = (rule: Rule): ScheduleStepRule => { const { interval, from } = rule; const fromHumanizedValue = getHumanizedDuration(from, interval); @@ -354,6 +367,7 @@ const getRuleSpecificRuleParamKeys = (ruleType: Type) => { return ['anomaly_threshold', 'machine_learning_job_id']; case 'threshold': return ['threshold', ...queryRuleParams]; + case 'new_terms': case 'threat_match': case 'query': case 'saved_query': diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts index 019e5ad4c1a94..cd4a41d1d3f19 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/types.ts @@ -153,6 +153,8 @@ export interface DefineStepRule { threatQueryBar: FieldValueQueryBar; threatMapping: ThreatMapping; eqlOptions: EqlOptionsSelected; + newTermsFields: string[]; + historyWindowSize: string; } export interface ScheduleStepRule { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts index b62994d657c3e..e528db104a486 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts @@ -48,10 +48,12 @@ import { createQueryAlertType, createSavedQueryAlertType, createThresholdAlertType, + createNewTermsAlertType, } from '../../rule_types'; import { createSecurityRuleTypeWrapper } from '../../rule_types/create_security_rule_type_wrapper'; import { RULE_PREVIEW_INVOCATION_COUNT } from '../../../../../common/detection_engine/constants'; import type { RuleExecutionContext, StatusChangeArgs } from '../../rule_execution_log'; +import { assertUnreachable } from '../../../../../common/utility_types'; import { wrapSearchSourceClient } from './utils/wrap_search_source_client'; const PREVIEW_TIMEOUT_SECONDS = 60; @@ -354,6 +356,19 @@ export const previewRulesRoute = async ( { create: alertInstanceFactoryStub, done: () => ({ getRecoveredAlerts: () => [] }) } ); break; + case 'new_terms': + const newTermsAlertType = previewRuleTypeWrapper(createNewTermsAlertType(ruleOptions)); + await runExecutors( + newTermsAlertType.executor, + newTermsAlertType.id, + newTermsAlertType.name, + previewRuleParams, + () => true, + { create: alertInstanceFactoryStub, done: () => ({ getRecoveredAlerts: () => [] }) } + ); + break; + default: + assertUnreachable(previewRuleParams); } // Refreshes alias to ensure index is able to be read before returning diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts index ac29541574243..d7005fc746409 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts @@ -322,6 +322,7 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = wrapHits, wrapSequences, ruleDataReader: ruleDataClient.getReader({ namespace: options.spaceId }), + mergeStrategy, primaryTimestamp, secondaryTimestamp, }, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/bulk_create_factory.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/bulk_create_factory.ts index f1701e4436846..bb02aba492ed5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/bulk_create_factory.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/bulk_create_factory.ts @@ -25,6 +25,7 @@ export interface GenericBulkCreateResponse { createdItemsCount: number; createdItems: Array & { _id: string; _index: string }>; errors: string[]; + alertsWereTruncated: boolean; } export const bulkCreateFactory = @@ -35,7 +36,8 @@ export const bulkCreateFactory = refreshForBulkCreate: RefreshTypes ) => async ( - wrappedDocs: Array> + wrappedDocs: Array>, + maxAlerts?: number ): Promise> => { if (wrappedDocs.length === 0) { return { @@ -44,18 +46,20 @@ export const bulkCreateFactory = bulkCreateDuration: '0', createdItemsCount: 0, createdItems: [], + alertsWereTruncated: false, }; } const start = performance.now(); - const { createdAlerts, errors } = await alertWithPersistence( + const { createdAlerts, errors, alertsWereTruncated } = await alertWithPersistence( wrappedDocs.map((doc) => ({ _id: doc._id, // `fields` should have already been merged into `doc._source` _source: doc._source, })), - refreshForBulkCreate + refreshForBulkCreate, + maxAlerts ); const end = performance.now(); @@ -76,6 +80,7 @@ export const bulkCreateFactory = bulkCreateDuration: makeFloatString(end - start), createdItemsCount: createdAlerts.length, createdItems: createdAlerts, + alertsWereTruncated, }; } else { return { @@ -84,6 +89,7 @@ export const bulkCreateFactory = bulkCreateDuration: makeFloatString(end - start), createdItemsCount: createdAlerts.length, createdItems: createdAlerts, + alertsWereTruncated, }; } }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_bulk_body.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_bulk_body.ts index c2d7bca8f8022..5ea566ce33af0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_bulk_body.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/build_bulk_body.ts @@ -6,17 +6,13 @@ */ import { flattenWithPrefix } from '@kbn/securitysolution-rules'; +import type * as estypes from '@elastic/elasticsearch/lib/api/types'; import type { BaseHit } from '../../../../../../common/detection_engine/types'; import type { ConfigType } from '../../../../../config'; import type { BuildReasonMessage } from '../../../signals/reason_formatters'; import { getMergeStrategy } from '../../../signals/source_fields_merging/strategies'; -import type { - BaseSignalHit, - SignalSource, - SignalSourceHit, - SimpleHit, -} from '../../../signals/types'; +import type { BaseSignalHit, SignalSource, SignalSourceHit } from '../../../signals/types'; import { additionalAlertFields, buildAlert } from './build_alert'; import { filterSource } from './filter_source'; import type { CompleteRule, RuleParams } from '../../../schemas/rule_schemas'; @@ -50,7 +46,7 @@ const buildEventTypeAlert = (doc: BaseSignalHit): object => { export const buildBulkBody = ( spaceId: string | null | undefined, completeRule: CompleteRule, - doc: SimpleHit, + doc: estypes.SearchHit, mergeStrategy: ConfigType['alertMergeStrategy'], ignoreFields: ConfigType['alertIgnoreFields'], applyOverrides: boolean, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.test.ts new file mode 100644 index 0000000000000..dfdd2ce715ee4 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.test.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ALERT_UUID } from '@kbn/rule-data-utils'; +import { ALERT_NEW_TERMS } from '../../../../../../common/field_maps/field_names'; +import { getCompleteRuleMock, getNewTermsRuleParams } from '../../../schemas/rule_schemas.mock'; +import { sampleDocNoSortIdWithTimestamp } from '../../../signals/__mocks__/es_results'; +import { wrapNewTermsAlerts } from './wrap_new_terms_alerts'; + +const docId = 'd5e8eb51-a6a0-456d-8a15-4b79bfec3d71'; +describe('wrapNewTermsAlerts', () => { + test('should create an alert with the correct _id from a document', () => { + const doc = sampleDocNoSortIdWithTimestamp(docId); + const completeRule = getCompleteRuleMock(getNewTermsRuleParams()); + const alerts = wrapNewTermsAlerts({ + eventsAndTerms: [{ event: doc, newTerms: ['127.0.0.1'] }], + spaceId: 'default', + mergeStrategy: 'missingFields', + completeRule, + indicesToQuery: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + }); + + expect(alerts[0]._id).toEqual('a36d9fe6fe4b2f65058fb1a487733275f811af58'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('a36d9fe6fe4b2f65058fb1a487733275f811af58'); + expect(alerts[0]._source[ALERT_NEW_TERMS]).toEqual(['127.0.0.1']); + }); + + test('should create an alert with a different _id if the space is different', () => { + const doc = sampleDocNoSortIdWithTimestamp(docId); + const completeRule = getCompleteRuleMock(getNewTermsRuleParams()); + const alerts = wrapNewTermsAlerts({ + eventsAndTerms: [{ event: doc, newTerms: ['127.0.0.1'] }], + spaceId: 'otherSpace', + mergeStrategy: 'missingFields', + completeRule, + indicesToQuery: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + }); + + expect(alerts[0]._id).toEqual('f7877a31b1cc83373dbc9ba5939ebfab1db66545'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('f7877a31b1cc83373dbc9ba5939ebfab1db66545'); + expect(alerts[0]._source[ALERT_NEW_TERMS]).toEqual(['127.0.0.1']); + }); + + test('should create an alert with a different _id if the newTerms array is different', () => { + const doc = sampleDocNoSortIdWithTimestamp(docId); + const completeRule = getCompleteRuleMock(getNewTermsRuleParams()); + const alerts = wrapNewTermsAlerts({ + eventsAndTerms: [{ event: doc, newTerms: ['127.0.0.2'] }], + spaceId: 'otherSpace', + mergeStrategy: 'missingFields', + completeRule, + indicesToQuery: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + }); + + expect(alerts[0]._id).toEqual('75e5a507a4bc48bcd983820c7fd2d9621ff4e2ea'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('75e5a507a4bc48bcd983820c7fd2d9621ff4e2ea'); + expect(alerts[0]._source[ALERT_NEW_TERMS]).toEqual(['127.0.0.2']); + }); + + test('should create an alert with a different _id if the newTerms array contains multiple terms', () => { + const doc = sampleDocNoSortIdWithTimestamp(docId); + const completeRule = getCompleteRuleMock(getNewTermsRuleParams()); + const alerts = wrapNewTermsAlerts({ + eventsAndTerms: [{ event: doc, newTerms: ['127.0.0.1', '127.0.0.2'] }], + spaceId: 'otherSpace', + mergeStrategy: 'missingFields', + completeRule, + indicesToQuery: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + }); + + expect(alerts[0]._id).toEqual('86a216cfa4884767d9bb26d2b8db911cb4aa85ce'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('86a216cfa4884767d9bb26d2b8db911cb4aa85ce'); + expect(alerts[0]._source[ALERT_NEW_TERMS]).toEqual(['127.0.0.1', '127.0.0.2']); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.ts new file mode 100644 index 0000000000000..f3e1434b75f2b --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/factories/utils/wrap_new_terms_alerts.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/types'; +import objectHash from 'object-hash'; +import { ALERT_UUID } from '@kbn/rule-data-utils'; +import type { + BaseFieldsLatest, + NewTermsFieldsLatest, + WrappedFieldsLatest, +} from '../../../../../../common/detection_engine/schemas/alerts'; +import { ALERT_NEW_TERMS } from '../../../../../../common/field_maps/field_names'; +import type { ConfigType } from '../../../../../config'; +import type { CompleteRule, RuleParams } from '../../../schemas/rule_schemas'; +import { buildReasonMessageForNewTermsAlert } from '../../../signals/reason_formatters'; +import type { SignalSource } from '../../../signals/types'; +import { buildBulkBody } from './build_bulk_body'; + +export interface EventsAndTerms { + event: estypes.SearchHit; + newTerms: Array; +} + +export const wrapNewTermsAlerts = ({ + eventsAndTerms, + spaceId, + completeRule, + mergeStrategy, + indicesToQuery, +}: { + eventsAndTerms: EventsAndTerms[]; + spaceId: string | null | undefined; + completeRule: CompleteRule; + mergeStrategy: ConfigType['alertMergeStrategy']; + indicesToQuery: string[]; +}): Array> => { + return eventsAndTerms.map((eventAndTerms) => { + const id = objectHash([ + eventAndTerms.event._index, + eventAndTerms.event._id, + String(eventAndTerms.event._version), + `${spaceId}:${completeRule.alertId}`, + eventAndTerms.newTerms, + ]); + const baseAlert: BaseFieldsLatest = buildBulkBody( + spaceId, + completeRule, + eventAndTerms.event, + mergeStrategy, + [], + true, + buildReasonMessageForNewTermsAlert, + indicesToQuery + ); + return { + _id: id, + _index: '', + _source: { + ...baseAlert, + [ALERT_NEW_TERMS]: eventAndTerms.newTerms, + [ALERT_UUID]: id, + }, + }; + }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/index.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/index.ts index db50ba38c95a5..9c5743aa1451d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/index.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/index.ts @@ -11,3 +11,4 @@ export { createMlAlertType } from './ml/create_ml_alert_type'; export { createQueryAlertType } from './query/create_query_alert_type'; export { createSavedQueryAlertType } from './saved_query/create_saved_query_alert_type'; export { createThresholdAlertType } from './threshold/create_threshold_alert_type'; +export { createNewTermsAlertType } from './new_terms/create_new_terms_alert_type'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/README.md b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/README.md new file mode 100644 index 0000000000000..50ec5e7682a28 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/README.md @@ -0,0 +1,29 @@ +## Design + +The rule accepts 2 new parameters that are unique to the new_terms rule type, in addition to common Security rule parameters such as query, index, and filters, to, from, etc. The new parameters are: + +- `new_terms_fields`: an array of field names, currently limited to an array of size 1. In the future we will likely allow multiple field names to be specified here. + Example: ['host.ip'] +- `history_window_start`: defines the additional time range to search over when determining if a term is "new". If a term is found between the times `history_window_start` and from then it will not be classified as a new term. + Example: now-30d + The rule pages through all terms that have appeared in the last rule interval and checks each term to determine if it's new. It pages through terms 10000 at a time. + +Each page is evaluated in 3 phases. +Phase 1: Collect "recent" terms - terms that have appeared in the last rule interval, without regard to whether or not they have appeared in historical data. This is done using a composite aggregation to ensure we can iterate over every term. + +Phase 2: Check if the page of terms contains any new terms. This uses a regular terms agg with the include parameter - every term is added to the array of include values, so the terms agg is limited to only aggregating on the terms of interest from phase 1. This avoids issues with the terms agg providing approximate results due to getting different terms from different shards. + +Phase 3: Any new terms from phase 2 are processed and the first document to contain that term is retrieved. The document becomes the basis of the generated alert. This is done with an aggregation query that is very similar to the agg used in phase 2, except it also includes a top_hits agg. top_hits is moved to a separate, later phase for efficiency - top_hits is slow and most terms will not be new in phase 2. This means we only execute the top_hits agg on the terms that are actually new which is faster. + +## Alert schema + +New terms alerts have one special field at the moment: `kibana.alert.new_terms`. This field contains the detected term that caused the alert. A single source document may have multiple new terms if the source document contains an array of values in the specified field. In that case, multiple alerts will be generated from the single source document - one for each new value. + +## Timestamp override and fallback + +The new terms rule type reuses the singleSearchAfter function which implements timestamp fallback for queries automatically. However, the min aggregation by timestamp necessitates a slightly more complex fallback strategy since min aggs only accept a single field. If a timestamp override is defined, the new terms rule type defines a query-time runtime field `kibana.combined_timestamp` which is defined as the timestamp override value if it exists, otherwise `@timestamp`, for each document. We can then use the min aggregation on this runtime field to calculate the earliest time a term was found. + +## Limitations and future enhancements + +- Value list exceptions are not supported at the moment. Commit ead04ce removes an experimental method I tried for evaluating value list exceptions. +- In the future we may want to support searching for new sets of terms, e.g. a pair of `host.ip` and `host.id` that has never been seen together before. diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_new_terms_aggregation.test.ts.snap b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_new_terms_aggregation.test.ts.snap new file mode 100644 index 0000000000000..72df8a34cfa18 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_new_terms_aggregation.test.ts.snap @@ -0,0 +1,137 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`aggregations buildDocFetchAgg builds a correct top hits aggregation 1`] = ` +Object { + "new_terms": Object { + "aggs": Object { + "docs": Object { + "top_hits": Object { + "size": 1, + "sort": Array [ + Object { + "@timestamp": "asc", + }, + ], + }, + }, + }, + "terms": Object { + "field": "host.name", + "include": Array [ + "myHost", + ], + "size": 10000, + }, + }, +} +`; + +exports[`aggregations buildNewTermsAggregation builds a correct aggregation with @timestamp 1`] = ` +Object { + "new_terms": Object { + "aggs": Object { + "filtering_agg": Object { + "bucket_selector": Object { + "buckets_path": Object { + "first_seen_value": "first_seen", + }, + "script": Object { + "params": Object { + "start_time": 1650000000, + }, + "source": "params.first_seen_value > params.start_time", + }, + }, + }, + "first_seen": Object { + "min": Object { + "field": "@timestamp", + }, + }, + }, + "terms": Object { + "field": "host.ip", + "include": Array [ + "myHost", + ], + "size": 10000, + }, + }, +} +`; + +exports[`aggregations buildNewTermsAggregation builds a correct aggregation with event.ingested 1`] = ` +Object { + "new_terms": Object { + "aggs": Object { + "filtering_agg": Object { + "bucket_selector": Object { + "buckets_path": Object { + "first_seen_value": "first_seen", + }, + "script": Object { + "params": Object { + "start_time": 1650935705, + }, + "source": "params.first_seen_value > params.start_time", + }, + }, + }, + "first_seen": Object { + "min": Object { + "field": "event.ingested", + }, + }, + }, + "terms": Object { + "field": "host.name", + "include": Array [ + "myHost", + ], + "size": 10000, + }, + }, +} +`; + +exports[`aggregations buildRecentTermsAgg builds a correct composite agg without \`after\` 1`] = ` +Object { + "new_terms": Object { + "composite": Object { + "after": undefined, + "size": 10000, + "sources": Array [ + Object { + "host.name": Object { + "terms": Object { + "field": "host.name", + }, + }, + }, + ], + }, + }, +} +`; + +exports[`aggregations buildRecentTermsAgg builds a correct composite aggregation with \`after\` 1`] = ` +Object { + "new_terms": Object { + "composite": Object { + "after": Object { + "host.name": "myHost", + }, + "size": 10000, + "sources": Array [ + Object { + "host.name": Object { + "terms": Object { + "field": "host.name", + }, + }, + }, + ], + }, + }, +} +`; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_timestamp_runtime_mapping.test.ts.snap b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_timestamp_runtime_mapping.test.ts.snap new file mode 100644 index 0000000000000..5c26f11304813 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/__snapshots__/build_timestamp_runtime_mapping.test.ts.snap @@ -0,0 +1,21 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`buildTimestampRuntimeMapping builds a correct timestamp fallback runtime mapping 1`] = ` +Object { + "kibana.combined_timestamp": Object { + "script": Object { + "params": Object { + "timestampOverride": "event.ingested", + }, + "source": " + if (doc.containsKey(params.timestampOverride) && doc[params.timestampOverride].size()!=0) { + emit(doc[params.timestampOverride].value.millis); + } else { + emit(doc['@timestamp'].value.millis); + } + ", + }, + "type": "date", + }, +} +`; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.test.ts new file mode 100644 index 0000000000000..9b853a730ba4c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.test.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import moment from 'moment'; +import { + buildDocFetchAgg, + buildNewTermsAgg, + buildRecentTermsAgg, +} from './build_new_terms_aggregation'; + +describe('aggregations', () => { + describe('buildRecentTermsAgg', () => { + test('builds a correct composite agg without `after`', () => { + const aggregation = buildRecentTermsAgg({ + field: 'host.name', + after: undefined, + }); + + expect(aggregation).toMatchSnapshot(); + }); + + test('builds a correct composite aggregation with `after`', () => { + const aggregation = buildRecentTermsAgg({ + field: 'host.name', + after: { 'host.name': 'myHost' }, + }); + + expect(aggregation).toMatchSnapshot(); + }); + }); + + describe('buildNewTermsAggregation', () => { + test('builds a correct aggregation with event.ingested', () => { + const newValueWindowStart = moment(1650935705); + const aggregation = buildNewTermsAgg({ + newValueWindowStart, + field: 'host.name', + timestampField: 'event.ingested', + include: ['myHost'], + }); + + expect(aggregation).toMatchSnapshot(); + }); + + test('builds a correct aggregation with @timestamp', () => { + const newValueWindowStart = moment(1650000000); + const aggregation = buildNewTermsAgg({ + newValueWindowStart, + field: 'host.ip', + timestampField: '@timestamp', + include: ['myHost'], + }); + + expect(aggregation).toMatchSnapshot(); + }); + }); + + describe('buildDocFetchAgg', () => { + test('builds a correct top hits aggregation', () => { + const aggregation = buildDocFetchAgg({ + field: 'host.name', + timestampField: '@timestamp', + include: ['myHost'], + }); + + expect(aggregation).toMatchSnapshot(); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.ts new file mode 100644 index 0000000000000..c9ad9c053363a --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_new_terms_aggregation.ts @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Moment } from 'moment'; +import type { ESSearchResponse } from '@kbn/core/types/elasticsearch'; +import type { SignalSource } from '../../signals/types'; + +export type RecentTermsAggResult = ESSearchResponse< + SignalSource, + { body: { aggregations: ReturnType } } +>; + +export type NewTermsAggResult = ESSearchResponse< + SignalSource, + { body: { aggregations: ReturnType } } +>; + +export type DocFetchAggResult = ESSearchResponse< + SignalSource, + { body: { aggregations: ReturnType } } +>; + +const PAGE_SIZE = 10000; + +/** + * Creates an aggregation that pages through all terms. Used to find the terms that have appeared recently, + * without regard to whether or not they're actually new. + */ +export const buildRecentTermsAgg = ({ + field, + after, +}: { + field: string; + after: Record | undefined; +}) => { + return { + new_terms: { + composite: { + sources: [ + { + [field]: { + terms: { + field, + }, + }, + }, + ], + size: PAGE_SIZE, + after, + }, + }, + }; +}; + +/** + * Creates an aggregation that returns a bucket for each term in the `include` array + * that only appears after the time `newValueWindowStart`. + */ +export const buildNewTermsAgg = ({ + newValueWindowStart, + field, + timestampField, + include, +}: { + newValueWindowStart: Moment; + field: string; + timestampField: string; + include: Array; +}) => { + return { + new_terms: { + terms: { + field, + size: PAGE_SIZE, + // include actually accepts strings or numbers, so we cast to string[] to make TS happy + include: include as string[], + }, + aggs: { + first_seen: { + min: { + field: timestampField, + }, + }, + filtering_agg: { + bucket_selector: { + buckets_path: { + first_seen_value: 'first_seen', + }, + script: { + params: { + start_time: newValueWindowStart.valueOf(), + }, + source: 'params.first_seen_value > params.start_time', + }, + }, + }, + }, + }, + }; +}; + +/** + * Creates an aggregation that fetches the oldest document for each value in the `include` array. + */ +export const buildDocFetchAgg = ({ + field, + timestampField, + include, +}: { + field: string; + timestampField: string; + include: Array; +}) => { + return { + new_terms: { + terms: { + field, + size: PAGE_SIZE, + // include actually accepts strings or numbers, so we cast to string[] to make TS happy + include: include as string[], + }, + aggs: { + docs: { + top_hits: { + size: 1, + sort: [ + { + [timestampField]: 'asc' as const, + }, + ], + }, + }, + }, + }, + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.test.ts new file mode 100644 index 0000000000000..9b67dc53d9967 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.test.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { buildTimestampRuntimeMapping } from './build_timestamp_runtime_mapping'; + +describe('buildTimestampRuntimeMapping', () => { + test('builds a correct timestamp fallback runtime mapping', () => { + const runtimeMapping = buildTimestampRuntimeMapping({ + timestampOverride: 'event.ingested', + }); + + expect(runtimeMapping).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.ts new file mode 100644 index 0000000000000..9c33aaab48e7f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/build_timestamp_runtime_mapping.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/types'; + +export const TIMESTAMP_RUNTIME_FIELD = 'kibana.combined_timestamp' as const; + +export const buildTimestampRuntimeMapping = ({ + timestampOverride, +}: { + timestampOverride: string; +}): estypes.MappingRuntimeFields => { + return { + [TIMESTAMP_RUNTIME_FIELD]: { + type: 'date', + script: { + source: ` + if (doc.containsKey(params.timestampOverride) && doc[params.timestampOverride].size()!=0) { + emit(doc[params.timestampOverride].value.millis); + } else { + emit(doc['@timestamp'].value.millis); + } + `, + params: { + timestampOverride, + }, + }, + }, + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts new file mode 100644 index 0000000000000..9bea2eb495b26 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/create_new_terms_alert_type.ts @@ -0,0 +1,345 @@ +/* + * Copyright 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 * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import dateMath from '@elastic/datemath'; +import { validateNonExact } from '@kbn/securitysolution-io-ts-utils'; +import { NEW_TERMS_RULE_TYPE_ID } from '@kbn/securitysolution-rules'; +import { SERVER_APP_ID } from '../../../../../common/constants'; + +import type { NewTermsRuleParams } from '../../schemas/rule_schemas'; +import { newTermsRuleParams } from '../../schemas/rule_schemas'; +import type { CreateRuleOptions, SecurityAlertType } from '../types'; +import { singleSearchAfter } from '../../signals/single_search_after'; +import { getFilter } from '../../signals/get_filter'; +import type { GenericBulkCreateResponse } from '../factories'; +import type { BaseFieldsLatest } from '../../../../../common/detection_engine/schemas/alerts'; +import { wrapNewTermsAlerts } from '../factories/utils/wrap_new_terms_alerts'; +import type { + DocFetchAggResult, + RecentTermsAggResult, + NewTermsAggResult, +} from './build_new_terms_aggregation'; +import { + buildDocFetchAgg, + buildRecentTermsAgg, + buildNewTermsAgg, +} from './build_new_terms_aggregation'; +import { + buildTimestampRuntimeMapping, + TIMESTAMP_RUNTIME_FIELD, +} from './build_timestamp_runtime_mapping'; +import type { SignalSource } from '../../signals/types'; + +interface BulkCreateResults { + bulkCreateTimes: string[]; + createdSignalsCount: number; + createdSignals: unknown[]; + success: boolean; + errors: string[]; + alertsWereTruncated: boolean; +} + +interface SearchAfterResults { + searchDurations: string[]; + searchErrors: string[]; +} + +const addBulkCreateResults = ( + results: BulkCreateResults, + newResults: GenericBulkCreateResponse +): BulkCreateResults => { + return { + bulkCreateTimes: [...results.bulkCreateTimes, newResults.bulkCreateDuration], + createdSignalsCount: results.createdSignalsCount + newResults.createdItemsCount, + createdSignals: [...results.createdSignals, ...newResults.createdItems], + success: results.success && newResults.success, + errors: [...results.errors, ...newResults.errors], + alertsWereTruncated: results.alertsWereTruncated || newResults.alertsWereTruncated, + }; +}; + +export const createNewTermsAlertType = ( + createOptions: CreateRuleOptions +): SecurityAlertType => { + const { logger } = createOptions; + return { + id: NEW_TERMS_RULE_TYPE_ID, + name: 'New Terms Rule', + validate: { + params: { + validate: (object: unknown) => { + const [validated, errors] = validateNonExact(object, newTermsRuleParams); + if (errors != null) { + throw new Error(errors); + } + if (validated == null) { + throw new Error('Validation of rule params failed'); + } + return validated; + }, + }, + }, + actionGroups: [ + { + id: 'default', + name: 'Default', + }, + ], + defaultActionGroupId: 'default', + actionVariables: { + context: [{ name: 'server', description: 'the server' }], + }, + minimumLicenseRequired: 'basic', + isExportable: false, + producer: SERVER_APP_ID, + async executor(execOptions) { + const { + runOpts: { + buildRuleMessage, + bulkCreate, + completeRule, + exceptionItems, + tuple, + mergeStrategy, + inputIndex, + runtimeMappings, + primaryTimestamp, + secondaryTimestamp, + }, + services, + params, + spaceId, + } = execOptions; + + const filter = await getFilter({ + filters: params.filters, + index: inputIndex, + language: params.language, + savedId: undefined, + services, + type: params.type, + query: params.query, + lists: exceptionItems, + }); + + const parsedHistoryWindowSize = dateMath.parse(params.historyWindowStart, { + forceNow: tuple.to.toDate(), + }); + if (parsedHistoryWindowSize == null) { + throw Error(`Failed to parse 'historyWindowStart'`); + } + + let afterKey; + let bulkCreateResults: BulkCreateResults = { + bulkCreateTimes: [], + createdSignalsCount: 0, + createdSignals: [], + success: true, + errors: [], + alertsWereTruncated: false, + }; + + const searchAfterResults: SearchAfterResults = { + searchDurations: [], + searchErrors: [], + }; + + // If we have a timestampOverride, we'll compute a runtime field that emits the override for each document if it exists, + // otherwise it emits @timestamp. If we don't have a timestamp override we don't want to pay the cost of using a + // runtime field, so we just use @timestamp directly. + const { timestampField, timestampRuntimeMappings } = params.timestampOverride + ? { + timestampField: TIMESTAMP_RUNTIME_FIELD, + timestampRuntimeMappings: buildTimestampRuntimeMapping({ + timestampOverride: params.timestampOverride, + }), + } + : { timestampField: '@timestamp', timestampRuntimeMappings: undefined }; + + // There are 2 conditions that mean we're finished: either there were still too many alerts to create + // after deduplication and the array of alerts was truncated before being submitted to ES, or there were + // exactly enough new alerts to hit maxSignals without truncating the array of alerts. We check both because + // it's possible for the array to be truncated but alert documents could fail to be created for other reasons, + // in which case createdSignalsCount would still be less than maxSignals. Since valid alerts were truncated from + // the array in that case, we stop and report the errors. + while ( + !bulkCreateResults.alertsWereTruncated && + bulkCreateResults.createdSignalsCount < params.maxSignals + ) { + // PHASE 1: Fetch a page of terms using a composite aggregation. This will collect a page from + // all of the terms seen over the last rule interval. In the next phase we'll determine which + // ones are new. + const { searchResult, searchDuration, searchErrors } = await singleSearchAfter({ + aggregations: buildRecentTermsAgg({ + field: params.newTermsFields[0], + after: afterKey, + }), + searchAfterSortIds: undefined, + index: inputIndex, + // The time range for the initial composite aggregation is the rule interval, `from` and `to` + from: tuple.from.toISOString(), + to: tuple.to.toISOString(), + services, + filter, + logger, + pageSize: 0, + primaryTimestamp, + secondaryTimestamp, + buildRuleMessage, + runtimeMappings, + }); + const searchResultWithAggs = searchResult as RecentTermsAggResult; + if (!searchResultWithAggs.aggregations) { + throw new Error('expected to find aggregations on search result'); + } + logger.debug(`Time spent on composite agg: ${searchDuration}`); + + searchAfterResults.searchDurations.push(searchDuration); + searchAfterResults.searchErrors.push(...searchErrors); + + afterKey = searchResultWithAggs.aggregations.new_terms.after_key; + + // If the aggregation returns no after_key it signals that we've paged through all results + // and the current page is empty so we can immediately break. + if (afterKey == null) { + break; + } + const bucketsForField = searchResultWithAggs.aggregations.new_terms.buckets; + const includeValues = bucketsForField + .map((bucket) => Object.values(bucket.key)[0]) + .filter((value): value is string | number => value != null); + + // PHASE 2: Take the page of results from Phase 1 and determine if each term exists in the history window. + // The aggregation filters out buckets for terms that exist prior to `tuple.from`, so the buckets in the + // response correspond to each new term. + const { + searchResult: pageSearchResult, + searchDuration: pageSearchDuration, + searchErrors: pageSearchErrors, + } = await singleSearchAfter({ + aggregations: buildNewTermsAgg({ + newValueWindowStart: tuple.from, + timestampField, + field: params.newTermsFields[0], + include: includeValues, + }), + runtimeMappings: { + ...runtimeMappings, + ...timestampRuntimeMappings, + }, + searchAfterSortIds: undefined, + index: inputIndex, + // For Phase 2, we expand the time range to aggregate over the history window + // in addition to the rule interval + from: parsedHistoryWindowSize.toISOString(), + to: tuple.to.toISOString(), + services, + filter, + logger, + pageSize: 0, + primaryTimestamp, + secondaryTimestamp, + buildRuleMessage, + }); + searchAfterResults.searchDurations.push(pageSearchDuration); + searchAfterResults.searchErrors.push(...pageSearchErrors); + + logger.debug(`Time spent on phase 2 terms agg: ${pageSearchDuration}`); + + const pageSearchResultWithAggs = pageSearchResult as NewTermsAggResult; + if (!pageSearchResultWithAggs.aggregations) { + throw new Error('expected to find aggregations on page search result'); + } + + // PHASE 3: For each term that is not in the history window, fetch the oldest document in + // the rule interval for that term. This is the first document to contain the new term, and will + // become the basis of the resulting alert. + // One document could become multiple alerts if the document contains an array with multiple new terms. + if (pageSearchResultWithAggs.aggregations.new_terms.buckets.length > 0) { + const actualNewTerms = pageSearchResultWithAggs.aggregations.new_terms.buckets.map( + (bucket) => bucket.key + ); + + const { + searchResult: docFetchSearchResult, + searchDuration: docFetchSearchDuration, + searchErrors: docFetchSearchErrors, + } = await singleSearchAfter({ + aggregations: buildDocFetchAgg({ + timestampField, + field: params.newTermsFields[0], + include: actualNewTerms, + }), + runtimeMappings: { + ...runtimeMappings, + ...timestampRuntimeMappings, + }, + searchAfterSortIds: undefined, + index: inputIndex, + // For phase 3, we go back to aggregating only over the rule interval - excluding the history window + from: tuple.from.toISOString(), + to: tuple.to.toISOString(), + services, + filter, + logger, + pageSize: 0, + primaryTimestamp, + secondaryTimestamp, + buildRuleMessage, + }); + searchAfterResults.searchDurations.push(docFetchSearchDuration); + searchAfterResults.searchErrors.push(...docFetchSearchErrors); + + const docFetchResultWithAggs = docFetchSearchResult as DocFetchAggResult; + + if (!docFetchResultWithAggs.aggregations) { + throw new Error('expected to find aggregations on page search result'); + } + + const eventsAndTerms: Array<{ + event: estypes.SearchHit; + newTerms: Array; + }> = docFetchResultWithAggs.aggregations.new_terms.buckets.map((bucket) => ({ + event: bucket.docs.hits.hits[0], + newTerms: [bucket.key], + })); + + const wrappedAlerts = wrapNewTermsAlerts({ + eventsAndTerms, + spaceId, + completeRule, + mergeStrategy, + indicesToQuery: inputIndex, + }); + + const bulkCreateResult = await bulkCreate( + wrappedAlerts, + params.maxSignals - bulkCreateResults.createdSignalsCount + ); + + bulkCreateResults = addBulkCreateResults(bulkCreateResults, bulkCreateResult); + } + } + + return { + // If an error occurs but doesn't cause us to throw then we still count the execution as a success. + // Should be refactored for better clarity, but that's how it is for now. + success: true, + warning: false, + searchAfterTimes: searchAfterResults.searchDurations, + bulkCreateTimes: bulkCreateResults.bulkCreateTimes, + lastLookBackDate: undefined, + createdSignalsCount: bulkCreateResults.createdSignalsCount, + createdSignals: bulkCreateResults.createdSignals, + errors: [...searchAfterResults.searchErrors, ...bulkCreateResults.errors], + warningMessages: [], + state: {}, + }; + }, + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts index eef69fd4ebab7..3212fee6a1c1d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/types.ts @@ -69,6 +69,7 @@ export interface RunOpts { ruleDataReader: IRuleDataReader; inputIndex: string[]; runtimeMappings: estypes.MappingRuntimeFields | undefined; + mergeStrategy: ConfigType['alertMergeStrategy']; primaryTimestamp: string; secondaryTimestamp?: string; } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enrich_filter_with_rule_type_mappings.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enrich_filter_with_rule_type_mappings.test.ts index ae9db4f0071a9..f57ab2d4b87f4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enrich_filter_with_rule_type_mappings.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enrich_filter_with_rule_type_mappings.test.ts @@ -9,6 +9,7 @@ import { EQL_RULE_TYPE_ID, INDICATOR_RULE_TYPE_ID, ML_RULE_TYPE_ID, + NEW_TERMS_RULE_TYPE_ID, QUERY_RULE_TYPE_ID, SAVED_QUERY_RULE_TYPE_ID, THRESHOLD_RULE_TYPE_ID, @@ -21,7 +22,8 @@ const allAlertTypeIds = `(alert.attributes.alertTypeId: ${EQL_RULE_TYPE_ID} OR alert.attributes.alertTypeId: ${QUERY_RULE_TYPE_ID} OR alert.attributes.alertTypeId: ${SAVED_QUERY_RULE_TYPE_ID} OR alert.attributes.alertTypeId: ${INDICATOR_RULE_TYPE_ID} - OR alert.attributes.alertTypeId: ${THRESHOLD_RULE_TYPE_ID})`.replace(/[\n\r]/g, ''); + OR alert.attributes.alertTypeId: ${THRESHOLD_RULE_TYPE_ID} + OR alert.attributes.alertTypeId: ${NEW_TERMS_RULE_TYPE_ID})`.replace(/[\n\r]/g, ''); describe('enrichFilterWithRuleTypeMapping', () => { test('it returns a full filter with an AND if sent down', () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.test.ts index ba840ae6e580e..0a728f9c9e5c8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.test.ts @@ -9,6 +9,7 @@ import { convertPatchAPIToInternalSchema, patchTypeSpecificSnakeToCamel } from ' import { getEqlRuleParams, getMlRuleParams, + getNewTermsRuleParams, getQueryRuleParams, getSavedQueryRuleParams, getThreatRuleParams, @@ -179,6 +180,29 @@ describe('rule_converters', () => { 'Invalid value "invalid" supplied to "anomaly_threshold"' ); }); + + test('should accept new terms params when existing rule type is new terms', () => { + const patchParams = { + new_terms_fields: ['event.new_field'], + }; + const rule = getNewTermsRuleParams(); + const patchedParams = patchTypeSpecificSnakeToCamel(patchParams, rule); + expect(patchedParams).toEqual( + expect.objectContaining({ + newTermsFields: ['event.new_field'], + }) + ); + }); + + test('should reject invalid new terms params when existing rule type is new terms', () => { + const patchParams = { + new_terms_fields: 'invalid', + }; + const rule = getNewTermsRuleParams(); + expect(() => patchTypeSpecificSnakeToCamel(patchParams, rule)).toThrowError( + 'Invalid value "invalid" supplied to "new_terms_fields"' + ); + }); }); describe('convertPatchAPIToInternalSchema', () => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts index 7312037ae956d..0056606f17f15 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_converters.ts @@ -34,6 +34,8 @@ import type { MachineLearningRuleParams, MachineLearningSpecificRuleParams, InternalRuleUpdate, + NewTermsRuleParams, + NewTermsSpecificRuleParams, } from './rule_schemas'; import { assertUnreachable } from '../../../../common/utility_types'; import type { @@ -45,6 +47,7 @@ import type { import { eqlPatchParams, machineLearningPatchParams, + newTermsPatchParams, queryPatchParams, savedQueryPatchParams, threatMatchPatchParams, @@ -56,6 +59,7 @@ import type { EqlPatchParams, FullResponseSchema, MachineLearningPatchParams, + NewTermsPatchParams, QueryPatchParams, ResponseTypeSpecific, SavedQueryPatchParams, @@ -162,6 +166,18 @@ export const typeSpecificSnakeToCamel = (params: CreateTypeSpecific): TypeSpecif machineLearningJobId: normalizeMachineLearningJobIds(params.machine_learning_job_id), }; } + case 'new_terms': { + return { + type: params.type, + query: params.query, + newTermsFields: params.new_terms_fields, + historyWindowStart: params.history_window_start, + index: params.index, + filters: params.filters, + language: params.language ?? 'kuery', + dataViewId: params.data_view_id, + }; + } default: { return assertUnreachable(params); } @@ -269,6 +285,22 @@ const patchMachineLearningParams = ( }; }; +const patchNewTermsParams = ( + params: NewTermsPatchParams, + existingRule: NewTermsRuleParams +): NewTermsSpecificRuleParams => { + return { + type: existingRule.type, + language: params.language ?? existingRule.language, + index: params.index ?? existingRule.index, + dataViewId: params.data_view_id ?? existingRule.dataViewId, + query: params.query ?? existingRule.query, + filters: params.filters ?? existingRule.filters, + newTermsFields: params.new_terms_fields ?? existingRule.newTermsFields, + historyWindowStart: params.history_window_start ?? existingRule.historyWindowStart, + }; +}; + const parseValidationError = (error: string | null): BadRequestError => { if (error != null) { return new BadRequestError(error); @@ -329,6 +361,13 @@ export const patchTypeSpecificSnakeToCamel = ( } return patchMachineLearningParams(validated, existingRule); } + case 'new_terms': { + const [validated, error] = validateNonExact(params, newTermsPatchParams); + if (validated == null) { + throw parseValidationError(error); + } + return patchNewTermsParams(validated, existingRule); + } default: { return assertUnreachable(existingRule); } @@ -542,6 +581,18 @@ export const typeSpecificCamelToSnake = (params: TypeSpecificRuleParams): Respon machine_learning_job_id: params.machineLearningJobId, }; } + case 'new_terms': { + return { + type: params.type, + query: params.query, + new_terms_fields: params.newTermsFields, + history_window_start: params.historyWindowStart, + index: params.index, + filters: params.filters, + language: params.language, + data_view_id: params.dataViewId, + }; + } default: { return assertUnreachable(params); } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.mock.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.mock.ts index fec09f41097b9..853b31f5dcfaa 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.mock.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.mock.ts @@ -13,6 +13,7 @@ import type { CompleteRule, EqlRuleParams, MachineLearningRuleParams, + NewTermsRuleParams, QueryRuleParams, RuleParams, SavedQueryRuleParams, @@ -148,6 +149,28 @@ export const getSavedQueryRuleParams = (): SavedQueryRuleParams => { }; }; +export const getNewTermsRuleParams = (): NewTermsRuleParams => { + return { + ...getBaseRuleParams(), + type: 'new_terms', + language: 'kuery', + query: 'user.name: root or user.name: admin', + index: ['auditbeat-*', 'filebeat-*', 'packetbeat-*', 'winlogbeat-*'], + dataViewId: undefined, + filters: [ + { + query: { + match_phrase: { + 'host.name': 'some-host', + }, + }, + }, + ], + newTermsFields: ['host.name'], + historyWindowStart: 'now-30d', + }; +}; + export const getThreatRuleParams = (): ThreatRuleParams => { return { ...getBaseRuleParams(), diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.ts index 754f56d637e0b..d879f3dbeda3c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/schemas/rule_schemas.ts @@ -35,6 +35,7 @@ import { QUERY_RULE_TYPE_ID, THRESHOLD_RULE_TYPE_ID, SAVED_QUERY_RULE_TYPE_ID, + NEW_TERMS_RULE_TYPE_ID, } from '@kbn/securitysolution-rules'; import type { SanitizedRuleConfig } from '@kbn/alerting-plugin/common'; @@ -74,6 +75,8 @@ import { RelatedIntegrationArray, RequiredFieldArray, SetupGuide, + newTermsFields, + historyWindowStart, timestampOverrideFallbackDisabledOrUndefined, } from '../../../../common/detection_engine/schemas/common'; import { SERVER_APP_ID } from '../../../../common/constants'; @@ -209,6 +212,20 @@ export const machineLearningRuleParams = t.intersection([ export type MachineLearningSpecificRuleParams = t.TypeOf; export type MachineLearningRuleParams = t.TypeOf; +const newTermsSpecificRuleParams = t.type({ + type: t.literal('new_terms'), + query, + newTermsFields, + historyWindowStart, + index: indexOrUndefined, + filters: filtersOrUndefined, + language: nonEqlLanguages, + dataViewId: dataViewIdOrUndefined, +}); +export const newTermsRuleParams = t.intersection([baseRuleParams, newTermsSpecificRuleParams]); +export type NewTermsSpecificRuleParams = t.TypeOf; +export type NewTermsRuleParams = t.TypeOf; + export const typeSpecificRuleParams = t.union([ eqlSpecificRuleParams, threatSpecificRuleParams, @@ -216,6 +233,7 @@ export const typeSpecificRuleParams = t.union([ savedQuerySpecificRuleParams, thresholdSpecificRuleParams, machineLearningSpecificRuleParams, + newTermsSpecificRuleParams, ]); export type TypeSpecificRuleParams = t.TypeOf; @@ -243,6 +261,7 @@ export const allRuleTypes = t.union([ t.literal(QUERY_RULE_TYPE_ID), t.literal(SAVED_QUERY_RULE_TYPE_ID), t.literal(THRESHOLD_RULE_TYPE_ID), + t.literal(NEW_TERMS_RULE_TYPE_ID), ]); export const internalRuleCreate = t.type({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_events_query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_events_query.ts index 1a6e8fe3a723c..eda488e7fa292 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_events_query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/build_events_query.ts @@ -191,6 +191,7 @@ export const buildEventsSearchQuery = ({ ...docFields, ], ...(aggregations ? { aggregations } : {}), + runtime_mappings: runtimeMappings, sort, }, }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts index dfaf986f348df..7f8cc6bbb38db 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts @@ -99,6 +99,7 @@ export const getFilter = async ({ switch (type) { case 'threat_match': case 'threshold': + case 'new_terms': case 'query': { return queryFilter(); } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/reason_formatters.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/reason_formatters.ts index 04eb6cf6f4260..0b9148d995c74 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/reason_formatters.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/reason_formatters.ts @@ -16,7 +16,7 @@ export interface BuildReasonMessageArgs { } export interface BuildReasonMessageUtilArgs extends BuildReasonMessageArgs { - type?: 'eql' | 'ml' | 'query' | 'threatMatch' | 'threshold'; + type?: 'eql' | 'ml' | 'query' | 'threatMatch' | 'threshold' | 'new_terms'; } export type BuildReasonMessage = (args: BuildReasonMessageArgs) => string; @@ -134,3 +134,6 @@ export const buildReasonMessageForThreatMatchAlert = (args: BuildReasonMessageAr export const buildReasonMessageForThresholdAlert = (args: BuildReasonMessageArgs) => buildReasonMessageUtil({ ...args, type: 'threshold' }); + +export const buildReasonMessageForNewTermsAlert = (args: BuildReasonMessageArgs) => + buildReasonMessageUtil({ ...args, type: 'new_terms' }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.test.ts index bcc70e3fb735f..51e98d7575444 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/search_after_bulk_create.test.ts @@ -127,6 +127,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -144,6 +145,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -161,6 +163,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -178,6 +181,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -239,6 +243,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -256,6 +261,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -273,6 +279,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -349,6 +356,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -480,6 +488,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search .mockResolvedValueOnce( @@ -613,6 +622,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); const exceptionItem = getExceptionListItemSchemaMock(); @@ -683,6 +693,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -861,6 +872,7 @@ describe('searchAfterAndBulkCreate', () => { statusCode: 500, }, }, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.bulk.mockResponseOnce(bulkItem); // adds the response with errors we are testing @@ -880,6 +892,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -897,6 +910,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -914,6 +928,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -964,6 +979,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -981,6 +997,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( @@ -998,6 +1015,7 @@ describe('searchAfterAndBulkCreate', () => { }, ], errors: {}, + alertsWereTruncated: false, }); mockService.scopedClusterClient.asCurrentUser.search.mockResolvedValueOnce( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts index 2cd70bcb23cee..a8c26ad14dd33 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/types.ts @@ -241,7 +241,8 @@ export type BulkResponseErrorAggregation = Record Promise; export type BulkCreate = ( - docs: Array> + docs: Array>, + maxAlerts?: number ) => Promise>; export type SimpleHit = BaseHit<{ '@timestamp'?: string }>; diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 908920ce77600..0fe1adc22f880 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -33,6 +33,7 @@ import { createEqlAlertType, createIndicatorMatchAlertType, createMlAlertType, + createNewTermsAlertType, createQueryAlertType, createSavedQueryAlertType, createThresholdAlertType, @@ -256,6 +257,7 @@ export class Plugin implements ISecuritySolutionPlugin { plugins.alerting.registerType(securityRuleTypeWrapper(createMlAlertType(ruleOptions))); plugins.alerting.registerType(securityRuleTypeWrapper(createQueryAlertType(ruleOptions))); plugins.alerting.registerType(securityRuleTypeWrapper(createThresholdAlertType(ruleOptions))); + plugins.alerting.registerType(securityRuleTypeWrapper(createNewTermsAlertType(ruleOptions))); // TODO We need to get the endpoint routes inside of initRoutes initRoutes( diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_new_terms.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_new_terms.ts new file mode 100644 index 0000000000000..7fb6411b8b885 --- /dev/null +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/create_new_terms.ts @@ -0,0 +1,422 @@ +/* + * Copyright 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 { orderBy } from 'lodash'; +import expect from '@kbn/expect'; + +import { RuleExecutionStatus } from '@kbn/security-solution-plugin/common/detection_engine/schemas/common'; +import { NewTermsCreateSchema } from '@kbn/security-solution-plugin/common/detection_engine/schemas/request'; +import { DETECTION_ENGINE_RULES_URL } from '@kbn/security-solution-plugin/common/constants'; +import { getCreateNewTermsRulesSchemaMock } from '@kbn/security-solution-plugin/common/detection_engine/schemas/request/rule_schemas.mock'; +import { DetectionAlert } from '@kbn/security-solution-plugin/common/detection_engine/schemas/alerts'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { + createRule, + createRuleWithExceptionEntries, + createSignalsIndex, + deleteAllAlerts, + deleteSignalsIndex, + getOpenSignals, + getSignalsByIds, + waitForRuleSuccessOrStatus, + waitForSignalsToBePresent, +} from '../../utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertest'); + const log = getService('log'); + const es = getService('es'); + + /** + * Specific api integration tests for threat matching rule type + */ + describe('create_new_terms', () => { + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/auditbeat/hosts'); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/auditbeat/hosts'); + }); + + beforeEach(async () => { + await createSignalsIndex(supertest, log); + }); + + afterEach(async () => { + await deleteSignalsIndex(supertest, log); + await deleteAllAlerts(supertest, log); + }); + + it('should create a single rule with a rule_id and validate it ran successfully', async () => { + const ruleResponse = await createRule( + supertest, + log, + getCreateNewTermsRulesSchemaMock('rule-1', true) + ); + + await waitForRuleSuccessOrStatus( + supertest, + log, + ruleResponse.id, + RuleExecutionStatus.succeeded + ); + + const { body: rule } = await supertest + .get(DETECTION_ENGINE_RULES_URL) + .set('kbn-xsrf', 'true') + .query({ id: ruleResponse.id }) + .expect(200); + + expect(rule?.execution_summary?.last_execution.status).to.eql('succeeded'); + }); + + const removeRandomValuedProperties = (alert: DetectionAlert | undefined) => { + if (!alert) { + return undefined; + } + const { + 'kibana.version': version, + 'kibana.alert.rule.execution.uuid': execUuid, + 'kibana.alert.rule.uuid': uuid, + '@timestamp': timestamp, + 'kibana.alert.rule.created_at': createdAt, + 'kibana.alert.rule.updated_at': updatedAt, + 'kibana.alert.uuid': alertUuid, + ...restOfAlert + } = alert; + return restOfAlert; + }; + + // This test also tests that alerts are NOT created for terms that are not new: the host name + // suricata-sensor-san-francisco appears in a document at 2019-02-19T20:42:08.230Z, but also appears + // in earlier documents so is not new. An alert should not be generated for that term. + it('should generate 1 alert with 1 selected field', async () => { + const rule: NewTermsCreateSchema = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + new_terms_fields: ['host.name'], + from: '2019-02-19T20:42:00.000Z', + history_window_start: '2019-01-19T20:42:00.000Z', + }; + + const createdRule = await createRule(supertest, log, rule); + + await waitForRuleSuccessOrStatus( + supertest, + log, + createdRule.id, + RuleExecutionStatus.succeeded + ); + + const signalsOpen = await getOpenSignals(supertest, log, es, createdRule); + expect(signalsOpen.hits.hits.length).eql(1); + expect(removeRandomValuedProperties(signalsOpen.hits.hits[0]._source)).eql({ + 'kibana.alert.new_terms': ['zeek-newyork-sha-aa8df15'], + 'kibana.alert.rule.category': 'New Terms Rule', + 'kibana.alert.rule.consumer': 'siem', + 'kibana.alert.rule.name': 'Query with a rule id', + 'kibana.alert.rule.producer': 'siem', + 'kibana.alert.rule.rule_type_id': 'siem.newTermsRule', + 'kibana.space_ids': ['default'], + 'kibana.alert.rule.tags': [], + agent: { + ephemeral_id: '7cc2091a-72f1-4c63-843b-fdeb622f9c69', + hostname: 'zeek-newyork-sha-aa8df15', + id: '4b4462ef-93d2-409c-87a6-299d942e5047', + type: 'auditbeat', + version: '8.0.0', + }, + cloud: { instance: { id: '139865230' }, provider: 'digitalocean', region: 'nyc1' }, + ecs: { version: '1.0.0-beta2' }, + host: { + architecture: 'x86_64', + hostname: 'zeek-newyork-sha-aa8df15', + id: '3729d06ce9964aa98549f41cbd99334d', + ip: ['157.230.208.30', '10.10.0.6', 'fe80::24ce:f7ff:fede:a571'], + mac: ['26:ce:f7:de:a5:71'], + name: 'zeek-newyork-sha-aa8df15', + os: { + codename: 'cosmic', + family: 'debian', + kernel: '4.18.0-10-generic', + name: 'Ubuntu', + platform: 'ubuntu', + version: '18.10 (Cosmic Cuttlefish)', + }, + }, + message: + 'Login by user root (UID: 0) on pts/0 (PID: 20638) from 8.42.77.171 (IP: 8.42.77.171)', + process: { pid: 20638 }, + service: { type: 'system' }, + source: { ip: '8.42.77.171' }, + user: { id: 0, name: 'root', terminal: 'pts/0' }, + 'event.action': 'user_login', + 'event.category': 'authentication', + 'event.dataset': 'login', + 'event.kind': 'signal', + 'event.module': 'system', + 'event.origin': '/var/log/wtmp', + 'event.outcome': 'success', + 'event.type': 'authentication_success', + 'kibana.alert.original_time': '2019-02-19T20:42:08.230Z', + 'kibana.alert.ancestors': [ + { + id: 'x07wJ2oB9v5HJNSHhyxi', + type: 'event', + index: 'auditbeat-8.0.0-2019.02.19-000001', + depth: 0, + }, + ], + 'kibana.alert.status': 'active', + 'kibana.alert.workflow_status': 'open', + 'kibana.alert.depth': 1, + 'kibana.alert.reason': + 'authentication event by root on zeek-newyork-sha-aa8df15 created high alert Query with a rule id.', + 'kibana.alert.severity': 'high', + 'kibana.alert.risk_score': 55, + 'kibana.alert.rule.parameters': { + description: 'Detecting root and admin users', + risk_score: 55, + severity: 'high', + author: [], + false_positives: [], + from: '2019-02-19T20:42:00.000Z', + rule_id: 'rule-1', + max_signals: 100, + risk_score_mapping: [], + severity_mapping: [], + threat: [], + to: 'now', + references: [], + version: 1, + exceptions_list: [], + immutable: false, + related_integrations: [], + required_fields: [], + setup: '', + type: 'new_terms', + query: '*', + new_terms_fields: ['host.name'], + history_window_start: '2019-01-19T20:42:00.000Z', + index: ['auditbeat-*'], + language: 'kuery', + }, + 'kibana.alert.rule.actions': [], + 'kibana.alert.rule.author': [], + 'kibana.alert.rule.created_by': 'elastic', + 'kibana.alert.rule.description': 'Detecting root and admin users', + 'kibana.alert.rule.enabled': true, + 'kibana.alert.rule.exceptions_list': [], + 'kibana.alert.rule.false_positives': [], + 'kibana.alert.rule.from': '2019-02-19T20:42:00.000Z', + 'kibana.alert.rule.immutable': false, + 'kibana.alert.rule.indices': ['auditbeat-*'], + 'kibana.alert.rule.interval': '5m', + 'kibana.alert.rule.max_signals': 100, + 'kibana.alert.rule.references': [], + 'kibana.alert.rule.risk_score_mapping': [], + 'kibana.alert.rule.rule_id': 'rule-1', + 'kibana.alert.rule.severity_mapping': [], + 'kibana.alert.rule.threat': [], + 'kibana.alert.rule.to': 'now', + 'kibana.alert.rule.type': 'new_terms', + 'kibana.alert.rule.updated_by': 'elastic', + 'kibana.alert.rule.version': 1, + 'kibana.alert.rule.risk_score': 55, + 'kibana.alert.rule.severity': 'high', + 'kibana.alert.original_event.action': 'user_login', + 'kibana.alert.original_event.category': 'authentication', + 'kibana.alert.original_event.dataset': 'login', + 'kibana.alert.original_event.kind': 'event', + 'kibana.alert.original_event.module': 'system', + 'kibana.alert.original_event.origin': '/var/log/wtmp', + 'kibana.alert.original_event.outcome': 'success', + 'kibana.alert.original_event.type': 'authentication_success', + }); + }); + + it('should generate 3 alerts when 1 document has 3 new values', async () => { + const rule: NewTermsCreateSchema = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + new_terms_fields: ['host.ip'], + from: '2019-02-19T20:42:00.000Z', + history_window_start: '2019-01-19T20:42:00.000Z', + }; + + const createdRule = await createRule(supertest, log, rule); + + await waitForRuleSuccessOrStatus( + supertest, + log, + createdRule.id, + RuleExecutionStatus.succeeded + ); + + const signalsOpen = await getOpenSignals(supertest, log, es, createdRule); + expect(signalsOpen.hits.hits.length).eql(3); + const signalsOrderedByHostIp = orderBy( + signalsOpen.hits.hits, + '_source.kibana.alert.new_terms', + 'asc' + ); + expect(signalsOrderedByHostIp[0]._source?.['kibana.alert.new_terms']).eql(['10.10.0.6']); + expect(signalsOrderedByHostIp[1]._source?.['kibana.alert.new_terms']).eql(['157.230.208.30']); + expect(signalsOrderedByHostIp[2]._source?.['kibana.alert.new_terms']).eql([ + 'fe80::24ce:f7ff:fede:a571', + ]); + }); + + it('should generate alerts for every term when history window is small', async () => { + const rule: NewTermsCreateSchema = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + new_terms_fields: ['host.name'], + from: '2019-02-19T20:42:00.000Z', + // Set the history_window_start equal to 'from' so we should alert on all terms in the time range + history_window_start: '2019-02-19T20:42:00.000Z', + }; + + const createdRule = await createRule(supertest, log, rule); + + await waitForRuleSuccessOrStatus( + supertest, + log, + createdRule.id, + RuleExecutionStatus.succeeded + ); + + const signalsOpen = await getOpenSignals(supertest, log, es, createdRule); + expect(signalsOpen.hits.hits.length).eql(5); + const hostNames = signalsOpen.hits.hits + .map((signal) => signal._source?.['kibana.alert.new_terms']) + .sort(); + expect(hostNames[0]).eql(['suricata-sensor-amsterdam']); + expect(hostNames[1]).eql(['suricata-sensor-san-francisco']); + expect(hostNames[2]).eql(['zeek-newyork-sha-aa8df15']); + expect(hostNames[3]).eql(['zeek-sensor-amsterdam']); + expect(hostNames[4]).eql(['zeek-sensor-san-francisco']); + }); + + describe('timestamp override and fallback', () => { + before(async () => { + await esArchiver.load( + 'x-pack/test/functional/es_archives/security_solution/timestamp_fallback' + ); + await esArchiver.load( + 'x-pack/test/functional/es_archives/security_solution/timestamp_override_3' + ); + }); + after(async () => { + await esArchiver.unload( + 'x-pack/test/functional/es_archives/security_solution/timestamp_fallback' + ); + await esArchiver.unload( + 'x-pack/test/functional/es_archives/security_solution/timestamp_override_3' + ); + }); + + it('should generate the correct alerts', async () => { + const rule: NewTermsCreateSchema = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + // myfakeindex-3 does not have event.ingested mapped so we can test if the runtime field + // 'kibana.combined_timestamp' handles unmapped fields properly + index: ['timestamp-fallback-test', 'myfakeindex-3'], + new_terms_fields: ['host.name'], + from: '2020-12-16T16:00:00.000Z', + // Set the history_window_start equal to 'from' so we should alert on all terms in the time range + history_window_start: '2020-12-16T16:00:00.000Z', + timestamp_override: 'event.ingested', + }; + + const createdRule = await createRule(supertest, log, rule); + + await waitForSignalsToBePresent(supertest, log, 2, [createdRule.id]); + + const signalsOpen = await getSignalsByIds(supertest, log, [createdRule.id]); + expect(signalsOpen.hits.hits.length).eql(2); + const hostNames = signalsOpen.hits.hits + .map((signal) => signal._source?.['kibana.alert.new_terms']) + .sort(); + expect(hostNames[0]).eql(['host-3']); + expect(hostNames[1]).eql(['host-4']); + }); + }); + + it('should apply exceptions', async () => { + const rule: NewTermsCreateSchema = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + new_terms_fields: ['host.name'], + from: '2019-02-19T20:42:00.000Z', + // Set the history_window_start equal to 'from' so we should alert on all terms in the time range + history_window_start: '2019-02-19T20:42:00.000Z', + }; + const createdRule = await createRuleWithExceptionEntries(supertest, log, rule, [ + [ + { + field: 'host.name', + operator: 'included', + type: 'match', + value: 'zeek-sensor-san-francisco', + }, + ], + ]); + + await waitForRuleSuccessOrStatus( + supertest, + log, + createdRule.id, + RuleExecutionStatus.succeeded + ); + + const signalsOpen = await getOpenSignals(supertest, log, es, createdRule); + expect(signalsOpen.hits.hits.length).eql(4); + const hostNames = signalsOpen.hits.hits + .map((signal) => signal._source?.['kibana.alert.new_terms']) + .sort(); + expect(hostNames[0]).eql(['suricata-sensor-amsterdam']); + expect(hostNames[1]).eql(['suricata-sensor-san-francisco']); + expect(hostNames[2]).eql(['zeek-newyork-sha-aa8df15']); + expect(hostNames[3]).eql(['zeek-sensor-amsterdam']); + }); + + it('should work for max signals > 100', async () => { + const maxSignals = 200; + const rule: NewTermsCreateSchema = { + ...getCreateNewTermsRulesSchemaMock('rule-1', true), + new_terms_fields: ['process.pid'], + from: '2018-02-19T20:42:00.000Z', + // Set the history_window_start equal to 'from' so we should alert on all terms in the time range + history_window_start: '2018-02-19T20:42:00.000Z', + max_signals: maxSignals, + }; + + const createdRule = await createRule(supertest, log, rule); + + await waitForRuleSuccessOrStatus( + supertest, + log, + createdRule.id, + RuleExecutionStatus.succeeded + ); + + const signalsOpen = await getOpenSignals( + supertest, + log, + es, + createdRule, + RuleExecutionStatus.succeeded, + maxSignals + ); + expect(signalsOpen.hits.hits.length).eql(maxSignals); + const processPids = signalsOpen.hits.hits + .map((signal) => signal._source?.['kibana.alert.new_terms']) + .sort(); + expect(processPids[0]).eql([1]); + }); + }); +}; diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts index cb61f90aec33c..37a60223498b4 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/group1/index.ts @@ -24,6 +24,7 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./preview_rules')); loadTestFile(require.resolve('./create_rules_bulk')); loadTestFile(require.resolve('./create_ml')); + loadTestFile(require.resolve('./create_new_terms')); loadTestFile(require.resolve('./create_threat_matching')); loadTestFile(require.resolve('./delete_rules')); loadTestFile(require.resolve('./delete_rules_bulk')); diff --git a/x-pack/test/detection_engine_api_integration/utils/get_open_signals.ts b/x-pack/test/detection_engine_api_integration/utils/get_open_signals.ts index 9f0504fcd4f02..6ce1a61c6bda7 100644 --- a/x-pack/test/detection_engine_api_integration/utils/get_open_signals.ts +++ b/x-pack/test/detection_engine_api_integration/utils/get_open_signals.ts @@ -20,12 +20,13 @@ export const getOpenSignals = async ( log: ToolingLog, es: Client, rule: FullResponseSchema, - status: RuleExecutionStatus = RuleExecutionStatus.succeeded + status: RuleExecutionStatus = RuleExecutionStatus.succeeded, + size?: number ) => { await waitForRuleSuccessOrStatus(supertest, log, rule.id, status); // Critically important that we wait for rule success AND refresh the write index in that order before we // assert that no signals were created. Otherwise, signals could be written but not available to query yet // when we search, causing tests that check that signals are NOT created to pass when they should fail. await refreshIndex(es, '.alerts-security.alerts-default*'); - return getSignalsByIds(supertest, log, [rule.id]); + return getSignalsByIds(supertest, log, [rule.id], size); }; diff --git a/x-pack/test/detection_engine_api_integration/utils/remove_server_generated_properties.ts b/x-pack/test/detection_engine_api_integration/utils/remove_server_generated_properties.ts index 5404c09c34aac..5f863c0e62b9b 100644 --- a/x-pack/test/detection_engine_api_integration/utils/remove_server_generated_properties.ts +++ b/x-pack/test/detection_engine_api_integration/utils/remove_server_generated_properties.ts @@ -20,7 +20,6 @@ export const removeServerGeneratedProperties = ( created_at, updated_at, execution_summary, - /* eslint-enable @typescript-eslint/naming-convention */ ...removedProperties } = rule; return removedProperties; diff --git a/x-pack/test/functional/es_archives/security_solution/timestamp_fallback/data.json b/x-pack/test/functional/es_archives/security_solution/timestamp_fallback/data.json new file mode 100644 index 0000000000000..fb2bc02bd0173 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/timestamp_fallback/data.json @@ -0,0 +1,65 @@ +{ + "type": "doc", + "value": { + "index": "timestamp-fallback-test", + "source": { + "message": "hello world", + "@timestamp": "2020-12-16T15:15:18.570Z", + "host": { + "name": "host-1" + } + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": "timestamp-fallback-test", + "source": { + "message": "hello world", + "@timestamp": "2020-12-16T15:15:18.570Z", + "event": { + "ingested": "2020-12-16T15:16:18.570Z" + }, + "host": { + "name": "host-2" + } + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": "timestamp-fallback-test", + "source": { + "message": "hello world", + "@timestamp": "2020-12-16T16:15:18.570Z", + "host": { + "name": "host-3" + } + }, + "type": "_doc" + } +} + +{ + "type": "doc", + "value": { + "index": "timestamp-fallback-test", + "source": { + "message": "hello world", + "@timestamp": "2020-12-16T16:15:18.570Z", + "event": { + "ingested": "2020-12-16T16:16:18.570Z" + }, + "host": { + "name": "host-4" + } + }, + "type": "_doc" + } +} diff --git a/x-pack/test/functional/es_archives/security_solution/timestamp_fallback/mappings.json b/x-pack/test/functional/es_archives/security_solution/timestamp_fallback/mappings.json new file mode 100644 index 0000000000000..e5bf43258d355 --- /dev/null +++ b/x-pack/test/functional/es_archives/security_solution/timestamp_fallback/mappings.json @@ -0,0 +1,37 @@ +{ + "type": "index", + "value": { + "index": "timestamp-fallback-test", + "mappings": { + "dynamic": "strict", + "properties": { + "@timestamp": { + "type": "date" + }, + "message": { + "type": "text", + "fields": { + "keyword": { + "type": "keyword", + "ignore_above": 256 + } + } + }, + "event": { + "properties": { + "ingested": { + "type": "date" + } + } + }, + "host": { + "properties": { + "name": { + "type": "keyword" + } + } + } + } + } + } +} From b8f41a0eea5f5ec897d16dd5fa8b2a9b1031319d Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Fri, 22 Jul 2022 12:15:07 -0500 Subject: [PATCH 20/78] Bump cssnano to ^5 (#136864) * Bump cssnano to ^5 * include in css configuration * fix * cleanup --- package.json | 3 +- packages/kbn-optimizer/postcss.config.js | 11 +- .../basic_optimization.test.ts.snap | 70 +- .../src/worker/webpack.config.ts | 9 + .../generate_packages_optimized_assets.ts | 8 +- yarn.lock | 717 ++++++------------ 6 files changed, 298 insertions(+), 520 deletions(-) diff --git a/package.json b/package.json index e3ffa2b78d269..1cb365536a16b 100644 --- a/package.json +++ b/package.json @@ -1027,7 +1027,8 @@ "copy-webpack-plugin": "^6.0.2", "cpy": "^8.1.1", "css-loader": "^3.4.2", - "cssnano": "^4.1.11", + "cssnano": "^5.1.12", + "cssnano-preset-default": "^5.2.12", "csstype": "^3.0.2", "cypress": "^9.6.1", "cypress-axe": "^0.14.0", diff --git a/packages/kbn-optimizer/postcss.config.js b/packages/kbn-optimizer/postcss.config.js index 32b49a1017559..9097a77cd7a87 100644 --- a/packages/kbn-optimizer/postcss.config.js +++ b/packages/kbn-optimizer/postcss.config.js @@ -6,6 +6,15 @@ * Side Public License, v 1. */ +const autoprefixer = require('autoprefixer'); +const cssnano = require('cssnano'); +const preset = require('cssnano-preset-default'); + module.exports = { - plugins: [require('autoprefixer')()], + plugins: [ + autoprefixer(), + cssnano({ + preset: preset({ discardComments: false }), + }), + ], }; diff --git a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap index 52a183bc04b45..49d77b7882f4a 100644 --- a/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap +++ b/packages/kbn-optimizer/src/integration_tests/__snapshots__/basic_optimization.test.ts.snap @@ -234,7 +234,7 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` }; })(), i = []; - function c(e) { + function a(e) { for (var n = -1, t = 0; t < i.length; t++) if (i[t].identifier === e) { n = t; @@ -242,15 +242,15 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` } return n; } - function a(e, n) { + function c(e, n) { for (var t = {}, r = [], o = 0; o < e.length; o++) { - var a = e[o], - u = n.base ? a[0] + n.base : a[0], + var c = e[o], + u = n.base ? c[0] + n.base : c[0], s = t[u] || 0, f = \\"\\".concat(u, \\" \\").concat(s); t[u] = s + 1; - var l = c(f), - d = { css: a[1], media: a[2], sourceMap: a[3] }; + var l = a(f), + d = { css: c[1], media: c[2], sourceMap: c[3] }; -1 !== l ? (i[l].references++, i[l].updater(d)) : i.push({ identifier: f, updater: v(d, n), references: 1 }), @@ -273,12 +273,12 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` ) e.insert(n); else { - var c = o(e.insert || \\"head\\"); - if (!c) + var a = o(e.insert || \\"head\\"); + if (!a) throw new Error( \\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\\" ); - c.appendChild(n); + a.appendChild(n); } return n; } @@ -297,9 +297,9 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` if (e.styleSheet) e.styleSheet.cssText = f(n, o); else { var i = document.createTextNode(o), - c = e.childNodes; - c[n] && e.removeChild(c[n]), - c.length ? e.insertBefore(i, c[n]) : e.appendChild(i); + a = e.childNodes; + a[n] && e.removeChild(a[n]), + a.length ? e.insertBefore(i, a[n]) : e.appendChild(i); } } function d(e, n, t) { @@ -362,18 +362,18 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` (void 0 === r && (r = Boolean(window && document && document.all && !window.atob)), r)); - var t = a((e = e || []), n); + var t = c((e = e || []), n); return function (e) { if ( ((e = e || []), \\"[object Array]\\" === Object.prototype.toString.call(e)) ) { for (var r = 0; r < t.length; r++) { - var o = c(t[r]); + var o = a(t[r]); i[o].references--; } - for (var u = a(e, n), s = 0; s < t.length; s++) { - var f = c(t[s]); + for (var u = c(e, n), s = 0; s < t.length; s++) { + var f = a(t[s]); 0 === i[f].references && (i[f].updater(), i.splice(f, 1)); } t = u; @@ -393,23 +393,23 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` r, o, i = e[1] || \\"\\", - c = e[3]; - if (!c) return i; + a = e[3]; + if (!a) return i; if (n && \\"function\\" == typeof btoa) { - var a = - ((t = c), + var c = + ((t = a), (r = btoa(unescape(encodeURIComponent(JSON.stringify(t))))), (o = \\"sourceMappingURL=data:application/json;charset=utf-8;base64,\\".concat( r )), \\"/*# \\".concat(o, \\" */\\")), - u = c.sources.map(function (e) { + u = a.sources.map(function (e) { return \\"/*# sourceURL=\\" - .concat(c.sourceRoot || \\"\\") + .concat(a.sourceRoot || \\"\\") .concat(e, \\" */\\"); }); - return [i].concat(u).concat([a]).join(\\"\\\\n\\"); + return [i].concat(u).concat([c]).join(\\"\\\\n\\"); } return [i].join(\\"\\\\n\\"); })(n, e); @@ -421,11 +421,11 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` var o = {}; if (r) for (var i = 0; i < this.length; i++) { - var c = this[i][0]; - null != c && (o[c] = !0); + var a = this[i][0]; + null != a && (o[a] = !0); } - for (var a = 0; a < e.length; a++) { - var u = [].concat(e[a]); + for (var c = 0; c < e.length; c++) { + var u = [].concat(e[c]); (r && o[u[0]]) || (t && (u[2] @@ -465,11 +465,7 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` r(o, { insert: \\"head\\", singleton: !1 }), (e.exports = o.locals || {}); }, function (e, n, t) { - (n = t(1)(!1)).push([ - e.i, - \\"p{background-color:rebeccapurple}body{width:12}\\\\n\\", - \\"\\", - ]), + (n = t(1)(!1)).push([e.i, \\"p{background-color:#639}body{width:12}\\", \\"\\"]), (e.exports = n); }, function (e, n, t) { @@ -480,11 +476,7 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` r(o, { insert: \\"head\\", singleton: !1 }), (e.exports = o.locals || {}); }, function (e, n, t) { - (n = t(1)(!1)).push([ - e.i, - \\"p{background-color:rebeccapurple}body{width:13}\\\\n\\", - \\"\\", - ]), + (n = t(1)(!1)).push([e.i, \\"p{background-color:#639}body{width:13}\\", \\"\\"]), (e.exports = n); }, function (e, n, t) { @@ -503,7 +495,7 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` r(o, { insert: \\"head\\", singleton: !1 }), (e.exports = o.locals || {}); }, function (e, n, t) { - (n = t(1)(!1)).push([e.i, \\"body{color:green}\\\\n\\", \\"\\"]), (e.exports = n); + (n = t(1)(!1)).push([e.i, \\"body{color:green}\\", \\"\\"]), (e.exports = n); }, function (e, n, t) { var r = t(0), @@ -513,7 +505,7 @@ exports[`prepares assets for distribution: bar bundle 1`] = ` r(o, { insert: \\"head\\", singleton: !1 }), (e.exports = o.locals || {}); }, function (e, n, t) { - (n = t(1)(!1)).push([e.i, \\"body{color:green}\\\\n\\", \\"\\"]), (e.exports = n); + (n = t(1)(!1)).push([e.i, \\"body{color:green}\\", \\"\\"]), (e.exports = n); }, function (e, n, t) { \\"use strict\\"; diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 13e342356a2bc..ccc99a8a42671 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -144,6 +144,15 @@ export function getWebpackConfig(bundle: Bundle, bundleRefs: BundleRefs, worker: sourceMap: !worker.dist, }, }, + { + loader: 'postcss-loader', + options: { + sourceMap: !worker.dist, + postcssOptions: { + config: require.resolve('@kbn/optimizer/postcss.config.js'), + }, + }, + }, ], }, { diff --git a/src/dev/build/tasks/generate_packages_optimized_assets.ts b/src/dev/build/tasks/generate_packages_optimized_assets.ts index 8469a769d8c0b..d1a8ec6d20824 100644 --- a/src/dev/build/tasks/generate_packages_optimized_assets.ts +++ b/src/dev/build/tasks/generate_packages_optimized_assets.ts @@ -44,12 +44,8 @@ async function optimizeAssets(log: ToolingLog, assetDir: string) { log.debug('Minify CSS'); await asyncPipeline( vfs.src(['**/*.css'], { cwd: assetDir }), - gulpPostCSS([ - // eslint-disable-next-line @typescript-eslint/no-var-requires - require('cssnano')({ - preset: ['default', { discardComments: false }], - }), - ]), + // eslint-disable-next-line @typescript-eslint/no-var-requires + gulpPostCSS(require('@kbn/optimizer/postcss.config.js').plugins), vfs.dest(assetDir) ); diff --git a/yarn.lock b/yarn.lock index 35f15e8b6b3bb..e8b2319a61e47 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5754,6 +5754,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "@ts-morph/common@~0.12.2": version "0.12.2" resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.12.2.tgz#61d07a47d622d231e833c44471ab306faaa41aed" @@ -7780,11 +7785,6 @@ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== -"@types/q@^1.5.1": - version "1.5.4" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" - integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== - "@types/qs@*", "@types/qs@^6.9.5": version "6.9.7" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" @@ -8941,11 +8941,6 @@ ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" -alphanum-sort@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3" - integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM= - am-i-a-dependency@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/am-i-a-dependency/-/am-i-a-dependency-1.1.2.tgz#f9d3422304d6f642f821e4c407565035f6167f1f" @@ -10484,7 +10479,7 @@ browserify@^17.0.0: vm-browserify "^1.0.0" xtend "^4.0.0" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.20.2, browserslist@^4.20.3: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.20.2, browserslist@^4.20.3: version "4.21.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe" integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== @@ -11261,15 +11256,6 @@ co@^4.6.0: resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= -coa@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" - integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== - dependencies: - "@types/q" "^1.5.1" - chalk "^2.4.1" - q "^1.1.2" - code-block-writer@^11.0.0: version "11.0.0" resolved "https://registry.yarnpkg.com/code-block-writer/-/code-block-writer-11.0.0.tgz#5956fb186617f6740e2c3257757fea79315dd7d4" @@ -11322,7 +11308,7 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" -color-convert@^1.9.0, color-convert@^1.9.1, color-convert@^1.9.3: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -11346,7 +11332,7 @@ color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.2, color-string@^1.6.0, color-string@^1.9.0: +color-string@^1.5.2, color-string@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.0.tgz#63b6ebd1bec11999d1df3a79a7569451ac2be8aa" integrity sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ== @@ -11367,14 +11353,6 @@ color@3.0.x: color-convert "^1.9.1" color-string "^1.5.2" -color@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - color@^4.2.1, color@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" @@ -11383,7 +11361,7 @@ color@^4.2.1, color@^4.2.3: color-convert "^2.0.1" color-string "^1.9.0" -colord@^2.9.2: +colord@^2.9.1, colord@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== @@ -11781,7 +11759,7 @@ cors@^2.8.4: object-assign "^4" vary "^1" -cosmiconfig@^5.0.0, cosmiconfig@^5.2.1: +cosmiconfig@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" integrity sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA== @@ -11987,18 +11965,10 @@ css-color-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05" integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU= -css-color-names@0.0.4, css-color-names@^0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" - integrity sha1-gIrcLnnPhHOAabZGyyDsJ762KeA= - -css-declaration-sorter@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz#c198940f63a76d7e36c1e71018b001721054cb22" - integrity sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA== - dependencies: - postcss "^7.0.1" - timsort "^0.3.0" +css-declaration-sorter@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz#72ebd995c8f4532ff0036631f7365cce9759df14" + integrity sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og== css-functions-list@^3.1.0: version "3.1.0" @@ -12032,11 +12002,6 @@ css-loader@^3.4.2, css-loader@^3.6.0: schema-utils "^2.7.0" semver "^6.3.0" -css-select-base-adapter@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz#3b2ff4972cc362ab88561507a95408a1432135d7" - integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== - css-select@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" @@ -12047,16 +12012,6 @@ css-select@^1.1.0: domutils "1.5.1" nth-check "~1.0.1" -css-select@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz#6a34653356635934a81baca68d0255432105dbef" - integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== - dependencies: - boolbase "^1.0.0" - css-what "^3.2.1" - domutils "^1.7.0" - nth-check "^1.0.2" - css-select@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067" @@ -12077,14 +12032,6 @@ css-to-react-native@^3.0.0: css-color-keywords "^1.0.0" postcss-value-parser "^4.0.2" -css-tree@1.0.0-alpha.37: - version "1.0.0-alpha.37" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz#98bebd62c4c1d9f960ec340cf9f7522e30709a22" - integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== - dependencies: - mdn-data "2.0.4" - source-map "^0.6.1" - css-tree@^1.0.0-alpha.28, css-tree@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" @@ -12093,16 +12040,19 @@ css-tree@^1.0.0-alpha.28, css-tree@^1.1.2: mdn-data "2.0.14" source-map "^0.6.1" +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg== -css-what@^3.2.1: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-3.4.2.tgz#ea7026fcb01777edbde52124e21f327e7ae950e4" - integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== - css-what@^5.0.0, css-what@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" @@ -12147,75 +12097,56 @@ cssfontparser@^1.2.1: resolved "https://registry.yarnpkg.com/cssfontparser/-/cssfontparser-1.2.1.tgz#f4022fc8f9700c68029d542084afbaf425a3f3e3" integrity sha1-9AIvyPlwDGgCnVQghK+69CWj8+M= -cssnano-preset-default@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" - integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== - dependencies: - css-declaration-sorter "^4.0.1" - cssnano-util-raw-cache "^4.0.1" - postcss "^7.0.0" - postcss-calc "^7.0.1" - postcss-colormin "^4.0.3" - postcss-convert-values "^4.0.1" - postcss-discard-comments "^4.0.2" - postcss-discard-duplicates "^4.0.2" - postcss-discard-empty "^4.0.1" - postcss-discard-overridden "^4.0.1" - postcss-merge-longhand "^4.0.11" - postcss-merge-rules "^4.0.3" - postcss-minify-font-values "^4.0.2" - postcss-minify-gradients "^4.0.2" - postcss-minify-params "^4.0.2" - postcss-minify-selectors "^4.0.2" - postcss-normalize-charset "^4.0.1" - postcss-normalize-display-values "^4.0.2" - postcss-normalize-positions "^4.0.2" - postcss-normalize-repeat-style "^4.0.2" - postcss-normalize-string "^4.0.2" - postcss-normalize-timing-functions "^4.0.2" - postcss-normalize-unicode "^4.0.1" - postcss-normalize-url "^4.0.1" - postcss-normalize-whitespace "^4.0.2" - postcss-ordered-values "^4.1.2" - postcss-reduce-initial "^4.0.3" - postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.3" - postcss-unique-selectors "^4.0.1" - -cssnano-util-get-arguments@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f" - integrity sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8= - -cssnano-util-get-match@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d" - integrity sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0= - -cssnano-util-raw-cache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz#b26d5fd5f72a11dfe7a7846fb4c67260f96bf282" - integrity sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA== - dependencies: - postcss "^7.0.0" - -cssnano-util-same-parent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz#574082fb2859d2db433855835d9a8456ea18bbf3" - integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== +cssnano-preset-default@^5.2.12: + version "5.2.12" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz#ebe6596ec7030e62c3eb2b3c09f533c0644a9a97" + integrity sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew== + dependencies: + css-declaration-sorter "^6.3.0" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.0" + postcss-convert-values "^5.1.2" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.6" + postcss-merge-rules "^5.1.2" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.3" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.0" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.0" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== -cssnano@^4.1.11: - version "4.1.11" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" - integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== +cssnano@^5.1.12: + version "5.1.12" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.12.tgz#bcd0b64d6be8692de79332c501daa7ece969816c" + integrity sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ== dependencies: - cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.8" - is-resolvable "^1.0.0" - postcss "^7.0.0" + cssnano-preset-default "^5.2.12" + lilconfig "^2.0.3" + yaml "^1.10.2" -csso@^4.0.2: +csso@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== @@ -13488,14 +13419,6 @@ domutils@1.5.1: dom-serializer "0" domelementtype "1" -domutils@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - domutils@^2.0.0, domutils@^2.5.2, domutils@^2.6.0, domutils@^2.7.0, domutils@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" @@ -16677,11 +16600,6 @@ heap@^0.2.6: resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.6.tgz#087e1f10b046932fc8594dd9e6d378afc9d1e5ac" integrity sha1-CH4fELBGky/IWU3Z5tN4r8nR5aw= -hex-color-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" - integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== - highlight.js@^10.1.1, highlight.js@^10.4.1, highlight.js@~10.4.0: version "10.4.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.4.1.tgz#d48fbcf4a9971c4361b3f95f302747afe19dbad0" @@ -16768,16 +16686,6 @@ hpagent@^1.0.0: resolved "https://registry.yarnpkg.com/hpagent/-/hpagent-1.0.0.tgz#c68f68b3df845687dbdc4896546713ce09cc6bee" integrity sha512-SCleE2Uc1bM752ymxg8QXYGW0TWtAV4ZW3TqH1aOnyi6T6YW2xadCcclm5qeVjvMvfQ2RKNtZxO7uVb9CTPt1A== -hsl-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e" - integrity sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4= - -hsla-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" - integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= - html-element-map@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.2.0.tgz#dfbb09efe882806af63d990cf6db37993f099f22" @@ -17212,11 +17120,6 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -indexes-of@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" - integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= - infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" @@ -17451,11 +17354,6 @@ irregular-plurals@^3.2.0: resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-3.2.0.tgz#b19c490a0723798db51b235d7e39add44dab0822" integrity sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q== -is-absolute-url@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6" - integrity sha1-UFMN+4T8yap9vnhS6Do3uTufKqY= - is-absolute-url@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -17564,18 +17462,6 @@ is-ci@^3.0.0: dependencies: ci-info "^3.1.1" -is-color-stop@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345" - integrity sha1-z/9HGu5N1cnhWFmPvhKWe1za00U= - dependencies: - css-color-names "^0.0.4" - hex-color-regex "^1.1.0" - hsl-regex "^1.0.0" - hsla-regex "^1.0.0" - rgb-regex "^1.0.1" - rgba-regex "^1.0.0" - is-core-module@^2.2.0, is-core-module@^2.6.0, is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" @@ -17925,11 +17811,6 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" -is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== - is-set@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" @@ -19535,7 +19416,7 @@ liftoff@^3.1.0: rechoir "^0.6.2" resolve "^1.1.7" -lilconfig@^2.0.4: +lilconfig@^2.0.3, lilconfig@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== @@ -20334,11 +20215,6 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== -mdn-data@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b" - integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== - mdurl@^1.0.0, mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -21362,11 +21238,6 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@^3.0.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559" - integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg== - normalize-url@^4.1.0: version "4.5.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" @@ -21433,13 +21304,6 @@ npmlog@^6.0.0: gauge "^4.0.0" set-blocking "^2.0.0" -nth-check@^1.0.2, nth-check@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" - integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== - dependencies: - boolbase "~1.0.0" - nth-check@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" @@ -21447,6 +21311,13 @@ nth-check@^2.0.0: dependencies: boolbase "^1.0.0" +nth-check@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + null-loader@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/null-loader/-/null-loader-3.0.0.tgz#3e2b6c663c5bda8c73a54357d8fa0708dc61b245" @@ -22726,61 +22597,51 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= -postcss-calc@^7.0.1: - version "7.0.5" - resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e" - integrity sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg== +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== dependencies: - postcss "^7.0.27" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.0.2" + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" -postcss-colormin@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz#ae060bce93ed794ac71264f08132d550956bd381" - integrity sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw== +postcss-colormin@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a" + integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg== dependencies: - browserslist "^4.0.0" - color "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.6" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" -postcss-convert-values@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz#ca3813ed4da0f812f9d43703584e449ebe189a7f" - integrity sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ== +postcss-convert-values@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab" + integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.20.3" + postcss-value-parser "^4.2.0" -postcss-discard-comments@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz#1fbabd2c246bff6aaad7997b2b0918f4d7af4033" - integrity sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg== - dependencies: - postcss "^7.0.0" +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== -postcss-discard-duplicates@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz#3fe133cd3c82282e550fc9b239176a9207b784eb" - integrity sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ== - dependencies: - postcss "^7.0.0" +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== -postcss-discard-empty@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz#c8c951e9f73ed9428019458444a02ad90bb9f765" - integrity sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w== - dependencies: - postcss "^7.0.0" +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== -postcss-discard-overridden@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz#652aef8a96726f029f5e3e00146ee7a4e755ff57" - integrity sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg== - dependencies: - postcss "^7.0.0" +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== postcss-flexbugs-fixes@^4.2.1: version "4.2.1" @@ -22813,67 +22674,55 @@ postcss-media-query-parser@^0.2.3: resolved "https://registry.yarnpkg.com/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= -postcss-merge-longhand@^4.0.11: - version "4.0.11" - resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz#62f49a13e4a0ee04e7b98f42bb16062ca2549e24" - integrity sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw== +postcss-merge-longhand@^5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz#f378a8a7e55766b7b644f48e5d8c789ed7ed51ce" + integrity sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw== dependencies: - css-color-names "0.0.4" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - stylehacks "^4.0.0" + postcss-value-parser "^4.2.0" + stylehacks "^5.1.0" -postcss-merge-rules@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz#362bea4ff5a1f98e4075a713c6cb25aefef9a650" - integrity sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ== +postcss-merge-rules@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5" + integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ== dependencies: - browserslist "^4.0.0" + browserslist "^4.16.6" caniuse-api "^3.0.0" - cssnano-util-same-parent "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" - vendors "^1.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" -postcss-minify-font-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz#cd4c344cce474343fac5d82206ab2cbcb8afd5a6" - integrity sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg== +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-minify-gradients@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz#93b29c2ff5099c535eecda56c4aa6e665a663471" - integrity sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q== +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== dependencies: - cssnano-util-get-arguments "^4.0.0" - is-color-stop "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-params@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz#6b9cef030c11e35261f95f618c90036d680db874" - integrity sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg== +postcss-minify-params@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9" + integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg== dependencies: - alphanum-sort "^1.0.0" - browserslist "^4.0.0" - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - uniqs "^2.0.0" + browserslist "^4.16.6" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" -postcss-minify-selectors@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz#e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8" - integrity sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g== +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== dependencies: - alphanum-sort "^1.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + postcss-selector-parser "^6.0.5" postcss-modules-extract-imports@^2.0.0: version "2.0.0" @@ -22908,120 +22757,96 @@ postcss-modules-values@^3.0.0: icss-utils "^4.0.0" postcss "^7.0.6" -postcss-normalize-charset@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz#8b35add3aee83a136b0471e0d59be58a50285dd4" - integrity sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g== - dependencies: - postcss "^7.0.0" +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== -postcss-normalize-display-values@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz#0dbe04a4ce9063d4667ed2be476bb830c825935a" - integrity sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ== +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-positions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz#05f757f84f260437378368a91f8932d4b102917f" - integrity sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA== +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== dependencies: - cssnano-util-get-arguments "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-repeat-style@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz#c4ebbc289f3991a028d44751cbdd11918b17910c" - integrity sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q== +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== dependencies: - cssnano-util-get-arguments "^4.0.0" - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-string@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz#cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c" - integrity sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA== +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== dependencies: - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-timing-functions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz#8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9" - integrity sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A== +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== dependencies: - cssnano-util-get-match "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-normalize-unicode@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz#841bd48fdcf3019ad4baa7493a3d363b52ae1cfb" - integrity sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg== +postcss-normalize-unicode@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75" + integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + browserslist "^4.16.6" + postcss-value-parser "^4.2.0" -postcss-normalize-url@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz#10e437f86bc7c7e58f7b9652ed878daaa95faae1" - integrity sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA== +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== dependencies: - is-absolute-url "^2.0.0" - normalize-url "^3.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" -postcss-normalize-whitespace@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz#bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82" - integrity sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA== +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" -postcss-ordered-values@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz#0cf75c820ec7d5c4d280189559e0b571ebac0eee" - integrity sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw== +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== dependencies: - cssnano-util-get-arguments "^4.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" postcss-prefix-selector@^1.16.0: version "1.16.0" resolved "https://registry.yarnpkg.com/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz#ad5b56f9a73a2c090ca7161049632c9d89bcb404" integrity sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q== -postcss-reduce-initial@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz#7fd42ebea5e9c814609639e2c2e84ae270ba48df" - integrity sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA== +postcss-reduce-initial@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6" + integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw== dependencies: - browserslist "^4.0.0" + browserslist "^4.16.6" caniuse-api "^3.0.0" - has "^1.0.0" - postcss "^7.0.0" -postcss-reduce-transforms@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz#17efa405eacc6e07be3414a5ca2d1074681d4e29" - integrity sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg== +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== dependencies: - cssnano-util-get-match "^4.0.0" - has "^1.0.0" - postcss "^7.0.0" - postcss-value-parser "^3.0.0" + postcss-value-parser "^4.2.0" postcss-resolve-nested-selector@^0.1.1: version "0.1.1" @@ -23038,16 +22863,7 @@ postcss-scss@^4.0.4: resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-4.0.4.tgz#aa8f60e19ee18259bc193db9e4b96edfce3f3b1f" integrity sha512-aBBbVyzA8b3hUL0MGrpydxxXKXFZc5Eqva0Q3V9qsBOLEMsjb6w49WfpsoWzpEgcqJGW4t7Rio8WXVU9Gd8vWg== -postcss-selector-parser@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz#b310f5c4c0fdaf76f94902bbaa30db6aa84f5270" - integrity sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA== - dependencies: - dot-prop "^5.2.0" - indexes-of "^1.0.1" - uniq "^1.0.1" - -postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.6: +postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.6, postcss-selector-parser@^6.0.9: version "6.0.10" resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz#79b61e2c0d1bfc2602d549e11d0876256f8df88d" integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== @@ -23055,35 +22871,27 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.10, postcss-selecto cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-svgo@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" - integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== dependencies: - postcss "^7.0.0" - postcss-value-parser "^3.0.0" - svgo "^1.0.0" + postcss-value-parser "^4.2.0" + svgo "^2.7.0" -postcss-unique-selectors@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" - integrity sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg== +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== dependencies: - alphanum-sort "^1.0.0" - postcss "^7.0.0" - uniqs "^2.0.0" - -postcss-value-parser@^3.0.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + postcss-selector-parser "^6.0.5" postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.32, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -23576,7 +23384,7 @@ puppeteer@^5.3.1: unbzip2-stream "^1.3.3" ws "^7.2.3" -q@^1.1.2, q@^1.5.1: +q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= @@ -25350,16 +25158,6 @@ rfdc@^1.2.0: resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== -rgb-regex@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1" - integrity sha1-wODWiC3w4jviVKR16O3UGRX+rrE= - -rgba-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" - integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= - rgbcolor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/rgbcolor/-/rgbcolor-1.0.1.tgz#d6505ecdb304a6595da26fa4b43307306775945d" @@ -25583,7 +25381,7 @@ save-pixels@^2.3.2: pngjs-nozlib "^1.0.0" through "^2.3.4" -sax@>=0.6.0, sax@^1.2.1, sax@~1.2.4: +sax@>=0.6.0, sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -26967,14 +26765,13 @@ styled-components@^5.1.0: shallowequal "^1.1.0" supports-color "^5.5.0" -stylehacks@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" - integrity sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g== +stylehacks@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520" + integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q== dependencies: - browserslist "^4.0.0" - postcss "^7.0.0" - postcss-selector-parser "^3.0.0" + browserslist "^4.16.6" + postcss-selector-parser "^6.0.4" stylelint-scss@^4.3.0: version "4.3.0" @@ -27174,24 +26971,18 @@ svg-tags@^1.0.0: resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= -svgo@^1.0.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz#b6dc511c063346c9e415b81e43401145b96d4167" - integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== dependencies: - chalk "^2.4.1" - coa "^2.0.2" - css-select "^2.0.0" - css-select-base-adapter "^0.1.1" - css-tree "1.0.0-alpha.37" - csso "^4.0.2" - js-yaml "^3.13.1" - mkdirp "~0.5.1" - object.values "^1.1.0" - sax "~1.2.4" + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" stable "^0.1.8" - unquote "~1.1.1" - util.promisify "~1.0.0" symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: version "1.2.0" @@ -27543,11 +27334,6 @@ timm@^1.6.1: resolved "https://registry.yarnpkg.com/timm/-/timm-1.6.1.tgz#5f8aafc932248c76caf2c6af60542a32d3c30701" integrity sha512-hqDTYi/bWuDxL2i6T3v6nrvkAQ/1Bc060GSkVEQZp02zTSTB4CHSKsOkliequCftQaNRcjRqUZmpGWs5FfhrNg== -timsort@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - tiny-inflate@^1.0.0, tiny-inflate@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" @@ -28257,16 +28043,11 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -uniq@^1.0.0, uniq@^1.0.1: +uniq@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= -uniqs@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02" - integrity sha1-/+3ks2slKQaW5uFl1KWe25mOawI= - unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" @@ -28444,11 +28225,6 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unquote@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" - integrity sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ= - unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -29147,11 +28923,6 @@ vega@^5.22.1: vega-voronoi "~4.2.0" vega-wordcloud "~4.1.3" -vendors@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e" - integrity sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w== - verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" From 0b8b66f73f4d2f9e6b6dcdaeb1d3be229c0f2467 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Fri, 22 Jul 2022 10:30:01 -0700 Subject: [PATCH 21/78] [Data views] Add pre-configuration options to runtime field editor fly-out (#136769) * [Data views] Add pre-configuration options to runtime field editor fly-out * fix test * more polish * update example app functional test * fix functional test * improve comment * fix unexported public apis * comments for public apis * restrict runaway metrics changes * more comments for public api * fix fn test * revert updates to api_docs * more public api comments in data_view_field_editor * fix api comments * add public api export * clean up FieldFormatConfig types * cleanup * allow checkbox to be visually checked --- .../public/app.tsx | 67 +++++++++++++------ .../client_integration/field_editor.test.tsx | 2 +- .../field_editor_flyout_content.helpers.ts | 2 +- .../field_editor_flyout_content.test.ts | 27 ++++++-- .../field_editor_flyout_preview.helpers.ts | 2 +- .../field_editor_flyout_preview.test.ts | 8 +-- .../components/field_editor/field_editor.tsx | 2 +- .../field_editor/form_fields/format_field.tsx | 10 +-- .../field_editor_flyout_content.tsx | 50 +++++++------- .../field_editor_flyout_content_container.tsx | 29 +++++--- .../field_format_editor.tsx | 11 +-- .../public/components/preview/types.ts | 9 +-- .../data_view_field_editor/public/index.ts | 1 + .../public/lib/serialization.ts | 4 +- .../public/open_editor.tsx | 62 ++++++++++------- .../data_view_field_editor/public/plugin.ts | 2 +- .../data_view_field_editor/public/types.ts | 48 ++++++++++--- .../data_view_field_editor_example.ts | 22 ++++++ 18 files changed, 243 insertions(+), 115 deletions(-) diff --git a/examples/data_view_field_editor_example/public/app.tsx b/examples/data_view_field_editor_example/public/app.tsx index 0a5b98ee41a04..846ff0b290fb4 100644 --- a/examples/data_view_field_editor_example/public/app.tsx +++ b/examples/data_view_field_editor_example/public/app.tsx @@ -6,23 +6,28 @@ * Side Public License, v 1. */ -import React, { useState } from 'react'; -import ReactDOM from 'react-dom'; import { + DefaultItemAction, + EuiButton, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiInMemoryTable, EuiPage, - EuiPageHeader, EuiPageBody, EuiPageContent, EuiPageContentBody, - EuiButton, - EuiInMemoryTable, + EuiPageHeader, EuiText, - DefaultItemAction, + useGeneratedHtmlId, } from '@elastic/eui'; import { AppMountParameters } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { DataViewField } from '@kbn/data-views-plugin/public'; +import React, { useState } from 'react'; +import ReactDOM from 'react-dom'; interface Props { dataView?: DataView; @@ -33,6 +38,8 @@ const DataViewFieldEditorExample = ({ dataView, dataViewFieldEditor }: Props) => const [fields, setFields] = useState( dataView?.fields.getAll().filter((f) => !f.scripted) || [] ); + const [preconfigured, setPreconfigured] = useState(false); + const refreshFields = () => setFields(dataView?.fields.getAll().filter((f) => !f.scripted) || []); const columns = [ { @@ -75,22 +82,42 @@ const DataViewFieldEditorExample = ({ dataView, dataViewFieldEditor }: Props) => }, ]; + const preconfigureId = useGeneratedHtmlId({ prefix: 'usePreconfigured' }); const content = dataView ? ( <> Data view: {dataView.title} -
- - dataViewFieldEditor.openEditor({ - ctx: { dataView }, - onSave: refreshFields, - }) - } - data-test-subj="addField" - > - Add field - -
+ + + + dataViewFieldEditor.openEditor({ + ctx: { dataView }, + onSave: refreshFields, + fieldToCreate: preconfigured + ? { + name: 'demotestfield', + type: 'boolean', + script: { source: 'emit(true)' }, // optional + customLabel: 'cool demo test field', // optional + format: { id: 'boolean' }, // optional + } + : undefined, + }) + } + data-test-subj="addField" + > + Add field + + + + setPreconfigured(!preconfigured)} + /> + + items={fields} columns={columns} diff --git a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor.test.tsx b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor.test.tsx index 1ba108492e7f9..521d7aff8f976 100644 --- a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor.test.tsx +++ b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor.test.tsx @@ -98,7 +98,7 @@ describe('', () => { test('should accept a defaultValue and onChange prop to forward the form state', async () => { const field = { name: 'foo', - type: 'date', + type: 'date' as const, script: { source: 'emit("hello")' }, }; diff --git a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.helpers.ts b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.helpers.ts index c3816b0bfb8c3..e54a854cbb962 100644 --- a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.helpers.ts +++ b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.helpers.ts @@ -34,7 +34,7 @@ export const setup = async (props?: Partial, deps?: Partial) => // Setup testbed await act(async () => { - testBed = await registerTestBed(WithFieldEditorDependencies(FieldEditorFlyoutContent, deps), { + testBed = registerTestBed(WithFieldEditorDependencies(FieldEditorFlyoutContent, deps), { memoryRouter: { wrapComponent: false, }, diff --git a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.test.ts b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.test.ts index a3ae323a1c3db..63eca247cca6f 100644 --- a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.test.ts +++ b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_content.test.ts @@ -36,16 +36,16 @@ describe('', () => { expect(find('flyoutTitle').text()).toBe('Create field'); }); - test('should allow a field to be provided', async () => { + test('should allow an existing field to be provided', async () => { const field = { name: 'foo', - type: 'ip', + type: 'ip' as const, script: { source: 'emit("hello world")', }, }; - const { find } = await setup({ field }); + const { find } = await setup({ fieldToEdit: field }); expect(find('flyoutTitle').text()).toBe(`Edit field 'foo'`); expect(find('nameField.input').props().value).toBe(field.name); @@ -53,15 +53,32 @@ describe('', () => { expect(find('scriptField').props().value).toBe(field.script.source); }); + test('should allow a new field to be created with initial configuration', async () => { + const fieldToCreate = { + name: 'demotestfield', + type: 'boolean' as const, + script: { source: 'emit(true)' }, + customLabel: 'cool demo test field', + format: { id: 'boolean' }, + }; + + const { find } = await setup({ fieldToCreate }); + + expect(find('flyoutTitle').text()).toBe(`Create field`); + expect(find('nameField.input').props().value).toBe(fieldToCreate.name); + expect(find('typeField').props().value).toBe(fieldToCreate.type); + expect(find('scriptField').props().value).toBe(fieldToCreate.script.source); + }); + test('should accept an "onSave" prop', async () => { const field = { name: 'foo', - type: 'date', + type: 'date' as const, script: { source: 'test=123' }, }; const onSave: jest.Mock = jest.fn(); - const { find, actions } = await setup({ onSave, field }); + const { find, actions } = await setup({ onSave, fieldToEdit: field }); await act(async () => { find('fieldSaveButton').simulate('click'); diff --git a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.helpers.ts b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.helpers.ts index 9df7de5f65d62..31d243fa699d9 100644 --- a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.helpers.ts +++ b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.helpers.ts @@ -164,7 +164,7 @@ export const setup = async (props?: Partial, deps?: Partial) => // Setup testbed await act(async () => { - testBed = await registerTestBed(WithFieldEditorDependencies(FieldEditorFlyoutContent, deps), { + testBed = registerTestBed(WithFieldEditorDependencies(FieldEditorFlyoutContent, deps), { memoryRouter: { wrapComponent: false, }, diff --git a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.test.ts b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.test.ts index 3efece9d6286f..5dd0045ab5d68 100644 --- a/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.test.ts +++ b/src/plugins/data_view_field_editor/__jest__/client_integration/field_editor_flyout_preview.test.ts @@ -216,7 +216,7 @@ describe('Field editor Preview panel', () => { test('should **not** display an empty prompt editing a document with a script', async () => { const field = { name: 'foo', - type: 'ip', + type: 'ip' as const, script: { source: 'emit("hello world")', }, @@ -225,7 +225,7 @@ describe('Field editor Preview panel', () => { // We open the editor with a field to edit the empty prompt should not be there // as we have a script and we'll load the preview. await act(async () => { - testBed = await setup({ field }); + testBed = await setup({ fieldToEdit: field }); }); const { exists, component } = testBed; @@ -237,7 +237,7 @@ describe('Field editor Preview panel', () => { test('should **not** display an empty prompt editing a document with format defined', async () => { const field = { name: 'foo', - type: 'ip', + type: 'ip' as const, format: { id: 'upper', params: {}, @@ -245,7 +245,7 @@ describe('Field editor Preview panel', () => { }; await act(async () => { - testBed = await setup({ field }); + testBed = await setup({ fieldToEdit: field }); }); const { exists, component } = testBed; diff --git a/src/plugins/data_view_field_editor/public/components/field_editor/field_editor.tsx b/src/plugins/data_view_field_editor/public/components/field_editor/field_editor.tsx index 0185e1ba1c3f9..47b871196be03 100644 --- a/src/plugins/data_view_field_editor/public/components/field_editor/field_editor.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_editor/field_editor.tsx @@ -64,7 +64,7 @@ export interface FieldFormInternal extends Omit } export interface Props { - /** Optional field to edit */ + /** Optional field to edit or preselected field to create */ field?: Field; /** Handler to receive state changes updates */ onChange?: (state: FieldEditorFormState) => void; diff --git a/src/plugins/data_view_field_editor/public/components/field_editor/form_fields/format_field.tsx b/src/plugins/data_view_field_editor/public/components/field_editor/form_fields/format_field.tsx index c584a59eda8d1..d90d7ef6cdf68 100644 --- a/src/plugins/data_view_field_editor/public/components/field_editor/form_fields/format_field.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_editor/form_fields/format_field.tsx @@ -5,14 +5,14 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import React, { useState, useEffect, useRef } from 'react'; -import { EuiCallOut, EuiSpacer } from '@elastic/eui'; -import { UseField, useFormData, ES_FIELD_TYPES, useFormContext } from '../../../shared_imports'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { SerializedFieldFormat } from '@kbn/field-formats-plugin/common'; +import React, { useEffect, useRef, useState } from 'react'; +import { ES_FIELD_TYPES, UseField, useFormContext, useFormData } from '../../../shared_imports'; import { useFieldEditorContext } from '../../field_editor_context'; import { FormatSelectEditor } from '../../field_format_editor'; import type { FieldFormInternal } from '../field_editor'; -import type { FieldFormatConfig } from '../../../types'; export const FormatField = () => { const { dataView, uiSettings, fieldFormats, fieldFormatEditors } = useFieldEditorContext(); @@ -44,7 +44,7 @@ export const FormatField = () => { }, [type, getFields]); return ( - path="format"> + path="format"> {({ setValue, errors, value }) => { return ( <> diff --git a/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content.tsx b/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content.tsx index 765fb23502972..9968838919513 100644 --- a/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content.tsx @@ -6,25 +6,24 @@ * Side Public License, v 1. */ -import React, { useState, useCallback, useEffect, useRef } from 'react'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; import { - EuiTitle, + EuiButton, + EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, - EuiButtonEmpty, - EuiButton, EuiText, + EuiTitle, } from '@elastic/eui'; - -import type { Field } from '../types'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { euiFlyoutClassname } from '../constants'; -import { FlyoutPanels } from './flyout_panels'; -import { useFieldEditorContext } from './field_editor_context'; +import type { Field } from '../types'; +import { ModifiedFieldModal, SaveFieldTypeOrNameChangedModal } from './confirm_modals'; import { FieldEditor, FieldEditorFormState } from './field_editor/field_editor'; +import { useFieldEditorContext } from './field_editor_context'; +import { FlyoutPanels } from './flyout_panels'; import { FieldPreview, useFieldPreviewContext } from './preview'; -import { ModifiedFieldModal, SaveFieldTypeOrNameChangedModal } from './confirm_modals'; const i18nTexts = { cancelButtonLabel: i18n.translate('indexPatternFieldEditor.editor.flyoutCancelButtonLabel', { @@ -50,7 +49,9 @@ export interface Props { */ onCancel: () => void; /** Optional field to process */ - field?: Field; + fieldToEdit?: Field; + /** Optional preselected configuration for new field */ + fieldToCreate?: Field; isSavingField: boolean; /** Handler to call when the component mounts. * We will pass "up" data that the parent component might need @@ -59,14 +60,15 @@ export interface Props { } const FieldEditorFlyoutContentComponent = ({ - field, + fieldToEdit, + fieldToCreate, onSave, onCancel, isSavingField, onMounted, }: Props) => { const isMounted = useRef(false); - const isEditingExistingField = !!field; + const isEditingExistingField = !!fieldToEdit; const { dataView } = useFieldEditorContext(); const { panel: { isVisible: isPanelVisible }, @@ -75,9 +77,9 @@ const FieldEditorFlyoutContentComponent = ({ const [formState, setFormState] = useState({ isSubmitted: false, isSubmitting: false, - isValid: field ? true : undefined, - submit: field - ? async () => ({ isValid: true, data: field }) + isValid: fieldToEdit ? true : undefined, + submit: fieldToEdit + ? async () => ({ isValid: true, data: fieldToEdit }) : async () => ({ isValid: false, data: {} as Field }), }); @@ -106,8 +108,8 @@ const FieldEditorFlyoutContentComponent = ({ } if (isValid) { - const nameChange = field?.name !== data.name; - const typeChange = field?.type !== data.type; + const nameChange = fieldToEdit?.name !== data.name; + const typeChange = fieldToEdit?.type !== data.type; if (isEditingExistingField && (nameChange || typeChange)) { setModalVisibility({ @@ -118,7 +120,7 @@ const FieldEditorFlyoutContentComponent = ({ onSave(data); } } - }, [onSave, submit, field, isEditingExistingField]); + }, [onSave, submit, fieldToEdit, isEditingExistingField]); const onClickCancel = useCallback(() => { const canClose = canCloseValidator(); @@ -132,7 +134,7 @@ const FieldEditorFlyoutContentComponent = ({ if (modalVisibility.confirmChangeNameOrType) { return ( { const { data } = await submit(); onSave(data); @@ -196,12 +198,12 @@ const FieldEditorFlyoutContentComponent = ({

- {field ? ( + {fieldToEdit ? ( ) : ( @@ -226,7 +228,7 @@ const FieldEditorFlyoutContentComponent = ({ diff --git a/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content_container.tsx b/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content_container.tsx index 35bf9b3cc6b36..6696cf1e48b55 100644 --- a/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content_container.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_editor_flyout_content_container.tsx @@ -43,7 +43,9 @@ export interface Props { /** The Kibana field type of the field to create or edit (default: "runtime") */ fieldTypeToProcess: InternalFieldType; /** Optional field to edit */ - field?: DataViewField; + fieldToEdit?: DataViewField; + /** Optional initial configuration for new field */ + fieldToCreate?: Field; /** Services */ dataViews: DataViewsPublicPluginStart; notifications: NotificationsStart; @@ -64,7 +66,8 @@ export interface Props { */ export const FieldEditorFlyoutContentContainer = ({ - field, + fieldToEdit, + fieldToCreate, onSave, onCancel, onMounted, @@ -80,7 +83,6 @@ export const FieldEditorFlyoutContentContainer = ({ fieldFormats, uiSettings, }: Props) => { - const fieldToEdit = deserializeField(dataView, field); const [isSaving, setIsSaving] = useState(false); const { fields } = dataView; @@ -92,7 +94,7 @@ export const FieldEditorFlyoutContentContainer = ({ fields .filter((fld) => { - const isFieldBeingEdited = field?.name === fld.name; + const isFieldBeingEdited = fieldToEdit?.name === fld.name; return !isFieldBeingEdited && fld.isMapped; }) .forEach((fld) => { @@ -103,7 +105,7 @@ export const FieldEditorFlyoutContentContainer = ({ }); return existing; - }, [fields, field]); + }, [fields, fieldToEdit]); const services = useMemo( () => ({ @@ -126,8 +128,8 @@ export const FieldEditorFlyoutContentContainer = ({ // eslint-disable-next-line no-empty } catch {} // rename an existing runtime field - if (field?.name && field.name !== updatedField.name) { - dataView.removeRuntimeField(field.name); + if (fieldToEdit?.name && fieldToEdit.name !== updatedField.name) { + dataView.removeRuntimeField(fieldToEdit.name); } dataView.addRuntimeField(updatedField.name, { @@ -184,7 +186,15 @@ export const FieldEditorFlyoutContentContainer = ({ setIsSaving(false); } }, - [onSave, dataView, dataViews, notifications, fieldTypeToProcess, field?.name, usageCollection] + [ + onSave, + dataView, + dataViews, + notifications, + fieldTypeToProcess, + fieldToEdit?.name, + usageCollection, + ] ); return ( @@ -204,7 +214,8 @@ export const FieldEditorFlyoutContentContainer = ({ onSave={saveField} onCancel={onCancel} onMounted={onMounted} - field={fieldToEdit} + fieldToCreate={fieldToCreate} + fieldToEdit={deserializeField(dataView, fieldToEdit)} isSavingField={isSaving} /> diff --git a/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx b/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx index ac080ed0ed797..de90fcb73abe7 100644 --- a/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_format_editor/field_format_editor.tsx @@ -10,14 +10,17 @@ import { EuiCode, EuiFormRow, EuiSelect } from '@elastic/eui'; import { CoreStart } from '@kbn/core/public'; import { ES_FIELD_TYPES, KBN_FIELD_TYPES } from '@kbn/data-plugin/public'; import { DataView } from '@kbn/data-views-plugin/public'; -import type { FieldFormatInstanceType, FieldFormatParams } from '@kbn/field-formats-plugin/common'; +import type { + FieldFormatInstanceType, + FieldFormatParams, + SerializedFieldFormat, +} from '@kbn/field-formats-plugin/common'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { castEsToKbnFieldTypeName } from '@kbn/field-types'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import React, { PureComponent } from 'react'; import { FormatEditorServiceStart } from '../../service'; -import { FieldFormatConfig } from '../../types'; import { FormatEditor } from './format_editor'; export interface FormatSelectEditorProps { @@ -26,9 +29,9 @@ export interface FormatSelectEditorProps { fieldFormatEditors: FormatEditorServiceStart['fieldFormatEditors']; fieldFormats: FieldFormatsStart; uiSettings: CoreStart['uiSettings']; - onChange: (change?: FieldFormatConfig) => void; + onChange: (change?: SerializedFieldFormat) => void; onError: (error?: string) => void; - value?: FieldFormatConfig; + value?: SerializedFieldFormat; } interface FieldTypeFormat { diff --git a/src/plugins/data_view_field_editor/public/components/preview/types.ts b/src/plugins/data_view_field_editor/public/components/preview/types.ts index d7c0a5867efd6..761c1db2094da 100644 --- a/src/plugins/data_view_field_editor/public/components/preview/types.ts +++ b/src/plugins/data_view_field_editor/public/components/preview/types.ts @@ -5,10 +5,11 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import React from 'react'; -import type { RuntimeType, RuntimeField } from '../../shared_imports'; -import type { FieldFormatConfig, RuntimeFieldPainlessError } from '../../types'; +import { SerializedFieldFormat } from '@kbn/field-formats-plugin/common'; +import React from 'react'; +import type { RuntimeField, RuntimeType } from '../../shared_imports'; +import type { RuntimeFieldPainlessError } from '../../types'; export type From = 'cluster' | 'custom'; @@ -54,7 +55,7 @@ export interface Params { index: string | null; type: RuntimeType | null; script: Required['script'] | null; - format: FieldFormatConfig | null; + format: SerializedFieldFormat | null; document: { [key: string]: unknown } | null; } diff --git a/src/plugins/data_view_field_editor/public/index.ts b/src/plugins/data_view_field_editor/public/index.ts index 981cde8ca73c0..7f76210c2c6f0 100644 --- a/src/plugins/data_view_field_editor/public/index.ts +++ b/src/plugins/data_view_field_editor/public/index.ts @@ -21,6 +21,7 @@ import { IndexPatternFieldEditorPlugin } from './plugin'; export type { + Field, PluginSetup as IndexPatternFieldEditorSetup, PluginStart as IndexPatternFieldEditorStart, } from './types'; diff --git a/src/plugins/data_view_field_editor/public/lib/serialization.ts b/src/plugins/data_view_field_editor/public/lib/serialization.ts index 833fe331203c2..82051eef17663 100644 --- a/src/plugins/data_view_field_editor/public/lib/serialization.ts +++ b/src/plugins/data_view_field_editor/public/lib/serialization.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ import { monaco } from '@kbn/monaco'; -import { DataViewField, DataView } from '../shared_imports'; +import { DataViewField, DataView, RuntimeType } from '../shared_imports'; import type { Field, RuntimeFieldPainlessError } from '../types'; export const deserializeField = (dataView: DataView, field?: DataViewField): Field | undefined => { @@ -16,7 +16,7 @@ export const deserializeField = (dataView: DataView, field?: DataViewField): Fie return { name: field.name, - type: field?.esTypes ? field.esTypes[0] : 'keyword', + type: field?.esTypes ? (field.esTypes[0] as RuntimeType) : ('keyword' as const), script: field.runtimeField ? field.runtimeField.script : undefined, customLabel: field.customLabel, popularity: field.count, diff --git a/src/plugins/data_view_field_editor/public/open_editor.tsx b/src/plugins/data_view_field_editor/public/open_editor.tsx index f6355b0e70e0e..d938ae52642b7 100644 --- a/src/plugins/data_view_field_editor/public/open_editor.tsx +++ b/src/plugins/data_view_field_editor/public/open_editor.tsx @@ -6,33 +6,47 @@ * Side Public License, v 1. */ -import React from 'react'; import { CoreStart, OverlayRef } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; - -import { - createKibanaReactContext, - toMountPoint, - DataViewField, +import React from 'react'; +import { FieldEditorLoader } from './components/field_editor_loader'; +import { euiFlyoutClassname } from './constants'; +import type { ApiService } from './lib/api'; +import type { DataPublicPluginStart, DataView, - UsageCollectionStart, + DataViewField, DataViewsPublicPluginStart, FieldFormatsStart, RuntimeType, + UsageCollectionStart, } from './shared_imports'; +import { createKibanaReactContext, toMountPoint } from './shared_imports'; +import type { CloseEditor, Field, InternalFieldType, PluginStart } from './types'; -import type { PluginStart, InternalFieldType, CloseEditor } from './types'; -import type { ApiService } from './lib/api'; -import { euiFlyoutClassname } from './constants'; -import { FieldEditorLoader } from './components/field_editor_loader'; - +/** + * Options for opening the field editor + * @public + */ export interface OpenFieldEditorOptions { + /** + * context containing the data view the field belongs to + */ ctx: { dataView: DataView; }; + /** + * action to take after field is saved + */ onSave?: (field: DataViewField) => void; + /** + * field to edit, for existing field + */ fieldName?: string; + /** + * pre-selectable options for new field creation + */ + fieldToCreate?: Field; } interface Dependencies { @@ -75,7 +89,8 @@ export const getFieldEditorOpener = const openEditor = ({ onSave, - fieldName, + fieldName: fieldNameToEdit, + fieldToCreate, ctx: { dataView }, }: OpenFieldEditorOptions): CloseEditor => { const closeEditor = () => { @@ -93,24 +108,24 @@ export const getFieldEditorOpener = } }; - const field = fieldName ? dataView.getFieldByName(fieldName) : undefined; + const fieldToEdit = fieldNameToEdit ? dataView.getFieldByName(fieldNameToEdit) : undefined; - if (fieldName && !field) { + if (fieldNameToEdit && !fieldToEdit) { const err = i18n.translate('indexPatternFieldEditor.noSuchFieldName', { defaultMessage: "Field named '{fieldName}' not found on index pattern", - values: { fieldName }, + values: { fieldName: fieldNameToEdit }, }); notifications.toasts.addDanger(err); return closeEditor; } - const isNewRuntimeField = !fieldName; + const isNewRuntimeField = !fieldNameToEdit; const isExistingRuntimeField = - field && - field.runtimeField && - !field.isMapped && + fieldToEdit && + fieldToEdit.runtimeField && + !fieldToEdit.isMapped && // treat composite field instances as mapped fields for field editing purposes - field.runtimeField.type !== ('composite' as RuntimeType); + fieldToEdit.runtimeField.type !== ('composite' as RuntimeType); const fieldTypeToProcess: InternalFieldType = isNewRuntimeField || isExistingRuntimeField ? 'runtime' : 'concrete'; @@ -122,7 +137,8 @@ export const getFieldEditorOpener = onCancel={closeEditor} onMounted={onMounted} docLinks={docLinks} - field={field} + fieldToEdit={fieldToEdit} + fieldToCreate={fieldToCreate} fieldTypeToProcess={fieldTypeToProcess} dataView={dataView} search={search} @@ -150,7 +166,7 @@ export const getFieldEditorOpener = : i18n.translate('indexPatternFieldEditor.editField.flyoutAriaLabel', { defaultMessage: 'Edit {fieldName} field', values: { - fieldName, + fieldName: fieldNameToEdit, }, }), onClose: (flyout) => { diff --git a/src/plugins/data_view_field_editor/public/plugin.ts b/src/plugins/data_view_field_editor/public/plugin.ts index fe5b5d8390765..b95ad388bca7c 100644 --- a/src/plugins/data_view_field_editor/public/plugin.ts +++ b/src/plugins/data_view_field_editor/public/plugin.ts @@ -28,7 +28,7 @@ export class IndexPatternFieldEditorPlugin }; } - public start(core: CoreStart, plugins: StartPlugins) { + public start(core: CoreStart, plugins: StartPlugins): PluginStart { const { fieldFormatEditors } = this.formatEditorService.start(); const { http } = core; const { data, usageCollection, dataViews, fieldFormats } = plugins; diff --git a/src/plugins/data_view_field_editor/public/types.ts b/src/plugins/data_view_field_editor/public/types.ts index 504a97eb7f329..8ee47f20515a1 100644 --- a/src/plugins/data_view_field_editor/public/types.ts +++ b/src/plugins/data_view_field_editor/public/types.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { SerializableRecord } from '@kbn/utility-types'; +import { FieldSpec } from '@kbn/data-views-plugin/public'; import { FunctionComponent } from 'react'; import { DeleteFieldProviderProps } from './components'; import { OpenFieldDeleteModalOptions } from './open_delete_modal'; @@ -21,11 +21,22 @@ import { UsageCollectionStart, } from './shared_imports'; +/** + * Public setup contract of data view field editor + * @public + */ export interface PluginSetup { fieldFormatEditors: FormatEditorServiceSetup['fieldFormatEditors']; } +/** + * Public start contract of data view field editor + * @public + */ export interface PluginStart { + /** + * method to open the data view field editor fly-out + */ openEditor(options: OpenFieldEditorOptions): () => void; openDeleteModal(options: OpenFieldDeleteModalOptions): () => void; fieldFormatEditors: FormatEditorServiceStart['fieldFormatEditors']; @@ -47,18 +58,35 @@ export interface StartPlugins { export type InternalFieldType = 'concrete' | 'runtime'; +/** + * The data model for the field editor + * @public + */ export interface Field { - name: string; - type: RuntimeField['type'] | string; + /** + * name / path used for the field + */ + name: FieldSpec['name']; + /** + * ES type + */ + type: RuntimeType; + /** + * source of the runtime field script + */ script?: RuntimeField['script']; - customLabel?: string; + /** + * custom label for display + */ + customLabel?: FieldSpec['customLabel']; + /** + * custom popularity + */ popularity?: number; - format?: FieldFormatConfig; -} - -export interface FieldFormatConfig { - id: string; - params?: SerializableRecord; + /** + * configuration of the field format + */ + format?: FieldSpec['format']; } export interface EsRuntimeField { diff --git a/test/examples/data_view_field_editor_example/data_view_field_editor_example.ts b/test/examples/data_view_field_editor_example/data_view_field_editor_example.ts index 389c877432493..0645fe3cd68ef 100644 --- a/test/examples/data_view_field_editor_example/data_view_field_editor_example.ts +++ b/test/examples/data_view_field_editor_example/data_view_field_editor_example.ts @@ -6,19 +6,41 @@ * Side Public License, v 1. */ +import expect from '@kbn/expect'; import { PluginFunctionalProviderContext } from '../../plugin_functional/services'; // eslint-disable-next-line import/no-default-export export default function ({ getService }: PluginFunctionalProviderContext) { const testSubjects = getService('testSubjects'); + const find = getService('find'); describe('', () => { it('finds a data view', async () => { await testSubjects.existOrFail('dataViewTitle'); }); + it('opens the field editor', async () => { await testSubjects.click('addField'); await testSubjects.existOrFail('flyoutTitle'); + await testSubjects.click('closeFlyoutButton'); + }); + + it('uses preconfigured options for a new field', async () => { + // find the checkbox label and click it - `testSubjects.setCheckbox()` is not working for our checkbox + const controlWrapper = await testSubjects.find('preconfiguredControlWrapper'); + const control = await find.descendantDisplayedByCssSelector('label', controlWrapper); + await control.click(); + + await testSubjects.click('addField'); + await testSubjects.existOrFail('flyoutTitle'); + + const nameField = await testSubjects.find('nameField'); + const nameInput = await find.descendantDisplayedByCssSelector( + '[data-test-subj=input]', + nameField + ); + + expect(await nameInput.getAttribute('value')).to.equal('demotestfield'); }); }); } From b12d58cd556de353d171c744e0086043dccccd4a Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Fri, 22 Jul 2022 19:37:42 +0200 Subject: [PATCH 22/78] [Enterprise Search] Add sync now button for connectors (#136941) --- .../enterprise_search/common/types/indices.ts | 13 +- .../__mocks__/view_index.mock.ts | 79 ++++++++++ .../start_sync_api_logic.test.ts | 31 ++++ .../connector_package/start_sync_api_logic.ts | 20 +++ .../header_actions/header_actions.tsx | 120 +++++++++------- .../components/header_actions/sync_button.tsx | 53 +++++++ .../connector/connector_configuration.tsx | 36 ++--- .../connector_configuration_config.tsx | 2 +- .../connector/connector_scheduling.tsx | 17 ++- .../search_index/index_view_logic.test.ts | 134 +++++++++++++++++ .../search_index/index_view_logic.ts | 103 +++++++++++++ .../components/search_index/overview.tsx | 14 +- .../components/search_index/search_index.tsx | 9 +- .../search_indices/indices_logic.test.ts | 109 ++++---------- .../search_indices/indices_logic.ts | 72 +--------- .../search_indices/indices_table.tsx | 32 +---- .../enterprise_search_content/types.ts | 29 ++++ .../utils/indices.test.ts | 119 +++++++++++++++ .../utils/indices.ts | 135 ++++++++++++++++++ .../index_management/setup_indices.test.ts | 2 +- .../server/index_management/setup_indices.ts | 2 +- .../server/lib/connectors/start_sync.test.ts | 88 ++++++++++++ .../server/lib/connectors/start_sync.ts | 32 +++++ .../update_connector_scheduling.test.ts | 10 +- .../connectors/update_connector_scheduling.ts | 4 +- .../routes/enterprise_search/connectors.ts | 25 ++++ 26 files changed, 1017 insertions(+), 273 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/sync_button.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts create mode 100644 x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts diff --git a/x-pack/plugins/enterprise_search/common/types/indices.ts b/x-pack/plugins/enterprise_search/common/types/indices.ts index 8c106801e333d..bf19d8789519e 100644 --- a/x-pack/plugins/enterprise_search/common/types/indices.ts +++ b/x-pack/plugins/enterprise_search/common/types/indices.ts @@ -38,14 +38,19 @@ export interface ConnectorIndex extends ElasticsearchIndex { export interface CrawlerIndex extends ElasticsearchIndex { crawler: Crawler; } -export interface ElasticsearchIndexWithIngestion extends ElasticsearchIndex { - connector?: Connector; - crawler?: Crawler; +export interface ConnectorIndex extends ElasticsearchIndex { + connector: Connector; } export interface ElasticsearchIndexWithPrivileges extends ElasticsearchIndex { alias: boolean; privileges: { - read: boolean; manage: boolean; + read: boolean; }; } + +export interface CrawlerIndex extends ElasticsearchIndex { + crawler: Crawler; +} + +export type ElasticsearchIndexWithIngestion = ElasticsearchIndex | ConnectorIndex | CrawlerIndex; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts new file mode 100644 index 0000000000000..b3a7f3d6c166d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SyncStatus, ConnectorStatus } from '../../../../common/types/connectors'; + +import { + ApiViewIndex, + ConnectorViewIndex, + CrawlerViewIndex, + IngestionMethod, + IngestionStatus, +} from '../types'; + +export const apiIndex: ApiViewIndex = { + ingestionMethod: IngestionMethod.API, + ingestionStatus: IngestionStatus.CONNECTED, + lastUpdated: null, + name: 'api', + total: { + docs: { + count: 1, + deleted: 0, + }, + store: { size_in_bytes: '8024' }, + }, +}; +export const connectorIndex: ConnectorViewIndex = { + connector: { + api_key_id: null, + configuration: {}, + id: '2', + index_name: 'connector', + last_seen: null, + last_sync_error: null, + last_sync_status: SyncStatus.COMPLETED, + last_synced: null, + scheduling: { + enabled: false, + interval: '', + }, + service_type: null, + status: ConnectorStatus.CONFIGURED, + sync_now: false, + }, + ingestionMethod: IngestionMethod.CONNECTOR, + ingestionStatus: IngestionStatus.INCOMPLETE, + lastUpdated: 'never', + name: 'connector', + total: { + docs: { + count: 1, + deleted: 0, + }, + store: { size_in_bytes: '8024' }, + }, +}; +export const crawlerIndex: CrawlerViewIndex = { + crawler: { + id: '3', + index_name: 'crawler', + }, + ingestionMethod: IngestionMethod.CRAWLER, + ingestionStatus: IngestionStatus.INCOMPLETE, + lastUpdated: null, + name: 'crawler', + total: { + docs: { + count: 1, + deleted: 0, + }, + store: { size_in_bytes: '8024' }, + }, +}; + +export const elasticsearchViewIndices = [apiIndex, connectorIndex, crawlerIndex]; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.test.ts new file mode 100644 index 0000000000000..7496557996868 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mockHttpValues } from '../../../__mocks__/kea_logic'; + +import { nextTick } from '@kbn/test-jest-helpers'; + +import { startSync } from './start_sync_api_logic'; + +describe('startSync', () => { + const { http } = mockHttpValues; + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('generateApiKey', () => { + it('calls correct api', async () => { + const promise = Promise.resolve('result'); + http.post.mockReturnValue(promise); + const result = startSync({ connectorId: 'connectorId' }); + await nextTick(); + expect(http.post).toHaveBeenCalledWith( + '/internal/enterprise_search/connectors/connectorId/start_sync' + ); + await expect(result).resolves.toEqual('result'); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.ts new file mode 100644 index 0000000000000..b2f9a2638e1c0 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/start_sync_api_logic.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 { createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +export interface StartSyncArgs { + connectorId: string; +} + +export const startSync = async ({ connectorId }: StartSyncArgs) => { + const route = `/internal/enterprise_search/connectors/${connectorId}/start_sync`; + return await HttpLogic.values.http.post(route); +}; + +export const StartSyncApiLogic = createApiLogic(['start_sync_api_logic'], startSync); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx index a03f2736a8584..74dcd7b47d9b0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/header_actions.tsx @@ -15,6 +15,8 @@ import { EuiContextMenuPanel, EuiContextMenuItem, EuiText, + EuiFlexGroup, + EuiFlexItem, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -23,62 +25,82 @@ import { APP_SEARCH_PLUGIN } from '../../../../../../../common/constants'; import { ENGINE_CREATION_PATH } from '../../../../../app_search/routes'; import { KibanaLogic } from '../../../../../shared/kibana'; +import { IngestionMethod } from '../../../../types'; +import { IndexViewLogic } from '../../index_view_logic'; + import { HeaderActionsLogic } from './header_actions.logic'; +import { SyncButton } from './sync_button'; const SearchEnginesPopover: React.FC = () => { const { isSearchEnginesPopoverOpen } = useValues(HeaderActionsLogic); const { toggleSearchEnginesPopover } = useActions(HeaderActionsLogic); + const { ingestionMethod } = useValues(IndexViewLogic); return ( - - {i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.label', { - defaultMessage: 'Search Engines', - })} - - } - > - { - KibanaLogic.values.navigateToUrl(APP_SEARCH_PLUGIN.URL, { - shouldNotCreateHref: true, - }); - }} - > - -

- {i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.viewEngines', { - defaultMessage: 'View App Search engines', - })} -

-
- , - { - KibanaLogic.values.navigateToUrl(APP_SEARCH_PLUGIN.URL + ENGINE_CREATION_PATH, { - shouldNotCreateHref: true, - }); - }} - > - -

- {i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.createEngine', { - defaultMessage: 'Create a new App Search engine', - })} -

-
-
, - ]} - /> -
+ + + + {i18n.translate('xpack.enterpriseSearch.content.index.searchEngines.label', { + defaultMessage: 'Search Engines', + })} + + } + > + { + KibanaLogic.values.navigateToUrl(APP_SEARCH_PLUGIN.URL, { + shouldNotCreateHref: true, + }); + }} + > + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.searchEngines.viewEngines', + { + defaultMessage: 'View App Search engines', + } + )} +

+
+ , + { + KibanaLogic.values.navigateToUrl(APP_SEARCH_PLUGIN.URL + ENGINE_CREATION_PATH, { + shouldNotCreateHref: true, + }); + }} + > + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.searchEngines.createEngine', + { + defaultMessage: 'Create a new App Search engine', + } + )} +

+
+
, + ]} + /> +
+
+ {ingestionMethod === IngestionMethod.CONNECTOR && ( + + + + )} +
); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/sync_button.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/sync_button.tsx new file mode 100644 index 0000000000000..6a6c483b30134 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/components/header_actions/sync_button.tsx @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { useValues, useActions } from 'kea'; + +import { EuiButton } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { IngestionStatus } from '../../../../types'; +import { IndexViewLogic } from '../../index_view_logic'; + +export const SyncButton: React.FC = () => { + const { ingestionStatus, isSyncing, isWaitingForSync } = useValues(IndexViewLogic); + const { startSync } = useActions(IndexViewLogic); + + const getSyncButtonText = () => { + if (isWaitingForSync) { + return i18n.translate( + 'xpack.enterpriseSearch.content.index.syncButton.waitingForSync.label', + { + defaultMessage: 'Waiting for sync', + } + ); + } + if (isSyncing && ingestionStatus !== IngestionStatus.ERROR) { + return i18n.translate('xpack.enterpriseSearch.content.index.syncButton.syncing.label', { + defaultMessage: 'Syncing', + }); + } + return i18n.translate('xpack.enterpriseSearch.content.index.syncButton.label', { + defaultMessage: 'Sync', + }); + }; + return ( + + {getSyncButtonText()} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx index 8243f901b70f8..0e3d726b9afe5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration.tsx @@ -28,6 +28,7 @@ import { EuiButtonTo } from '../../../../shared/react_router_helpers'; import { GenerateConnectorApiKeyApiLogic } from '../../../api/connector_package/generate_connector_api_key_api_logic'; import { FetchIndexApiLogic } from '../../../api/index/fetch_index_api_logic'; import { SEARCH_INDEX_TAB_PATH } from '../../../routes'; +import { isConnectorIndex } from '../../../utils/indices'; import { ApiKey } from '../../api_key/api_key'; import { IndexNameLogic } from '../index_name_logic'; @@ -41,22 +42,22 @@ export const ConnectorConfiguration: React.FC = () => { const { data: apiKeyData } = useValues(GenerateConnectorApiKeyApiLogic); const { data: indexData } = useValues(FetchIndexApiLogic); const { indexName } = useValues(IndexNameLogic); - const indexId = indexData?.connector?.id ?? ''; + if (!isConnectorIndex(indexData)) { + return <>; + } + const indexId = indexData.connector.id ?? ''; - const hasApiKey = !!(indexData?.connector?.api_key_id ?? apiKeyData); + const hasApiKey = !!(indexData.connector.api_key_id ?? apiKeyData); - const ConnectorConfig: React.FC = () => - indexData?.connector ? ( - - ) : ( - <> - ); + const ConnectorConfig: React.FC = () => ( + + ); const ScheduleStep: React.FC = () => ( @@ -145,7 +146,7 @@ export const ConnectorConfiguration: React.FC = () => { children: ( ), status: hasApiKey ? 'complete' : 'incomplete', @@ -160,7 +161,7 @@ export const ConnectorConfiguration: React.FC = () => { { children: , status: - !indexData?.connector?.status || + !indexData.connector.status || indexData.connector.status === ConnectorStatus.CREATED ? 'incomplete' : 'complete', @@ -175,7 +176,6 @@ export const ConnectorConfiguration: React.FC = () => { { children: , status: - indexData?.connector?.status && indexData.connector.status === ConnectorStatus.CONNECTED ? 'complete' : 'incomplete', @@ -189,7 +189,7 @@ export const ConnectorConfiguration: React.FC = () => { }, { children: , - status: indexData?.connector?.scheduling.enabled ? 'complete' : 'incomplete', + status: indexData.connector.scheduling.enabled ? 'complete' : 'incomplete', title: i18n.translate( 'xpack.enterpriseSearch.content.indices.configurationConnector.steps.schedule.title', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_config.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_config.tsx index c1927aeea0dfc..7bead70acbdff 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_config.tsx @@ -68,7 +68,7 @@ export const ConnectorConfigurationConfig: React.FC ); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx index 2f0b46520b89b..ca10c6ce6ff23 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_scheduling.tsx @@ -19,14 +19,18 @@ import { EuiButton, EuiButtonEmpty, } from '@elastic/eui'; + import { CronEditor, Frequency } from '@kbn/es-ui-shared-plugin/public'; import { i18n } from '@kbn/i18n'; import { Status } from '../../../../../../common/types/api'; +import { ConnectorIndex } from '../../../../../../common/types/indices'; import { UnsavedChangesPrompt } from '../../../../shared/unsaved_changes_prompt'; import { UpdateConnectorSchedulingApiLogic } from '../../../api/connector_package/update_connector_scheduling_api_logic'; import { FetchIndexApiLogic } from '../../../api/index/fetch_index_api_logic'; +import { isConnectorIndex } from '../../../utils/indices'; + import { ConnectorSchedulingLogic } from './connector_scheduling_logic'; export const ConnectorSchedulingComponent: React.FC = () => { @@ -36,7 +40,8 @@ export const ConnectorSchedulingComponent: React.FC = () => { const { hasChanges } = useValues(ConnectorSchedulingLogic); const { setHasChanges } = useActions(ConnectorSchedulingLogic); - const schedulingInput = data?.connector?.scheduling; + // Need to do this ugly casting because we can't check this after the below typecheck, because useState can't be used after an if + const schedulingInput = (data as ConnectorIndex)?.connector?.scheduling; const [scheduling, setScheduling] = useState(schedulingInput); const [fieldToPreferredValueMap, setFieldToPreferredValueMap] = useState({}); const [simpleCron, setSimpleCron] = useState<{ @@ -47,7 +52,11 @@ export const ConnectorSchedulingComponent: React.FC = () => { frequency: schedulingInput?.interval ? cronToFrequency(schedulingInput.interval) : 'HOUR', }); - const editor = scheduling && ( + if (!isConnectorIndex(data)) { + return <>; + } + + const editor = ( { /> ); - return scheduling ? ( + return ( <> { - ) : ( - <> ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts new file mode 100644 index 0000000000000..e15271f2fb655 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.test.ts @@ -0,0 +1,134 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LogicMounter, mockFlashMessageHelpers } from '../../../__mocks__/kea_logic'; + +import { apiIndex, connectorIndex } from '../../__mocks__/view_index.mock'; + +import { nextTick } from '@kbn/test-jest-helpers'; + +import { HttpError } from '../../../../../common/types/api'; + +import { SyncStatus } from '../../../../../common/types/connectors'; +import { StartSyncApiLogic } from '../../api/connector_package/start_sync_api_logic'; +import { FetchIndexApiLogic } from '../../api/index/fetch_index_api_logic'; + +import { IngestionMethod, IngestionStatus } from '../../types'; + +import { indexToViewIndex } from '../../utils/indices'; + +import { IndexViewLogic } from './index_view_logic'; + +const DEFAULT_VALUES = { + data: undefined, + index: undefined, + ingestionMethod: IngestionMethod.API, + ingestionStatus: IngestionStatus.CONNECTED, + isSyncing: false, + isWaitingForSync: false, + lastUpdated: null, + localSyncNowValue: false, + syncStatus: undefined, +}; + +const CONNECTOR_VALUES = { + ...DEFAULT_VALUES, + data: connectorIndex, + index: indexToViewIndex(connectorIndex), + ingestionMethod: IngestionMethod.CONNECTOR, + ingestionStatus: IngestionStatus.INCOMPLETE, + lastUpdated: 'never', +}; + +describe('IndexViewLogic', () => { + const { mount: apiLogicMount } = new LogicMounter(StartSyncApiLogic); + const { mount: fetchIndexMount } = new LogicMounter(FetchIndexApiLogic); + const { mount } = new LogicMounter(IndexViewLogic); + + beforeEach(() => { + jest.clearAllMocks(); + jest.useRealTimers(); + apiLogicMount(); + fetchIndexMount(); + mount(); + }); + + it('has expected default values', () => { + expect(IndexViewLogic.values).toEqual(DEFAULT_VALUES); + }); + + describe('actions', () => { + describe('fetchIndex.apiSuccess', () => { + it('should update values', () => { + FetchIndexApiLogic.actions.apiSuccess({ + ...connectorIndex, + connector: { ...connectorIndex.connector!, sync_now: true }, + }); + expect(IndexViewLogic.values).toEqual({ + ...CONNECTOR_VALUES, + data: { + ...CONNECTOR_VALUES.data, + connector: { ...CONNECTOR_VALUES.data.connector, sync_now: true }, + }, + index: { + ...CONNECTOR_VALUES.index, + connector: { ...CONNECTOR_VALUES.index.connector, sync_now: true }, + }, + isWaitingForSync: true, + syncStatus: SyncStatus.COMPLETED, + }); + }); + it('should update values with no connector', () => { + FetchIndexApiLogic.actions.apiSuccess(apiIndex); + expect(IndexViewLogic.values).toEqual({ + ...DEFAULT_VALUES, + data: apiIndex, + index: apiIndex, + }); + }); + }); + describe('startSync', () => { + it('should call makeRequest', async () => { + FetchIndexApiLogic.actions.apiSuccess(connectorIndex); + IndexViewLogic.actions.makeRequest = jest.fn(); + IndexViewLogic.actions.startSync(); + await nextTick(); + expect(IndexViewLogic.actions.makeRequest).toHaveBeenCalledWith({ + connectorId: '2', + }); + expect(IndexViewLogic.values).toEqual({ + ...CONNECTOR_VALUES, + syncStatus: SyncStatus.COMPLETED, + }); + }); + }); + describe('apiSuccess', () => { + it('should set localSyncNow to true', async () => { + FetchIndexApiLogic.actions.apiSuccess(connectorIndex); + StartSyncApiLogic.actions.apiSuccess({}); + expect(IndexViewLogic.values).toEqual({ + ...CONNECTOR_VALUES, + isWaitingForSync: true, + localSyncNowValue: true, + syncStatus: SyncStatus.COMPLETED, + }); + }); + }); + }); + + describe('listeners', () => { + it('calls clearFlashMessages on makeRequest', () => { + IndexViewLogic.actions.makeRequest({ connectorId: 'connectorId' }); + expect(mockFlashMessageHelpers.clearFlashMessages).toHaveBeenCalledTimes(1); + }); + it('calls flashAPIErrors on apiError', () => { + IndexViewLogic.actions.apiError({} as HttpError); + expect(mockFlashMessageHelpers.flashAPIErrors).toHaveBeenCalledTimes(1); + expect(mockFlashMessageHelpers.flashAPIErrors).toHaveBeenCalledWith({}); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.ts new file mode 100644 index 0000000000000..2d60d69d08702 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/index_view_logic.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 { kea, MakeLogicType } from 'kea'; + +import { i18n } from '@kbn/i18n'; + +import { SyncStatus } from '../../../../../common/types/connectors'; +import { Actions } from '../../../shared/api_logic/create_api_logic'; +import { + flashAPIErrors, + clearFlashMessages, + flashSuccessToast, +} from '../../../shared/flash_messages'; +import { StartSyncApiLogic, StartSyncArgs } from '../../api/connector_package/start_sync_api_logic'; +import { + FetchIndexApiLogic, + FetchIndexApiParams, + FetchIndexApiResponse, +} from '../../api/index/fetch_index_api_logic'; +import { ElasticsearchViewIndex, IngestionMethod, IngestionStatus } from '../../types'; +import { + getIngestionMethod, + getIngestionStatus, + getLastUpdated, + indexToViewIndex, + isConnectorIndex, +} from '../../utils/indices'; + +export type IndicesActions = Pick< + Actions, + 'makeRequest' | 'apiSuccess' | 'apiError' +> & { + fetchIndexSuccess: Actions['apiSuccess']; + startSync(): void; +}; +export interface IndicesValues { + data: typeof FetchIndexApiLogic.values.data; + index: ElasticsearchViewIndex | undefined; + ingestionMethod: IngestionMethod; + ingestionStatus: IngestionStatus; + isSyncing: boolean; + isWaitingForSync: boolean; + lastUpdated: string | null; + localSyncNowValue: boolean; // holds local value after update so UI updates correctly + syncStatus: SyncStatus; +} + +export const IndexViewLogic = kea>({ + actions: { + startSync: true, + }, + connect: { + actions: [StartSyncApiLogic, ['makeRequest', 'apiSuccess', 'apiError']], + values: [FetchIndexApiLogic, ['data']], + }, + listeners: ({ actions, values }) => ({ + apiError: (e) => flashAPIErrors(e), + apiSuccess: () => { + flashSuccessToast( + i18n.translate('xpack.enterpriseSearch.content.searchIndex.index.syncSuccess.message', { + defaultMessage: 'Successfully scheduled a sync, waiting for a connector to pick it up', + }) + ); + }, + makeRequest: () => clearFlashMessages(), + startSync: () => { + if (isConnectorIndex(values.data)) { + actions.makeRequest({ connectorId: values.data?.connector?.id }); + } + }, + }), + path: ['enterprise_search', 'content', 'view_index_logic'], + reducers: { + localSyncNowValue: [ + false, + { + apiSuccess: () => true, + fetchIndexSuccess: (_, index) => + isConnectorIndex(index) ? index.connector.sync_now : false, + }, + ], + }, + selectors: ({ selectors }) => ({ + index: [() => [selectors.data], (data) => (data ? indexToViewIndex(data) : undefined)], + ingestionMethod: [() => [selectors.data], (data) => getIngestionMethod(data)], + ingestionStatus: [() => [selectors.data], (data) => getIngestionStatus(data)], + isSyncing: [ + () => [selectors.syncStatus], + (syncStatus) => syncStatus === SyncStatus.IN_PROGRESS, + ], + isWaitingForSync: [ + () => [selectors.data, selectors.localSyncNowValue], + (data, localSyncNowValue) => data?.connector?.sync_now || localSyncNowValue, + ], + lastUpdated: [() => [selectors.data], (data) => getLastUpdated(data)], + syncStatus: [() => [selectors.data], (data) => data?.connector?.last_sync_status], + }), +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx index 7267f52680b2b..7ca27646d4c10 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/overview.tsx @@ -13,6 +13,8 @@ import { EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { isApiIndex, isConnectorIndex, isCrawlerIndex } from '../../utils/indices'; + import { CrawlDetailsFlyout } from './crawler/crawl_details_flyout/crawl_details_flyout'; import { CrawlRequestsPanel } from './crawler/crawl_requests_panel/crawl_requests_panel'; import { CrawlerTotalStats } from './crawler_total_stats'; @@ -23,19 +25,15 @@ import { TotalStats } from './total_stats'; export const SearchIndexOverview: React.FC = () => { const { indexData } = useValues(OverviewLogic); - const isCrawler = typeof indexData?.crawler !== 'undefined'; - const isConnector = typeof indexData?.connector !== 'undefined'; - const isApi = !(isCrawler || isConnector); - return ( <> - {isCrawler ? ( + {isCrawlerIndex(indexData) ? ( ) : ( { } /> )} - {isApi && ( + {isApiIndex(indexData) && ( <> )} - {isCrawler && ( + {isCrawlerIndex(indexData) && ( <> diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx index 786fec0b96adb..a614ced00040c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx @@ -20,6 +20,7 @@ import { generateEncodedPath } from '../../../shared/encode_path_params'; import { KibanaLogic } from '../../../shared/kibana'; import { FetchIndexApiLogic } from '../../api/index/fetch_index_api_logic'; import { SEARCH_INDEX_PATH, SEARCH_INDEX_TAB_PATH } from '../../routes'; +import { isConnectorIndex, isCrawlerIndex } from '../../utils/indices'; import { EnterpriseSearchContentPageTemplate } from '../layout/page_template'; import { baseBreadcrumbs } from '../search_indices'; @@ -125,8 +126,8 @@ export const SearchIndex: React.FC = () => { const tabs: EuiTabbedContentTab[] = [ ...ALL_INDICES_TABS, - ...(indexData?.connector ? CONNECTOR_TABS : []), - ...(indexData?.crawler ? CRAWLER_TABS : []), + ...(isConnectorIndex(indexData) ? CONNECTOR_TABS : []), + ...(isCrawlerIndex(indexData) ? CRAWLER_TABS : []), ]; const selectedTab = tabs.find((tab) => tab.id === tabId); @@ -151,14 +152,14 @@ export const SearchIndex: React.FC = () => { pageTitle: indexName, rightSideItems: [ ...headerActions, - ...(indexData?.crawler ? [] : []), + ...(isCrawlerIndex(indexData) ? [] : []), ], }} > <> {isCalloutVisible && } - {indexData?.crawler && } + {isCrawlerIndex(indexData) && } ); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts index 5680d8fe72244..b1dfd23cbfb4c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.test.ts @@ -9,6 +9,8 @@ import { LogicMounter, mockFlashMessageHelpers } from '../../../__mocks__/kea_lo import { indices } from '../../__mocks__/search_indices.mock'; +import { connectorIndex, elasticsearchViewIndices } from '../../__mocks__/view_index.mock'; + import moment from 'moment'; import { nextTick } from '@kbn/test-jest-helpers'; @@ -20,7 +22,9 @@ import { DEFAULT_META } from '../../../shared/constants'; import { FetchIndicesAPILogic } from '../../api/index/fetch_indices_api_logic'; -import { IndicesLogic, IngestionMethod, IngestionStatus, ViewSearchIndex } from './indices_logic'; +import { IngestionStatus } from '../../types'; + +import { IndicesLogic } from './indices_logic'; const DEFAULT_VALUES = { data: undefined, @@ -31,69 +35,6 @@ const DEFAULT_VALUES = { status: Status.IDLE, }; -const apiIndex: ViewSearchIndex = { - ingestionMethod: IngestionMethod.API, - ingestionStatus: IngestionStatus.CONNECTED, - lastUpdated: null, - name: 'api', - total: { - docs: { - count: 1, - deleted: 0, - }, - store: { size_in_bytes: '8024' }, - }, -}; -const connectorIndex: ViewSearchIndex = { - connector: { - api_key_id: null, - configuration: {}, - id: '2', - index_name: 'connector', - last_seen: null, - last_sync_error: null, - last_sync_status: SyncStatus.COMPLETED, - last_synced: null, - scheduling: { - enabled: false, - interval: '', - }, - service_type: null, - status: ConnectorStatus.CONFIGURED, - sync_now: false, - }, - ingestionMethod: IngestionMethod.CONNECTOR, - ingestionStatus: IngestionStatus.INCOMPLETE, - lastUpdated: 'never', - name: 'connector', - total: { - docs: { - count: 1, - deleted: 0, - }, - store: { size_in_bytes: '8024' }, - }, -}; -const crawlerIndex: ViewSearchIndex = { - crawler: { - id: '3', - index_name: 'crawler', - }, - ingestionMethod: IngestionMethod.CRAWLER, - ingestionStatus: IngestionStatus.INCOMPLETE, - lastUpdated: null, - name: 'crawler', - total: { - docs: { - count: 1, - deleted: 0, - }, - store: { size_in_bytes: '8024' }, - }, -}; - -const viewSearchIndices = [apiIndex, connectorIndex, crawlerIndex]; - describe('IndicesLogic', () => { const { mount: apiLogicMount } = new LogicMounter(FetchIndicesAPILogic); const { mount } = new LogicMounter(IndicesLogic); @@ -150,7 +91,7 @@ describe('IndicesLogic', () => { meta: newMeta, }, hasNoIndices: false, - indices: viewSearchIndices, + indices: elasticsearchViewIndices, isLoading: false, meta: newMeta, status: Status.SUCCESS, @@ -275,19 +216,19 @@ describe('IndicesLogic', () => { it('updates when apiSuccess listener triggered', () => { expect(IndicesLogic.values).toEqual(DEFAULT_VALUES); IndicesLogic.actions.apiSuccess({ - indices: viewSearchIndices, + indices: elasticsearchViewIndices, isInitialRequest: true, meta: DEFAULT_META, }); expect(IndicesLogic.values).toEqual({ data: { - indices: viewSearchIndices, + indices: elasticsearchViewIndices, isInitialRequest: true, meta: DEFAULT_META, }, hasNoIndices: false, - indices: viewSearchIndices, + indices: elasticsearchViewIndices, isLoading: false, meta: DEFAULT_META, status: Status.SUCCESS, @@ -300,9 +241,9 @@ describe('IndicesLogic', () => { IndicesLogic.actions.apiSuccess({ indices: [ { - ...indices[1], + ...connectorIndex, connector: { - ...indices[1].connector!, + ...connectorIndex.connector!, last_seen: lastSeen, status: ConnectorStatus.CONNECTED, }, @@ -316,9 +257,9 @@ describe('IndicesLogic', () => { data: { indices: [ { - ...indices[1], + ...connectorIndex, connector: { - ...indices[1].connector!, + ...connectorIndex.connector!, last_seen: lastSeen, status: ConnectorStatus.CONNECTED, }, @@ -349,8 +290,8 @@ describe('IndicesLogic', () => { IndicesLogic.actions.apiSuccess({ indices: [ { - ...indices[1], - connector: { ...indices[1].connector!, status: ConnectorStatus.CONNECTED }, + ...connectorIndex, + connector: { ...connectorIndex.connector, status: ConnectorStatus.CONNECTED }, }, ], isInitialRequest: true, @@ -361,8 +302,8 @@ describe('IndicesLogic', () => { data: { indices: [ { - ...indices[1], - connector: { ...indices[1].connector!, status: ConnectorStatus.CONNECTED }, + ...connectorIndex, + connector: { ...connectorIndex.connector, status: ConnectorStatus.CONNECTED }, }, ], isInitialRequest: true, @@ -389,8 +330,8 @@ describe('IndicesLogic', () => { IndicesLogic.actions.apiSuccess({ indices: [ { - ...indices[1], - connector: { ...indices[1].connector!, status: ConnectorStatus.ERROR }, + ...connectorIndex, + connector: { ...connectorIndex.connector!, status: ConnectorStatus.ERROR }, }, ], isInitialRequest: true, @@ -401,8 +342,8 @@ describe('IndicesLogic', () => { data: { indices: [ { - ...indices[1], - connector: { ...indices[1].connector!, status: ConnectorStatus.ERROR }, + ...connectorIndex, + connector: { ...connectorIndex.connector!, status: ConnectorStatus.ERROR }, }, ], isInitialRequest: true, @@ -426,9 +367,9 @@ describe('IndicesLogic', () => { IndicesLogic.actions.apiSuccess({ indices: [ { - ...indices[1], + ...connectorIndex, connector: { - ...indices[1].connector!, + ...connectorIndex.connector!, last_sync_status: SyncStatus.ERROR, status: ConnectorStatus.CONNECTED, }, @@ -442,9 +383,9 @@ describe('IndicesLogic', () => { data: { indices: [ { - ...indices[1], + ...connectorIndex, connector: { - ...indices[1].connector!, + ...connectorIndex.connector!, last_sync_status: SyncStatus.ERROR, status: ConnectorStatus.CONNECTED, }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.ts index 02441da8e285d..0902eeadbb164 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_logic.ts @@ -6,72 +6,16 @@ */ import { kea, MakeLogicType } from 'kea'; -import moment from 'moment'; import { Meta } from '../../../../../common/types'; import { HttpError, Status } from '../../../../../common/types/api'; -import { ConnectorStatus, SyncStatus } from '../../../../../common/types/connectors'; import { ElasticsearchIndexWithIngestion } from '../../../../../common/types/indices'; import { DEFAULT_META } from '../../../shared/constants'; import { flashAPIErrors, clearFlashMessages } from '../../../shared/flash_messages'; import { updateMetaPageIndex } from '../../../shared/table_pagination'; import { FetchIndicesAPILogic } from '../../api/index/fetch_indices_api_logic'; - -export const enum IngestionMethod { - CONNECTOR, - CRAWLER, - API, -} - -export const enum IngestionStatus { - CONNECTED, - ERROR, - SYNC_ERROR, - INCOMPLETE, -} - -export interface ViewSearchIndex extends ElasticsearchIndexWithIngestion { - ingestionMethod: IngestionMethod; - ingestionStatus: IngestionStatus; - lastUpdated: Date | 'never' | null; -} - -function getIngestionMethod(index?: ElasticsearchIndexWithIngestion): IngestionMethod { - if (index?.connector) { - return IngestionMethod.CONNECTOR; - } - if (index?.crawler) { - return IngestionMethod.CRAWLER; - } - return IngestionMethod.API; -} - -function getIngestionStatus( - index: ElasticsearchIndexWithIngestion, - ingestionMethod: IngestionMethod -): IngestionStatus { - if (ingestionMethod === IngestionMethod.API) { - return IngestionStatus.CONNECTED; - } - if (ingestionMethod === IngestionMethod.CONNECTOR) { - if ( - index.connector?.last_seen && - moment(index.connector.last_seen).isBefore(moment().subtract(30, 'minutes')) - ) { - return IngestionStatus.ERROR; - } - if (index.connector?.last_sync_status === SyncStatus.ERROR) { - return IngestionStatus.SYNC_ERROR; - } - if (index.connector?.status === ConnectorStatus.CONNECTED) { - return IngestionStatus.CONNECTED; - } - if (index.connector?.status === ConnectorStatus.ERROR) { - return IngestionStatus.ERROR; - } - } - return IngestionStatus.INCOMPLETE; -} +import { ElasticsearchViewIndex } from '../../types'; +import { indexToViewIndex } from '../../utils/indices'; export interface IndicesActions { apiError(error: HttpError): HttpError; @@ -103,7 +47,7 @@ export interface IndicesActions { export interface IndicesValues { data: typeof FetchIndicesAPILogic.values.data; hasNoIndices: boolean; - indices: ViewSearchIndex[]; + indices: ElasticsearchViewIndex[]; isLoading: boolean; meta: Meta; status: typeof FetchIndicesAPILogic.values.status; @@ -149,15 +93,7 @@ export const IndicesLogic = kea>({ ], indices: [ () => [selectors.data], - (data) => - data?.indices - ? data.indices.map((index: ElasticsearchIndexWithIngestion) => ({ - ...index, - ingestionMethod: getIngestionMethod(index), - ingestionStatus: getIngestionStatus(index, getIngestionMethod(index)), - lastUpdated: index.connector ? index.connector.last_synced ?? 'never' : null, - })) - : [], + (data) => (data?.indices ? data.indices.map(indexToViewIndex) : []), ], isLoading: [ () => [selectors.status], diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx index ec77e8f1a6ce3..c8b7f4283bcf0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_indices/indices_table.tsx @@ -24,8 +24,8 @@ import { Meta } from '../../../../../common/types'; import { EuiLinkTo, EuiButtonIconTo } from '../../../shared/react_router_helpers'; import { convertMetaToPagination } from '../../../shared/table_pagination'; import { SEARCH_INDEX_PATH } from '../../routes'; - -import { ViewSearchIndex, IngestionMethod, IngestionStatus } from './indices_logic'; +import { ElasticsearchViewIndex, IngestionMethod, IngestionStatus } from '../../types'; +import { ingestionMethodToText } from '../../utils/indices'; const healthColorsMap = { green: 'success', @@ -34,29 +34,7 @@ const healthColorsMap = { yellow: 'warning', }; -function ingestionMethodToText(ingestionMethod: IngestionMethod) { - if (ingestionMethod === IngestionMethod.CONNECTOR) { - return i18n.translate( - 'xpack.enterpriseSearch.content.searchIndices.ingestionMethod.connector.label', - { - defaultMessage: 'Connector', - } - ); - } - if (ingestionMethod === IngestionMethod.CRAWLER) { - return i18n.translate( - 'xpack.enterpriseSearch.content.searchIndices.ingestionMethod.crawler.label', - { - defaultMessage: 'Crawler', - } - ); - } - return i18n.translate('xpack.enterpriseSearch.content.searchIndices.ingestionMethod.api.label', { - defaultMessage: 'API', - }); -} - -const columns: Array> = [ +const columns: Array> = [ { field: 'name', name: i18n.translate('xpack.enterpriseSearch.content.searchIndices.name.columnTitle', { @@ -207,10 +185,10 @@ const columns: Array> = [ ]; interface IndicesTableProps { - indices: ViewSearchIndex[]; + indices: ElasticsearchViewIndex[]; isLoading: boolean; meta: Meta; - onChange: (criteria: CriteriaWithPagination) => void; + onChange: (criteria: CriteriaWithPagination) => void; } export const IndicesTable: React.FC = ({ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/types.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/types.ts index 8ff7dc30f34ea..9120a3b055b61 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/types.ts @@ -5,6 +5,35 @@ * 2.0. */ +import { ConnectorIndex, CrawlerIndex, ElasticsearchIndex } from '../../../common/types/indices'; + export interface Crawler { domains: []; } + +export const enum IngestionMethod { + CONNECTOR, + CRAWLER, + API, +} + +export const enum IngestionStatus { + CONNECTED, + ERROR, + SYNC_ERROR, + INCOMPLETE, +} + +interface ElasticsearchViewIndexExtension { + ingestionMethod: IngestionMethod; + ingestionStatus: IngestionStatus; + lastUpdated: string | 'never' | null; // date string +} + +export type ConnectorViewIndex = ConnectorIndex & ElasticsearchViewIndexExtension; + +export type CrawlerViewIndex = CrawlerIndex & ElasticsearchViewIndexExtension; + +export type ApiViewIndex = ElasticsearchIndex & ElasticsearchViewIndexExtension; + +export type ElasticsearchViewIndex = CrawlerViewIndex | ConnectorViewIndex | ApiViewIndex; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts new file mode 100644 index 0000000000000..e02f67964b764 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.test.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { connectorIndex, crawlerIndex, apiIndex } from '../__mocks__/view_index.mock'; + +import moment from 'moment'; + +import { ConnectorStatus, SyncStatus } from '../../../../common/types/connectors'; +import { IngestionMethod, IngestionStatus } from '../types'; + +import { + getIngestionMethod, + getIngestionStatus, + getLastUpdated, + indexToViewIndex, +} from './indices'; + +describe('Indices util functions', () => { + describe('getIngestionMethod', () => { + it('should return correct ingestion method for connector', () => { + expect(getIngestionMethod(connectorIndex)).toEqual(IngestionMethod.CONNECTOR); + }); + it('should return correct ingestion method for crawler', () => { + expect(getIngestionMethod(crawlerIndex)).toEqual(IngestionMethod.CRAWLER); + }); + it('should return correct ingestion method for API', () => { + expect(getIngestionMethod(apiIndex)).toEqual(IngestionMethod.API); + }); + it('should return API for undefined index', () => { + expect(getIngestionMethod(undefined)).toEqual(IngestionMethod.API); + }); + }); + describe('getIngestionStatus', () => { + it('should return connected for API', () => { + expect(getIngestionStatus(apiIndex)).toEqual(IngestionStatus.CONNECTED); + }); + it('should return connected for undefined', () => { + expect(getIngestionStatus(undefined)).toEqual(IngestionStatus.CONNECTED); + }); + it('should return incomplete for incomplete connector', () => { + expect(getIngestionStatus(connectorIndex)).toEqual(IngestionStatus.INCOMPLETE); + }); + it('should return connected for complete connector', () => { + expect( + getIngestionStatus({ + ...connectorIndex, + connector: { ...connectorIndex.connector, status: ConnectorStatus.CONNECTED }, + }) + ).toEqual(IngestionStatus.CONNECTED); + }); + it('should return error for connector that last checked in more than 30 minutes ago', () => { + const lastSeen = moment().subtract(31, 'minutes').format(); + expect( + getIngestionStatus({ + ...connectorIndex, + connector: { + ...connectorIndex.connector, + last_seen: lastSeen, + status: ConnectorStatus.CONNECTED, + }, + }) + ).toEqual(IngestionStatus.ERROR); + }); + it('should return sync error for complete connector with sync error', () => { + expect( + getIngestionStatus({ + ...connectorIndex, + connector: { + ...connectorIndex.connector, + last_sync_status: SyncStatus.ERROR, + status: ConnectorStatus.NEEDS_CONFIGURATION, + }, + }) + ).toEqual(IngestionStatus.SYNC_ERROR); + }); + it('should return error for connector with error', () => { + expect( + getIngestionStatus({ + ...connectorIndex, + connector: { + ...connectorIndex.connector, + last_sync_status: SyncStatus.COMPLETED, + status: ConnectorStatus.ERROR, + }, + }) + ).toEqual(IngestionStatus.ERROR); + }); + }); + describe('getLastUpdated', () => { + it('should return never for connector with no last updated time', () => { + expect(getLastUpdated(connectorIndex)).toEqual('never'); + }); + it('should return last_synced for connector with no last updated time', () => { + expect( + getLastUpdated({ + ...connectorIndex, + connector: { ...connectorIndex.connector, last_synced: 'last_synced' }, + }) + ).toEqual('last_synced'); + }); + it('should return null for api', () => { + expect(getLastUpdated(apiIndex)).toEqual(null); + }); + }); + describe('indexToViewIndex', () => { + it('should apply above transformations to viewIndex', () => { + expect(indexToViewIndex(connectorIndex)).toEqual({ + ...connectorIndex, + ingestionMethod: getIngestionMethod(connectorIndex), + ingestionStatus: getIngestionStatus(connectorIndex), + lastUpdated: getLastUpdated(connectorIndex), + }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts new file mode 100644 index 0000000000000..30bf0fc2b5d51 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/indices.ts @@ -0,0 +1,135 @@ +/* + * Copyright 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 { i18n } from '@kbn/i18n'; + +import { SyncStatus, ConnectorStatus } from '../../../../common/types/connectors'; +import { + ConnectorIndex, + CrawlerIndex, + ElasticsearchIndexWithIngestion, +} from '../../../../common/types/indices'; + +import { + ApiViewIndex, + ConnectorViewIndex, + CrawlerViewIndex, + ElasticsearchViewIndex, + IngestionMethod, + IngestionStatus, +} from '../types'; + +export function isConnectorIndex( + index: ElasticsearchIndexWithIngestion | undefined +): index is ConnectorIndex { + return !!(index as ConnectorIndex)?.connector; +} + +export function isCrawlerIndex( + index: ElasticsearchIndexWithIngestion | undefined +): index is CrawlerIndex { + return !!(index as CrawlerIndex)?.crawler; +} + +export function isApiIndex(index: ElasticsearchIndexWithIngestion | undefined): boolean { + if (!index) { + return false; + } + return !isConnectorIndex(index) && !isCrawlerIndex(index); +} + +export function isConnectorViewIndex(index: ElasticsearchViewIndex): index is ConnectorViewIndex { + return !!(index as ConnectorViewIndex)?.connector; +} + +export function isCrawlerViewIndex(index: ElasticsearchViewIndex): index is CrawlerViewIndex { + return !!(index as CrawlerViewIndex)?.crawler; +} + +export function isApiViewIndex(index: ElasticsearchViewIndex): index is ApiViewIndex { + return !!index && !isConnectorViewIndex(index) && !isCrawlerViewIndex(index); +} + +export function getIngestionMethod(index?: ElasticsearchIndexWithIngestion): IngestionMethod { + if (!index) return IngestionMethod.API; + if (isConnectorIndex(index)) { + return IngestionMethod.CONNECTOR; + } + if (isCrawlerIndex(index)) { + return IngestionMethod.CRAWLER; + } + return IngestionMethod.API; +} + +export function getIngestionStatus(index?: ElasticsearchIndexWithIngestion): IngestionStatus { + if (!index || isApiIndex(index)) { + return IngestionStatus.CONNECTED; + } + if (isConnectorIndex(index)) { + if ( + index.connector.last_seen && + moment(index.connector.last_seen).isBefore(moment().subtract(30, 'minutes')) + ) { + return IngestionStatus.ERROR; + } + if (index.connector.last_sync_status === SyncStatus.ERROR) { + return IngestionStatus.SYNC_ERROR; + } + if (index.connector.status === ConnectorStatus.CONNECTED) { + return IngestionStatus.CONNECTED; + } + if (index.connector.status === ConnectorStatus.ERROR) { + return IngestionStatus.ERROR; + } + } + return IngestionStatus.INCOMPLETE; +} + +export function getLastUpdated(index?: ElasticsearchIndexWithIngestion): string | null { + return isConnectorIndex(index) ? index.connector.last_synced ?? 'never' : null; +} + +export function indexToViewIndex(index: ConnectorIndex): ConnectorViewIndex; +export function indexToViewIndex(index: CrawlerIndex): CrawlerViewIndex; +export function indexToViewIndex(index: ElasticsearchIndexWithIngestion): ApiViewIndex { + const extraFields = { + ingestionMethod: getIngestionMethod(index), + ingestionStatus: getIngestionStatus(index), + lastUpdated: getLastUpdated(index), + }; + if (isConnectorIndex(index)) { + const connectorResult: ConnectorViewIndex = { ...index, ...extraFields }; + return connectorResult; + } + if (isCrawlerIndex(index)) { + const crawlerResult: CrawlerViewIndex = { ...index, ...extraFields }; + return crawlerResult; + } + const apiResult: ApiViewIndex = { ...index, ...extraFields }; + return apiResult; +} + +export function ingestionMethodToText(ingestionMethod: IngestionMethod) { + if (ingestionMethod === IngestionMethod.CONNECTOR) { + return i18n.translate( + 'xpack.enterpriseSearch.content.searchIndices.ingestionMethod.connector', + { + defaultMessage: 'Connector', + } + ); + } + if (ingestionMethod === IngestionMethod.CRAWLER) { + return i18n.translate('xpack.enterpriseSearch.content.searchIndices.ingestionMethod.crawler', { + defaultMessage: 'Crawler', + }); + } + return i18n.translate('xpack.enterpriseSearch.content.searchIndices.ingestionMethod.api', { + defaultMessage: 'API', + }); +} diff --git a/x-pack/plugins/enterprise_search/server/index_management/setup_indices.test.ts b/x-pack/plugins/enterprise_search/server/index_management/setup_indices.test.ts index 8e9376ecc19c6..3a3354335e109 100644 --- a/x-pack/plugins/enterprise_search/server/index_management/setup_indices.test.ts +++ b/x-pack/plugins/enterprise_search/server/index_management/setup_indices.test.ts @@ -72,7 +72,7 @@ describe('Setup Indices', () => { }, indexed_document_count: { type: 'integer' }, status: { - type: 'object', + type: 'keyword', }, worker_hostname: { type: 'keyword' }, }, diff --git a/x-pack/plugins/enterprise_search/server/index_management/setup_indices.ts b/x-pack/plugins/enterprise_search/server/index_management/setup_indices.ts index 5f911c8536701..a8b4f7a1a14af 100644 --- a/x-pack/plugins/enterprise_search/server/index_management/setup_indices.ts +++ b/x-pack/plugins/enterprise_search/server/index_management/setup_indices.ts @@ -78,7 +78,7 @@ const indices: IndexDefinition[] = [ }, indexed_document_count: { type: 'integer' }, status: { - type: 'object', + type: 'keyword', }, worker_hostname: { type: 'keyword' }, }, diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.test.ts new file mode 100644 index 0000000000000..a1212fc04fdce --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX } from '../..'; +import { ErrorCode } from '../../../common/types/error_codes'; + +import { startConnectorSync } from './start_sync'; + +describe('addConnector lib function', () => { + const mockClient = { + asCurrentUser: { + get: jest.fn(), + index: jest.fn(), + indices: { + refresh: jest.fn(), + }, + }, + asInternalUser: {}, + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should start a sync', async () => { + mockClient.asCurrentUser.get.mockImplementationOnce(() => { + return Promise.resolve({ + _source: { + api_key_id: null, + configuration: {}, + created_at: null, + index_name: 'index_name', + last_seen: null, + last_sync_error: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: false, + }, + index: CONNECTORS_INDEX, + }); + }); + mockClient.asCurrentUser.index.mockImplementation(() => ({ _id: 'fakeId' })); + + await expect( + startConnectorSync(mockClient as unknown as IScopedClusterClient, 'connectorId') + ).resolves.toEqual({ _id: 'fakeId' }); + expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ + document: { + api_key_id: null, + configuration: {}, + created_at: null, + index_name: 'index_name', + last_seen: null, + last_sync_error: null, + last_sync_status: null, + last_synced: null, + scheduling: { enabled: true, interval: '1 2 3 4 5' }, + service_type: null, + status: 'not connected', + sync_now: true, + }, + id: 'connectorId', + index: CONNECTORS_INDEX, + }); + expect(mockClient.asCurrentUser.indices.refresh).toHaveBeenCalledWith({ + index: CONNECTORS_INDEX, + }); + }); + + it('should not create index if there is no connector', async () => { + mockClient.asCurrentUser.get.mockImplementationOnce(() => { + return Promise.resolve({}); + }); + await expect( + startConnectorSync(mockClient as unknown as IScopedClusterClient, 'connectorId') + ).rejects.toEqual(new Error(ErrorCode.RESOURCE_NOT_FOUND)); + expect(mockClient.asCurrentUser.index).not.toHaveBeenCalled(); + }); +}); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts new file mode 100644 index 0000000000000..d52bb2de6751d --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/start_sync.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core/server'; + +import { CONNECTORS_INDEX } from '../..'; + +import { ConnectorDocument } from '../../../common/types/connectors'; +import { ErrorCode } from '../../../common/types/error_codes'; + +export const startConnectorSync = async (client: IScopedClusterClient, connectorId: string) => { + const connectorResult = await client.asCurrentUser.get({ + id: connectorId, + index: CONNECTORS_INDEX, + }); + const connector = connectorResult._source; + if (connector) { + const result = await client.asCurrentUser.index({ + document: { ...connector, sync_now: true }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + return result; + } else { + throw new Error(ErrorCode.RESOURCE_NOT_FOUND); + } +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts index fe0cea4e09a56..86845b090bf93 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.test.ts @@ -16,6 +16,9 @@ describe('addConnector lib function', () => { asCurrentUser: { get: jest.fn(), index: jest.fn(), + indices: { + refresh: jest.fn(), + }, }, asInternalUser: {}, }; @@ -36,7 +39,7 @@ describe('addConnector lib function', () => { last_sync_error: null, last_sync_status: null, last_synced: null, - scheduling: { enabled: true, interval: '1 2 3 4 5' }, + scheduling: { enabled: false, interval: '* * * * *' }, service_type: null, status: 'not connected', sync_now: false, @@ -70,9 +73,12 @@ describe('addConnector lib function', () => { id: 'connectorId', index: CONNECTORS_INDEX, }); + expect(mockClient.asCurrentUser.indices.refresh).toHaveBeenCalledWith({ + index: CONNECTORS_INDEX, + }); }); - it('should not create index if there is no connector', async () => { + it('should not index document if there is no connector', async () => { mockClient.asCurrentUser.get.mockImplementationOnce(() => { return Promise.resolve({}); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts index 3fe7e602148b5..3672c3b05344a 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/update_connector_scheduling.ts @@ -23,11 +23,13 @@ export const updateConnectorScheduling = async ( }); const connector = connectorResult._source; if (connector) { - return await client.asCurrentUser.index({ + const result = await client.asCurrentUser.index({ document: { ...connector, scheduling }, id: connectorId, index: CONNECTORS_INDEX, }); + await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); + return result; } else { throw new Error( i18n.translate('xpack.enterpriseSearch.server.connectors.scheduling.error', { diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index 8fd2cb0ed2bf4..035536c5480f2 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n'; import { ErrorCode } from '../../../common/types/error_codes'; import { addConnector } from '../../lib/connectors/add_connector'; +import { startConnectorSync } from '../../lib/connectors/start_sync'; import { updateConnectorConfiguration } from '../../lib/connectors/update_connector_configuration'; import { updateConnectorScheduling } from '../../lib/connectors/update_connector_scheduling'; @@ -124,4 +125,28 @@ export function registerConnectorRoutes({ router }: RouteDependencies) { } } ); + router.post( + { + path: '/internal/enterprise_search/connectors/{connectorId}/start_sync', + validate: { + params: schema.object({ + connectorId: schema.string(), + }), + }, + }, + async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + try { + await startConnectorSync(client, request.params.connectorId); + return response.ok(); + } catch (error) { + return response.customError({ + body: i18n.translate('xpack.enterpriseSearch.server.routes.updateConnector.error', { + defaultMessage: 'Error fetching data from Enterprise Search', + }), + statusCode: 502, + }); + } + } + ); } From c3649b822cf037056bb9c3b0f7ad4cc1bd879d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Fri, 22 Jul 2022 19:46:05 +0200 Subject: [PATCH 23/78] Prefer DataView client over SavedObjects client when possible (#136694) * Prefer DataView client over SavedObjects client when possible * Remove unused mock * Fix unit test * Fall back to dynamic data view * Post-rebase fix --- .../public/application/application.test.tsx | 4 - .../plugins/apm/public/application/index.tsx | 7 -- .../service_inventory.stories.tsx | 2 +- .../trace_explorer/trace_search_box/index.tsx | 4 +- .../components/shared/kuery_bar/index.tsx | 7 +- .../components/shared/search_bar.test.tsx | 9 +- .../apm_plugin/mock_apm_plugin_context.tsx | 1 + .../apm/public/hooks/use_apm_data_view.ts | 66 ++++++++++++ .../apm/public/hooks/use_dynamic_data_view.ts | 21 ---- .../apm/public/hooks/use_static_data_view.ts | 16 --- .../apm/public/services/rest/data_view.ts | 14 --- .../server/lib/helpers/setup_request.test.ts | 6 -- .../apm/server/lib/helpers/setup_request.ts | 4 +- .../data_view/create_static_data_view.test.ts | 57 +++++----- .../data_view/create_static_data_view.ts | 100 ++++++++++-------- .../data_view/get_apm_data_view_attributes.ts | 41 ------- .../routes/data_view/get_dynamic_data_view.ts | 66 ------------ .../apm/server/routes/data_view/route.ts | 66 +++++------- x-pack/plugins/apm/server/tutorial/index.ts | 20 ---- x-pack/plugins/apm/server/types.ts | 4 + .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../csm_shared_context/index.tsx | 10 +- .../app/rum_dashboard/ux_overview_fetchers.ts | 26 +++-- .../ux/public/hooks/use_dynamic_data_view.ts | 6 +- .../tests/data_view/static.spec.ts | 12 ++- 27 files changed, 228 insertions(+), 344 deletions(-) create mode 100644 x-pack/plugins/apm/public/hooks/use_apm_data_view.ts delete mode 100644 x-pack/plugins/apm/public/hooks/use_dynamic_data_view.ts delete mode 100644 x-pack/plugins/apm/public/hooks/use_static_data_view.ts delete mode 100644 x-pack/plugins/apm/public/services/rest/data_view.ts delete mode 100644 x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_attributes.ts delete mode 100644 x-pack/plugins/apm/server/routes/data_view/get_dynamic_data_view.ts diff --git a/x-pack/plugins/apm/public/application/application.test.tsx b/x-pack/plugins/apm/public/application/application.test.tsx index dd74d072c306d..62adf0b2cb355 100644 --- a/x-pack/plugins/apm/public/application/application.test.tsx +++ b/x-pack/plugins/apm/public/application/application.test.tsx @@ -18,10 +18,6 @@ import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { embeddablePluginMock } from '@kbn/embeddable-plugin/public/mocks'; import { ApmPluginSetupDeps, ApmPluginStartDeps } from '../plugin'; -jest.mock('../services/rest/data_view', () => ({ - createStaticDataView: () => Promise.resolve(undefined), -})); - describe('renderApp (APM)', () => { let mockConsole: jest.SpyInstance; beforeAll(() => { diff --git a/x-pack/plugins/apm/public/application/index.tsx b/x-pack/plugins/apm/public/application/index.tsx index b471655c6b7d5..1fff65f4746ad 100644 --- a/x-pack/plugins/apm/public/application/index.tsx +++ b/x-pack/plugins/apm/public/application/index.tsx @@ -18,7 +18,6 @@ import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; import { ConfigSchema } from '..'; import { ApmPluginSetupDeps, ApmPluginStartDeps } from '../plugin'; import { createCallApmApi } from '../services/rest/create_call_apm_api'; -import { createStaticDataView } from '../services/rest/data_view'; import { setHelpExtension } from '../set_help_extension'; import { setReadonlyBadge } from '../update_badge'; import { ApmAppRoot } from '../components/routing/app_root'; @@ -61,12 +60,6 @@ export const renderApp = ({ setReadonlyBadge(coreStart); createCallApmApi(coreStart); - // Automatically creates static data view and stores as saved object - createStaticDataView().catch((e) => { - // eslint-disable-next-line no-console - console.log('Error creating static data view', e); - }); - // add .kbnAppWrappers class to root element element.classList.add(APP_WRAPPER_CLASS); diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.stories.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.stories.tsx index cbda5f9d3ccfd..2cd79535afac5 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.stories.tsx @@ -36,11 +36,11 @@ const stories: Meta<{}> = { default: return {}; } - return {}; }, }, notifications: { toasts: { add: () => {}, addWarning: () => {} } }, uiSettings: { get: () => [] }, + dataViews: { get: async () => {} }, } as unknown as CoreStart; const KibanaReactContext = createKibanaReactContext(coreMock); diff --git a/x-pack/plugins/apm/public/components/app/trace_explorer/trace_search_box/index.tsx b/x-pack/plugins/apm/public/components/app/trace_explorer/trace_search_box/index.tsx index 4951a378c03c3..ad16bd7302220 100644 --- a/x-pack/plugins/apm/public/components/app/trace_explorer/trace_search_box/index.tsx +++ b/x-pack/plugins/apm/public/components/app/trace_explorer/trace_search_box/index.tsx @@ -19,7 +19,7 @@ import { TraceSearchQuery, TraceSearchType, } from '../../../../../common/trace_explorer'; -import { useStaticDataView } from '../../../../hooks/use_static_data_view'; +import { useApmDataView } from '../../../../hooks/use_apm_data_view'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { EQLCodeEditorSuggestionType } from '../../../shared/eql_code_editor/constants'; import { LazilyLoadedEQLCodeEditor } from '../../../shared/eql_code_editor/lazily_loaded_code_editor'; @@ -57,7 +57,7 @@ export function TraceSearchBox({ loading, }: Props) { const { unifiedSearch } = useApmPluginContext(); - const { value: dataView } = useStaticDataView(); + const { dataView } = useApmDataView(); return ( diff --git a/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx b/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx index cf39561a5037b..0d02d38792bf3 100644 --- a/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/kuery_bar/index.tsx @@ -16,7 +16,7 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { useLegacyUrlParams } from '../../../context/url_params_context/use_url_params'; import { useApmParams } from '../../../hooks/use_apm_params'; -import { useDynamicDataViewFetcher } from '../../../hooks/use_dynamic_data_view'; +import { useApmDataView } from '../../../hooks/use_apm_data_view'; import { fromQuery, toQuery } from '../links/url_helpers'; import { getBoolFilter } from './get_bool_filter'; // @ts-expect-error @@ -71,8 +71,7 @@ export function KueryBar(props: { }; const example = examples[processorEvent || 'defaults']; - - const { dataView } = useDynamicDataViewFetcher(); + const { dataView } = useApmDataView(); const placeholder = props.placeholder ?? @@ -106,7 +105,7 @@ export function KueryBar(props: { const suggestions = ( (await unifiedSearch.autocomplete.getQuerySuggestions({ language: 'kuery', - indexPatterns: [dataView as DataView], + indexPatterns: [dataView], boolFilter: props.boolFilter ?? getBoolFilter({ diff --git a/x-pack/plugins/apm/public/components/shared/search_bar.test.tsx b/x-pack/plugins/apm/public/components/shared/search_bar.test.tsx index d6fc9eb0eecb5..33a3646bf7529 100644 --- a/x-pack/plugins/apm/public/components/shared/search_bar.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/search_bar.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { getByTestId, fireEvent, getByText } from '@testing-library/react'; +import { getByTestId, fireEvent, getByText, act } from '@testing-library/react'; import { createMemoryHistory, MemoryHistory } from 'history'; import React from 'react'; import { Router } from 'react-router-dom'; @@ -37,6 +37,7 @@ function setup({ const KibanaReactContext = createKibanaReactContext({ usageCollection: { reportUiCounter: () => {} }, + dataViews: { get: async () => {} }, } as Partial); // mock transaction types @@ -91,7 +92,7 @@ describe('when transactionType is selected and multiple transaction types are gi expect(dropdown).toHaveValue('secondType'); }); - it('should update the URL when a transaction type is selected', () => { + it('should update the URL when a transaction type is selected', async () => { const { container } = setup({ history, serviceTransactionTypes: ['firstType', 'secondType'], @@ -112,7 +113,9 @@ describe('when transactionType is selected and multiple transaction types are gi expect(getByText(dropdown, 'secondType')).toBeInTheDocument(); // change dropdown value - fireEvent.change(dropdown, { target: { value: 'firstType' } }); + await act(async () => { + fireEvent.change(dropdown, { target: { value: 'firstType' } }); + }); // assert that value was changed expect(dropdown).toHaveValue('firstType'); diff --git a/x-pack/plugins/apm/public/context/apm_plugin/mock_apm_plugin_context.tsx b/x-pack/plugins/apm/public/context/apm_plugin/mock_apm_plugin_context.tsx index 6b0d75fbe4178..e9f7bda8de236 100644 --- a/x-pack/plugins/apm/public/context/apm_plugin/mock_apm_plugin_context.tsx +++ b/x-pack/plugins/apm/public/context/apm_plugin/mock_apm_plugin_context.tsx @@ -28,6 +28,7 @@ const mockCore = merge({}, coreStart, { capabilities: { apm: {}, ml: {}, + savedObjectsManagement: { edit: true }, }, }, uiSettings: { diff --git a/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts b/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts new file mode 100644 index 0000000000000..9d4ef214ff5ef --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_apm_data_view.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DataView } from '@kbn/data-views-plugin/common'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { SavedObjectNotFound } from '@kbn/kibana-utils-plugin/common'; +import { useEffect, useState } from 'react'; +import { APM_STATIC_DATA_VIEW_ID } from '../../common/data_view_constants'; +import { useApmPluginContext } from '../context/apm_plugin/use_apm_plugin_context'; +import { ApmPluginStartDeps } from '../plugin'; +import { callApmApi } from '../services/rest/create_call_apm_api'; + +async function createStaticApmDataView() { + const res = await callApmApi('POST /internal/apm/data_view/static', { + signal: null, + }); + return res.dataView; +} + +async function getApmDataViewTitle() { + const res = await callApmApi('GET /internal/apm/data_view/title', { + signal: null, + }); + return res.apmDataViewTitle; +} + +export function useApmDataView() { + const { services } = useKibana(); + const { core } = useApmPluginContext(); + const [dataView, setDataView] = useState(); + + const canCreateDataView = + core.application.capabilities.savedObjectsManagement.edit; + + useEffect(() => { + async function fetchDataView() { + try { + // load static data view + return await services.dataViews.get(APM_STATIC_DATA_VIEW_ID); + } catch (e) { + // re-throw if an unhandled error occurred + const notFound = e instanceof SavedObjectNotFound; + if (!notFound) { + throw e; + } + + // create static data view if user has permissions + if (canCreateDataView) { + return createStaticApmDataView(); + } else { + // or create dynamic data view if user does not have permissions to create a static + const title = await getApmDataViewTitle(); + return services.dataViews.create({ title }); + } + } + } + + fetchDataView().then((dv) => setDataView(dv)); + }, [canCreateDataView, services.dataViews]); + + return { dataView }; +} diff --git a/x-pack/plugins/apm/public/hooks/use_dynamic_data_view.ts b/x-pack/plugins/apm/public/hooks/use_dynamic_data_view.ts deleted file mode 100644 index 04d289d9e49a2..0000000000000 --- a/x-pack/plugins/apm/public/hooks/use_dynamic_data_view.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useFetcher } from './use_fetcher'; - -export function useDynamicDataViewFetcher() { - const { data, status } = useFetcher((callApmApi) => { - return callApmApi('GET /internal/apm/data_view/dynamic', { - isCachable: true, - }); - }, []); - - return { - dataView: data?.dynamicDataView, - status, - }; -} diff --git a/x-pack/plugins/apm/public/hooks/use_static_data_view.ts b/x-pack/plugins/apm/public/hooks/use_static_data_view.ts deleted file mode 100644 index 4281f7cac83c8..0000000000000 --- a/x-pack/plugins/apm/public/hooks/use_static_data_view.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import useAsync from 'react-use/lib/useAsync'; -import { useApmPluginContext } from '../context/apm_plugin/use_apm_plugin_context'; -import { APM_STATIC_DATA_VIEW_ID } from '../../common/data_view_constants'; - -export function useStaticDataView() { - const { dataViews } = useApmPluginContext(); - - return useAsync(() => dataViews.get(APM_STATIC_DATA_VIEW_ID)); -} diff --git a/x-pack/plugins/apm/public/services/rest/data_view.ts b/x-pack/plugins/apm/public/services/rest/data_view.ts deleted file mode 100644 index 016c1c905b008..0000000000000 --- a/x-pack/plugins/apm/public/services/rest/data_view.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { callApmApi } from './create_call_apm_api'; - -export const createStaticDataView = async () => { - return await callApmApi('POST /internal/apm/data_view/static', { - signal: null, - }); -}; diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts index 818f999754610..db4825680eae0 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts @@ -25,12 +25,6 @@ jest.mock('../../routes/settings/apm_indices/get_apm_indices', () => ({ } as Awaited>), })); -jest.mock('../../routes/data_view/get_dynamic_data_view', () => ({ - getDynamicDataView: async () => { - return; - }, -})); - function getMockResources() { const esClientMock = elasticsearchServiceMock.createScopedClusterClient(); // @ts-expect-error incomplete definition diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts index 2701d754350f5..9d6a716c8b3ed 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts @@ -51,7 +51,9 @@ export async function setupRequest({ config, }), withApmSpan('get_ui_settings', () => - coreContext.uiSettings.client.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN) + coreContext.uiSettings.client.get( + UI_SETTINGS.SEARCH_INCLUDE_FROZEN + ) ), ]); diff --git a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts index d42a5a7eb3a9b..c7e22eba054b9 100644 --- a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts +++ b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.test.ts @@ -8,18 +8,16 @@ import { createStaticDataView } from './create_static_data_view'; import { Setup } from '../../lib/helpers/setup_request'; import * as HistoricalAgentData from '../historical_data/has_historical_agent_data'; -import { InternalSavedObjectsClient } from '../../lib/helpers/get_internal_saved_objects_client'; import { APMConfig } from '../..'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; -function getMockSavedObjectsClient(existingDataViewTitle: string) { +function getMockedDataViewService(existingDataViewTitle: string) { return { get: jest.fn(() => ({ - attributes: { - title: existingDataViewTitle, - }, + title: existingDataViewTitle, })), - create: jest.fn(), - } as unknown as InternalSavedObjectsClient; + createAndSave: jest.fn(), + } as unknown as DataViewsService; } const setup = { @@ -33,14 +31,13 @@ const setup = { describe('createStaticDataView', () => { it(`should not create data view if 'xpack.apm.autocreateApmIndexPattern=false'`, async () => { - const savedObjectsClient = getMockSavedObjectsClient('apm-*'); + const dataViewService = getMockedDataViewService('apm-*'); await createStaticDataView({ setup, config: { autoCreateApmDataView: false } as APMConfig, - savedObjectsClient, - spaceId: 'default', + dataViewService, }); - expect(savedObjectsClient.create).not.toHaveBeenCalled(); + expect(dataViewService.createAndSave).not.toHaveBeenCalled(); }); it(`should not create data view if no APM data is found`, async () => { @@ -49,15 +46,14 @@ describe('createStaticDataView', () => { .spyOn(HistoricalAgentData, 'hasHistoricalAgentData') .mockResolvedValue(false); - const savedObjectsClient = getMockSavedObjectsClient('apm-*'); + const dataViewService = getMockedDataViewService('apm-*'); await createStaticDataView({ setup, config: { autoCreateApmDataView: true } as APMConfig, - savedObjectsClient, - spaceId: 'default', + dataViewService, }); - expect(savedObjectsClient.create).not.toHaveBeenCalled(); + expect(dataViewService.createAndSave).not.toHaveBeenCalled(); }); it(`should create data view`, async () => { @@ -66,16 +62,15 @@ describe('createStaticDataView', () => { .spyOn(HistoricalAgentData, 'hasHistoricalAgentData') .mockResolvedValue(true); - const savedObjectsClient = getMockSavedObjectsClient('apm-*'); + const dataViewService = getMockedDataViewService('apm-*'); await createStaticDataView({ setup, config: { autoCreateApmDataView: true } as APMConfig, - savedObjectsClient, - spaceId: 'default', + dataViewService, }); - expect(savedObjectsClient.create).toHaveBeenCalled(); + expect(dataViewService.createAndSave).toHaveBeenCalled(); }); it(`should overwrite the data view if the new data view title does not match the old data view title`, async () => { @@ -84,25 +79,24 @@ describe('createStaticDataView', () => { .spyOn(HistoricalAgentData, 'hasHistoricalAgentData') .mockResolvedValue(true); - const savedObjectsClient = getMockSavedObjectsClient('apm-*'); + const dataViewService = getMockedDataViewService('apm-*'); const expectedDataViewTitle = 'apm-*-transaction-*,apm-*-span-*,apm-*-error-*,apm-*-metrics-*'; await createStaticDataView({ setup, config: { autoCreateApmDataView: true } as APMConfig, - savedObjectsClient, - spaceId: 'default', + dataViewService, }); - expect(savedObjectsClient.get).toHaveBeenCalled(); - expect(savedObjectsClient.create).toHaveBeenCalled(); + expect(dataViewService.get).toHaveBeenCalled(); + expect(dataViewService.createAndSave).toHaveBeenCalled(); // @ts-ignore - expect(savedObjectsClient.create.mock.calls[0][1].title).toBe( + expect(dataViewService.createAndSave.mock.calls[0][0].title).toBe( expectedDataViewTitle ); // @ts-ignore - expect(savedObjectsClient.create.mock.calls[0][2].overwrite).toBe(true); + expect(dataViewService.createAndSave.mock.calls[0][1]).toBe(true); }); it(`should not overwrite an data view if the new data view title matches the old data view title`, async () => { @@ -111,20 +105,17 @@ describe('createStaticDataView', () => { .spyOn(HistoricalAgentData, 'hasHistoricalAgentData') .mockResolvedValue(true); - const savedObjectsClient = getMockSavedObjectsClient( + const dataViewService = getMockedDataViewService( 'apm-*-transaction-*,apm-*-span-*,apm-*-error-*,apm-*-metrics-*' ); await createStaticDataView({ setup, config: { autoCreateApmDataView: true } as APMConfig, - savedObjectsClient, - spaceId: 'default', + dataViewService, }); - expect(savedObjectsClient.get).toHaveBeenCalled(); - expect(savedObjectsClient.create).toHaveBeenCalled(); - // @ts-ignore - expect(savedObjectsClient.create.mock.calls[0][2].overwrite).toBe(false); + expect(dataViewService.get).toHaveBeenCalled(); + expect(dataViewService.createAndSave).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts index 4a0878a5dc135..6142791b45cc9 100644 --- a/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts +++ b/x-pack/plugins/apm/server/routes/data_view/create_static_data_view.ts @@ -6,95 +6,109 @@ */ import { SavedObjectsErrorHelpers } from '@kbn/core/server'; +import { DataView, DataViewsService } from '@kbn/data-views-plugin/common'; +import { + TRACE_ID, + TRANSACTION_ID, +} from '../../../common/elasticsearch_fieldnames'; import { APM_STATIC_DATA_VIEW_ID } from '../../../common/data_view_constants'; import { hasHistoricalAgentData } from '../historical_data/has_historical_agent_data'; -import { Setup } from '../../lib/helpers/setup_request'; -import { APMRouteHandlerResources } from '../typings'; -import { InternalSavedObjectsClient } from '../../lib/helpers/get_internal_saved_objects_client'; import { withApmSpan } from '../../utils/with_apm_span'; import { getApmDataViewTitle } from './get_apm_data_view_title'; -import { getApmDataViewAttributes } from './get_apm_data_view_attributes'; - -interface ApmDataViewAttributes { - title: string; -} +import { Setup } from '../../lib/helpers/setup_request'; +import { APMConfig } from '../..'; export async function createStaticDataView({ - setup, + dataViewService, config, - savedObjectsClient, - spaceId, + setup, }: { + dataViewService: DataViewsService; + config: APMConfig; setup: Setup; - config: APMRouteHandlerResources['config']; - savedObjectsClient: InternalSavedObjectsClient; - spaceId?: string; -}): Promise { +}): Promise { return withApmSpan('create_static_data_view', async () => { // don't auto-create APM data view if it's been disabled via the config if (!config.autoCreateApmDataView) { - return false; + return; } // Discover and other apps will throw errors if an data view exists without having matching indices. // The following ensures the data view is only created if APM data is found const hasData = await hasHistoricalAgentData(setup); if (!hasData) { - return false; + return; } const apmDataViewTitle = getApmDataViewTitle(setup.indices); - const forceOverwrite = await getForceOverwrite({ + const shouldCreateOrUpdate = await getShouldCreateOrUpdate({ apmDataViewTitle, - savedObjectsClient, + dataViewService, }); + if (!shouldCreateOrUpdate) { + return; + } + try { - await withApmSpan('create_index_pattern_saved_object', () => - savedObjectsClient.create( - 'index-pattern', - getApmDataViewAttributes(apmDataViewTitle), + return await withApmSpan('create_data_view', async () => { + const dataView = await dataViewService.createAndSave( { + allowNoIndex: true, id: APM_STATIC_DATA_VIEW_ID, - overwrite: forceOverwrite, - namespace: spaceId, - } - ) - ); + name: 'APM', + title: apmDataViewTitle, + timeFieldName: '@timestamp', - return true; + // link to APM from Discover + fieldFormats: { + [TRACE_ID]: { + id: 'url', + params: { + urlTemplate: 'apm/link-to/trace/{{value}}', + labelTemplate: '{{value}}', + }, + }, + [TRANSACTION_ID]: { + id: 'url', + params: { + urlTemplate: 'apm/link-to/transaction/{{value}}', + labelTemplate: '{{value}}', + }, + }, + }, + }, + true + ); + + return dataView; + }); } catch (e) { // if the data view (saved object) already exists a conflict error (code: 409) will be thrown // that error should be silenced if (SavedObjectsErrorHelpers.isConflictError(e)) { - return false; + return; } throw e; } }); } -// force an overwrite of the data view if the data view has been changed -async function getForceOverwrite({ - savedObjectsClient, +// only create data view if it doesn't exist or was changed +async function getShouldCreateOrUpdate({ + dataViewService, apmDataViewTitle, }: { - savedObjectsClient: InternalSavedObjectsClient; + dataViewService: DataViewsService; apmDataViewTitle: string; }) { try { - const existingDataView = - await savedObjectsClient.get( - 'index-pattern', - APM_STATIC_DATA_VIEW_ID - ); - - // if the existing data view does not matches the new one, force an update - return existingDataView.attributes.title !== apmDataViewTitle; + const existingDataView = await dataViewService.get(APM_STATIC_DATA_VIEW_ID); + return existingDataView.title !== apmDataViewTitle; } catch (e) { // ignore exception if the data view (saved object) is not found if (SavedObjectsErrorHelpers.isNotFoundError(e)) { - return false; + return true; } throw e; diff --git a/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_attributes.ts b/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_attributes.ts deleted file mode 100644 index b7b7b5333fc8e..0000000000000 --- a/x-pack/plugins/apm/server/routes/data_view/get_apm_data_view_attributes.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - TRACE_ID, - TRANSACTION_ID, -} from '../../../common/elasticsearch_fieldnames'; - -export function getApmDataViewAttributes(title: string) { - return { - // required fields (even if empty) - title, - fieldAttrs: '{}', - fields: '[]', - runtimeFieldMap: '{}', - timeFieldName: '@timestamp', - typeMeta: '{}', - - // link to APM from Discover - fieldFormatMap: JSON.stringify({ - [TRACE_ID]: { - id: 'url', - params: { - urlTemplate: 'apm/link-to/trace/{{value}}', - labelTemplate: '{{value}}', - }, - }, - [TRANSACTION_ID]: { - id: 'url', - params: { - urlTemplate: 'apm/link-to/transaction/{{value}}', - labelTemplate: '{{value}}', - }, - }, - }), - }; -} diff --git a/x-pack/plugins/apm/server/routes/data_view/get_dynamic_data_view.ts b/x-pack/plugins/apm/server/routes/data_view/get_dynamic_data_view.ts deleted file mode 100644 index 8d2c61cce4d81..0000000000000 --- a/x-pack/plugins/apm/server/routes/data_view/get_dynamic_data_view.ts +++ /dev/null @@ -1,66 +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 { IndexPatternsFetcher, FieldDescriptor } from '@kbn/data-plugin/server'; -import { APMRouteHandlerResources } from '../typings'; -import { withApmSpan } from '../../utils/with_apm_span'; -import { getApmIndices } from '../settings/apm_indices/get_apm_indices'; -import { getApmDataViewTitle } from './get_apm_data_view_title'; - -export interface DataViewTitleAndFields { - title: string; - timeFieldName: string; - fields: FieldDescriptor[]; -} - -export const getDynamicDataView = ({ - config, - context, - logger, -}: Pick) => { - return withApmSpan('get_dynamic_data_view', async () => { - const coreContext = await context.core; - const apmIndicies = await getApmIndices({ - savedObjectsClient: coreContext.savedObjects.client, - config, - }); - const dataViewTitle = getApmDataViewTitle(apmIndicies); - - const DataViewsFetcher = new IndexPatternsFetcher( - coreContext.elasticsearch.client.asCurrentUser - ); - - // Since `getDynamicDataView` is called in setup_request (and thus by every endpoint) - // and since `getFieldsForWildcard` will throw if the specified indices don't exist, - // we have to catch errors here to avoid all endpoints returning 500 for users without APM data - // (would be a bad first time experience) - try { - const fields = await DataViewsFetcher.getFieldsForWildcard({ - pattern: dataViewTitle, - }); - - const dataView: DataViewTitleAndFields = { - fields, - timeFieldName: '@timestamp', - title: dataViewTitle, - }; - - return dataView; - } catch (e) { - const notExists = e.output?.statusCode === 404; - if (notExists) { - logger.error( - `Could not get dynamic data view because indices "${dataViewTitle}" don't exist` - ); - return; - } - - // re-throw - throw e; - } - }); -}; diff --git a/x-pack/plugins/apm/server/routes/data_view/route.ts b/x-pack/plugins/apm/server/routes/data_view/route.ts index 4b2a3dbb7252d..a8c660c293d4c 100644 --- a/x-pack/plugins/apm/server/routes/data_view/route.ts +++ b/x-pack/plugins/apm/server/routes/data_view/route.ts @@ -5,69 +5,59 @@ * 2.0. */ -import { ISavedObjectsRepository } from '@kbn/core/server'; +import { DataView } from '@kbn/data-views-plugin/common'; import { createStaticDataView } from './create_static_data_view'; import { setupRequest } from '../../lib/helpers/setup_request'; -import { getDynamicDataView } from './get_dynamic_data_view'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; +import { getApmDataViewTitle } from './get_apm_data_view_title'; +import { getApmIndices } from '../settings/apm_indices/get_apm_indices'; const staticDataViewRoute = createApmServerRoute({ endpoint: 'POST /internal/apm/data_view/static', options: { tags: ['access:apm'] }, - handler: async (resources): Promise<{ created: boolean }> => { - const { + handler: async (resources): Promise<{ dataView: DataView | undefined }> => { + const setup = await setupRequest(resources); + const { context, plugins, request, config } = resources; + + const coreContext = await context.core; + const dataViewStart = await plugins.dataViews.start(); + const dataViewService = await dataViewStart.dataViewsServiceFactory( + coreContext.savedObjects.client, + coreContext.elasticsearch.client.asCurrentUser, request, - core, - plugins: { spaces }, - config, - } = resources; - - const setupPromise = setupRequest(resources); - const clientPromise = core - .start() - .then( - (coreStart): ISavedObjectsRepository => - coreStart.savedObjects.createInternalRepository() - ); - - const setup = await setupPromise; - const savedObjectsClient = await clientPromise; - - const spaceId = spaces?.setup.spacesService.getSpaceId(request); + true + ); - const didCreateDataView = await createStaticDataView({ - setup, + const dataView = await createStaticDataView({ + dataViewService, config, - savedObjectsClient, - spaceId, + setup, }); - return { created: didCreateDataView }; + return { dataView }; }, }); -const dynamicDataViewRoute = createApmServerRoute({ - endpoint: 'GET /internal/apm/data_view/dynamic', +const dataViewTitleRoute = createApmServerRoute({ + endpoint: 'GET /internal/apm/data_view/title', options: { tags: ['access:apm'] }, handler: async ({ context, config, logger, - }): Promise<{ - dynamicDataView: - | import('./get_dynamic_data_view').DataViewTitleAndFields - | undefined; - }> => { - const dynamicDataView = await getDynamicDataView({ - context, + }): Promise<{ apmDataViewTitle: string }> => { + const coreContext = await context.core; + const apmIndicies = await getApmIndices({ + savedObjectsClient: coreContext.savedObjects.client, config, - logger, }); - return { dynamicDataView }; + const apmDataViewTitle = getApmDataViewTitle(apmIndicies); + + return { apmDataViewTitle }; }, }); export const dataViewRouteRepository = { ...staticDataViewRoute, - ...dynamicDataViewRoute, + ...dataViewTitleRoute, }; diff --git a/x-pack/plugins/apm/server/tutorial/index.ts b/x-pack/plugins/apm/server/tutorial/index.ts index e211e708c8ab3..24d1c1d048a25 100644 --- a/x-pack/plugins/apm/server/tutorial/index.ts +++ b/x-pack/plugins/apm/server/tutorial/index.ts @@ -13,9 +13,6 @@ import { } from '@kbn/home-plugin/server'; import { CloudSetup } from '@kbn/cloud-plugin/server'; import { APMConfig } from '..'; -import { APM_STATIC_DATA_VIEW_ID } from '../../common/data_view_constants'; -import { getApmDataViewAttributes } from '../routes/data_view/get_apm_data_view_attributes'; -import { getApmDataViewTitle } from '../routes/data_view/get_apm_data_view_title'; import { ApmIndicesConfig } from '../routes/settings/apm_indices/get_apm_indices'; import { createElasticCloudInstructions } from './envs/elastic_cloud'; import { onPremInstructions } from './envs/on_prem'; @@ -39,15 +36,6 @@ export const tutorialProvider = isFleetPluginEnabled: boolean; }) => () => { - const dataViewTitle = getApmDataViewTitle(apmIndices); - const savedObjects = [ - { - id: APM_STATIC_DATA_VIEW_ID, - attributes: getApmDataViewAttributes(dataViewTitle), - type: 'index-pattern', - }, - ]; - const artifacts: ArtifactsSchema = { dashboards: [ { @@ -109,13 +97,5 @@ It allows you to monitor the performance of thousands of applications in real ti cloudSetup: cloud, }), previewImagePath: '/plugins/apm/assets/apm.png', - savedObjects, - savedObjectsInstallMsg: i18n.translate( - 'xpack.apm.tutorial.specProvider.savedObjectsInstallMsg', - { - defaultMessage: - 'An APM data view is required for some features in the APM UI.', - } - ), } as TutorialSchema; }; diff --git a/x-pack/plugins/apm/server/types.ts b/x-pack/plugins/apm/server/types.ts index 73258ef2008fa..6353e0070160c 100644 --- a/x-pack/plugins/apm/server/types.ts +++ b/x-pack/plugins/apm/server/types.ts @@ -50,6 +50,8 @@ import { FleetStartContract as FleetPluginStart, } from '@kbn/fleet-plugin/server'; import { InfraPluginStart, InfraPluginSetup } from '@kbn/infra-plugin/server'; +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; + import { APMConfig } from '.'; import { ApmIndicesConfig } from './routes/settings/apm_indices/get_apm_indices'; import { APMEventClient } from './lib/helpers/create_es_client/create_apm_event_client'; @@ -73,6 +75,7 @@ export interface APMPluginSetupDependencies { observability: ObservabilityPluginSetup; ruleRegistry: RuleRegistryPluginSetupContract; infra: InfraPluginSetup; + dataViews: {}; // optional dependencies actions?: ActionsPlugin['setup']; @@ -95,6 +98,7 @@ export interface APMPluginStartDependencies { observability: undefined; ruleRegistry: RuleRegistryPluginStartContract; infra: InfraPluginStart; + dataViews: DataViewsServerPluginStart; // optional dependencies actions?: ActionsPlugin['start']; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 15972429c1e9c..eb750081cc79e 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -8565,7 +8565,6 @@ "xpack.apm.tutorial.specProvider.artifacts.dashboards.linkLabel": "Tableau de bord APM", "xpack.apm.tutorial.specProvider.longDescription": "Le monitoring des performances applicatives (APM) collecte les indicateurs et les erreurs de performance approfondies depuis votre application. Cela vous permet de monitorer les performances de milliers d'applications en temps réel. [Learn more]({learnMoreLink}).", "xpack.apm.tutorial.specProvider.name": "APM", - "xpack.apm.tutorial.specProvider.savedObjectsInstallMsg": "Une vue de données APM est requise pour certaines fonctionnalités de l'interface utilisateur APM.", "xpack.apm.tutorial.startServer.textPre": "Le serveur traite et conserve les indicateurs de performances de l'application dans Elasticsearch.", "xpack.apm.tutorial.startServer.title": "Lancer le serveur APM", "xpack.apm.tutorial.windowsServerInstructions.textPost": "Remarque : si l'exécution du script est désactivée dans votre système, vous devez définir la politique d'exécution de la session en cours de sorte que l'exécution du script soit autorisée. Par exemple : {command}.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index e53a85804b10c..00b76f08c4060 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8557,7 +8557,6 @@ "xpack.apm.tutorial.specProvider.artifacts.dashboards.linkLabel": "APM ダッシュボード", "xpack.apm.tutorial.specProvider.longDescription": "アプリケーションパフォーマンスモニタリング(APM)は、アプリケーション内から詳細なパフォーマンスメトリックやエラーを収集します。何千ものアプリケーションのパフォーマンスをリアルタイムで監視できます。[詳細]({learnMoreLink})。", "xpack.apm.tutorial.specProvider.name": "APM", - "xpack.apm.tutorial.specProvider.savedObjectsInstallMsg": "APM UIの機能にはAPMデータビューが必要なものがあります。", "xpack.apm.tutorial.startServer.textPre": "サーバーは、Elasticsearch アプリケーションのパフォーマンスメトリックを処理し保存します。", "xpack.apm.tutorial.startServer.title": "APM Server の起動", "xpack.apm.tutorial.windowsServerInstructions.textPost": "注:システムでスクリプトの実行が無効な場合、スクリプトを実行するために現在のセッションの実行ポリシーの設定が必要となります。例:{command}。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 78d5e28908baa..e512a3b01fe36 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8571,7 +8571,6 @@ "xpack.apm.tutorial.specProvider.artifacts.dashboards.linkLabel": "APM 仪表板", "xpack.apm.tutorial.specProvider.longDescription": "应用程序性能监测 (APM) 从您的应用程序内收集深入全面的性能指标和错误。其允许您实时监测数以千计的应用程序的性能。[了解详情]({learnMoreLink})。", "xpack.apm.tutorial.specProvider.name": "APM", - "xpack.apm.tutorial.specProvider.savedObjectsInstallMsg": "APM UI 中的某些功能需要 APM 数据视图。", "xpack.apm.tutorial.startServer.textPre": "服务器在 Elasticsearch 中处理并存储应用程序性能指标。", "xpack.apm.tutorial.startServer.title": "启动 APM Server", "xpack.apm.tutorial.windowsServerInstructions.textPost": "注意:如果您的系统禁用了脚本执行,则需要为当前会话设置执行策略,以允许脚本运行。示例:{command}。", diff --git a/x-pack/plugins/ux/public/components/app/rum_dashboard/csm_shared_context/index.tsx b/x-pack/plugins/ux/public/components/app/rum_dashboard/csm_shared_context/index.tsx index 7fbaa57646e2e..e3a888effd319 100644 --- a/x-pack/plugins/ux/public/components/app/rum_dashboard/csm_shared_context/index.tsx +++ b/x-pack/plugins/ux/public/components/app/rum_dashboard/csm_shared_context/index.tsx @@ -11,7 +11,7 @@ import { DataView, DataViewsPublicPluginStart, } from '@kbn/data-views-plugin/public'; -import { useDynamicDataViewFetcher } from '../../../../hooks/use_dynamic_data_view'; +import { useDynamicDataViewTitle } from '../../../../hooks/use_dynamic_data_view'; import { useFetcher } from '../../../../hooks/use_fetcher'; interface SharedData { @@ -51,15 +51,15 @@ export function CsmSharedContextProvider({ services: { dataViews }, } = useKibana<{ dataViews: DataViewsPublicPluginStart }>(); - const { dataView: uxDataView } = useDynamicDataViewFetcher(); + const { dataViewTitle } = useDynamicDataViewTitle(); const { data } = useFetcher>(async () => { - if (uxDataView?.title) { + if (dataViewTitle) { return dataViews.create({ - title: uxDataView?.title, + title: dataViewTitle, }); } - }, [uxDataView?.title, dataViews]); + }, [dataViewTitle, dataViews]); useEffect(() => { setDataView(data); diff --git a/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts b/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts index 4fd5cf01423f6..6daf34fef8afe 100644 --- a/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts +++ b/x-pack/plugins/ux/public/components/app/rum_dashboard/ux_overview_fetchers.ts @@ -38,12 +38,16 @@ async function getCoreWebVitalsResponse({ serviceName, dataStartPlugin, }: WithDataPlugin) { - const dataView = await callApmApi('GET /internal/apm/data_view/dynamic', { - signal: null, - }); + const dataViewResponse = await callApmApi( + 'GET /internal/apm/data_view/title', + { + signal: null, + } + ); + return await esQuery>(dataStartPlugin, { params: { - index: dataView.dynamicDataView?.title, + index: dataViewResponse.apmDataViewTitle, ...coreWebVitalsQuery(absoluteTime.start, absoluteTime.end, undefined, { serviceName: serviceName ? [serviceName] : undefined, }), @@ -78,14 +82,18 @@ export const fetchUxOverviewDate = async ( export async function hasRumData( params: WithDataPlugin ): Promise { - const dataView = await callApmApi('GET /internal/apm/data_view/dynamic', { - signal: null, - }); + const dataViewResponse = await callApmApi( + 'GET /internal/apm/data_view/title', + { + signal: null, + } + ); + const esQueryResponse = await esQuery>( params.dataStartPlugin, { params: { - index: dataView.dynamicDataView?.title, + index: dataViewResponse.apmDataViewTitle, ...hasRumDataQuery({ start: params?.absoluteTime?.start, end: params?.absoluteTime?.end, @@ -94,7 +102,7 @@ export async function hasRumData( } ); - return formatHasRumResult(esQueryResponse, dataView.dynamicDataView?.title); + return formatHasRumResult(esQueryResponse, dataViewResponse.apmDataViewTitle); } async function esQuery( diff --git a/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts b/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts index 04d289d9e49a2..81fb2f966966b 100644 --- a/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts +++ b/x-pack/plugins/ux/public/hooks/use_dynamic_data_view.ts @@ -7,15 +7,15 @@ import { useFetcher } from './use_fetcher'; -export function useDynamicDataViewFetcher() { +export function useDynamicDataViewTitle() { const { data, status } = useFetcher((callApmApi) => { - return callApmApi('GET /internal/apm/data_view/dynamic', { + return callApmApi('GET /internal/apm/data_view/title', { isCachable: true, }); }, []); return { - dataView: data?.dynamicDataView, + dataViewTitle: data?.apmDataViewTitle, status, }; } diff --git a/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts b/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts index 0f265343b9d01..e52f9396c526b 100644 --- a/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts +++ b/x-pack/test/apm_api_integration/tests/data_view/static.spec.ts @@ -20,11 +20,10 @@ export default function ApiTest({ getService }: FtrProviderContext) { const dataViewPattern = 'traces-apm*,apm-*,logs-apm*,apm-*,metrics-apm*,apm-*'; function createDataViewViaApmApi() { - return apmApiClient.readUser({ endpoint: 'POST /internal/apm/data_view/static' }); + return apmApiClient.writeUser({ endpoint: 'POST /internal/apm/data_view/static' }); } function deleteDataView() { - // return supertest.delete('/api/saved_objects//').set('kbn-xsrf', 'foo').expect(200) return supertest .delete(`/api/saved_objects/index-pattern/${APM_STATIC_DATA_VIEW_ID}`) .set('kbn-xsrf', 'foo') @@ -51,7 +50,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('does not create data view', async () => { expect(response.status).to.be(200); - expect(response.body.created).to.be(false); + expect(response.body.dataView).to.be(undefined); }); it('cannot fetch data view', async () => { @@ -79,7 +78,12 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('successfully creates the apm data view', async () => { expect(response.status).to.be(200); - expect(response.body.created).to.be(true); + + expect(response.body.dataView!.id).to.be('apm_static_index_pattern_id'); + expect(response.body.dataView!.name).to.be('APM'); + expect(response.body.dataView!.title).to.be( + 'traces-apm*,apm-*,logs-apm*,apm-*,metrics-apm*,apm-*' + ); }); describe('when fetching the data view', async () => { From c7f4748f5c1bff1ebe5ded3d6bc2f78ec98c8ded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Fri, 22 Jul 2022 19:49:50 +0200 Subject: [PATCH 24/78] [APM] Remove unused UX code (#136926) * [APM] Remove unused UX code * Fix i18n --- x-pack/plugins/apm/common/ux_ui_filter.ts | 126 ------------------ .../plugins/apm/public/utils/test_helpers.tsx | 1 - .../transactions/breakdown/index.test.ts | 1 - x-pack/plugins/apm/server/routes/typings.ts | 2 - .../plugins/apm/server/utils/test_helpers.tsx | 4 - .../translations/translations/fr-FR.json | 6 - .../translations/translations/ja-JP.json | 6 - .../translations/translations/zh-CN.json | 6 - 8 files changed, 152 deletions(-) delete mode 100644 x-pack/plugins/apm/common/ux_ui_filter.ts diff --git a/x-pack/plugins/apm/common/ux_ui_filter.ts b/x-pack/plugins/apm/common/ux_ui_filter.ts deleted file mode 100644 index f1dd0394de62a..0000000000000 --- a/x-pack/plugins/apm/common/ux_ui_filter.ts +++ /dev/null @@ -1,126 +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 { - CLIENT_GEO_COUNTRY_ISO_CODE, - SERVICE_NAME, - TRANSACTION_URL, - USER_AGENT_DEVICE, - USER_AGENT_NAME, - USER_AGENT_OS, -} from './elasticsearch_fieldnames'; - -export const uxFiltersByName = { - transactionUrl: { - title: i18n.translate('xpack.apm.localFilters.titles.transactionUrl', { - defaultMessage: 'URL', - }), - fieldName: TRANSACTION_URL, - }, - transactionUrlExcluded: { - title: i18n.translate('xpack.apm.localFilters.titles.transactionUrl', { - defaultMessage: 'URL', - }), - fieldName: TRANSACTION_URL, - excluded: true, - }, - browser: { - title: i18n.translate('xpack.apm.localFilters.titles.browser', { - defaultMessage: 'Browser', - }), - fieldName: USER_AGENT_NAME, - }, - browserExcluded: { - title: i18n.translate('xpack.apm.localFilters.titles.browser', { - defaultMessage: 'Browser', - }), - fieldName: USER_AGENT_NAME, - excluded: true, - }, - device: { - title: i18n.translate('xpack.apm.localFilters.titles.device', { - defaultMessage: 'Device', - }), - fieldName: USER_AGENT_DEVICE, - }, - deviceExcluded: { - title: i18n.translate('xpack.apm.localFilters.titles.device', { - defaultMessage: 'Device', - }), - fieldName: USER_AGENT_DEVICE, - excluded: true, - }, - location: { - title: i18n.translate('xpack.apm.localFilters.titles.location', { - defaultMessage: 'Location', - }), - fieldName: CLIENT_GEO_COUNTRY_ISO_CODE, - }, - locationExcluded: { - title: i18n.translate('xpack.apm.localFilters.titles.location', { - defaultMessage: 'Location', - }), - fieldName: CLIENT_GEO_COUNTRY_ISO_CODE, - excluded: true, - }, - os: { - title: i18n.translate('xpack.apm.localFilters.titles.os', { - defaultMessage: 'OS', - }), - fieldName: USER_AGENT_OS, - }, - osExcluded: { - title: i18n.translate('xpack.apm.localFilters.titles.os', { - defaultMessage: 'OS', - }), - fieldName: USER_AGENT_OS, - excluded: true, - }, - serviceName: { - title: i18n.translate('xpack.apm.localFilters.titles.serviceName', { - defaultMessage: 'Service name', - }), - fieldName: SERVICE_NAME, - }, -}; - -export type UxLocalUIFilterName = keyof typeof uxFiltersByName; - -export interface UxLocalUIFilter { - name: UxLocalUIFilterName; - title: string; - fieldName: string; - excluded?: boolean; - value: string[]; -} - -type UxLocalUIFilterMap = { - [key in UxLocalUIFilterName]: UxLocalUIFilter; -}; - -export const uxLocalUIFilterNames = Object.keys( - uxFiltersByName -) as UxLocalUIFilterName[]; - -export const uxLocalUIFilters = uxLocalUIFilterNames.reduce((acc, key) => { - const field = uxFiltersByName[key]; - - return { - ...acc, - [key]: { - ...field, - name: key, - }, - }; -}, {} as UxLocalUIFilterMap); - -export type UxUIFilters = { - environment?: string; -} & { - [key in UxLocalUIFilterName]?: string[]; -}; diff --git a/x-pack/plugins/apm/public/utils/test_helpers.tsx b/x-pack/plugins/apm/public/utils/test_helpers.tsx index d365cfc26d658..ea8219ed55248 100644 --- a/x-pack/plugins/apm/public/utils/test_helpers.tsx +++ b/x-pack/plugins/apm/public/utils/test_helpers.tsx @@ -174,7 +174,6 @@ export async function inspectSearchParams( }, } ) as APMConfig, - uiFilters: {}, indices: { sourcemap: 'myIndex', error: 'myIndex', diff --git a/x-pack/plugins/apm/server/routes/transactions/breakdown/index.test.ts b/x-pack/plugins/apm/server/routes/transactions/breakdown/index.test.ts index 41d4c60fd72b4..2df04fcdb0548 100644 --- a/x-pack/plugins/apm/server/routes/transactions/breakdown/index.test.ts +++ b/x-pack/plugins/apm/server/routes/transactions/breakdown/index.test.ts @@ -35,7 +35,6 @@ function getMockSetup(esResponse: any) { get: () => 'myIndex', } ) as APMConfig, - uiFilters: {}, indices: mockIndices, }; } diff --git a/x-pack/plugins/apm/server/routes/typings.ts b/x-pack/plugins/apm/server/routes/typings.ts index 9764b427ee7d7..2e246f753d75b 100644 --- a/x-pack/plugins/apm/server/routes/typings.ts +++ b/x-pack/plugins/apm/server/routes/typings.ts @@ -22,7 +22,6 @@ import { APMPluginSetupDependencies, APMPluginStartDependencies, } from '../types'; -import { UxUIFilters } from '../../common/ux_ui_filter'; export type ApmPluginRequestHandlerContext = CustomRequestHandlerContext<{ licensing: LicensingApiRequestHandlerContext; @@ -56,7 +55,6 @@ export interface APMRouteHandlerResources { _inspect: boolean; start?: number; end?: number; - uiFilters?: UxUIFilters; }; }; config: APMConfig; diff --git a/x-pack/plugins/apm/server/utils/test_helpers.tsx b/x-pack/plugins/apm/server/utils/test_helpers.tsx index e16c20b566def..244675fb7f843 100644 --- a/x-pack/plugins/apm/server/utils/test_helpers.tsx +++ b/x-pack/plugins/apm/server/utils/test_helpers.tsx @@ -11,13 +11,11 @@ import { } from '@kbn/core/types/elasticsearch'; import { APMConfig } from '..'; import { ApmIndicesConfig } from '../routes/settings/apm_indices/get_apm_indices'; -import { UxUIFilters } from '../../common/ux_ui_filter'; interface Options { mockResponse?: ( request: ESSearchRequest ) => ESSearchResponse; - uiFilters?: Record; config?: Partial; } @@ -25,7 +23,6 @@ interface MockSetup { apmEventClient: any; internalClient: any; config: APMConfig; - uiFilters: UxUIFilters; indices: ApmIndicesConfig; } @@ -89,7 +86,6 @@ export async function inspectSearchParams( }, } ) as APMConfig, - uiFilters: options?.uiFilters ?? {}, indices: { ...mockApmIndices, apmAgentConfigurationIndex: 'myIndex', diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index eb750081cc79e..5f3d0eec0c8a3 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -7874,12 +7874,6 @@ "xpack.apm.license.betaTooltipMessage": "Cette fonctionnalité est actuellement en version bêta. Si vous rencontrez des bugs ou si vous souhaitez apporter des commentaires, ouvrez un ticket de problème ou visitez notre forum de discussion.", "xpack.apm.license.button": "Commencer l'essai", "xpack.apm.license.title": "Commencer un essai gratuit de 30 jours", - "xpack.apm.localFilters.titles.browser": "Navigateur", - "xpack.apm.localFilters.titles.device": "Appareil", - "xpack.apm.localFilters.titles.location": "Lieu", - "xpack.apm.localFilters.titles.os": "Système d'exploitation", - "xpack.apm.localFilters.titles.serviceName": "Nom de service", - "xpack.apm.localFilters.titles.transactionUrl": "URL", "xpack.apm.managedTable.errorMessage": "Impossible de récupérer", "xpack.apm.managedTable.loadingDescription": "Chargement…", "xpack.apm.metadata.help": "Comment ajouter des étiquettes et d'autres données", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 00b76f08c4060..a7ff53d4453bf 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7867,12 +7867,6 @@ "xpack.apm.license.betaTooltipMessage": "現在、この機能はベータです。不具合を見つけた場合やご意見がある場合、サポートに問い合わせるか、またはディスカッションフォーラムにご報告ください。", "xpack.apm.license.button": "トライアルを開始", "xpack.apm.license.title": "無料の 30 日トライアルを開始", - "xpack.apm.localFilters.titles.browser": "ブラウザー", - "xpack.apm.localFilters.titles.device": "デバイス", - "xpack.apm.localFilters.titles.location": "場所", - "xpack.apm.localFilters.titles.os": "OS", - "xpack.apm.localFilters.titles.serviceName": "サービス名", - "xpack.apm.localFilters.titles.transactionUrl": "URL", "xpack.apm.managedTable.errorMessage": "取得できませんでした", "xpack.apm.managedTable.loadingDescription": "読み込み中…", "xpack.apm.metadata.help": "ラベルとその他のデータを追加する方法", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index e512a3b01fe36..3a17d3d843df1 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7880,12 +7880,6 @@ "xpack.apm.license.betaTooltipMessage": "此功能当前为公测版。如果遇到任何错误或有任何反馈,请报告问题或访问我们的论坛。", "xpack.apm.license.button": "开始试用", "xpack.apm.license.title": "开始为期 30 天的免费试用", - "xpack.apm.localFilters.titles.browser": "浏览器", - "xpack.apm.localFilters.titles.device": "设备", - "xpack.apm.localFilters.titles.location": "位置", - "xpack.apm.localFilters.titles.os": "OS", - "xpack.apm.localFilters.titles.serviceName": "服务名称", - "xpack.apm.localFilters.titles.transactionUrl": "URL", "xpack.apm.managedTable.errorMessage": "无法提取", "xpack.apm.managedTable.loadingDescription": "正在加载……", "xpack.apm.metadata.help": "如何添加标签和其他数据", From 72627fd771539eeb6cedbdabc84d1cafee83ffaa Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Fri, 22 Jul 2022 12:00:52 -0600 Subject: [PATCH 25/78] [maps] Automatically display the maps legend (#136872) * [maps] Automatically display the maps legend * clean-up * merge import statements --- .../maps/public/actions/layer_actions.ts | 40 +++++++++++++++++-- .../plugins/maps/public/actions/ui_actions.ts | 19 +++++++-- 2 files changed, 52 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index 4fb817c699e9e..9c2fea2a302d5 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -24,7 +24,7 @@ import { } from '../selectors/map_selectors'; import { FLYOUT_STATE } from '../reducers/ui'; import { cancelRequest, getInspectorAdapters } from '../reducers/non_serializable_instances'; -import { setDrawMode, updateFlyout } from './ui_actions'; +import { hideTOCDetails, setDrawMode, showTOCDetails, updateFlyout } from './ui_actions'; import { ADD_LAYER, ADD_WAITING_FOR_MAP_READY_LAYER, @@ -57,17 +57,24 @@ import { StyleDescriptor, TileMetaFeature, VectorLayerDescriptor, + VectorStyleDescriptor, } from '../../common/descriptor_types'; import { ILayer } from '../classes/layers/layer'; import { IVectorLayer } from '../classes/layers/vector_layer'; import { OnSourceChangeArgs } from '../classes/sources/source'; -import { DRAW_MODE, LAYER_STYLE_TYPE, LAYER_TYPE, SCALING_TYPES } from '../../common/constants'; +import { + DRAW_MODE, + LAYER_STYLE_TYPE, + LAYER_TYPE, + SCALING_TYPES, + STYLE_TYPE, +} from '../../common/constants'; import { IVectorStyle } from '../classes/styles/vector/vector_style'; import { notifyLicensedFeatureUsage } from '../licensed_features'; import { IESAggField } from '../classes/fields/agg'; import { IField } from '../classes/fields/field'; import type { IESSource } from '../classes/sources/es_source'; -import { getDrawMode } from '../selectors/ui_selectors'; +import { getDrawMode, getOpenTOCDetails } from '../selectors/ui_selectors'; export function trackCurrentLayerState(layerId: string) { return { @@ -196,6 +203,15 @@ export function addPreviewLayers(layerDescriptors: LayerDescriptor[]) { layerDescriptors.forEach((layerDescriptor) => { dispatch(addLayer({ ...layerDescriptor, __isPreviewLayer: true })); + + // Auto open layer legend to increase legend discoverability + if ( + layerDescriptor.style && + (hasByValueStyling(layerDescriptor.style) || + layerDescriptor.style.type === LAYER_STYLE_TYPE.HEATMAP) + ) { + dispatch(showTOCDetails(layerDescriptor.id)); + } }); }; } @@ -602,6 +618,10 @@ function removeLayerFromLayerList(layerId: string) { if (layerId === editState?.layerId) { dispatch(setDrawMode(DRAW_MODE.NONE)); } + const openTOCDetails = getOpenTOCDetails(getState()); + if (openTOCDetails.includes(layerId)) { + dispatch(hideTOCDetails(layerId)); + } }; } @@ -644,6 +664,11 @@ export function updateLayerStyle(layerId: string, styleDescriptor: StyleDescript }, }); + // Auto open layer legend to increase legend discoverability + if (hasByValueStyling(styleDescriptor)) { + dispatch(showTOCDetails(layerId)); + } + // Ensure updateStyleMeta is triggered // syncDataForLayer may not trigger endDataLoad if no re-fetch is required dispatch(updateStyleMeta(layerId)); @@ -742,3 +767,12 @@ function clearInspectorAdapters(layer: ILayer, adapters: Adapters) { }); } } + +function hasByValueStyling(styleDescriptor: StyleDescriptor) { + return ( + styleDescriptor.type === LAYER_STYLE_TYPE.VECTOR && + Object.values((styleDescriptor as VectorStyleDescriptor).properties).some((styleProperty) => { + return (styleProperty as { type?: STYLE_TYPE })?.type === STYLE_TYPE.DYNAMIC; + }) + ); +} diff --git a/x-pack/plugins/maps/public/actions/ui_actions.ts b/x-pack/plugins/maps/public/actions/ui_actions.ts index bdc0e91556712..52f0185daf0f2 100644 --- a/x-pack/plugins/maps/public/actions/ui_actions.ts +++ b/x-pack/plugins/maps/public/actions/ui_actions.ts @@ -8,7 +8,7 @@ import { AnyAction } from 'redux'; import { ThunkDispatch } from 'redux-thunk'; import { MapStoreState } from '../reducers/store'; -import { getFlyoutDisplay } from '../selectors/ui_selectors'; +import { getFlyoutDisplay, getOpenTOCDetails } from '../selectors/ui_selectors'; import { FLYOUT_STATE } from '../reducers/ui'; import { setQuery, trackMapSettings } from './map_actions'; import { setSelectedLayer } from './layer_actions'; @@ -82,9 +82,20 @@ export function setOpenTOCDetails(layerIds?: string[]) { } export function showTOCDetails(layerId: string) { - return { - type: SHOW_TOC_DETAILS, - layerId, + return ( + dispatch: ThunkDispatch, + getState: () => MapStoreState + ) => { + const openTOCDetails = getOpenTOCDetails(getState()); + if (openTOCDetails.includes(layerId)) { + // details already open, nothing to do + return; + } + + dispatch({ + type: SHOW_TOC_DETAILS, + layerId, + }); }; } From 6911d5a7c4d995e06ae4f512c78951c3df74be7c Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Fri, 22 Jul 2022 11:07:06 -0700 Subject: [PATCH 26/78] [Timelines T-Grid] Changed formatting of the timeline data to parse all nested objects under the "kibana.alert.rule.parameters" (#136908) * [Timelines T-Grid] Changed formatting of the timeline data to parse all nested objects under the "kibana.alert.rule.parameters" * Excluded some of the alert params fields from parsing, because this is expected by the design * [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../common/utils/field_formatters.test.ts | 68 ++++- .../common/utils/field_formatters.ts | 9 +- .../helpers/format_timeline_data.test.ts | 245 ++++++++++++++++++ 3 files changed, 311 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/timelines/common/utils/field_formatters.test.ts b/x-pack/plugins/timelines/common/utils/field_formatters.test.ts index 5cc339bc04e67..c2ecd75879b67 100644 --- a/x-pack/plugins/timelines/common/utils/field_formatters.test.ts +++ b/x-pack/plugins/timelines/common/utils/field_formatters.test.ts @@ -120,14 +120,66 @@ describe('Events Details Helpers', () => { }, { category: 'kibana', - field: 'kibana.alert.rule.parameters.criteria', - isObjectArray: true, - originalValue: [ - '{"metric":"cpu","comparator":">","threshold":[3],"timeSize":1,"timeUnit":"m","customMetric":{"type":"custom","id":"alert-custom-metric","field":"","aggregation":"avg"}}', - ], - values: [ - '{"metric":"cpu","comparator":">","threshold":[3],"timeSize":1,"timeUnit":"m","customMetric":{"type":"custom","id":"alert-custom-metric","field":"","aggregation":"avg"}}', - ], + field: 'kibana.alert.rule.parameters.criteria.metric', + isObjectArray: false, + originalValue: ['cpu'], + values: ['cpu'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.comparator', + isObjectArray: false, + originalValue: ['>'], + values: ['>'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.threshold', + isObjectArray: false, + originalValue: ['3'], + values: ['3'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.timeSize', + isObjectArray: false, + originalValue: ['1'], + values: ['1'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.timeUnit', + isObjectArray: false, + originalValue: ['m'], + values: ['m'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.customMetric.type', + isObjectArray: false, + originalValue: ['custom'], + values: ['custom'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.customMetric.id', + isObjectArray: false, + originalValue: ['alert-custom-metric'], + values: ['alert-custom-metric'], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.customMetric.field', + isObjectArray: false, + originalValue: [''], + values: [''], + }, + { + category: 'kibana', + field: 'kibana.alert.rule.parameters.criteria.customMetric.aggregation', + isObjectArray: false, + originalValue: ['avg'], + values: ['avg'], }, { category: 'kibana', diff --git a/x-pack/plugins/timelines/common/utils/field_formatters.ts b/x-pack/plugins/timelines/common/utils/field_formatters.ts index cb99b38860539..e3160de9e6303 100644 --- a/x-pack/plugins/timelines/common/utils/field_formatters.ts +++ b/x-pack/plugins/timelines/common/utils/field_formatters.ts @@ -14,6 +14,7 @@ import { experimentalRuleFieldMap } from '@kbn/rule-registry-plugin/common/asset import { EventHit, TimelineEventsDetailsItem } from '../search_strategy'; import { toObjectArrayOfStrings, toStringArray } from './to_array'; export const baseCategoryFields = ['@timestamp', 'labels', 'message', 'tags']; +const nonFlattenedFormatParamsFields = ['related_integrations', 'threat_mapping']; export const getFieldCategory = (field: string): string => { const fieldCategory = field.split('.')[0]; @@ -42,7 +43,8 @@ export const isGeoField = (field: string) => field.includes('geo.location') || field.includes('geoip.location'); export const isRuleParametersFieldOrSubfield = (field: string, prependField?: string) => - prependField?.includes(ALERT_RULE_PARAMETERS) || field === ALERT_RULE_PARAMETERS; + (prependField?.includes(ALERT_RULE_PARAMETERS) || field === ALERT_RULE_PARAMETERS) && + !nonFlattenedFormatParamsFields.includes(field); export const getDataFromFieldsHits = ( fields: EventHit['fields'], @@ -73,9 +75,10 @@ export const getDataFromFieldsHits = ( // return simple field value (non-ecs object, non-array) if ( !isObjectArray || - Object.keys({ ...ecsFieldMap, ...technicalRuleFieldMap, ...experimentalRuleFieldMap }).find( + (Object.keys({ ...ecsFieldMap, ...technicalRuleFieldMap, ...experimentalRuleFieldMap }).find( (ecsField) => ecsField === field - ) === undefined + ) === undefined && + !isRuleParametersFieldOrSubfield(field, prependField)) ) { return [ ...accumulator, diff --git a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts index 746b71198ee66..de3e3d0040245 100644 --- a/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts +++ b/x-pack/plugins/timelines/server/search_strategy/timeline/factory/helpers/format_timeline_data.test.ts @@ -215,4 +215,249 @@ describe('formatTimelineData', () => { }, }); }); + + it('should properly format the inventory rule signal results', async () => { + const response: EventHit = { + _index: '.internal.alerts-observability.metrics.alerts-default-000001', + _id: '3fef4a4c-3d96-4e79-b4e5-158a0461d577', + _score: null, + fields: { + 'kibana.alert.workflow_status': ['open'], + 'kibana.alert.status': ['active'], + 'kibana.alert.rule.uuid': ['15d82f10-0926-11ed-bece-6b0c033d0075'], + 'kibana.alert.reason': [ + 'CPU usage is 37.8% in the last 1 day for gke-edge-oblt-pool-1-9a60016d-7dvq. Alert when > 10%.', + ], + 'kibana.alert.rule.producer': ['infrastructure'], + 'kibana.alert.rule.consumer': ['infrastructure'], + 'kibana.alert.rule.category': ['Inventory'], + 'kibana.alert.start': ['2022-07-21T20:00:35.848Z'], + 'kibana.alert.rule.rule_type_id': ['metrics.alert.inventory.threshold'], + 'event.action': ['active'], + 'kibana.alert.duration.us': [9502040000], + '@timestamp': ['2022-07-21T22:38:57.888Z'], + 'kibana.alert.instance.id': ['gke-edge-oblt-pool-1-9a60016d-7dvq'], + 'kibana.alert.rule.name': ['test 1212'], + 'kibana.alert.rule.execution.uuid': ['37498c42-0190-4a83-adfa-c7e5f817f977'], + 'kibana.alert.uuid': ['3fef4a4c-3d96-4e79-b4e5-158a0461d577'], + 'kibana.space_ids': ['default'], + 'kibana.version': ['8.4.0'], + 'event.kind': ['signal'], + 'kibana.alert.rule.parameters': [ + { + sourceId: 'default', + nodeType: 'host', + criteria: [ + { + comparator: '>', + timeSize: 1, + metric: 'cpu', + threshold: [10], + customMetric: { + aggregation: 'avg', + id: 'alert-custom-metric', + field: '', + type: 'custom', + }, + timeUnit: 'd', + }, + ], + }, + ], + }, + sort: ['1'], + }; + + expect( + await formatTimelineData( + [ + 'kibana.alert.status', + '@timestamp', + 'kibana.alert.duration.us', + 'kibana.alert.reason', + '*', + 'kibana.alert.duration.us', + 'kibana.alert.evaluation.threshold', + 'kibana.alert.evaluation.value', + 'kibana.alert.reason', + 'kibana.alert.rule.category', + 'kibana.alert.rule.name', + 'kibana.alert.status', + 'kibana.alert.uuid', + 'kibana.alert.start', + '@timestamp', + 'kibana.alert.workflow_status', + 'kibana.alert.rule.uuid', + 'kibana.alert.rule.producer', + 'kibana.alert.rule.consumer', + 'kibana.alert.rule.rule_type_id', + 'event.action', + 'kibana.alert.instance.id', + 'kibana.alert.rule.execution.uuid', + 'kibana.space_ids', + 'kibana.version', + 'event.kind', + 'kibana.alert.rule.parameters', + ], + TIMELINE_EVENTS_FIELDS, + response + ) + ).toEqual({ + cursor: { + tiebreaker: null, + value: '', + }, + node: { + _id: '3fef4a4c-3d96-4e79-b4e5-158a0461d577', + _index: '.internal.alerts-observability.metrics.alerts-default-000001', + data: [ + { + field: 'kibana.alert.rule.consumer', + value: ['infrastructure'], + }, + { + field: '@timestamp', + value: ['2022-07-21T22:38:57.888Z'], + }, + { + field: 'kibana.alert.workflow_status', + value: ['open'], + }, + { + field: 'kibana.alert.reason', + value: [ + 'CPU usage is 37.8% in the last 1 day for gke-edge-oblt-pool-1-9a60016d-7dvq. Alert when > 10%.', + ], + }, + { + field: 'kibana.alert.rule.name', + value: ['test 1212'], + }, + { + field: 'kibana.alert.rule.uuid', + value: ['15d82f10-0926-11ed-bece-6b0c033d0075'], + }, + { + field: 'event.action', + value: ['active'], + }, + { + field: 'event.kind', + value: ['signal'], + }, + { + field: 'kibana.alert.status', + value: ['active'], + }, + { + field: 'kibana.alert.duration.us', + value: ['9502040000'], + }, + { + field: 'kibana.alert.rule.category', + value: ['Inventory'], + }, + { + field: 'kibana.alert.uuid', + value: ['3fef4a4c-3d96-4e79-b4e5-158a0461d577'], + }, + { + field: 'kibana.alert.start', + value: ['2022-07-21T20:00:35.848Z'], + }, + { + field: 'kibana.alert.rule.producer', + value: ['infrastructure'], + }, + { + field: 'kibana.alert.rule.rule_type_id', + value: ['metrics.alert.inventory.threshold'], + }, + { + field: 'kibana.alert.instance.id', + value: ['gke-edge-oblt-pool-1-9a60016d-7dvq'], + }, + { + field: 'kibana.alert.rule.execution.uuid', + value: ['37498c42-0190-4a83-adfa-c7e5f817f977'], + }, + { + field: 'kibana.space_ids', + value: ['default'], + }, + { + field: 'kibana.version', + value: ['8.4.0'], + }, + { + field: 'kibana.alert.rule.parameters.sourceId', + value: ['default'], + }, + { + field: 'kibana.alert.rule.parameters.nodeType', + value: ['host'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.comparator', + value: ['>'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.timeSize', + value: ['1'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.metric', + value: ['cpu'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.threshold', + value: ['10'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.customMetric.aggregation', + value: ['avg'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.customMetric.id', + value: ['alert-custom-metric'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.customMetric.field', + value: [''], + }, + { + field: 'kibana.alert.rule.parameters.criteria.customMetric.type', + value: ['custom'], + }, + { + field: 'kibana.alert.rule.parameters.criteria.timeUnit', + value: ['d'], + }, + ], + ecs: { + '@timestamp': ['2022-07-21T22:38:57.888Z'], + _id: '3fef4a4c-3d96-4e79-b4e5-158a0461d577', + _index: '.internal.alerts-observability.metrics.alerts-default-000001', + event: { + action: ['active'], + kind: ['signal'], + }, + kibana: { + alert: { + reason: [ + 'CPU usage is 37.8% in the last 1 day for gke-edge-oblt-pool-1-9a60016d-7dvq. Alert when > 10%.', + ], + rule: { + consumer: ['infrastructure'], + name: ['test 1212'], + uuid: ['15d82f10-0926-11ed-bece-6b0c033d0075'], + }, + workflow_status: ['open'], + }, + }, + timestamp: '2022-07-21T22:38:57.888Z', + }, + }, + }); + }); }); From 1cbf53e35529a86339dcf290587bc1eb2cd999da Mon Sep 17 00:00:00 2001 From: Muhammad Ibragimov <53621505+mibragimov@users.noreply.github.com> Date: Fri, 22 Jul 2022 23:09:22 +0500 Subject: [PATCH 27/78] [Console] Fix flaky tests (#136498) * [Console] Fix flaky tests for comments and folds] * Fix flaky test * Remove dismissTutorial Co-authored-by: Muhammad Ibragimov --- test/functional/apps/console/_autocomplete.ts | 2 +- test/functional/apps/console/_console.ts | 26 ++++++++++++------- test/functional/apps/console/_vector_tile.ts | 2 +- test/functional/page_objects/console_page.ts | 26 +++++++------------ 4 files changed, 29 insertions(+), 27 deletions(-) diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts index 85be77d9522a7..4145501babb58 100644 --- a/test/functional/apps/console/_autocomplete.ts +++ b/test/functional/apps/console/_autocomplete.ts @@ -22,7 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { log.debug('navigateTo console'); await PageObjects.common.navigateToApp('console'); // Ensure that the text area can be interacted with - await PageObjects.console.dismissTutorial(); + await PageObjects.console.closeHelpIfExists(); await PageObjects.console.clearTextArea(); }); diff --git a/test/functional/apps/console/_console.ts b/test/functional/apps/console/_console.ts index 6e55c6d42f65e..a734c3cb6d7e8 100644 --- a/test/functional/apps/console/_console.ts +++ b/test/functional/apps/console/_console.ts @@ -158,32 +158,40 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); describe('with folded/unfolded lines in request body', () => { - const enterRequestWithBody = async () => { - await PageObjects.console.enterRequest(); - await PageObjects.console.pressEnter(); - await PageObjects.console.enterText('{\n\t\t"_source": []'); + const enterRequest = async () => { + await PageObjects.console.enterRequest('\nGET test/doc/1 \n{\n\t\t"_source": []'); + await PageObjects.console.clickPlay(); }; - it('should restore the state of folding/unfolding when navigating back to Console', async () => { + beforeEach(async () => { await PageObjects.console.clearTextArea(); - await enterRequestWithBody(); + }); + + it('should restore the state of folding/unfolding when navigating back to Console', async () => { + await enterRequest(); await PageObjects.console.clickFoldWidget(); await PageObjects.common.navigateToApp('home'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.common.navigateToApp('console'); await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.console.dismissTutorial(); + await PageObjects.console.closeHelpIfExists(); expect(await PageObjects.console.hasFolds()).to.be(true); }); it('should restore the state of folding/unfolding when the page reloads', async () => { - await PageObjects.console.clearTextArea(); - await enterRequestWithBody(); + await enterRequest(); await PageObjects.console.clickFoldWidget(); await browser.refresh(); await PageObjects.header.waitUntilLoadingHasFinished(); expect(await PageObjects.console.hasFolds()).to.be(true); }); + + it('should not have folds by default', async () => { + await enterRequest(); + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); + expect(await PageObjects.console.hasFolds()).to.be(false); + }); }); }); } diff --git a/test/functional/apps/console/_vector_tile.ts b/test/functional/apps/console/_vector_tile.ts index b02db523b95ac..3959877fdf685 100644 --- a/test/functional/apps/console/_vector_tile.ts +++ b/test/functional/apps/console/_vector_tile.ts @@ -22,7 +22,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.home.addSampleDataSet('logs'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.common.navigateToApp('console'); - await PageObjects.console.dismissTutorial(); + await PageObjects.console.closeHelpIfExists(); await PageObjects.console.clearTextArea(); }); diff --git a/test/functional/page_objects/console_page.ts b/test/functional/page_objects/console_page.ts index de1f02df42157..d4079012bd51e 100644 --- a/test/functional/page_objects/console_page.ts +++ b/test/functional/page_objects/console_page.ts @@ -123,15 +123,6 @@ export class ConsolePageObject extends FtrService { return this.testSubjects.find('console-application'); } - public async dismissTutorial() { - try { - const closeButton = await this.testSubjects.find('help-close-button'); - await closeButton.click(); - } catch (e) { - // Ignore because it is probably not there. - } - } - // Prompt autocomplete window and provide a initial letter of properties to narrow down the results. E.g. 'b' = 'bool' public async promptAutocomplete(letter = 'b') { const textArea = await this.testSubjects.find('console-textarea'); @@ -251,13 +242,7 @@ export class ConsolePageObject extends FtrService { } public async hasFolds() { - try { - const requestEditor = await this.getRequestEditor(); - const folds = await requestEditor.findAllByCssSelector('.ace_fold'); - return folds.length > 0; - } catch (e) { - return false; - } + return await this.find.existsByCssSelector('.ace_fold'); } public async getResponseStatus() { @@ -265,4 +250,13 @@ export class ConsolePageObject extends FtrService { const text = await statusBadge.getVisibleText(); return text.replace(/[^\d.]+/, ''); } + + async closeHelpIfExists() { + await this.retry.try(async () => { + const helpPanelShown = await this.testSubjects.exists('help-close-button'); + if (helpPanelShown) { + await this.collapseHelp(); + } + }); + } } From 4b52441a53b576c162b98f7063311f8d9ea47e77 Mon Sep 17 00:00:00 2001 From: Davey Holler Date: Fri, 22 Jul 2022 11:15:05 -0700 Subject: [PATCH 28/78] [Enterprise Search] New overview page (#136586) --- .../enterprise_search/common/constants.ts | 15 - .../components/license_callout/constants.ts | 2 +- .../license_callout/license_callout.test.tsx | 13 +- .../license_callout/license_callout.tsx | 29 +- .../components/product_card/product_card.scss | 7 +- .../product_card/product_card.test.tsx | 88 +++--- .../components/product_card/product_card.tsx | 190 ++++++++---- .../product_selector.test.tsx | 27 +- .../product_selector/product_selector.tsx | 284 ++++++++++++++---- .../enterprise_search_overview/constants.ts | 2 +- .../add_content_empty_prompt.scss | 2 - .../add_content_empty_prompt.tsx | 41 ++- .../elasticsearch_resources.tsx | 6 +- .../getting_started_steps.test.tsx | 6 +- .../getting_started_steps.tsx | 18 +- .../licensing/manage_license_button.tsx | 7 +- .../public/assets/images/welcome_dark.svg | 14 + .../public/assets/images/welcome_light.svg | 14 + .../translations/translations/fr-FR.json | 10 +- .../translations/translations/ja-JP.json | 6 - .../translations/translations/zh-CN.json | 6 - .../accessibility/apps/enterprise_search.ts | 8 +- 22 files changed, 529 insertions(+), 266 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/assets/images/welcome_dark.svg create mode 100644 x-pack/plugins/enterprise_search/public/assets/images/welcome_light.svg diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index 508bff3c16247..53ae14d73efb2 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -47,10 +47,6 @@ export const ELASTICSEARCH_PLUGIN = { DESCRIPTION: i18n.translate('xpack.enterpriseSearch.elasticsearch.productDescription', { defaultMessage: 'Low-level tools for creating performant and relevant search experiences.', }), - CARD_DESCRIPTION: i18n.translate('xpack.enterpriseSearch.elasticsearch.productCardDescription', { - defaultMessage: - 'Design and build performant, relevant search-powered applications or large-scale search implementations directly in Elasticsearch.', - }), URL: '/app/enterprise_search/elasticsearch', SUPPORT_URL: 'https://discuss.elastic.co/c/elastic-stack/elasticsearch/', }; @@ -64,10 +60,6 @@ export const APP_SEARCH_PLUGIN = { defaultMessage: 'Leverage dashboards, analytics, and APIs for advanced application search made simple.', }), - CARD_DESCRIPTION: i18n.translate('xpack.enterpriseSearch.appSearch.productCardDescription', { - defaultMessage: - 'Design, deploy, and manage powerful search experiences for your websites and web/mobile apps.', - }), URL: '/app/enterprise_search/app_search', SUPPORT_URL: 'https://discuss.elastic.co/c/enterprise-search/app-search/', }; @@ -81,13 +73,6 @@ export const WORKPLACE_SEARCH_PLUGIN = { defaultMessage: 'Search all documents, files, and sources available across your virtual workplace.', }), - CARD_DESCRIPTION: i18n.translate( - 'xpack.enterpriseSearch.workplaceSearch.productCardDescription', - { - defaultMessage: - 'Unify your content in one place, with instant connectivity to popular productivity and collaboration tools.', - } - ), URL: '/app/enterprise_search/workplace_search', NON_ADMIN_URL: '/app/enterprise_search/workplace_search/p', SUPPORT_URL: 'https://discuss.elastic.co/c/enterprise-search/workplace-search/', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/constants.ts index f51eeb1c8160c..c8db1dd9b1943 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/constants.ts @@ -9,5 +9,5 @@ import { i18n } from '@kbn/i18n'; export const LICENSE_CALLOUT_BODY = i18n.translate('xpack.enterpriseSearch.licenseCalloutBody', { defaultMessage: - 'Enterprise authentication via SAML, document-level permission and authorization support, custom search experiences and more are available with a valid Platinum license.', + 'Enterprise authentication via SAML, document-level permission and authorization support, custom search experiences and more are available with a valid Premium license.', }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.test.tsx index 746a681452973..3d4723638c60c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.test.tsx @@ -11,23 +11,22 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiPanel, EuiText } from '@elastic/eui'; - -import { ManageLicenseButton } from '../../../shared/licensing'; +import { EuiPanel } from '@elastic/eui'; import { LicenseCallout } from '.'; +// TODO: Remove this license callout code completely (eventually) +// for now, the test is merely updated to reflect that it shouldn't +// render at all describe('LicenseCallout', () => { - it('renders when non-platinum or on trial', () => { + it('never renders a license callout', () => { setMockValues({ hasPlatinumLicense: false, isTrial: true, }); const wrapper = shallow(); - expect(wrapper.find(EuiPanel)).toHaveLength(1); - expect(wrapper.find(EuiText)).toHaveLength(2); - expect(wrapper.find(ManageLicenseButton)).toHaveLength(1); + expect(wrapper.find(EuiPanel)).toHaveLength(0); }); it('does not render for platinum', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.tsx index 0611c5f5ca7a3..2fff9c66eec09 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/license_callout/license_callout.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { useValues } from 'kea'; -import { EuiPanel, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { LicensingLogic, ManageLicenseButton } from '../../../shared/licensing'; @@ -23,19 +23,18 @@ export const LicenseCallout: React.FC = () => { if (hasPlatinumLicense && !isTrial) return null; return ( - - - - -

{PRODUCT_SELECTOR_CALLOUT_HEADING}

-
- {LICENSE_CALLOUT_BODY} -
- - - - -
-
+ + + +

{PRODUCT_SELECTOR_CALLOUT_HEADING}

+
+ + {LICENSE_CALLOUT_BODY} +
+ + + + +
); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.scss b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.scss index 26b974f4c84d4..81c3b9600a837 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.scss +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.scss @@ -6,10 +6,7 @@ */ .productCard { - &__imageContainer { - @include euiBreakpoint('xs') { - max-height: 115px; - overflow: hidden; - } + & &-features { + padding-top: 1.5rem; } } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.test.tsx index e19f731611d01..acac9b2df20de 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.test.tsx @@ -5,67 +5,83 @@ * 2.0. */ -import { setMockValues, mockTelemetryActions } from '../../../__mocks__/kea_logic'; +import { mockTelemetryActions } from '../../../__mocks__/kea_logic'; import React from 'react'; import { shallow } from 'enzyme'; -import { EuiCard } from '@elastic/eui'; - -import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; -import { EuiButtonTo } from '../../../shared/react_router_helpers'; - -import { ProductCard } from '.'; +import { snakeCase } from 'lodash'; + +import { EuiListGroup, EuiPanel } from '@elastic/eui'; + +import { EuiButtonTo, EuiButtonEmptyTo } from '../../../shared/react_router_helpers'; + +import { ProductCard, ProductCardProps } from './product_card'; + +const MOCK_VALUES: ProductCardProps = { + cta: 'Click me', + description: 'Mock description', + features: ['first feature', 'second feature'], + icon: 'logoElasticsearch', + name: 'Mock product', + productId: 'mockProduct', + resourceLinks: [ + { + label: 'Link one', + to: 'https://www.elastic.co/guide/one', + }, + { + label: 'Link twwo', + to: 'https://www.elastic.co/guide/two', + }, + ], + url: '/app/mock_app', +}; describe('ProductCard', () => { beforeEach(() => { jest.clearAllMocks(); }); - it('renders an App Search card', () => { - const wrapper = shallow(); - const card = wrapper.find(EuiCard).dive().shallow(); + it('renders a product card', () => { + const wrapper = shallow(); + const card = wrapper.find(EuiPanel); - expect(card.find('h2').text()).toEqual('Elastic App Search'); - expect(card.find('.productCard__image').prop('src')).toEqual('as.jpg'); + expect(card.find('h3').text()).toEqual(MOCK_VALUES.name); + expect(card.find(EuiListGroup).children()).toHaveLength(MOCK_VALUES.features.length); + expect(card.find('[data-test-subj="productCard-resources"]').text()).toEqual('Resources'); + expect(card.find('[data-test-subj="productCard-resourceLinks"]').children()).toHaveLength( + MOCK_VALUES.resourceLinks.length + ); - const button = card.find(EuiButtonTo); - expect(button.prop('to')).toEqual('/app/enterprise_search/app_search'); - expect(button.prop('children')).toEqual('Open App Search'); + const button = card.find(EuiButtonEmptyTo); + + expect(button).toHaveLength(1); + expect(button.prop('to')).toEqual(MOCK_VALUES.url); + expect(card.find(EuiButtonTo)).toHaveLength(0); button.simulate('click'); + expect(mockTelemetryActions.sendEnterpriseSearchTelemetry).toHaveBeenCalledWith({ action: 'clicked', - metric: 'app_search', + metric: snakeCase(MOCK_VALUES.productId), }); }); - it('renders a Workplace Search card', () => { - const wrapper = shallow(); - const card = wrapper.find(EuiCard).dive().shallow(); - - expect(card.find('h2').text()).toEqual('Elastic Workplace Search'); - expect(card.find('.productCard__image').prop('src')).toEqual('ws.jpg'); - + it('renders an empty cta', () => { + const wrapper = shallow(); + const card = wrapper.find(EuiPanel); const button = card.find(EuiButtonTo); - expect(button.prop('to')).toEqual('/app/enterprise_search/workplace_search'); - expect(button.prop('children')).toEqual('Open Workplace Search'); + + expect(button).toHaveLength(1); + expect(button.prop('to')).toEqual(MOCK_VALUES.url); + expect(card.find(EuiButtonEmptyTo)).toHaveLength(0); button.simulate('click'); expect(mockTelemetryActions.sendEnterpriseSearchTelemetry).toHaveBeenCalledWith({ action: 'clicked', - metric: 'workplace_search', + metric: snakeCase(MOCK_VALUES.productId), }); }); - - it('renders correct button text when host not present', () => { - setMockValues({ config: { host: '' } }); - - const wrapper = shallow(); - const card = wrapper.find(EuiCard).dive().shallow(); - const button = card.find(EuiButtonTo); - - expect(button.prop('children')).toEqual('Set up Workplace Search'); - }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.tsx index 33b7658788f62..c58318e2a96e2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_card/product_card.tsx @@ -7,81 +7,147 @@ import React from 'react'; -import { useValues, useActions } from 'kea'; +import { useActions } from 'kea'; import { snakeCase } from 'lodash'; -import { EuiCard, EuiTextColor } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiListGroup, + EuiListGroupItem, + EuiPanel, + EuiSpacer, + EuiText, + EuiTitle, + IconType, +} from '@elastic/eui'; + import { i18n } from '@kbn/i18n'; -import { KibanaLogic } from '../../../shared/kibana'; -import { EuiButtonTo } from '../../../shared/react_router_helpers'; +import { EuiButtonTo, EuiButtonEmptyTo } from '../../../shared/react_router_helpers'; import { TelemetryLogic } from '../../../shared/telemetry'; import './product_card.scss'; -interface ProductCardProps { - // Expects product plugin constants (@see common/constants.ts) - product: { - ID: string; - NAME: string; - CARD_DESCRIPTION: string; - URL: string; - }; - image: string; - url?: string; +interface ProductResourceLink { + label: string; + to: string; } -export const ProductCard: React.FC = ({ product, image, url }) => { - const { sendEnterpriseSearchTelemetry } = useActions(TelemetryLogic); - const { config } = useValues(KibanaLogic); - - const LAUNCH_BUTTON_TEXT = i18n.translate( - 'xpack.enterpriseSearch.overview.productCard.launchButton', - { - defaultMessage: 'Open {productName}', - values: { productName: product.NAME }, - } - ); +export interface ProductCardProps { + cta: string; + description: string; + emptyCta?: boolean; + features: string[]; + icon: IconType; + name: string; + productId: string; + resourceLinks: ProductResourceLink[]; + url: string; +} - const SETUP_BUTTON_TEXT = i18n.translate( - 'xpack.enterpriseSearch.overview.productCard.setupButton', - { - defaultMessage: 'Set up {productName}', - values: { productName: product.NAME }, - } - ); +export const ProductCard: React.FC = ({ + cta, + description, + emptyCta = false, + features, + icon, + productId, + name, + resourceLinks, + url, +}) => { + const { sendEnterpriseSearchTelemetry } = useActions(TelemetryLogic); return ( - - - - } + {product.CARD_DESCRIPTION}} - footer={ - - sendEnterpriseSearchTelemetry({ - action: 'clicked', - metric: snakeCase(product.ID), - }) - } - > - {config.host ? LAUNCH_BUTTON_TEXT : SETUP_BUTTON_TEXT} - - } - data-test-subj={`${product.ID}ProductCard`} - /> + data-test-subj={`${productId}ProductCard`} + className="productCard" + > + + + + + + +

{name}

+
+ + + {description} + + +
+ {emptyCta ? ( + + sendEnterpriseSearchTelemetry({ + action: 'clicked', + metric: snakeCase(productId), + }) + } + > + {cta} + + ) : ( + + sendEnterpriseSearchTelemetry({ + action: 'clicked', + metric: snakeCase(productId), + }) + } + > + {cta} + + )} +
+
+ + + {features.map((item: string, index: number) => ( + } + /> + ))} + + + + +

+ {i18n.translate('xpack.enterpriseSearch.productCard.resourcesTitle', { + defaultMessage: 'Resources', + })} +

+
+ + + {resourceLinks.map((resource, index) => ( + + + {resource.label} + + + ))} + +
+
+
); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx index 0a6b331b36540..c090b79445e13 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.test.tsx @@ -15,8 +15,6 @@ import { EuiEmptyPrompt } from '@elastic/eui'; import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; -import { ElasticsearchCard } from '../elasticsearch_card'; -import { LicenseCallout } from '../license_callout'; import { ProductCard } from '../product_card'; import { SetupGuideCta } from '../setup_guide'; import { TrialCallout } from '../trial_callout'; @@ -33,10 +31,8 @@ describe('ProductSelector', () => { setMockValues({ config: { host: '' } }); const wrapper = shallow(); - expect(wrapper.find(ProductCard)).toHaveLength(2); + expect(wrapper.find(ProductCard)).toHaveLength(3); expect(wrapper.find(SetupGuideCta)).toHaveLength(1); - expect(wrapper.find(LicenseCallout)).toHaveLength(0); - expect(wrapper.find(ElasticsearchCard)).toHaveLength(1); }); it('renders the trial callout', () => { @@ -60,15 +56,6 @@ describe('ProductSelector', () => { setMockValues({ config: { host: 'localhost' } }); }); - it('renders the license callout when user has access to a product', () => { - setMockValues({ config: { host: 'localhost' } }); - const wrapper = shallow( - - ); - - expect(wrapper.find(LicenseCallout)).toHaveLength(1); - }); - it('does not render the App Search card if the user does not have access to AS', () => { const wrapper = shallow( { /> ); - expect(wrapper.find(ProductCard)).toHaveLength(1); - expect(wrapper.find(ProductCard).prop('product').ID).toEqual('workplaceSearch'); + expect(wrapper.find(ProductCard)).toHaveLength(2); + expect(wrapper.find('[data-test-subj="productCard-workplaceSearch"]')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="productCard-elasticsearch"]')).toHaveLength(1); }); it('does not render the Workplace Search card if the user does not have access to WS', () => { @@ -89,8 +77,9 @@ describe('ProductSelector', () => { /> ); - expect(wrapper.find(ProductCard)).toHaveLength(1); - expect(wrapper.find(ProductCard).prop('product').ID).toEqual('appSearch'); + expect(wrapper.find(ProductCard)).toHaveLength(2); + expect(wrapper.find('[data-test-subj="productCard-appSearch"]')).toHaveLength(1); + expect(wrapper.find('[data-test-subj="productCard-elasticsearch"]')).toHaveLength(1); }); it('renders empty prompt and no cards or license callout if the user does not have access', () => { @@ -98,8 +87,6 @@ describe('ProductSelector', () => { expect(wrapper.find(EuiEmptyPrompt)).toHaveLength(1); expect(wrapper.find(ProductCard)).toHaveLength(0); - expect(wrapper.find(LicenseCallout)).toHaveLength(0); - expect(wrapper.find(ElasticsearchCard)).toHaveLength(0); }); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx index b958fb3925d4e..e5fd87d12f2fa 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx @@ -17,28 +17,23 @@ import { EuiImage, EuiLink, EuiSpacer, - EuiText, EuiTitle, } from '@elastic/eui'; import { Chat } from '@kbn/cloud-plugin/public'; import { i18n } from '@kbn/i18n'; import { - KibanaPageTemplateSolutionNavAvatar, - NO_DATA_PAGE_TEMPLATE_PROPS, -} from '@kbn/kibana-react-plugin/public'; - -import { APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; + APP_SEARCH_PLUGIN, + ELASTICSEARCH_PLUGIN, + WORKPLACE_SEARCH_PLUGIN, +} from '../../../../../common/constants'; +import { AddContentEmptyPrompt } from '../../../shared/add_content_empty_prompt'; import { docLinks } from '../../../shared/doc_links'; import { KibanaLogic } from '../../../shared/kibana'; import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendEnterpriseSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; -import AppSearchImage from '../../assets/app_search.png'; -import WorkplaceSearchImage from '../../assets/workplace_search.png'; -import { ElasticsearchCard } from '../elasticsearch_card'; import { EnterpriseSearchOverviewPageTemplate } from '../layout'; -import { LicenseCallout } from '../license_callout'; import { ProductCard } from '../product_card'; import { SetupGuideCta } from '../setup_guide'; import { TrialCallout } from '../trial_callout'; @@ -74,30 +69,236 @@ export const ProductSelector: React.FC = ({ const productCards = ( <> - - + - - + + +

+ {i18n.translate('xpack.enterpriseSearch.overview.productSelector.title', { + defaultMessage: 'Search experiences for every use case', + })} +

+
+ + + + + {shouldShowAppSearchCard && ( - - + + )} {shouldShowWorkplaceSearchCard && ( - + )} - - - - {config.host ? : } + {!config.host && } ); @@ -152,38 +353,17 @@ export const ProductSelector: React.FC = ({ /> ); return ( - + - - - - - - -

- {i18n.translate('xpack.enterpriseSearch.overview.heading', { - defaultMessage: 'Welcome to Elastic Enterprise Search', - })} -

-

- {config.host - ? i18n.translate('xpack.enterpriseSearch.overview.subheading', { - defaultMessage: 'Add search to your app or organization.', - }) - : i18n.translate('xpack.enterpriseSearch.overview.setupHeading', { - defaultMessage: 'Choose a product to set up and get started.', - })} -

-
-
-
- {shouldShowEnterpriseSearchCards ? productCards : insufficientAccessMessage}
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/constants.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/constants.ts index 3ab00cdd27e72..f702452cacc36 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/constants.ts @@ -10,6 +10,6 @@ import { i18n } from '@kbn/i18n'; export const PRODUCT_SELECTOR_CALLOUT_HEADING = i18n.translate( 'xpack.enterpriseSearch.productSelectorCalloutTitle', { - defaultMessage: 'Enterprise-grade features for teams big and small', + defaultMessage: 'Upgrade to get enterprise-level features for your team', } ); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.scss b/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.scss index c0fafb151174d..88f5fa86be148 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.scss +++ b/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.scss @@ -2,6 +2,4 @@ @include euiBreakpoint('xs','s') { flex-direction: column-reverse; } - - border-bottom: $euiBorderThin; } diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.tsx index 6025fbbdb96c0..e026271fd4f85 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/add_content_empty_prompt/add_content_empty_prompt.tsx @@ -19,29 +19,39 @@ import { EuiTitle, EuiText, EuiSpacer, + useEuiTheme, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../common/constants'; +import welcomeGraphicDark from '../../../assets/images/welcome_dark.svg'; +import welcomeGraphicLight from '../../../assets/images/welcome_light.svg'; import { NEW_INDEX_PATH } from '../../enterprise_search_content/routes'; import { EuiLinkTo } from '../react_router_helpers'; -import searchIndicesIllustration from './search_indices.svg'; import './add_content_empty_prompt.scss'; -export const AddContentEmptyPrompt: React.FC = () => { +interface EmptyPromptProps { + title?: string; + buttonLabel?: string; +} + +export const AddContentEmptyPrompt: React.FC = ({ title, buttonLabel }) => { + const { colorMode } = useEuiTheme(); + return ( - +

- {i18n.translate('xpack.enterpriseSearch.overview.emptyState.heading', { - defaultMessage: 'Add content to Enterprise Search', - })} + {title || + i18n.translate('xpack.enterpriseSearch.overview.emptyState.heading', { + defaultMessage: 'Add content to Enterprise Search', + })}

@@ -49,7 +59,13 @@ export const AddContentEmptyPrompt: React.FC = () => {

{i18n.translate('xpack.enterpriseSearch.emptyState.description', { defaultMessage: - "Data you add in Enterprise Search is called a Search index and it's searchable in both App and Workplace Search. Now you can use your connectors in App Search and your web crawlers in Workplace Search.", + 'You can now easily create and add content to Elasticsearch indices with Enterprise Search - including website content with the Elastic Web Crawler or third-party data sources with Custom Connectors.', + })} +

+

+ {i18n.translate('xpack.enterpriseSearch.emptyState.description.line2', { + defaultMessage: + "Whether you're building a search experience with App Search or Elasticsearch, you can now get started here.", })}

@@ -62,9 +78,10 @@ export const AddContentEmptyPrompt: React.FC = () => { shouldNotCreateHref > - {i18n.translate('xpack.enterpriseSearch.overview.emptyState.buttonTitle', { - defaultMessage: 'Add content to Enterprise Search', - })} + {buttonLabel || + i18n.translate('xpack.enterpriseSearch.overview.emptyState.buttonTitle', { + defaultMessage: 'Add content to Enterprise Search', + })}
@@ -82,9 +99,9 @@ export const AddContentEmptyPrompt: React.FC = () => {
( - + <>

{i18n.translate('xpack.enterpriseSearch.overview.elasticsearchResources.title', { @@ -53,5 +53,5 @@ export const ElasticsearchResources: React.FC = () => ( defaultMessage: 'Search UI for Elasticsearch', })} - + ); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.test.tsx index 7cf92dab0aa22..88e80a3a6f182 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.test.tsx @@ -44,15 +44,15 @@ describe('GettingStartedSteps', () => { ...rest, })); - expect(steps[0].title).toEqual('Add your documents and data to Enterprise Search'); + expect(steps[0].title).toEqual('Select or create an Elasticsearch index'); expect(steps[0].status).toEqual('current'); expect(steps[0].children.find(IconRow).length).toEqual(1); - expect(steps[1].title).toEqual('Build a search experience'); + expect(steps[1].title).toEqual('Assign your index to an App Search engine'); expect(steps[1].status).toEqual('incomplete'); expect(steps[1].children.find(EuiLinkTo).prop('to')).toEqual(ELASTICSEARCH_PLUGIN.URL); - expect(steps[2].title).toEqual('Tune your search relevance'); + expect(steps[2].title).toEqual('Build a client-side search experience with Search UI'); expect(steps[2].status).toEqual('incomplete'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.tsx index bf389f8b81581..ec884cfa9c2ef 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/getting_started_steps/getting_started_steps.tsx @@ -29,17 +29,17 @@ export const GettingStartedSteps: React.FC = ({ step = { title: i18n.translate( 'xpack.enterpriseSearch.overview.gettingStartedSteps.addData.title', - { defaultMessage: 'Add your documents and data to Enterprise Search' } + { defaultMessage: 'Select or create an Elasticsearch index' } ), children: ( <> - +

{i18n.translate( 'xpack.enterpriseSearch.overview.gettingStartedSteps.addData.message', { defaultMessage: - 'Get started by adding your data to Enterprise Search. You can use the Elastic Web Crawler, API endpoints, existing Elasticsearch indices or third party connectors like Google Drive, Microsoft Sharepoint and more.', + 'Get started by adding your data to Enterprise Search. You can use the Elastic Web Crawler, API endpoints, existing Elasticsearch indices , or third-party connectors like Google Drive, Microsoft Sharepoint and more.', } )}

@@ -53,17 +53,17 @@ export const GettingStartedSteps: React.FC = ({ step = { title: i18n.translate( 'xpack.enterpriseSearch.overview.gettingStartedSteps.buildSearchExperience.title', - { defaultMessage: 'Build a search experience' } + { defaultMessage: 'Assign your index to an App Search engine' } ), children: ( <> - +

{i18n.translate( 'xpack.enterpriseSearch.overview.gettingStartedSteps.buildSearchExperience.message', { defaultMessage: - 'You can use Search Engines to build customized search experiences for your customers or internal teams with App Search or Workplace Search. Or you can use Search UI to connect directly to an Elasticsearch index to build client-side search experinces for your users.', + 'You can use search engines to build customizable search experiences for your customers with App Search.', } )}

@@ -88,16 +88,16 @@ export const GettingStartedSteps: React.FC = ({ step = { title: i18n.translate( 'xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.title', - { defaultMessage: 'Tune your search relevance' } + { defaultMessage: 'Build a client-side search experience with Search UI' } ), children: ( - +

{i18n.translate( 'xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.message', { defaultMessage: - "Dive into analytics and tune the result settings to help your users find exactly what they're looking for", + 'Take full control over your client-side search experience by building with the Search UI library. Connect directly to App Search or Elasticsearch.', } )}

diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/licensing/manage_license_button.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/licensing/manage_license_button.tsx index d0fe98a7c1393..fc2984783ffd8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/licensing/manage_license_button.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/licensing/manage_license_button.tsx @@ -21,7 +21,12 @@ export const ManageLicenseButton: React.FC = (props) => { const { canManageLicense } = useValues(LicensingLogic); return canManageLicense ? ( - + {i18n.translate('xpack.enterpriseSearch.licenseManagementLink', { defaultMessage: 'Manage your license', })} diff --git a/x-pack/plugins/enterprise_search/public/assets/images/welcome_dark.svg b/x-pack/plugins/enterprise_search/public/assets/images/welcome_dark.svg new file mode 100644 index 0000000000000..203154c5a11f0 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/assets/images/welcome_dark.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/x-pack/plugins/enterprise_search/public/assets/images/welcome_light.svg b/x-pack/plugins/enterprise_search/public/assets/images/welcome_light.svg new file mode 100644 index 0000000000000..0e5dc587ae17c --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/assets/images/welcome_light.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5f3d0eec0c8a3..949969222ee3d 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -11856,7 +11856,6 @@ "xpack.enterpriseSearch.overview.gettingStartedSteps.searchWithElasticsearchLink": "Rechercher avec l'API Elasticsearch", "xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.message": "Plonger dans les analyses et ajuster les paramètres de recherche pour aider vos utilisateurs à trouver exactement ce qu'ils cherchent", "xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.title": "Ajuster votre pertinence de recherche", - "xpack.enterpriseSearch.overview.heading": "Bienvenue dans Elastic Enterprise Search", "xpack.enterpriseSearch.overview.iconRow.api.title": "API", "xpack.enterpriseSearch.overview.iconRow.api.tooltip": "Publier des documents sur un point de terminaison d'API à partir de vos propres applications", "xpack.enterpriseSearch.overview.iconRow.confluence.title": "Confluence", @@ -11877,14 +11876,9 @@ "xpack.enterpriseSearch.overview.insufficientPermissionsFooterLinkLabel": "Lire la documentation", "xpack.enterpriseSearch.overview.insufficientPermissionsTitle": "Permissions insuffisantes", "xpack.enterpriseSearch.overview.navTitle": "Aperçu", - "xpack.enterpriseSearch.overview.productCard.heading": "Elastic {productName}", - "xpack.enterpriseSearch.overview.productCard.launchButton": "Ouvrir {productName}", - "xpack.enterpriseSearch.overview.productCard.setupButton": "Configurer {productName}", - "xpack.enterpriseSearch.overview.productName": "Enterprise Search", + "xpack.enterpriseSearch.overview.productName": "Enterprise Search", "xpack.enterpriseSearch.overview.searchIndices.image.altText": "Illustration d'index de recherche", - "xpack.enterpriseSearch.overview.setupCta.description": "Ajoutez des fonctions de recherche à votre application ou à votre organisation interne avec Elastic App Search et Workplace Search. Regardez la vidéo pour savoir ce qu'il est possible de faire lorsque la recherche est facilitée.", - "xpack.enterpriseSearch.overview.setupHeading": "Choisissez un produit à configurer et lancez-vous.", - "xpack.enterpriseSearch.overview.subheading": "Ajoutez une fonction de recherche à votre application ou à votre organisation.", + "xpack.enterpriseSearch.overview.setupCta.description": "Ajoutez des fonctions de recherche à votre application ou à votre organisation interne avec Elastic App Search et Workplace Search. Regardez la vidéo pour savoir ce qu'il est possible de faire lorsque la recherche est facilitée.", "xpack.enterpriseSearch.productSelectorCalloutTitle": "Des fonctionnalités de niveau entreprise pour les grandes et petites équipes", "xpack.enterpriseSearch.readOnlyMode.warning": "Enterprise Search est en mode de lecture seule. Vous ne pourrez pas effectuer de changements tels que création, modification ou suppression.", "xpack.enterpriseSearch.roleMapping.addRoleMappingButtonLabel": "Ajouter un mapping", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a7ff53d4453bf..5ca7e1b2c9e58 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -11848,7 +11848,6 @@ "xpack.enterpriseSearch.overview.gettingStartedSteps.searchWithElasticsearchLink": "Elasticsearch APIで検索", "xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.message": "分析を行い、結果設定を調整して、ユーザーが検索している内容を正確に見つけられるようにします。", "xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.title": "検索関連性の調整", - "xpack.enterpriseSearch.overview.heading": "Elasticエンタープライズサーチへようこそ", "xpack.enterpriseSearch.overview.iconRow.api.title": "API", "xpack.enterpriseSearch.overview.iconRow.api.tooltip": "独自のアプリケーションからAPIエンドポイントにドキュメントをPOST", "xpack.enterpriseSearch.overview.iconRow.confluence.title": "Confluence", @@ -11869,14 +11868,9 @@ "xpack.enterpriseSearch.overview.insufficientPermissionsFooterLinkLabel": "ドキュメンテーションを表示", "xpack.enterpriseSearch.overview.insufficientPermissionsTitle": "パーミッションがありません", "xpack.enterpriseSearch.overview.navTitle": "概要", - "xpack.enterpriseSearch.overview.productCard.heading": "Elastic {productName}", - "xpack.enterpriseSearch.overview.productCard.launchButton": "{productName}を開く", - "xpack.enterpriseSearch.overview.productCard.setupButton": "{productName}をセットアップ", "xpack.enterpriseSearch.overview.productName": "Enterprise Search", "xpack.enterpriseSearch.overview.searchIndices.image.altText": "検索インデックスの例", "xpack.enterpriseSearch.overview.setupCta.description": "Elastic App Search および Workplace Search を使用して、アプリまたは社内組織に検索を追加できます。検索が簡単になるとどのような利点があるのかについては、動画をご覧ください。", - "xpack.enterpriseSearch.overview.setupHeading": "セットアップする製品を選択し、開始してください。", - "xpack.enterpriseSearch.overview.subheading": "アプリまたは組織に検索機能を追加できます。", "xpack.enterpriseSearch.productSelectorCalloutTitle": "あらゆる規模のチームに対応するエンタープライズ級の機能", "xpack.enterpriseSearch.readOnlyMode.warning": "エンタープライズ サーチは読み取り専用モードです。作成、編集、削除などの変更を実行できません。", "xpack.enterpriseSearch.roleMapping.addRoleMappingButtonLabel": "マッピングを追加", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 3a17d3d843df1..1e1b248b45af8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -11864,7 +11864,6 @@ "xpack.enterpriseSearch.overview.gettingStartedSteps.searchWithElasticsearchLink": "使用 Elasticsearch API 进行搜索", "xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.message": "深入进行分析并调整结果设置,以帮助用户准确找到他们寻找的内容", "xpack.enterpriseSearch.overview.gettingStartedSteps.tuneSearchExperience.title": "调整搜索相关性", - "xpack.enterpriseSearch.overview.heading": "欢迎使用 Elastic 企业搜索", "xpack.enterpriseSearch.overview.iconRow.api.title": "API", "xpack.enterpriseSearch.overview.iconRow.api.tooltip": "从您自己的应用程序将文档 POST 到 API 终端", "xpack.enterpriseSearch.overview.iconRow.confluence.title": "Confluence", @@ -11885,14 +11884,9 @@ "xpack.enterpriseSearch.overview.insufficientPermissionsFooterLinkLabel": "阅读文档", "xpack.enterpriseSearch.overview.insufficientPermissionsTitle": "权限不足", "xpack.enterpriseSearch.overview.navTitle": "概览", - "xpack.enterpriseSearch.overview.productCard.heading": "Elastic {productName}", - "xpack.enterpriseSearch.overview.productCard.launchButton": "打开 {productName}", - "xpack.enterpriseSearch.overview.productCard.setupButton": "设置 {productName}", "xpack.enterpriseSearch.overview.productName": "Enterprise Search", "xpack.enterpriseSearch.overview.searchIndices.image.altText": "搜索索引图示", "xpack.enterpriseSearch.overview.setupCta.description": "通过 Elastic App Search 和 Workplace Search,将搜索添加到您的应用或内部组织中。观看视频,了解方便易用的搜索功能可以帮您做些什么。", - "xpack.enterpriseSearch.overview.setupHeading": "选择产品进行设置并开始使用。", - "xpack.enterpriseSearch.overview.subheading": "将搜索功能添加到您的应用或组织。", "xpack.enterpriseSearch.productSelectorCalloutTitle": "适用于大型和小型团队的企业级功能", "xpack.enterpriseSearch.readOnlyMode.warning": "企业搜索处于只读模式。您将无法执行更改,例如创建、编辑或删除。", "xpack.enterpriseSearch.roleMapping.addRoleMappingButtonLabel": "添加映射", diff --git a/x-pack/test/accessibility/apps/enterprise_search.ts b/x-pack/test/accessibility/apps/enterprise_search.ts index b50c29a1d49f7..4c8a926da7d20 100644 --- a/x-pack/test/accessibility/apps/enterprise_search.ts +++ b/x-pack/test/accessibility/apps/enterprise_search.ts @@ -33,11 +33,15 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('loads a landing page with product cards', async function () { await retry.waitFor( - 'AS product card visible', + 'Elasticsearch product card visible', + async () => await testSubjects.exists('elasticsearchProductCard') + ); + await retry.waitFor( + 'App Search product card visible', async () => await testSubjects.exists('appSearchProductCard') ); await retry.waitFor( - 'WS product card visible', + 'Workplace Search product card visible', async () => await testSubjects.exists('workplaceSearchProductCard') ); await a11y.testAppSnapshot(); From 757001f3c6e4f6f66e1d2691215e117900ea8280 Mon Sep 17 00:00:00 2001 From: Spencer Date: Fri, 22 Jul 2022 12:03:28 -0700 Subject: [PATCH 29/78] [bazel] on CI, log buffered log lines that start with INFO: (#136981) --- packages/kbn-bazel-runner/src/bazel_runner.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/kbn-bazel-runner/src/bazel_runner.js b/packages/kbn-bazel-runner/src/bazel_runner.js index 257c7e695b312..78d91e7ae4799 100644 --- a/packages/kbn-bazel-runner/src/bazel_runner.js +++ b/packages/kbn-bazel-runner/src/bazel_runner.js @@ -58,7 +58,7 @@ function once(emitter, event) { * @param {import('./types').BazelRunOptions | undefined} options */ async function runBazelRunner(runner, args, options = undefined) { - const proc = ChildProcess.spawn(runner, args, { + const proc = ChildProcess.spawn(runner, options?.quiet ? [...args, '--color=no'] : args, { env: { ...process.env, ...options?.env, @@ -101,6 +101,15 @@ async function runBazelRunner(runner, args, options = undefined) { }), ]), ]); + + if (process.env.CI) { + // on CI it's useful to reduce the logging output, but we still want to see basic info from Bazel so continue to log the INFO: lines from bazel + for (const line of buffer) { + if (line.startsWith('INFO:') && !line.startsWith('INFO: From ')) { + console.log(options?.logPrefix ? `${options.logPrefix} ${line}` : line); + } + } + } } /** From 007addfa3b82b5d73130d5f25243b815bf8cbe11 Mon Sep 17 00:00:00 2001 From: Sander Philipse <94373878+sphilipse@users.noreply.github.com> Date: Fri, 22 Jul 2022 21:06:50 +0200 Subject: [PATCH 30/78] [Enterprise Search] Add API index creation (#136970) --- .../common/types/connectors.ts | 1 + .../__mocks__/search_indices.mock.ts | 1 + .../__mocks__/view_index.mock.ts | 1 + .../add_connector_package_api_logic.test.ts | 16 ++++-- .../add_connector_package_api_logic.ts | 7 ++- .../index/create_api_index_api_logic.test.ts | 31 +++++++++++ .../api/index/create_api_index_api_logic.ts | 45 +++++++++++++++ .../{ => method_api}/method_api.test.tsx | 3 +- .../new_index/{ => method_api}/method_api.tsx | 14 ++--- .../method_api/method_api_logic.test.ts | 55 +++++++++++++++++++ .../new_index/method_api/method_api_logic.ts | 48 ++++++++++++++++ .../method_connector/method_connector.tsx | 6 +- .../method_crawler_logic.test.ts | 5 +- .../components/new_index/new_index.tsx | 2 +- .../lib/connectors/add_connector.test.ts | 36 +++++++++--- .../server/lib/connectors/add_connector.ts | 15 +++-- .../server/lib/indices/create_index.ts | 22 ++++---- .../routes/enterprise_search/connectors.ts | 1 + .../routes/enterprise_search/indices.ts | 6 +- 19 files changed, 269 insertions(+), 46 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.ts rename x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/{ => method_api}/method_api.test.tsx (91%) rename x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/{ => method_api}/method_api.tsx (91%) create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api_logic.test.ts create mode 100644 x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api_logic.ts diff --git a/x-pack/plugins/enterprise_search/common/types/connectors.ts b/x-pack/plugins/enterprise_search/common/types/connectors.ts index a0019b6eadd38..faef7e5910886 100644 --- a/x-pack/plugins/enterprise_search/common/types/connectors.ts +++ b/x-pack/plugins/enterprise_search/common/types/connectors.ts @@ -34,6 +34,7 @@ export interface Connector { configuration: ConnectorConfiguration; id: string; index_name: string; + language: string | null; last_seen: string | null; last_sync_error: string | null; last_sync_status: string | null; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts index 37649cd258f1e..784fe38e28a67 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts @@ -25,6 +25,7 @@ export const indices: ElasticsearchIndexWithIngestion[] = [ configuration: {}, id: '2', index_name: 'connector', + language: 'en', last_seen: null, last_sync_error: null, last_sync_status: SyncStatus.COMPLETED, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts index b3a7f3d6c166d..9ee70460998a4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts @@ -34,6 +34,7 @@ export const connectorIndex: ConnectorViewIndex = { configuration: {}, id: '2', index_name: 'connector', + language: 'en', last_seen: null, last_sync_error: null, last_sync_status: SyncStatus.COMPLETED, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.test.ts index cae52da6bbfca..034e852fb6d52 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.test.ts @@ -20,20 +20,28 @@ describe('addConnectorPackageApiLogic', () => { it('calls correct api', async () => { const promise = Promise.resolve({ id: 'unique id', index_name: 'indexName' }); http.post.mockReturnValue(promise); - const result = addConnectorPackage({ indexName: 'indexName' }); + const result = addConnectorPackage({ indexName: 'indexName', language: 'en' }); await nextTick(); expect(http.post).toHaveBeenCalledWith('/internal/enterprise_search/connectors', { - body: JSON.stringify({ index_name: 'indexName' }), + body: JSON.stringify({ index_name: 'indexName', language: 'en' }), }); await expect(result).resolves.toEqual({ id: 'unique id', indexName: 'indexName' }); }); it('adds delete param if specific', async () => { const promise = Promise.resolve({ id: 'unique id', index_name: 'indexName' }); http.post.mockReturnValue(promise); - const result = addConnectorPackage({ deleteExistingConnector: true, indexName: 'indexName' }); + const result = addConnectorPackage({ + deleteExistingConnector: true, + indexName: 'indexName', + language: null, + }); await nextTick(); expect(http.post).toHaveBeenCalledWith('/internal/enterprise_search/connectors', { - body: JSON.stringify({ index_name: 'indexName', delete_existing_connector: true }), + body: JSON.stringify({ + delete_existing_connector: true, + index_name: 'indexName', + language: null, + }), }); await expect(result).resolves.toEqual({ id: 'unique id', indexName: 'indexName' }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.ts index d664f77c841d6..9805457c65b2f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector_package/add_connector_package_api_logic.ts @@ -16,6 +16,7 @@ interface AddConnectorValue { export interface AddConnectorPackageApiLogicArgs { deleteExistingConnector?: boolean; indexName: string; + language: string | null; } export interface AddConnectorPackageApiLogicResponse { @@ -24,8 +25,9 @@ export interface AddConnectorPackageApiLogicResponse { } export const addConnectorPackage = async ({ - indexName, deleteExistingConnector, + indexName, + language, }: AddConnectorPackageApiLogicArgs): Promise => { const route = '/internal/enterprise_search/connectors'; @@ -33,8 +35,9 @@ export const addConnectorPackage = async ({ ? { delete_existing_connector: deleteExistingConnector } : {}; const params = { - index_name: indexName, ...deleteParam, + index_name: indexName, + language, }; const result = await HttpLogic.values.http.post(route, { body: JSON.stringify(params), diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.test.ts new file mode 100644 index 0000000000000..4e304d193b564 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mockHttpValues } from '../../../__mocks__/kea_logic'; + +import { nextTick } from '@kbn/test-jest-helpers'; + +import { createApiIndex } from './create_api_index_api_logic'; + +describe('createApiIndexApiLogic', () => { + const { http } = mockHttpValues; + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('createApiIndex', () => { + it('calls correct api', async () => { + const promise = Promise.resolve({ index: 'indexName' }); + http.post.mockReturnValue(promise); + const result = createApiIndex({ indexName: 'indexName', language: 'en' }); + await nextTick(); + expect(http.post).toHaveBeenCalledWith('/internal/enterprise_search/indices', { + body: JSON.stringify({ index_name: 'indexName', language: 'en' }), + }); + await expect(result).resolves.toEqual({ indexName: 'indexName' }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.ts new file mode 100644 index 0000000000000..ecf67a1374cd7 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/index/create_api_index_api_logic.ts @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +interface CreateApiIndexValue { + index: string; +} + +export interface CreateApiIndexApiLogicArgs { + deleteExistingConnector?: boolean; + indexName: string; + language: string | null; +} + +export interface CreateApiIndexApiLogicResponse { + indexName: string; +} + +export const createApiIndex = async ({ + indexName, + language, +}: CreateApiIndexApiLogicArgs): Promise => { + const route = '/internal/enterprise_search/indices'; + const params = { + index_name: indexName, + language, + }; + const result = await HttpLogic.values.http.post(route, { + body: JSON.stringify(params), + }); + return { + indexName: result.index, + }; +}; + +export const CreateApiIndexApiLogic = createApiLogic( + ['create_api_index_api_logic'], + createApiIndex +); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api.test.tsx similarity index 91% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api.test.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api.test.tsx index 93b92271cbd28..0a7e767617b38 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api.test.tsx @@ -11,8 +11,9 @@ import { shallow } from 'enzyme'; import { EuiSteps } from '@elastic/eui'; +import { NewSearchIndexTemplate } from '../new_search_index_template'; + import { MethodApi } from './method_api'; -import { NewSearchIndexTemplate } from './new_search_index_template'; describe('MethodApi', () => { beforeEach(() => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api.tsx similarity index 91% rename from x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api.tsx rename to x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api.tsx index 22dc277fbe8a5..173ed3227ea8f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api.tsx @@ -5,20 +5,20 @@ * 2.0. */ -/** - * TODO: - * - Need to add documentation URLs (search for `#`s) - */ - import React from 'react'; +import { useActions } from 'kea'; + import { EuiSteps, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { NewSearchIndexTemplate } from './new_search_index_template'; +import { NewSearchIndexTemplate } from '../new_search_index_template'; + +import { MethodApiLogic } from './method_api_logic'; export const MethodApi: React.FC = () => { + const { makeRequest } = useActions(MethodApiLogic); return ( { /> } type="api" - onSubmit={() => null} + onSubmit={(indexName, language) => makeRequest({ indexName, language })} > { + const { mount } = new LogicMounter(MethodApiLogic); + const { clearFlashMessages, flashAPIErrors } = mockFlashMessageHelpers; + const { navigateToUrl } = mockKibanaValues; + + beforeEach(() => { + jest.clearAllMocks(); + mount(); + }); + + describe('listeners', () => { + describe('apiSuccess', () => { + it('navigates user to index detail view', () => { + MethodApiLogic.actions.apiSuccess({ indexName: 'my-index' }); + + expect(navigateToUrl).toHaveBeenCalledWith('/search_indices/my-index/overview'); + }); + }); + + describe('makeRequest', () => { + it('clears any displayed errors', () => { + MethodApiLogic.actions.makeRequest({ indexName: 'my-index', language: 'Universal' }); + + expect(clearFlashMessages).toHaveBeenCalled(); + }); + }); + + describe('apiError', () => { + it('displays the error to the user', () => { + const error = {} as HttpError; + + MethodApiLogic.actions.apiError(error); + + expect(flashAPIErrors).toHaveBeenCalledWith(error); + }); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api_logic.ts new file mode 100644 index 0000000000000..65d1563458319 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_api/method_api_logic.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 { kea, MakeLogicType } from 'kea'; + +import { Actions } from '../../../../shared/api_logic/create_api_logic'; +import { generateEncodedPath } from '../../../../shared/encode_path_params'; + +import { clearFlashMessages, flashAPIErrors } from '../../../../shared/flash_messages'; + +import { KibanaLogic } from '../../../../shared/kibana'; +import { + CreateApiIndexApiLogic, + CreateApiIndexApiLogicArgs, + CreateApiIndexApiLogicResponse, +} from '../../../api/index/create_api_index_api_logic'; +import { SEARCH_INDEX_TAB_PATH } from '../../../routes'; +import { SearchIndexTabId } from '../../search_index/search_index'; + +type MethodApiActions = Pick< + Actions, + 'apiError' | 'apiSuccess' | 'makeRequest' +>; + +export const MethodApiLogic = kea>({ + connect: { + actions: [CreateApiIndexApiLogic, ['apiError', 'apiSuccess', 'makeRequest']], + }, + listeners: { + apiError: (error) => { + flashAPIErrors(error); + }, + apiSuccess: ({ indexName }) => { + KibanaLogic.values.navigateToUrl( + generateEncodedPath(SEARCH_INDEX_TAB_PATH, { + indexName, + tabId: SearchIndexTabId.OVERVIEW, + }) + ); + }, + makeRequest: () => clearFlashMessages(), + }, + path: ['enterprise_search', 'method_api'], +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx index 0022ac1676ead..03ffef8b4c2e8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/method_connector/method_connector.tsx @@ -68,7 +68,7 @@ export const MethodConnector: React.FC = () => { const { error, status } = useValues(AddConnectorPackageApiLogic); const { isModalVisible } = useValues(AddConnectorPackageLogic); const { setIsModalVisible } = useActions(AddConnectorPackageLogic); - const { fullIndexName } = useValues(NewSearchIndexLogic); + const { fullIndexName, language } = useValues(NewSearchIndexLogic); const confirmModal = isModalVisible && ( { }} onConfirm={(event) => { event.preventDefault(); - makeRequest({ deleteExistingConnector: true, indexName: fullIndexName }); + makeRequest({ deleteExistingConnector: true, indexName: fullIndexName, language }); }} cancelButtonText={i18n.translate( 'xpack.enterpriseSearch.content.newIndex.steps.buildConnector.confirmModal.cancelButton.label', @@ -123,7 +123,7 @@ export const MethodConnector: React.FC = () => { onNameChange={() => { apiReset(); }} - onSubmit={(name) => makeRequest({ indexName: name })} + onSubmit={(name, lang) => makeRequest({ indexName: name, language: lang })} buttonLoading={status === Status.LOADING} > { +describe('MethodCrawlerLogic', () => { const { mount } = new LogicMounter(MethodCrawlerLogic); const { clearFlashMessages, flashAPIErrors } = mockFlashMessageHelpers; const { navigateToUrl } = mockKibanaValues; @@ -31,7 +30,7 @@ describe.skip('MethodCrawlerLogic', () => { it('navigates user to index detail view', () => { MethodCrawlerLogic.actions.apiSuccess({ created: 'my-index' }); - expect(navigateToUrl).toHaveBeenCalledWith('/search_indices/my-index'); + expect(navigateToUrl).toHaveBeenCalledWith('/search_indices/my-index/domain_management'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_index.tsx index 6aaee3099d729..4f4c54801ef4d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/new_index/new_index.tsx @@ -30,7 +30,7 @@ import { baseBreadcrumbs } from '../search_indices'; import { ButtonGroup, ButtonGroupOption } from './button_group'; import { SearchIndexEmptyState } from './empty_state'; -import { MethodApi } from './method_api'; +import { MethodApi } from './method_api/method_api'; import { MethodConnector } from './method_connector/method_connector'; import { MethodCrawler } from './method_crawler/method_crawler'; diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts index 21f5d6accac73..f458e95b9c114 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.test.ts @@ -46,13 +46,17 @@ describe('addConnector lib function', () => { (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); await expect( - addConnector(mockClient as unknown as IScopedClusterClient, { index_name: 'index_name' }) + addConnector(mockClient as unknown as IScopedClusterClient, { + index_name: 'index_name', + language: 'en', + }) ).resolves.toEqual({ id: 'fakeId', index_name: 'index_name' }); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ document: { api_key_id: null, configuration: {}, index_name: 'index_name', + language: 'en', last_seen: null, last_sync_error: null, last_sync_status: null, @@ -73,7 +77,10 @@ describe('addConnector lib function', () => { (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => undefined); await expect( - addConnector(mockClient as unknown as IScopedClusterClient, { index_name: 'index_name' }) + addConnector(mockClient as unknown as IScopedClusterClient, { + index_name: 'index_name', + language: 'en', + }) ).rejects.toEqual(new Error(ErrorCode.INDEX_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); }); @@ -84,7 +91,10 @@ describe('addConnector lib function', () => { (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => true); await expect( - addConnector(mockClient as unknown as IScopedClusterClient, { index_name: 'index_name' }) + addConnector(mockClient as unknown as IScopedClusterClient, { + index_name: 'index_name', + language: 'en', + }) ).rejects.toEqual(new Error(ErrorCode.CONNECTOR_DOCUMENT_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); }); @@ -95,7 +105,10 @@ describe('addConnector lib function', () => { (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => true); await expect( - addConnector(mockClient as unknown as IScopedClusterClient, { index_name: 'index_name' }) + addConnector(mockClient as unknown as IScopedClusterClient, { + index_name: 'index_name', + language: 'en', + }) ).rejects.toEqual(new Error(ErrorCode.INDEX_ALREADY_EXISTS)); expect(mockClient.asCurrentUser.indices.create).not.toHaveBeenCalled(); }); @@ -109,6 +122,7 @@ describe('addConnector lib function', () => { addConnector(mockClient as unknown as IScopedClusterClient, { delete_existing_connector: true, index_name: 'index_name', + language: null, }) ).resolves.toEqual({ id: 'fakeId', index_name: 'index_name' }); expect(mockClient.asCurrentUser.delete).toHaveBeenCalledWith({ @@ -120,6 +134,7 @@ describe('addConnector lib function', () => { api_key_id: null, configuration: {}, index_name: 'index_name', + language: null, last_seen: null, last_sync_error: null, last_sync_status: null, @@ -144,7 +159,10 @@ describe('addConnector lib function', () => { mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => false); await expect( - addConnector(mockClient as unknown as IScopedClusterClient, { index_name: 'index_name' }) + addConnector(mockClient as unknown as IScopedClusterClient, { + index_name: 'index_name', + language: 'en', + }) ).resolves.toEqual({ id: 'fakeId', index_name: 'index_name' }); expect(setupConnectorsIndices as jest.Mock).toHaveBeenCalledWith(mockClient.asCurrentUser); expect(mockClient.asCurrentUser.index).toHaveBeenCalledWith({ @@ -152,6 +170,7 @@ describe('addConnector lib function', () => { api_key_id: null, configuration: {}, index_name: 'index_name', + language: 'en', last_seen: null, last_sync_error: null, last_sync_status: null, @@ -163,7 +182,7 @@ describe('addConnector lib function', () => { }, index: CONNECTORS_INDEX, }); - expect(mockClient.asCurrentUser.index).toHaveBeenCalledTimes(2); + expect(mockClient.asCurrentUser.indices.create).toHaveBeenCalledWith({ index: 'index_name' }); }); it('should not create index if status code is not 404', async () => { mockClient.asCurrentUser.index.mockImplementationOnce(() => { @@ -172,7 +191,10 @@ describe('addConnector lib function', () => { mockClient.asCurrentUser.indices.exists.mockImplementation(() => false); (fetchConnectorByIndexName as jest.Mock).mockImplementation(() => false); await expect( - addConnector(mockClient as unknown as IScopedClusterClient, { index_name: 'index_name' }) + addConnector(mockClient as unknown as IScopedClusterClient, { + index_name: 'index_name', + language: 'en', + }) ).rejects.toEqual({ statusCode: 500 }); expect(setupConnectorsIndices).not.toHaveBeenCalled(); expect(mockClient.asCurrentUser.index).toHaveBeenCalledTimes(1); diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts index 855afde8e9a68..42533a1275a3c 100644 --- a/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/add_connector.ts @@ -20,6 +20,7 @@ import { fetchConnectorByIndexName } from './fetch_connectors'; const createConnector = async ( document: ConnectorDocument, client: IScopedClusterClient, + language: string | null, deleteExisting: boolean ): Promise<{ id: string; index_name: string }> => { const index = document.index_name; @@ -42,7 +43,7 @@ const createConnector = async ( document, index: CONNECTORS_INDEX, }); - await client.asCurrentUser.indices.create({ index: document.index_name }); + await client.asCurrentUser.indices.create({ index }); await client.asCurrentUser.indices.refresh({ index: CONNECTORS_INDEX }); return { id: result._id, index_name: document.index_name }; @@ -50,12 +51,13 @@ const createConnector = async ( export const addConnector = async ( client: IScopedClusterClient, - input: { delete_existing_connector?: boolean; index_name: string } + input: { delete_existing_connector?: boolean; index_name: string; language: string | null } ): Promise<{ id: string; index_name: string }> => { const document: ConnectorDocument = { api_key_id: null, configuration: {}, index_name: input.index_name, + language: input.language, last_seen: null, last_sync_error: null, last_sync_status: null, @@ -66,13 +68,18 @@ export const addConnector = async ( sync_now: false, }; try { - return await createConnector(document, client, !!input.delete_existing_connector); + return await createConnector( + document, + client, + input.language, + !!input.delete_existing_connector + ); } catch (error) { if (isIndexNotFoundException(error)) { // This means .ent-search-connectors index doesn't exist yet // So we first have to create it, and then try inserting the document again await setupConnectorsIndices(client.asCurrentUser); - return await createConnector(document, client, false); + return await createConnector(document, client, input.language, false); } else { throw error; } diff --git a/x-pack/plugins/enterprise_search/server/lib/indices/create_index.ts b/x-pack/plugins/enterprise_search/server/lib/indices/create_index.ts index be6748f0a9bdf..1e3df81ab7963 100644 --- a/x-pack/plugins/enterprise_search/server/lib/indices/create_index.ts +++ b/x-pack/plugins/enterprise_search/server/lib/indices/create_index.ts @@ -11,23 +11,23 @@ import { IScopedClusterClient } from '@kbn/core/server'; import { textAnalysisSettings } from './text_analysis'; const prefixMapping: MappingTextProperty = { - search_analyzer: 'q_prefix', analyzer: 'i_prefix', - type: 'text', index_options: 'docs', + search_analyzer: 'q_prefix', + type: 'text', }; const delimiterMapping: MappingTextProperty = { analyzer: 'iq_text_delimiter', - type: 'text', index_options: 'freqs', + type: 'text', }; const joinedMapping: MappingTextProperty = { - search_analyzer: 'q_text_bigram', analyzer: 'i_text_bigram', - type: 'text', index_options: 'freqs', + search_analyzer: 'q_text_bigram', + type: 'text', }; const enumMapping: MappingKeywordProperty = { @@ -45,17 +45,17 @@ const defaultMappings = { dynamic_templates: [ { all_text_fields: { - match_mapping_type: 'string', mapping: { analyzer: 'iq_text_base', fields: { - prefix: prefixMapping, delimiter: delimiterMapping, - joined: joinedMapping, enum: enumMapping, + joined: joinedMapping, + prefix: prefixMapping, stem: stemMapping, }, }, + match_mapping_type: 'string', }, }, ], @@ -64,13 +64,13 @@ const defaultMappings = { export const createApiIndex = async ( client: IScopedClusterClient, indexName: string, - language: string | undefined + language: string | undefined | null ) => { return await client.asCurrentUser.indices.create({ - index: indexName, body: { mappings: defaultMappings, - settings: textAnalysisSettings(language), + settings: textAnalysisSettings(language ?? undefined), }, + index: indexName, }); }; diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index 035536c5480f2..5c2f191eb1395 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -25,6 +25,7 @@ export function registerConnectorRoutes({ router }: RouteDependencies) { body: schema.object({ delete_existing_connector: schema.maybe(schema.boolean()), index_name: schema.string(), + language: schema.nullable(schema.string()), }), }, }, diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts index 6cca98815c456..b673e93d7524b 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/indices.ts @@ -187,13 +187,13 @@ export function registerIndexRoutes({ router }: RouteDependencies) { path: '/internal/enterprise_search/indices', validate: { body: schema.object({ - indexName: schema.string(), - language: schema.maybe(schema.string()), + index_name: schema.string(), + language: schema.maybe(schema.nullable(schema.string())), }), }, }, async (context, request, response) => { - const { indexName, language } = request.body; + const { ['index_name']: indexName, language } = request.body; const { client } = (await context.core).elasticsearch; try { const createIndexResponse = await createApiIndex(client, indexName, language); From 20de3fb673250d6e68bec9ac8a6fe07c7193d57a Mon Sep 17 00:00:00 2001 From: Steve Ross Date: Fri, 22 Jul 2022 15:07:13 -0400 Subject: [PATCH 31/78] update overview CTI link to use new threat intel category (#136208) --- .../cypress/integration/overview/cti_link_panel.spec.ts | 2 +- .../overview_cti_links/use_integrations_page_link.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts b/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts index 62f783e573f16..f1c8b8d5d3596 100644 --- a/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts @@ -28,7 +28,7 @@ describe('CTI Link Panel', () => { cy.get(`${OVERVIEW_CTI_ENABLE_MODULE_BUTTON}`).should('exist'); cy.get(`${OVERVIEW_CTI_ENABLE_MODULE_BUTTON}`) .should('have.attr', 'href') - .and('match', /app\/integrations\/browse\?q=threat%20intelligence/); + .and('match', /app\/integrations\/browse\/threat_intel/); }); describe('enabled threat intel module', () => { diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx index de710c2f1b17c..f31ccad081e47 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx @@ -8,4 +8,4 @@ import { useBasePath } from '../../../common/lib/kibana'; export const useIntegrationsPageLink = () => - `${useBasePath()}/app/integrations/browse?q=threat%20intelligence`; + `${useBasePath()}/app/integrations/browse/threat_intel`; From 90091baedea34a0633d9c9f57005c6371cf253ca Mon Sep 17 00:00:00 2001 From: Davis McPhee Date: Fri, 22 Jul 2022 16:17:15 -0300 Subject: [PATCH 32/78] [Discover] Fix issue where Discover breadcrumb loses context after page refresh or when opening in a new tab (#136749) --- .../hooks/use_navigation_props.test.tsx | 19 ++++---- .../public/hooks/use_navigation_props.tsx | 48 +++++++++---------- .../apps/context/_context_navigation.ts | 25 ++++++++++ 3 files changed, 57 insertions(+), 35 deletions(-) diff --git a/src/plugins/discover/public/hooks/use_navigation_props.test.tsx b/src/plugins/discover/public/hooks/use_navigation_props.test.tsx index 26a3c8941ca0e..6057c57247734 100644 --- a/src/plugins/discover/public/hooks/use_navigation_props.test.tsx +++ b/src/plugins/discover/public/hooks/use_navigation_props.test.tsx @@ -9,12 +9,7 @@ import React, { ReactElement } from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { createFilterManagerMock } from '@kbn/data-plugin/public/query/filter_manager/filter_manager.mock'; -import { - getContextHash, - HistoryState, - useNavigationProps, - UseNavigationProps, -} from './use_navigation_props'; +import { getContextHash, useNavigationProps, UseNavigationProps } from './use_navigation_props'; import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -45,7 +40,7 @@ const getContextRoute = () => { }; const render = (withRouter = true, props?: Partial) => { - const history = createMemoryHistory({ + const history = createMemoryHistory({ initialEntries: ['/' + getSearch()], }); const wrapper = ({ children }: { children: ReactElement }) => ( @@ -66,8 +61,9 @@ describe('useNavigationProps', () => { // @ts-expect-error result.current.singleDocProps.onClick(); expect(history.location.pathname).toEqual(getSingeDocRoute()); - expect(history.location.search).toEqual(`?id=${defaultProps.rowId}`); - expect(history.location.state?.breadcrumb).toEqual(`#/${getSearch()}`); + expect(history.location.search).toEqual( + `?id=${defaultProps.rowId}&breadcrumb=${encodeURIComponent(`#/${getSearch()}`)}` + ); }); test('should provide valid breadcrumb for context page from main view', () => { @@ -77,9 +73,10 @@ describe('useNavigationProps', () => { result.current.surrDocsProps.onClick(); expect(history.location.pathname).toEqual(getContextRoute()); expect(history.location.search).toEqual( - `?${getContextHash(defaultProps.columns, filterManager)}` + `?${getContextHash(defaultProps.columns, filterManager)}&breadcrumb=${encodeURIComponent( + `#/${getSearch()}` + )}` ); - expect(history.location.state?.breadcrumb).toEqual(`#/${getSearch()}`); }); test('should create valid links to the context and single doc pages from embeddable', () => { diff --git a/src/plugins/discover/public/hooks/use_navigation_props.tsx b/src/plugins/discover/public/hooks/use_navigation_props.tsx index a62df3f09e2fe..c60b6c161015f 100644 --- a/src/plugins/discover/public/hooks/use_navigation_props.tsx +++ b/src/plugins/discover/public/hooks/use_navigation_props.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { MouseEventHandler, useMemo, useRef } from 'react'; +import { MouseEventHandler, useMemo } from 'react'; import { useHistory, matchPath } from 'react-router-dom'; import type { Location } from 'history'; import { stringify } from 'query-string'; @@ -27,8 +27,6 @@ export interface UseNavigationProps { addBasePath: (url: string) => string; } -export type HistoryState = { breadcrumb?: string } | undefined; - export const getContextHash = (columns: string[], filterManager: FilterManager) => { const globalFilters = filterManager.getGlobalFilters(); const appFilters = filterManager.getAppFilters(); @@ -64,16 +62,12 @@ const getCurrentBreadcrumbs = ( return isContextRoute ? prevBreadcrumb : '#' + currentLocation.pathname + currentLocation.search; }; -export const useMainRouteBreadcrumb = () => { - // useRef needed to retrieve initial breadcrumb link from the push state without updates - const breadcrumb = useRef(); - const history = useHistory(); - - if (history.location.state?.breadcrumb) { - breadcrumb.current = history.location.state.breadcrumb; - } +const getCurrentBreadcrumb = (search: string | undefined) => + new URLSearchParams(search).get('breadcrumb') || undefined; - return breadcrumb.current; +export const useMainRouteBreadcrumb = () => { + const history = useHistory(); + return useMemo(() => getCurrentBreadcrumb(history.location.search), [history.location.search]); }; export const useNavigationProps = ({ @@ -84,10 +78,13 @@ export const useNavigationProps = ({ filterManager, addBasePath, }: UseNavigationProps) => { - const history = useHistory(); + const history = useHistory(); const currentLocation = useDiscoverServices().history().location; - const prevBreadcrumb = useRef(history?.location.state?.breadcrumb).current; + const prevBreadcrumb = useMemo( + () => getCurrentBreadcrumb(history?.location?.search), + [history?.location?.search] + ); const contextSearchHash = useMemo( () => getContextHash(columns, filterManager), [columns, filterManager] @@ -111,16 +108,16 @@ export const useNavigationProps = ({ path: '/context/:indexPatternId/:id', exact: true, }); + const currentBreadcrumb = encodeURIComponent( + getCurrentBreadcrumbs(!!isContextRoute, currentLocation, prevBreadcrumb) ?? '' + ); const onOpenSingleDoc: MouseEventHandler = (event) => { event?.preventDefault?.(); history.push({ pathname: `/doc/${indexPatternId}/${rowIndex}`, - search: `?id=${encodeURIComponent(rowId)}`, - state: { - breadcrumb: getCurrentBreadcrumbs(!!isContextRoute, currentLocation, prevBreadcrumb), - }, + search: `?id=${encodeURIComponent(rowId)}&breadcrumb=${currentBreadcrumb}`, }); }; @@ -131,16 +128,19 @@ export const useNavigationProps = ({ pathname: `/context/${encodeURIComponent(indexPatternId)}/${encodeURIComponent( String(rowId) )}`, - search: `?${contextSearchHash}`, - state: { - breadcrumb: getCurrentBreadcrumbs(!!isContextRoute, currentLocation, prevBreadcrumb), - }, + search: `?${contextSearchHash}&breadcrumb=${currentBreadcrumb}`, }); }; return { - singleDocProps: { onClick: onOpenSingleDoc, href: singleDocHref }, - surrDocsProps: { onClick: onOpenSurrDocs, href: surDocsHref }, + singleDocProps: { + onClick: onOpenSingleDoc, + href: `${singleDocHref}&breadcrumb=${currentBreadcrumb}`, + }, + surrDocsProps: { + onClick: onOpenSurrDocs, + href: `${surDocsHref}&breadcrumb=${currentBreadcrumb}`, + }, }; } diff --git a/test/functional/apps/context/_context_navigation.ts b/test/functional/apps/context/_context_navigation.ts index 1bda70cc558ee..d87ef6275f3d3 100644 --- a/test/functional/apps/context/_context_navigation.ts +++ b/test/functional/apps/context/_context_navigation.ts @@ -86,5 +86,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { } ); }); + + it('should go back via breadcrumbs with preserved state after a page refresh', async function () { + await retry.waitFor( + 'user navigating to context and returning to discover via breadcrumbs', + async () => { + await dataGrid.clickRowToggle({ rowIndex: 0 }); + const rowActions = await dataGrid.getRowActions({ rowIndex: 0 }); + await rowActions[1].click(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await browser.refresh(); + await PageObjects.context.waitUntilContextLoadingHasFinished(); + await find.clickByCssSelector(`[data-test-subj="breadcrumb first"]`); + await PageObjects.discover.waitForDocTableLoadingComplete(); + + for (const [columnName, value] of TEST_FILTER_COLUMN_NAMES) { + expect(await filterBar.hasFilter(columnName, value)).to.eql(true); + } + expect(await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes()).to.eql({ + start: 'Sep 18, 2015 @ 06:31:44.000', + end: 'Sep 23, 2015 @ 18:31:44.000', + }); + return true; + } + ); + }); }); } From 9e1ce81ff357e0977c9608b7603d223342b90e08 Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Fri, 22 Jul 2022 12:20:55 -0700 Subject: [PATCH 33/78] [Console] Handle encoded characters in API requests (#136788) * Revert "Revert "[Console] Handle encoded characters in API requests (#135441)" (#136750)" This reverts commit 44d4b2a8d729e54454c2bb79531c2963b1783597. * Debug * Fix requests failing on cloud Co-authored-by: Muhammad Ibragimov --- .../console/server/lib/proxy_request.test.ts | 110 +++++++++--------- .../console/server/lib/proxy_request.ts | 25 +--- .../server/lib/utils/encode_path.test.ts | 37 ++++++ .../console/server/lib/utils/encode_path.ts | 28 +++++ src/plugins/console/server/lib/utils/index.ts | 10 ++ .../console/server/lib/utils/to_url.test.ts | 38 ++++++ .../console/server/lib/utils/to_url.ts | 34 ++++++ .../api/console/proxy/create_handler.ts | 23 +--- .../api/console/proxy/query_string.test.ts | 2 +- test/functional/apps/console/_console.ts | 16 +++ 10 files changed, 226 insertions(+), 97 deletions(-) create mode 100644 src/plugins/console/server/lib/utils/encode_path.test.ts create mode 100644 src/plugins/console/server/lib/utils/encode_path.ts create mode 100644 src/plugins/console/server/lib/utils/index.ts create mode 100644 src/plugins/console/server/lib/utils/to_url.test.ts create mode 100644 src/plugins/console/server/lib/utils/to_url.ts diff --git a/src/plugins/console/server/lib/proxy_request.test.ts b/src/plugins/console/server/lib/proxy_request.test.ts index 98c63d9685c87..a5b60895d68ce 100644 --- a/src/plugins/console/server/lib/proxy_request.test.ts +++ b/src/plugins/console/server/lib/proxy_request.test.ts @@ -6,11 +6,12 @@ * Side Public License, v 1. */ -import http, { ClientRequest } from 'http'; +import http, { ClientRequest, OutgoingHttpHeaders } from 'http'; import * as sinon from 'sinon'; import { proxyRequest } from './proxy_request'; import { URL } from 'url'; import { fail } from 'assert'; +import { toURL } from './utils'; describe(`Console's send request`, () => { let sandbox: sinon.SinonSandbox; @@ -29,6 +30,25 @@ describe(`Console's send request`, () => { fakeRequest = null as any; }); + const sendProxyRequest = async ({ + headers = {}, + uri = new URL('http://noone.nowhere.none'), + timeout = 3000, + }: { + headers?: OutgoingHttpHeaders; + uri?: URL; + timeout?: number; + }) => { + return await proxyRequest({ + agent: null as any, + headers, + method: 'get', + payload: null as any, + uri, + timeout, + }); + }; + it('correctly implements timeout and abort mechanism', async () => { fakeRequest = { destroy: sinon.stub(), @@ -36,14 +56,7 @@ describe(`Console's send request`, () => { once() {}, } as any; try { - await proxyRequest({ - agent: null as any, - headers: {}, - method: 'get', - payload: null as any, - timeout: 0, // immediately timeout - uri: new URL('http://noone.nowhere.none'), - }); + await sendProxyRequest({ timeout: 0 }); // immediately timeout fail('Should not reach here!'); } catch (e) { expect(e.message).toEqual('Client request timeout'); @@ -63,16 +76,9 @@ describe(`Console's send request`, () => { } as any; // Don't set a host header this time - const result1 = await proxyRequest({ - agent: null as any, - headers: {}, - method: 'get', - payload: null as any, - timeout: 30000, - uri: new URL('http://noone.nowhere.none'), - }); + const defaultResult = await sendProxyRequest({}); - expect(result1).toEqual('done'); + expect(defaultResult).toEqual('done'); const [httpRequestOptions1] = stub.firstCall.args; @@ -83,16 +89,9 @@ describe(`Console's send request`, () => { }); // Set a host header - const result2 = await proxyRequest({ - agent: null as any, - headers: { Host: 'myhost' }, - method: 'get', - payload: null as any, - timeout: 30000, - uri: new URL('http://noone.nowhere.none'), - }); + const resultWithHostHeader = await sendProxyRequest({ headers: { Host: 'myhost' } }); - expect(result2).toEqual('done'); + expect(resultWithHostHeader).toEqual('done'); const [httpRequestOptions2] = stub.secondCall.args; expect((httpRequestOptions2 as any).headers).toEqual({ @@ -102,7 +101,7 @@ describe(`Console's send request`, () => { }); }); - describe('with percent-encoded uri pathname', () => { + describe('with request path', () => { beforeEach(() => { fakeRequest = { abort: sinon.stub(), @@ -115,39 +114,42 @@ describe(`Console's send request`, () => { } as any; }); - it('should decode percent-encoded uri pathname and encode it correctly', async () => { - const uri = new URL( - `http://noone.nowhere.none/%{[@metadata][beat]}-%{[@metadata][version]}-2020.08.23` - ); - const result = await proxyRequest({ - agent: null as any, - headers: {}, - method: 'get', - payload: null as any, - timeout: 30000, - uri, + const verifyRequestPath = async ({ + initialPath, + expectedPath, + }: { + initialPath: string; + expectedPath: string; + uri?: URL; + }) => { + const result = await sendProxyRequest({ + uri: toURL('http://noone.nowhere.none', initialPath), }); - expect(result).toEqual('done'); const [httpRequestOptions] = stub.firstCall.args; - expect((httpRequestOptions as any).path).toEqual( - '/%25%7B%5B%40metadata%5D%5Bbeat%5D%7D-%25%7B%5B%40metadata%5D%5Bversion%5D%7D-2020.08.23' - ); + expect((httpRequestOptions as any).path).toEqual(expectedPath); + }; + + it('should correctly encode invalid URL characters included in path', async () => { + await verifyRequestPath({ + initialPath: '%{[@metadata][beat]}-%{[@metadata][version]}-2020.08.23', + expectedPath: + '/%25%7B%5B%40metadata%5D%5Bbeat%5D%7D-%25%7B%5B%40metadata%5D%5Bversion%5D%7D-2020.08.23?pretty=true', + }); }); - it('should issue request with date-math format', async () => { - const result = await proxyRequest({ - agent: null as any, - headers: {}, - method: 'get', - payload: null as any, - timeout: 30000, - uri: new URL(`http://noone.nowhere.none/%3Cmy-index-%7Bnow%2Fd%7D%3E`), + it('should not encode the path if it is encoded', async () => { + await verifyRequestPath({ + initialPath: '%3Cmy-index-%7Bnow%2Fd%7D%3E', + expectedPath: '/%3Cmy-index-%7Bnow%2Fd%7D%3E?pretty=true', }); + }); - expect(result).toEqual('done'); - const [httpRequestOptions] = stub.firstCall.args; - expect((httpRequestOptions as any).path).toEqual('/%3Cmy-index-%7Bnow%2Fd%7D%3E'); + it('should correctly encode path with query params', async () => { + await verifyRequestPath({ + initialPath: '_index/.test?q=something&v=something', + expectedPath: '/_index/.test?q=something&v=something&pretty=true', + }); }); }); }); diff --git a/src/plugins/console/server/lib/proxy_request.ts b/src/plugins/console/server/lib/proxy_request.ts index 4a8839d1d8583..875345be52055 100644 --- a/src/plugins/console/server/lib/proxy_request.ts +++ b/src/plugins/console/server/lib/proxy_request.ts @@ -11,8 +11,7 @@ import https from 'https'; import net from 'net'; import stream from 'stream'; import Boom from '@hapi/boom'; -import { URL, URLSearchParams } from 'url'; -import { trimStart } from 'lodash'; +import { URL } from 'url'; interface Args { method: 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head'; @@ -31,22 +30,6 @@ interface Args { const sanitizeHostname = (hostName: string): string => hostName.trim().replace(/^\[/, '').replace(/\]$/, ''); -/** - * Node URL percent-encodes any invalid characters in the pathname which results a 400 bad request error. - * We need to decode the percent-encoded pathname, and encode it correctly with encodeURIComponent - */ - -const encodePathname = (pathname: string) => { - const decodedPath = new URLSearchParams(`path=${pathname}`).get('path') ?? ''; - - // Skip if it is valid - if (pathname === decodedPath) { - return pathname; - } - - return `/${encodeURIComponent(trimStart(decodedPath, '/'))}`; -}; - // We use a modified version of Hapi's Wreck because Hapi, Axios, and Superagent don't support GET requests // with bodies, but ES APIs do. Similarly with DELETE requests with bodies. Another library, `request` // diverged too much from current behaviour. @@ -59,9 +42,9 @@ export const proxyRequest = ({ payload, rejectUnauthorized, }: Args) => { - const { hostname, port, protocol, pathname, search } = uri; + const { hostname, port, protocol, search, pathname } = uri; const client = uri.protocol === 'https:' ? https : http; - const encodedPath = encodePathname(pathname); + let resolved = false; let resolve: (res: http.IncomingMessage) => void; @@ -84,7 +67,7 @@ export const proxyRequest = ({ host: sanitizeHostname(hostname), port: port === '' ? undefined : parseInt(port, 10), protocol, - path: `${encodedPath}${search || ''}`, + path: `${pathname}${search || ''}`, headers: { ...finalUserHeaders, 'content-type': 'application/json', diff --git a/src/plugins/console/server/lib/utils/encode_path.test.ts b/src/plugins/console/server/lib/utils/encode_path.test.ts new file mode 100644 index 0000000000000..07c7108e9d2cf --- /dev/null +++ b/src/plugins/console/server/lib/utils/encode_path.test.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { encodePath } from './encode_path'; + +describe('encodePath', () => { + const tests = [ + { + description: 'encodes invalid URL characters', + source: '/%{[@metadata][beat]}-%{[@metadata][version]}-2020.08.23', + assert: + '/%25%7B%5B%40metadata%5D%5Bbeat%5D%7D-%25%7B%5B%40metadata%5D%5Bversion%5D%7D-2020.08.23', + }, + { + description: 'ignores encoded characters', + source: '/my-index/_doc/this%2Fis%2Fa%2Fdoc', + assert: '/my-index/_doc/this%2Fis%2Fa%2Fdoc', + }, + { + description: 'ignores slashes between', + source: '_index/test/.test', + assert: '_index/test/.test', + }, + ]; + + tests.forEach(({ description, source, assert }) => { + test(description, () => { + const result = encodePath(source); + expect(result).toEqual(assert); + }); + }); +}); diff --git a/src/plugins/console/server/lib/utils/encode_path.ts b/src/plugins/console/server/lib/utils/encode_path.ts new file mode 100644 index 0000000000000..273c60d3f66e4 --- /dev/null +++ b/src/plugins/console/server/lib/utils/encode_path.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 { URLSearchParams } from 'url'; +import { trimStart } from 'lodash'; + +export const encodePath = (path: string) => { + const decodedPath = new URLSearchParams(`path=${path}`).get('path') ?? ''; + // Take the initial path and compare it with the decoded path. + // If the result is not the same, the path is encoded. + const isEncoded = trimStart(path, '/') !== trimStart(decodedPath, '/'); + + // Return the initial path if it is already encoded + if (isEncoded) { + return path; + } + + // Encode every component except slashes + return path + .split('/') + .map((component) => encodeURIComponent(component)) + .join('/'); +}; diff --git a/src/plugins/console/server/lib/utils/index.ts b/src/plugins/console/server/lib/utils/index.ts new file mode 100644 index 0000000000000..0da3e36b575e3 --- /dev/null +++ b/src/plugins/console/server/lib/utils/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 { encodePath } from './encode_path'; +export { toURL } from './to_url'; diff --git a/src/plugins/console/server/lib/utils/to_url.test.ts b/src/plugins/console/server/lib/utils/to_url.test.ts new file mode 100644 index 0000000000000..a28e6822fe7a0 --- /dev/null +++ b/src/plugins/console/server/lib/utils/to_url.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { toURL } from './to_url'; + +describe('toURL', () => { + it('should replace + sign in query params with %2b', () => { + const urlResult = toURL( + 'http://nowhere.none', + 'test/?q=create_date:[2020-05-10T08:00:00.000+08:00 TO *]' + ); + expect(urlResult.search).toEqual( + '?q=create_date%3A%5B2020-05-10T08%3A00%3A00.000%2B08%3A00+TO+*%5D&pretty=true' + ); + }); + + describe('with a path without the "pretty" search param', () => { + it('should append the "pretty" search param', () => { + const urlResult = toURL('http://nowhere.none', 'test'); + expect(urlResult.href).toEqual('http://nowhere.none/test?pretty=true'); + }); + }); + + it('should handle encoding pathname', () => { + const urlResult = toURL( + 'http://nowhere.none', + '/%{[@metadata][beat]}-%{[@metadata][version]}-2020.08.23' + ); + expect(urlResult.pathname).toEqual( + '/%25%7B%5B%40metadata%5D%5Bbeat%5D%7D-%25%7B%5B%40metadata%5D%5Bversion%5D%7D-2020.08.23' + ); + }); +}); diff --git a/src/plugins/console/server/lib/utils/to_url.ts b/src/plugins/console/server/lib/utils/to_url.ts new file mode 100644 index 0000000000000..a3ca956faa33c --- /dev/null +++ b/src/plugins/console/server/lib/utils/to_url.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 { URL } from 'url'; +import { trimEnd, trimStart } from 'lodash'; +import { encodePath } from './encode_path'; + +export function toURL(base: string, path: string) { + const [pathname, query = ''] = path.split('?'); + + // if there is a '+' sign in query e.g. ?q=create_date:[2020-05-10T08:00:00.000+08:00 TO *] + // node url encodes it as a whitespace which results in a faulty request + // we need to replace '+' with '%2b' to encode it correctly + if (/\+/g.test(query)) { + path = `${pathname}?${query.replace(/\+/g, '%2b')}`; + } + const urlResult = new URL(`${trimEnd(base, '/')}/${trimStart(path, '/')}`); + // Appending pretty here to have Elasticsearch do the JSON formatting, as doing + // in JS can lead to data loss (7.0 will get munged into 7, thus losing indication of + // measurement precision) + if (!urlResult.searchParams.get('pretty')) { + urlResult.searchParams.append('pretty', 'true'); + } + + // Node URL percent-encodes any invalid characters in url, which results in a bad request in some cases. E.g. urls with % character + // To fix this, we set the pathname to the correctly encoded path here + urlResult.pathname = encodePath(pathname); + return urlResult; +} diff --git a/src/plugins/console/server/routes/api/console/proxy/create_handler.ts b/src/plugins/console/server/routes/api/console/proxy/create_handler.ts index 1fc22ca685cc5..eddefc86fcbd2 100644 --- a/src/plugins/console/server/routes/api/console/proxy/create_handler.ts +++ b/src/plugins/console/server/routes/api/console/proxy/create_handler.ts @@ -7,8 +7,7 @@ */ import { Agent, IncomingMessage } from 'http'; -import * as url from 'url'; -import { pick, trimStart, trimEnd } from 'lodash'; +import { pick } from 'lodash'; import { SemVer } from 'semver'; import { KibanaRequest, RequestHandler } from '@kbn/core/server'; @@ -27,25 +26,7 @@ import { import { RouteDependencies } from '../../..'; import { Body, Query } from './validation_config'; - -function toURL(base: string, path: string) { - const [p, query = ''] = path.split('?'); - - // if there is a '+' sign in query e.g. ?q=create_date:[2020-05-10T08:00:00.000+08:00 TO *] - // node url encodes it as a whitespace which results in a faulty request - // we need to replace '+' with '%2b' to encode it correctly - if (/\+/g.test(query)) { - path = `${p}?${query.replace(/\+/g, '%2b')}`; - } - const urlResult = new url.URL(`${trimEnd(base, '/')}/${trimStart(path, '/')}`); - // Appending pretty here to have Elasticsearch do the JSON formatting, as doing - // in JS can lead to data loss (7.0 will get munged into 7, thus losing indication of - // measurement precision) - if (!urlResult.searchParams.get('pretty')) { - urlResult.searchParams.append('pretty', 'true'); - } - return urlResult; -} +import { toURL } from '../../../../lib/utils'; function filterHeaders(originalHeaders: object, headersToKeep: string[]): object { const normalizeHeader = function (header: string) { diff --git a/src/plugins/console/server/routes/api/console/proxy/query_string.test.ts b/src/plugins/console/server/routes/api/console/proxy/query_string.test.ts index fbdc53bc5383b..b60c7e97ec5a2 100644 --- a/src/plugins/console/server/routes/api/console/proxy/query_string.test.ts +++ b/src/plugins/console/server/routes/api/console/proxy/query_string.test.ts @@ -43,7 +43,7 @@ describe('Console Proxy Route', () => { await request('GET', 'http://evil.com/test'); expect(proxyRequestMock.mock.calls.length).toBe(1); const [[args]] = (requestModule.proxyRequest as jest.Mock).mock.calls; - expect(args.uri.href).toBe('http://localhost:9200/http://evil.com/test?pretty=true'); + expect(args.uri.href).toBe('http://localhost:9200/http%3A//evil.com/test?pretty=true'); }); }); describe('starts with a slash', () => { diff --git a/test/functional/apps/console/_console.ts b/test/functional/apps/console/_console.ts index a734c3cb6d7e8..0878442156ab7 100644 --- a/test/functional/apps/console/_console.ts +++ b/test/functional/apps/console/_console.ts @@ -126,6 +126,22 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); + describe('with query params', () => { + it('should issue a successful request', async () => { + await PageObjects.console.clearTextArea(); + await PageObjects.console.enterRequest( + '\n GET _cat/aliases?format=json&v=true&pretty=true' + ); + await PageObjects.console.clickPlay(); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.try(async () => { + const status = await PageObjects.console.getResponseStatus(); + expect(status).to.eql(200); + }); + }); + }); + describe('multiple requests output', () => { const sendMultipleRequests = async (requests: string[]) => { await asyncForEach(requests, async (request) => { From a90701d6caf86136eab6b32c3c2a20c7228c5471 Mon Sep 17 00:00:00 2001 From: Dominique Clarke Date: Fri, 22 Jul 2022 15:21:46 -0400 Subject: [PATCH 34/78] [Synthetics] add params to project, inline, and recorder monitors (#136447) * synthetics - add params to project, inline, and recorder monitors * adjust translation * add validation * update * adjust placement Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: shahzad31 --- .../browser/source_field.test.tsx | 27 ++- .../fleet_package/browser/source_field.tsx | 163 ++++++++++-------- .../components/fleet_package/code_editor.tsx | 13 +- .../components/fleet_package/validation.tsx | 12 ++ .../read_only_browser_fields.tsx | 43 ++++- .../monitor_management/validation.ts | 2 + .../translations/translations/fr-FR.json | 2 - .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 9 files changed, 178 insertions(+), 88 deletions(-) diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.test.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.test.tsx index 97001df29a69e..d334ad20f42e6 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.test.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.test.tsx @@ -11,7 +11,7 @@ import { fireEvent, screen, waitFor } from '@testing-library/react'; import { ConfigKey } from '../../../../../common/runtime_types'; import { render } from '../../../lib/helper/rtl_helpers'; import { IPolicyConfigContextProvider } from '../contexts/policy_config_context'; -import { SourceField, defaultValues } from './source_field'; +import { SourceField, Props, defaultValues } from './source_field'; import { BrowserSimpleFieldsContextProvider, PolicyConfigContextProvider } from '../contexts'; jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ @@ -34,6 +34,7 @@ jest.mock('@kbn/kibana-react-plugin/public', () => { { props.onChange(e.jsonContent); }} @@ -48,11 +49,12 @@ const onBlur = jest.fn(); describe('', () => { const WrappedComponent = ({ isZipUrlSourceEnabled, - }: Omit) => { + defaultConfig, + }: Omit & Partial) => { return ( - + ); @@ -95,4 +97,23 @@ describe('', () => { expect(screen.queryByTestId('syntheticsSourceTab__zipUrl')).not.toBeInTheDocument(); }); + + it('shows params for all source types', async () => { + const { getByText, getByTestId } = render(); + + const inlineTab = getByTestId('syntheticsSourceTab__inline'); + fireEvent.click(inlineTab); + + expect(getByText('Parameters')).toBeInTheDocument(); + + const recorder = getByTestId('syntheticsSourceTab__scriptRecorder'); + fireEvent.click(recorder); + + expect(getByText('Parameters')).toBeInTheDocument(); + + const zip = getByTestId('syntheticsSourceTab__zipUrl'); + fireEvent.click(zip); + + expect(getByText('Parameters')).toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.tsx index a4e31b79d8413..a15b0f8a7561d 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/browser/source_field.tsx @@ -9,6 +9,7 @@ import styled from 'styled-components'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { + EuiCode, EuiTabbedContent, EuiTabbedContentTab, EuiFormRow, @@ -44,7 +45,7 @@ interface SourceConfig { fileName?: string; } -interface Props { +export interface Props { onChange: (sourceConfig: SourceConfig) => void; onFieldBlur: (field: ConfigKey) => void; defaultConfig?: SourceConfig; @@ -106,6 +107,42 @@ export const SourceField = ({ /> ); + const params = ( + + } + labelAppend={} + helpText={ + params.value }} + /> + } + > + { + setConfig((prevConfig) => ({ ...prevConfig, params: code })); + onFieldBlur(ConfigKey.PARAMS); + }} + value={config.params} + data-test-subj="syntheticsBrowserParams" + /> + + ); + const zipUrlSourceTabId = 'syntheticsBrowserZipURLConfig'; const allTabs = [ { @@ -189,38 +226,7 @@ export const SourceField = ({ data-test-subj="syntheticsBrowserZipUrlFolder" /> - - } - labelAppend={} - helpText={ - - } - > - { - setConfig((prevConfig) => ({ ...prevConfig, params: code })); - onFieldBlur(ConfigKey.PARAMS); - }} - value={config.params} - data-test-subj="syntheticsBrowserZipUrlParams" - /> - + {params} - } - helpText={ - + + } + helpText={ + + } + > + { + setConfig((prevConfig) => ({ ...prevConfig, inlineScript: code })); + onFieldBlur(ConfigKey.SOURCE_INLINE); + }} + value={config.inlineScript} /> - } - > - { - setConfig((prevConfig) => ({ ...prevConfig, inlineScript: code })); - onFieldBlur(ConfigKey.SOURCE_INLINE); - }} - value={config.inlineScript} - /> - + + {params} + ), }, { @@ -347,18 +356,22 @@ export const SourceField = ({ ), 'data-test-subj': 'syntheticsSourceTab__scriptRecorder', content: ( - - setConfig((prevConfig) => ({ - ...prevConfig, - inlineScript: scriptText, - isGeneratedScript: true, - fileName, - })) - } - script={config.inlineScript} - fileName={config.fileName} - /> + <> + + setConfig((prevConfig) => ({ + ...prevConfig, + inlineScript: scriptText, + isGeneratedScript: true, + fileName, + })) + } + script={config.inlineScript} + fileName={config.fileName} + /> + + {params} + ), }, ]; diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/code_editor.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/code_editor.tsx index 328d05217b98f..60f6284cbf32e 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/code_editor.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/fleet_package/code_editor.tsx @@ -22,11 +22,19 @@ interface Props { ariaLabel: string; id: string; languageId: MonacoEditorLangId; - onChange: (value: string) => void; + onChange?: (value: string) => void; value: string; + readOnly?: boolean; } -export const CodeEditor = ({ ariaLabel, id, languageId, onChange, value }: Props) => { +export const CodeEditor = ({ + ariaLabel, + id, + languageId, + onChange, + value, + readOnly = false, +}: Props) => { return ( { + try { + if (params) { + JSON.parse(params ?? ''); + } + } catch (e) { + return true; + } + return false; +}; + const validateBrowser: ValidationLibrary = { ...validateCommon, [ConfigKey.SOURCE_ZIP_URL]: ({ @@ -136,6 +147,7 @@ const validateBrowser: ValidationLibrary = { [ConfigKey.UPLOAD_SPEED]: ({ [ConfigKey.UPLOAD_SPEED]: uploadSpeed }) => validateThrottleValue(uploadSpeed), [ConfigKey.LATENCY]: ({ [ConfigKey.LATENCY]: latency }) => validateThrottleValue(latency, true), + [ConfigKey.PARAMS]: ({ [ConfigKey.PARAMS]: params }) => validateParamsValue(params), }; export type ValidateDictionary = Record; diff --git a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/monitor_config/read_only_browser_fields.tsx b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/monitor_config/read_only_browser_fields.tsx index 6614b4d1ce4aa..5d524e5481cfb 100644 --- a/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/monitor_config/read_only_browser_fields.tsx +++ b/x-pack/plugins/synthetics/public/legacy_uptime/components/monitor_management/monitor_config/read_only_browser_fields.tsx @@ -6,9 +6,17 @@ */ import React from 'react'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiAccordion, EuiCallOut, EuiFormRow, EuiFieldText, EuiSpacer } from '@elastic/eui'; -import { ConfigKey } from '../../../../../common/runtime_types'; +import { + EuiAccordion, + EuiCallOut, + EuiFormRow, + EuiFieldText, + EuiSpacer, + EuiCode, +} from '@elastic/eui'; +import { ConfigKey, MonacoEditorLangId } from '../../../../../common/runtime_types'; import { useBrowserSimpleFieldsContext, useBrowserAdvancedFieldsContext, @@ -19,6 +27,7 @@ import { ComboBox } from '../../fleet_package/combo_box'; import { MonitorNameAndLocation } from './monitor_name_location'; import { ThrottlingFields } from '../../fleet_package/browser/throttling_fields'; import { OptionalLabel } from '../../fleet_package/optional_label'; +import { CodeEditor } from '../../fleet_package/code_editor'; import { DescribedFormGroupWithWrap } from '../../fleet_package/common/described_form_group_with_wrap'; const noop = () => {}; @@ -112,6 +121,36 @@ export const ProjectBrowserReadonlyFields = ({ minColumnWidth }: { minColumnWidt readOnly={true} /> + + } + labelAppend={} + helpText={ + params.value }} + /> + } + > + + validateThrottleValue(uploadSpeed), [ConfigKey.LATENCY]: ({ [ConfigKey.LATENCY]: latency }) => validateThrottleValue(latency, true), + [ConfigKey.PARAMS]: ({ [ConfigKey.PARAMS]: params }) => validateParamsValue(params), }; export type ValidateDictionary = Record; diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 949969222ee3d..fba18847cc689 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -29034,8 +29034,6 @@ "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.error": "Script obligatoire", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.helpText": "Exécute des scripts de tests synthétiques définis en ligne.", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.label": "Script en ligne", - "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.params.helpText": "Objet JSON qui définit toute variable dont vos tests ont besoin.", - "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.params.label": "Paramètres", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.scriptRecorder.closeButtonLabel": "Fermer le menu volant du script", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.scriptRecorder.mockFileName": "test_script.js", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.sourceType.label": "Type de source", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 5ca7e1b2c9e58..8c38d7834fbff 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -29115,8 +29115,6 @@ "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.error": "スクリプトが必要です", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.helpText": "インラインで定義されたSyntheticテストスクリプトを実行します。", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.label": "インラインスクリプト", - "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.params.helpText": "テストで必要な変数を定義するJSONオブジェクト。", - "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.params.label": "パラメーター", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.scriptRecorder.closeButtonLabel": "スクリプトフライアウトを閉じる", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.scriptRecorder.mockFileName": "test_script.js", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.sourceType.label": "ソースタイプ", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 1e1b248b45af8..69d9eadbc6904 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -29143,8 +29143,6 @@ "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.error": "“脚本”必填", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.helpText": "运行内联定义的 Synthetics 测试脚本。", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.inlineScript.label": "内联脚本", - "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.params.helpText": "JSON 对象,定义您的测试所需的任何变量。", - "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.params.label": "参数", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.scriptRecorder.closeButtonLabel": "关闭脚本浮出控件", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.scriptRecorder.mockFileName": "test_script.js", "xpack.synthetics.createPackagePolicy.stepConfigure.monitorIntegrationSettingsSection.browser.sourceType.label": "源类型", From 382dc17949fba949e641956149885d9ff42d530e Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Fri, 22 Jul 2022 12:39:25 -0700 Subject: [PATCH 35/78] [RAM] Move and create new API for action error logs (#136588) * Move error action log endpoint to a new endpoint * Add new tests and fix existing tests * Fix lint * Add API integration tests * Remove invalid sorting columns * Fix tests * Add utility to convert ES sort to event log sort, addressed comments * Fix jest tests * Fix type error Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../alerting/common/execution_log_types.ts | 12 +- .../authorization/alerting_authorization.ts | 1 + .../convert_es_sort_to_event_log_sort.test.ts | 63 ++ .../lib/convert_es_sort_to_event_log_sort.ts | 57 ++ x-pack/plugins/alerting/server/lib/index.ts | 1 + .../routes/get_action_error_log.test.ts | 119 ++++ .../server/routes/get_action_error_log.ts | 73 +++ .../routes/get_rule_execution_log.test.ts | 22 +- .../plugins/alerting/server/routes/index.ts | 2 + .../alerting/server/rules_client.mock.ts | 1 + .../server/rules_client/audit_events.ts | 7 + .../server/rules_client/rules_client.ts | 135 ++-- .../tests/get_action_error_log.test.ts | 576 ++++++++++++++++++ .../tests/get_execution_log.test.ts | 427 ------------- .../public/application/lib/rule_api/index.ts | 2 + .../rule_api/load_action_error_log.test.ts | 129 ++++ .../lib/rule_api/load_action_error_log.ts | 96 +++ .../load_execution_log_aggregations.test.ts | 4 +- .../load_execution_log_aggregations.ts | 35 +- .../with_bulk_rule_api_operations.test.tsx | 35 +- .../with_bulk_rule_api_operations.tsx | 13 +- .../components/rule_error_log.test.tsx | 133 ++-- .../components/rule_error_log.tsx | 48 +- .../components/rule_event_log_list.test.tsx | 20 +- .../components/rule_event_log_list.tsx | 2 +- .../triggers_actions_ui/public/index.ts | 1 + .../tests/alerting/get_action_error_log.ts | 236 +++++++ .../tests/alerting/get_execution_log.ts | 44 -- .../spaces_only/tests/alerting/index.ts | 1 + 29 files changed, 1650 insertions(+), 645 deletions(-) create mode 100644 x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.test.ts create mode 100644 x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.ts create mode 100644 x-pack/plugins/alerting/server/routes/get_action_error_log.test.ts create mode 100644 x-pack/plugins/alerting/server/routes/get_action_error_log.ts create mode 100644 x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.test.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.ts create mode 100644 x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts diff --git a/x-pack/plugins/alerting/common/execution_log_types.ts b/x-pack/plugins/alerting/common/execution_log_types.ts index cdfc7601190dd..74f2d7a000e27 100644 --- a/x-pack/plugins/alerting/common/execution_log_types.ts +++ b/x-pack/plugins/alerting/common/execution_log_types.ts @@ -18,8 +18,18 @@ export const executionLogSortableColumns = [ 'num_new_alerts', ] as const; +export const actionErrorLogSortableColumns = [ + '@timestamp', + 'event.start', + 'event.end', + 'event.duration', + 'event.action', +]; + export type ExecutionLogSortFields = typeof executionLogSortableColumns[number]; +export type ActionErrorLogSortFields = typeof actionErrorLogSortableColumns[number]; + export interface IExecutionLog { id: string; timestamp: string; @@ -56,5 +66,3 @@ export interface IExecutionLogResult { total: number; data: IExecutionLog[]; } - -export type IExecutionLogWithErrorsResult = IExecutionLogResult & IExecutionErrorsResult; diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts index bfa20cb2d00fe..0412678eca074 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts @@ -31,6 +31,7 @@ export enum ReadOperations { GetRuleState = 'getRuleState', GetAlertSummary = 'getAlertSummary', GetExecutionLog = 'getExecutionLog', + GetActionErrorLog = 'getActionErrorLog', Find = 'find', GetAuthorizedAlertsIndices = 'getAuthorizedAlertsIndices', } diff --git a/x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.test.ts b/x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.test.ts new file mode 100644 index 0000000000000..e14fdeb404525 --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.test.ts @@ -0,0 +1,63 @@ +/* + * Copyright 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 { convertEsSortToEventLogSort } from './convert_es_sort_to_event_log_sort'; + +describe('convertEsSortToEventLogSort', () => { + test('should throw when given invalid inputs', () => { + expect(() => { + convertEsSortToEventLogSort('should failed'); + }).toThrow('Invalid sort type - sort must contain sort field and sort order'); + + expect(() => { + convertEsSortToEventLogSort({}); + }).toThrow(`Invalid sort order type - sortOrder object must contain an 'order' property`); + + expect(() => { + convertEsSortToEventLogSort({ test: 'asc' }); + }).toThrow(`Invalid sort order type - sortOrder object must contain an 'order' property`); + }); + + test('should format ES sort into event logger sort', () => { + expect( + convertEsSortToEventLogSort({ + 'test-field': { + order: 'desc', + }, + }) + ).toEqual([ + { + sort_field: 'test-field', + sort_order: 'desc', + }, + ]); + + expect( + convertEsSortToEventLogSort([ + { + 'test-field-1': { + order: 'desc', + }, + }, + { + 'test-field-2': { + order: 'asc', + }, + }, + ]) + ).toEqual([ + { + sort_field: 'test-field-1', + sort_order: 'desc', + }, + { + sort_field: 'test-field-2', + sort_order: 'asc', + }, + ]); + }); +}); diff --git a/x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.ts b/x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.ts new file mode 100644 index 0000000000000..9adb2d0a21e69 --- /dev/null +++ b/x-pack/plugins/alerting/server/lib/convert_es_sort_to_event_log_sort.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + Sort, + FieldSort, + SortCombinations, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +const getFormattedSort = (sort: SortCombinations) => { + if (typeof sort === 'string') { + throw Error(`Invalid sort type - sort must contain sort field and sort order`); + } + + const sortField = Object.keys(sort)[0]; + const sortOrder = sort[sortField] as FieldSort; + + if (!sortOrder || !sortOrder.order) { + throw Error(`Invalid sort order type - sortOrder object must contain an 'order' property`); + } + + return { + sort_field: sortField, + sort_order: sortOrder.order, + }; +}; + +/** + * This helper function converts esSort: + * + * { + * field: { + * order: 'asc' + * } + * } + * + * Into event logger sort: + * + * [{ + * sort_field: field, + * sort_order: 'asc', + * }] + */ + +export const convertEsSortToEventLogSort = (esSort: Sort) => { + if (!esSort) { + return; + } + if (!Array.isArray(esSort)) { + return [getFormattedSort(esSort)]; + } + return esSort.map((sort) => getFormattedSort(sort)); +}; diff --git a/x-pack/plugins/alerting/server/lib/index.ts b/x-pack/plugins/alerting/server/lib/index.ts index d221c2251d386..825a9863badbb 100644 --- a/x-pack/plugins/alerting/server/lib/index.ts +++ b/x-pack/plugins/alerting/server/lib/index.ts @@ -29,4 +29,5 @@ export { processAlerts } from './process_alerts'; export { createWrappedScopedClusterClientFactory } from './wrap_scoped_cluster_client'; export { isRuleSnoozed, getRuleSnoozeEndTime } from './is_rule_snoozed'; export { convertRuleIdsToKueryNode } from './convert_rule_ids_to_kuery_node'; +export { convertEsSortToEventLogSort } from './convert_es_sort_to_event_log_sort'; export * from './snooze'; diff --git a/x-pack/plugins/alerting/server/routes/get_action_error_log.test.ts b/x-pack/plugins/alerting/server/routes/get_action_error_log.test.ts new file mode 100644 index 0000000000000..414d2e8b54122 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/get_action_error_log.test.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getActionErrorLogRoute } from './get_action_error_log'; +import { httpServiceMock } from '@kbn/core/server/mocks'; +import { licenseStateMock } from '../lib/license_state.mock'; +import { mockHandlerArguments } from './_mock_handler_arguments'; +import { SavedObjectsErrorHelpers } from '@kbn/core/server'; +import { rulesClientMock } from '../rules_client.mock'; + +const rulesClient = rulesClientMock.create(); +jest.mock('../lib/license_api_access', () => ({ + verifyApiAccess: jest.fn(), +})); + +beforeEach(() => { + jest.resetAllMocks(); +}); + +describe('getActionErrorLogRoute', () => { + const dateString = new Date().toISOString(); + const mockResponse = { + totalErrors: 2, + errors: [ + { + id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + timestamp: '2022-03-23T17:37:07.086Z', + type: 'actions', + message: + 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', + }, + { + id: 'c1c04f04-312e-4e23-8e36-e01eb4332ed6', + timestamp: '2022-03-23T17:23:05.249Z', + type: 'alerting', + message: `rule execution failure: example.always-firing:a348a740-9e2c-11ec-bd64-774ed95c43ef: 'test rule' - I am erroring in rule execution!!`, + }, + ], + }; + + it('gets action error log', async () => { + const licenseState = licenseStateMock.create(); + const router = httpServiceMock.createRouter(); + + getActionErrorLogRoute(router, licenseState); + + const [config, handler] = router.get.mock.calls[0]; + + expect(config.path).toMatchInlineSnapshot(`"/internal/alerting/rule/{id}/_action_error_log"`); + + rulesClient.getActionErrorLog.mockResolvedValue(mockResponse); + + const [context, req, res] = mockHandlerArguments( + { rulesClient }, + { + params: { + id: '1', + }, + query: { + date_start: dateString, + per_page: 10, + page: 1, + filter: 'message: "test"', + sort: [{ sort_field: '@timestamp', sort_order: 'asc' }], + }, + }, + ['ok'] + ); + + await handler(context, req, res); + + expect(rulesClient.getActionErrorLog).toHaveBeenCalledTimes(1); + expect(rulesClient.getActionErrorLog.mock.calls[0]).toEqual([ + { + dateStart: dateString, + dateEnd: undefined, + filter: 'message: "test"', + id: '1', + page: 1, + perPage: 10, + sort: [{ sort_field: '@timestamp', sort_order: 'asc' }], + }, + ]); + + expect(res.ok).toHaveBeenCalled(); + }); + + it('returns NOT-FOUND when rule and rule run is not found', async () => { + const licenseState = licenseStateMock.create(); + const router = httpServiceMock.createRouter(); + + getActionErrorLogRoute(router, licenseState); + + const [, handler] = router.get.mock.calls[0]; + + rulesClient.getActionErrorLog = jest + .fn() + .mockRejectedValueOnce(SavedObjectsErrorHelpers.createGenericNotFoundError('alert', '1')); + + const [context, req, res] = mockHandlerArguments( + { rulesClient }, + { + params: { + id: '1', + }, + query: {}, + }, + ['notFound'] + ); + + expect(handler(context, req, res)).rejects.toMatchInlineSnapshot( + `[Error: Saved object [alert/1] not found]` + ); + }); +}); diff --git a/x-pack/plugins/alerting/server/routes/get_action_error_log.ts b/x-pack/plugins/alerting/server/routes/get_action_error_log.ts new file mode 100644 index 0000000000000..c833b65e34bb0 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/get_action_error_log.ts @@ -0,0 +1,73 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IRouter } from '@kbn/core/server'; +import { schema } from '@kbn/config-schema'; +import { ILicenseState } from '../lib'; +import { GetActionErrorLogByIdParams } from '../rules_client'; +import { RewriteRequestCase, verifyAccessAndContext } from './lib'; +import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../types'; + +const paramSchema = schema.object({ + id: schema.string(), +}); + +const sortOrderSchema = schema.oneOf([schema.literal('asc'), schema.literal('desc')]); + +const sortFieldSchema = schema.oneOf([ + schema.object({ '@timestamp': schema.object({ order: sortOrderSchema }) }), + schema.object({ 'event.duration': schema.object({ order: sortOrderSchema }) }), +]); + +const sortFieldsSchema = schema.arrayOf(sortFieldSchema, { + defaultValue: [{ '@timestamp': { order: 'desc' } }], +}); + +const querySchema = schema.object({ + date_start: schema.string(), + date_end: schema.maybe(schema.string()), + filter: schema.maybe(schema.string()), + per_page: schema.number({ defaultValue: 10, min: 1 }), + page: schema.number({ defaultValue: 1, min: 1 }), + sort: sortFieldsSchema, +}); + +const rewriteReq: RewriteRequestCase = ({ + date_start: dateStart, + date_end: dateEnd, + per_page: perPage, + ...rest +}) => ({ + ...rest, + dateStart, + dateEnd, + perPage, +}); + +export const getActionErrorLogRoute = ( + router: IRouter, + licenseState: ILicenseState +) => { + router.get( + { + path: `${INTERNAL_BASE_ALERTING_API_PATH}/rule/{id}/_action_error_log`, + validate: { + params: paramSchema, + query: querySchema, + }, + }, + router.handleLegacyErrors( + verifyAccessAndContext(licenseState, async function (context, req, res) { + const rulesClient = (await context.alerting).getRulesClient(); + const { id } = req.params; + return res.ok({ + body: await rulesClient.getActionErrorLog(rewriteReq({ id, ...req.query })), + }); + }) + ) + ); +}; diff --git a/x-pack/plugins/alerting/server/routes/get_rule_execution_log.test.ts b/x-pack/plugins/alerting/server/routes/get_rule_execution_log.test.ts index 4a67404ab232e..5271cd7373697 100644 --- a/x-pack/plugins/alerting/server/routes/get_rule_execution_log.test.ts +++ b/x-pack/plugins/alerting/server/routes/get_rule_execution_log.test.ts @@ -11,7 +11,7 @@ import { licenseStateMock } from '../lib/license_state.mock'; import { mockHandlerArguments } from './_mock_handler_arguments'; import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import { rulesClientMock } from '../rules_client.mock'; -import { IExecutionLogWithErrorsResult } from '../../common'; +import { IExecutionLogResult } from '../../common'; const rulesClient = rulesClientMock.create(); jest.mock('../lib/license_api_access', () => ({ @@ -24,7 +24,7 @@ beforeEach(() => { describe('getRuleExecutionLogRoute', () => { const dateString = new Date().toISOString(); - const mockedExecutionLogWithErrors: IExecutionLogWithErrorsResult = { + const mockedExecutionLog: IExecutionLogResult = { total: 374, data: [ { @@ -68,22 +68,6 @@ describe('getRuleExecutionLogRoute', () => { schedule_delay_ms: 3008, }, ], - totalErrors: 2, - errors: [ - { - id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - timestamp: '2022-03-23T17:37:07.086Z', - type: 'actions', - message: - 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', - }, - { - id: 'c1c04f04-312e-4e23-8e36-e01eb4332ed6', - timestamp: '2022-03-23T17:23:05.249Z', - type: 'alerting', - message: `rule execution failure: example.always-firing:a348a740-9e2c-11ec-bd64-774ed95c43ef: 'test rule' - I am erroring in rule execution!!`, - }, - ], }; it('gets rule execution log', async () => { @@ -96,7 +80,7 @@ describe('getRuleExecutionLogRoute', () => { expect(config.path).toMatchInlineSnapshot(`"/internal/alerting/rule/{id}/_execution_log"`); - rulesClient.getExecutionLogForRule.mockResolvedValue(mockedExecutionLogWithErrors); + rulesClient.getExecutionLogForRule.mockResolvedValue(mockedExecutionLog); const [context, req, res] = mockHandlerArguments( { rulesClient }, diff --git a/x-pack/plugins/alerting/server/routes/index.ts b/x-pack/plugins/alerting/server/routes/index.ts index 2ef75ce269220..ef837a83ad9a4 100644 --- a/x-pack/plugins/alerting/server/routes/index.ts +++ b/x-pack/plugins/alerting/server/routes/index.ts @@ -21,6 +21,7 @@ import { enableRuleRoute } from './enable_rule'; import { findRulesRoute, findInternalRulesRoute } from './find_rules'; import { getRuleAlertSummaryRoute } from './get_rule_alert_summary'; import { getRuleExecutionLogRoute } from './get_rule_execution_log'; +import { getActionErrorLogRoute } from './get_action_error_log'; import { getRuleStateRoute } from './get_rule_state'; import { healthRoute } from './health'; import { resolveRuleRoute } from './resolve_rule'; @@ -58,6 +59,7 @@ export function defineRoutes(opts: RouteOptions) { findInternalRulesRoute(router, licenseState, usageCounter); getRuleAlertSummaryRoute(router, licenseState); getRuleExecutionLogRoute(router, licenseState); + getActionErrorLogRoute(router, licenseState); getRuleStateRoute(router, licenseState); healthRoute(router, licenseState, encryptedSavedObjects); ruleTypesRoute(router, licenseState); diff --git a/x-pack/plugins/alerting/server/rules_client.mock.ts b/x-pack/plugins/alerting/server/rules_client.mock.ts index e72f5840dbac6..9c504bba192cd 100644 --- a/x-pack/plugins/alerting/server/rules_client.mock.ts +++ b/x-pack/plugins/alerting/server/rules_client.mock.ts @@ -30,6 +30,7 @@ const createRulesClientMock = () => { listAlertTypes: jest.fn(), getAlertSummary: jest.fn(), getExecutionLogForRule: jest.fn(), + getActionErrorLog: jest.fn(), getSpaceId: jest.fn(), bulkEdit: jest.fn(), snooze: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/audit_events.ts b/x-pack/plugins/alerting/server/rules_client/audit_events.ts index 0d722498f50aa..215e16f32f29a 100644 --- a/x-pack/plugins/alerting/server/rules_client/audit_events.ts +++ b/x-pack/plugins/alerting/server/rules_client/audit_events.ts @@ -25,6 +25,7 @@ export enum RuleAuditAction { AGGREGATE = 'rule_aggregate', BULK_EDIT = 'rule_bulk_edit', GET_EXECUTION_LOG = 'rule_get_execution_log', + GET_ACTION_ERROR_LOG = 'rule_get_action_error_log', SNOOZE = 'rule_snooze', UNSNOOZE = 'rule_unsnooze', } @@ -52,6 +53,11 @@ const eventVerbs: Record = { 'accessing execution log for', 'accessed execution log for', ], + rule_get_action_error_log: [ + 'access action error log for', + 'accessing action error log for', + 'accessed action error log for', + ], rule_snooze: ['snooze', 'snoozing', 'snoozed'], rule_unsnooze: ['unsnooze', 'unsnoozing', 'unsnoozed'], }; @@ -73,6 +79,7 @@ const eventTypes: Record = { rule_alert_unmute: 'change', rule_aggregate: 'access', rule_get_execution_log: 'access', + rule_get_action_error_log: 'access', rule_snooze: 'change', rule_unsnooze: 'change', }; diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts index 4ffa39c797a53..c6a543a0b826e 100644 --- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts +++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts @@ -65,6 +65,7 @@ import { validateMutatedRuleTypeParams, convertRuleIdsToKueryNode, getRuleSnoozeEndTime, + convertEsSortToEventLogSort, } from '../lib'; import { taskInstanceToAlertTaskInstance } from '../task_runner/alert_task_instance'; import { RegistryRuleType, UntypedNormalizedRuleType } from '../rule_type_registry'; @@ -107,7 +108,7 @@ import { formatExecutionLogResult, getExecutionLogAggregation, } from '../lib/get_execution_log_aggregation'; -import { IExecutionLogWithErrorsResult } from '../../common'; +import { IExecutionLogResult, IExecutionErrorsResult } from '../../common'; import { validateSnoozeStartDate } from '../lib/validate_snooze_date'; import { RuleMutedError } from '../lib/errors/rule_muted'; import { formatExecutionErrorsResult } from '../lib/format_execution_log_errors'; @@ -355,6 +356,16 @@ export interface GetExecutionLogByIdParams { sort: estypes.Sort; } +export interface GetActionErrorLogByIdParams { + id: string; + dateStart: string; + dateEnd?: string; + filter?: string; + page: number; + perPage: number; + sort: estypes.Sort; +} + interface ScheduleRuleOptions { id: string; consumer: string; @@ -790,7 +801,7 @@ export class RulesClient { page, perPage, sort, - }: GetExecutionLogByIdParams): Promise { + }: GetExecutionLogByIdParams): Promise { this.logger.debug(`getExecutionLogForRule(): getting execution log for rule ${id}`); const rule = (await this.get({ id, includeLegacyId: true })) as SanitizedRuleWithLegacyId; @@ -828,40 +839,23 @@ export class RulesClient { const eventLogClient = await this.getEventLogClient(); try { - const [aggResult, errorResult] = await Promise.all([ - eventLogClient.aggregateEventsBySavedObjectIds( - 'alert', - [id], - { - start: parsedDateStart.toISOString(), - end: parsedDateEnd.toISOString(), - filter, - aggs: getExecutionLogAggregation({ - page, - perPage, - sort, - }), - }, - rule.legacyId !== null ? [rule.legacyId] : undefined - ), - eventLogClient.findEventsBySavedObjectIds( - 'alert', - [id], - { - start: parsedDateStart.toISOString(), - end: parsedDateEnd.toISOString(), - per_page: 500, - filter: `(event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout)`, - sort: [{ sort_field: '@timestamp', sort_order: 'desc' }], - }, - rule.legacyId !== null ? [rule.legacyId] : undefined - ), - ]); + const aggResult = await eventLogClient.aggregateEventsBySavedObjectIds( + 'alert', + [id], + { + start: parsedDateStart.toISOString(), + end: parsedDateEnd.toISOString(), + filter, + aggs: getExecutionLogAggregation({ + page, + perPage, + sort, + }), + }, + rule.legacyId !== null ? [rule.legacyId] : undefined + ); - return { - ...formatExecutionLogResult(aggResult), - ...formatExecutionErrorsResult(errorResult), - }; + return formatExecutionLogResult(aggResult); } catch (err) { this.logger.debug( `rulesClient.getExecutionLogForRule(): error searching event log for rule ${id}: ${err.message}` @@ -870,6 +864,77 @@ export class RulesClient { } } + public async getActionErrorLog({ + id, + dateStart, + dateEnd, + filter, + page, + perPage, + sort, + }: GetActionErrorLogByIdParams): Promise { + this.logger.debug(`getActionErrorLog(): getting action error logs for rule ${id}`); + const rule = (await this.get({ id, includeLegacyId: true })) as SanitizedRuleWithLegacyId; + + try { + // Make sure user has access to this rule + await this.authorization.ensureAuthorized({ + ruleTypeId: rule.alertTypeId, + consumer: rule.consumer, + operation: ReadOperations.GetActionErrorLog, + entity: AlertingAuthorizationEntity.Rule, + }); + } catch (error) { + this.auditLogger?.log( + ruleAuditEvent({ + action: RuleAuditAction.GET_ACTION_ERROR_LOG, + savedObject: { type: 'alert', id }, + error, + }) + ); + throw error; + } + + this.auditLogger?.log( + ruleAuditEvent({ + action: RuleAuditAction.GET_ACTION_ERROR_LOG, + savedObject: { type: 'alert', id }, + }) + ); + + const defaultFilter = + 'event.provider:actions AND ((event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout))'; + + // default duration of instance summary is 60 * rule interval + const dateNow = new Date(); + const parsedDateStart = parseDate(dateStart, 'dateStart', dateNow); + const parsedDateEnd = parseDate(dateEnd, 'dateEnd', dateNow); + + const eventLogClient = await this.getEventLogClient(); + + try { + const errorResult = await eventLogClient.findEventsBySavedObjectIds( + 'alert', + [id], + { + start: parsedDateStart.toISOString(), + end: parsedDateEnd.toISOString(), + page, + per_page: perPage, + filter: filter ? `(${defaultFilter}) AND (${filter})` : defaultFilter, + sort: convertEsSortToEventLogSort(sort), + }, + rule.legacyId !== null ? [rule.legacyId] : undefined + ); + return formatExecutionErrorsResult(errorResult); + } catch (err) { + this.logger.debug( + `rulesClient.getActionErrorLog(): error searching event log for rule ${id}: ${err.message}` + ); + throw err; + } + } + public async find({ options: { fields, ...options } = {}, excludeFromPublicApi = false, diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts new file mode 100644 index 0000000000000..3a18634b4f5db --- /dev/null +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_action_error_log.test.ts @@ -0,0 +1,576 @@ +/* + * Copyright 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 { RulesClient, ConstructorOptions, GetActionErrorLogByIdParams } from '../rules_client'; +import { savedObjectsClientMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; +import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; +import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; +import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; +import { actionsAuthorizationMock } from '@kbn/actions-plugin/server/mocks'; +import { AlertingAuthorization } from '../../authorization/alerting_authorization'; +import { ActionsAuthorization } from '@kbn/actions-plugin/server'; +import { eventLogClientMock } from '@kbn/event-log-plugin/server/mocks'; +import { SavedObject } from '@kbn/core/server'; +import { RawRule } from '../../types'; +import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; +import { getBeforeSetup, mockedDateString, setGlobalDate } from './lib'; + +const taskManager = taskManagerMock.createStart(); +const ruleTypeRegistry = ruleTypeRegistryMock.create(); +const unsecuredSavedObjectsClient = savedObjectsClientMock.create(); +const eventLogClient = eventLogClientMock.create(); + +const encryptedSavedObjects = encryptedSavedObjectsMock.createClient(); +const authorization = alertingAuthorizationMock.create(); +const actionsAuthorization = actionsAuthorizationMock.create(); +const auditLogger = auditLoggerMock.create(); + +const kibanaVersion = 'v7.10.0'; +const rulesClientParams: jest.Mocked = { + taskManager, + ruleTypeRegistry, + unsecuredSavedObjectsClient, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, + spaceId: 'default', + namespace: 'default', + minimumScheduleInterval: { value: '1m', enforce: false }, + getUserName: jest.fn(), + createAPIKey: jest.fn(), + logger: loggingSystemMock.create().get(), + encryptedSavedObjectsClient: encryptedSavedObjects, + getActionsClient: jest.fn(), + getEventLogClient: jest.fn(), + kibanaVersion, + auditLogger, +}; + +beforeEach(() => { + getBeforeSetup(rulesClientParams, taskManager, ruleTypeRegistry, eventLogClient); + (auditLogger.log as jest.Mock).mockClear(); +}); + +setGlobalDate(); + +const RuleIntervalSeconds = 1; + +const BaseRuleSavedObject: SavedObject = { + id: '1', + type: 'alert', + attributes: { + enabled: true, + name: 'rule-name', + tags: ['tag-1', 'tag-2'], + alertTypeId: '123', + consumer: 'rule-consumer', + legacyId: null, + schedule: { interval: `${RuleIntervalSeconds}s` }, + actions: [], + params: {}, + createdBy: null, + updatedBy: null, + createdAt: mockedDateString, + updatedAt: mockedDateString, + apiKey: null, + apiKeyOwner: null, + throttle: null, + notifyWhen: null, + muteAll: false, + mutedInstanceIds: [], + executionStatus: { + status: 'unknown', + lastExecutionDate: '2020-08-20T19:23:38Z', + error: null, + warning: null, + }, + }, + references: [], +}; + +const findResults = { + page: 1, + per_page: 500, + total: 5, + data: [ + { + '@timestamp': '2022-03-23T17:37:07.106Z', + event: { + provider: 'actions', + action: 'execute', + kind: 'action', + start: '2022-03-23T17:37:07.105Z', + end: '2022-03-23T17:37:07.105Z', + duration: '0', + outcome: 'failure', + }, + kibana: { + alert: { + rule: { + execution: { + uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + }, + }, + }, + saved_objects: [ + { + rel: 'primary', + type: 'action', + id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', + type_id: '.server-log', + }, + { + rel: 'primary', + type: 'alert', + id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', + type_id: 'example.always-firing', + }, + ], + task: { + scheduled: '2022-03-23T17:37:04.674Z', + schedule_delay: 2431000000, + }, + server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', + version: '8.2.0', + }, + message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', + error: { + message: + 'an error occurred while running the action executor: something funky with the server log', + }, + ecs: { + version: '1.8.0', + }, + }, + { + '@timestamp': '2022-03-23T17:37:07.102Z', + event: { + provider: 'actions', + action: 'execute', + kind: 'action', + start: '2022-03-23T17:37:07.101Z', + end: '2022-03-23T17:37:07.102Z', + duration: '1000000', + outcome: 'failure', + }, + kibana: { + alert: { + rule: { + execution: { + uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + }, + }, + }, + saved_objects: [ + { + rel: 'primary', + type: 'action', + id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', + type_id: '.server-log', + }, + { + rel: 'primary', + type: 'alert', + id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', + type_id: 'example.always-firing', + }, + ], + task: { + scheduled: '2022-03-23T17:37:04.676Z', + schedule_delay: 2425000000, + }, + server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', + version: '8.2.0', + }, + message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', + error: { + message: + 'an error occurred while running the action executor: something funky with the server log', + }, + ecs: { + version: '1.8.0', + }, + }, + { + '@timestamp': '2022-03-23T17:37:07.098Z', + event: { + provider: 'actions', + action: 'execute', + kind: 'action', + start: '2022-03-23T17:37:07.098Z', + end: '2022-03-23T17:37:07.098Z', + duration: '0', + outcome: 'failure', + }, + kibana: { + alert: { + rule: { + execution: { + uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + }, + }, + }, + saved_objects: [ + { + rel: 'primary', + type: 'action', + id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', + type_id: '.server-log', + }, + { + rel: 'primary', + type: 'alert', + id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', + type_id: 'example.always-firing', + }, + ], + task: { + scheduled: '2022-03-23T17:37:04.673Z', + schedule_delay: 2425000000, + }, + server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', + version: '8.2.0', + }, + message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', + error: { + message: + 'an error occurred while running the action executor: something funky with the server log', + }, + ecs: { + version: '1.8.0', + }, + }, + { + '@timestamp': '2022-03-23T17:37:07.096Z', + event: { + provider: 'actions', + action: 'execute', + kind: 'action', + start: '2022-03-23T17:37:07.095Z', + end: '2022-03-23T17:37:07.096Z', + duration: '1000000', + outcome: 'failure', + }, + kibana: { + alert: { + rule: { + execution: { + uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + }, + }, + }, + saved_objects: [ + { + rel: 'primary', + type: 'action', + id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', + type_id: '.server-log', + }, + { + rel: 'primary', + type: 'alert', + id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', + type_id: 'example.always-firing', + }, + ], + task: { + scheduled: '2022-03-23T17:37:04.677Z', + schedule_delay: 2418000000, + }, + server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', + version: '8.2.0', + }, + message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', + error: { + message: + 'an error occurred while running the action executor: something funky with the server log', + }, + ecs: { + version: '1.8.0', + }, + }, + { + '@timestamp': '2022-03-23T17:37:07.086Z', + event: { + provider: 'actions', + action: 'execute', + kind: 'action', + start: '2022-03-23T17:37:07.084Z', + end: '2022-03-23T17:37:07.086Z', + duration: '2000000', + outcome: 'failure', + }, + kibana: { + alert: { + rule: { + execution: { + uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + }, + }, + }, + saved_objects: [ + { + rel: 'primary', + type: 'action', + id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', + type_id: '.server-log', + }, + { + rel: 'primary', + type: 'alert', + id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', + type_id: 'example.always-firing', + }, + ], + task: { + scheduled: '2022-03-23T17:37:04.678Z', + schedule_delay: 2406000000, + }, + server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', + version: '8.2.0', + }, + message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', + error: { + message: + 'an error occurred while running the action executor: something funky with the server log', + }, + ecs: { + version: '1.8.0', + }, + }, + ], +}; + +const getRuleSavedObject = (attributes: Partial = {}): SavedObject => { + return { + ...BaseRuleSavedObject, + attributes: { ...BaseRuleSavedObject.attributes, ...attributes }, + }; +}; + +const getActionErrorLogParams = (overwrites = {}) => { + return { + id: '1', + dateStart: new Date(Date.now() - 3600000).toISOString(), + page: 1, + perPage: 10, + sort: [ + { + '@timestamp': { + order: 'asc', + }, + }, + ] as GetActionErrorLogByIdParams['sort'], + ...overwrites, + }; +}; + +describe('getActionErrorLog()', () => { + let rulesClient: RulesClient; + + beforeEach(() => { + rulesClient = new RulesClient(rulesClientParams); + }); + + test('returns the expected return values when called', async () => { + const ruleSO = getRuleSavedObject({}); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(ruleSO); + eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); + + const result = await rulesClient.getActionErrorLog(getActionErrorLogParams()); + expect(result).toEqual({ + totalErrors: 5, + errors: [ + { + id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + timestamp: '2022-03-23T17:37:07.106Z', + type: 'actions', + message: + 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', + }, + { + id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + timestamp: '2022-03-23T17:37:07.102Z', + type: 'actions', + message: + 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', + }, + { + id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + timestamp: '2022-03-23T17:37:07.098Z', + type: 'actions', + message: + 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', + }, + { + id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + timestamp: '2022-03-23T17:37:07.096Z', + type: 'actions', + message: + 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', + }, + { + id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', + timestamp: '2022-03-23T17:37:07.086Z', + type: 'actions', + message: + 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', + }, + ], + }); + }); + + test('calls event log client with legacy ids param', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce( + getRuleSavedObject({ legacyId: '99999' }) + ); + + eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); + + await rulesClient.getActionErrorLog(getActionErrorLogParams()); + + expect(unsecuredSavedObjectsClient.get).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObjectIds).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObjectIds.mock.calls[0]).toEqual([ + 'alert', + ['1'], + { + page: 1, + per_page: 10, + filter: + 'event.provider:actions AND ((event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout))', + sort: [{ sort_field: '@timestamp', sort_order: 'asc' }], + end: mockedDateString, + start: '2019-02-12T20:01:22.479Z', + }, + ['99999'], + ]); + }); + + test('calls event log client with end date, filter, and paging', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); + eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); + + await rulesClient.getActionErrorLog( + getActionErrorLogParams({ + page: 3, + perPage: 20, + dateEnd: new Date(Date.now() - 2700000).toISOString(), + filter: 'message: "test" AND runId: 123', + }) + ); + + expect(eventLogClient.findEventsBySavedObjectIds).toHaveBeenCalledTimes(1); + expect(eventLogClient.findEventsBySavedObjectIds.mock.calls[0]).toEqual([ + 'alert', + ['1'], + { + page: 3, + per_page: 20, + filter: + '(event.provider:actions AND ((event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout))) AND (message: "test" AND runId: 123)', + sort: [{ sort_field: '@timestamp', sort_order: 'asc' }], + end: '2019-02-12T20:16:22.479Z', + start: '2019-02-12T20:01:22.479Z', + }, + undefined, + ]); + }); + + test('throws error when eventLog.findEventsBySavedObjectIds throws an error', async () => { + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); + eventLogClient.findEventsBySavedObjectIds.mockRejectedValueOnce(new Error('OMG 3!')); + + expect(rulesClient.getActionErrorLog(getActionErrorLogParams())).rejects.toMatchInlineSnapshot( + `[Error: OMG 3!]` + ); + }); + describe('authorization', () => { + beforeEach(() => { + const ruleSO = getRuleSavedObject({}); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(ruleSO); + }); + + test('ensures user is authorised to get this type of alert under the consumer', async () => { + eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); + await rulesClient.getActionErrorLog(getActionErrorLogParams()); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith({ + entity: 'rule', + consumer: 'rule-consumer', + operation: 'get', + ruleTypeId: '123', + }); + }); + + test('throws when user is not authorised to get this type of alert', async () => { + authorization.ensureAuthorized.mockRejectedValueOnce( + new Error(`Unauthorized to get a "myType" alert for "myApp"`) + ); + + await expect( + rulesClient.getActionErrorLog(getActionErrorLogParams()) + ).rejects.toMatchInlineSnapshot(`[Error: Unauthorized to get a "myType" alert for "myApp"]`); + + expect(authorization.ensureAuthorized).toHaveBeenCalledWith({ + entity: 'rule', + consumer: 'rule-consumer', + operation: 'get', + ruleTypeId: '123', + }); + }); + }); + + describe('auditLogger', () => { + beforeEach(() => { + const ruleSO = getRuleSavedObject({}); + unsecuredSavedObjectsClient.get.mockResolvedValueOnce(ruleSO); + }); + + test('logs audit event when getting a rule execution log', async () => { + eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); + await rulesClient.getActionErrorLog(getActionErrorLogParams()); + expect(auditLogger.log).toHaveBeenCalledWith( + expect.objectContaining({ + event: expect.objectContaining({ + action: 'rule_get_action_error_log', + outcome: 'success', + }), + kibana: { saved_object: { id: '1', type: 'alert' } }, + }) + ); + }); + + test('logs audit event when not authorised to get a rule', async () => { + // first call occurs during rule SO get + authorization.ensureAuthorized.mockResolvedValueOnce(); + authorization.ensureAuthorized.mockRejectedValueOnce(new Error('Unauthorized')); + + await expect( + rulesClient.getActionErrorLog(getActionErrorLogParams()) + ).rejects.toMatchInlineSnapshot(`[Error: Unauthorized]`); + expect(auditLogger.log).toHaveBeenCalledWith( + expect.objectContaining({ + event: expect.objectContaining({ + action: 'rule_get_action_error_log', + outcome: 'failure', + }), + kibana: { + saved_object: { + id: '1', + type: 'alert', + }, + }, + error: { + code: 'Error', + message: 'Unauthorized', + }, + }) + ); + }); + }); +}); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts index 04653d491f28b..7f14ec3681bb1 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_execution_log.test.ts @@ -279,313 +279,6 @@ const aggregateResults = { }, }; -const findResults = { - page: 1, - per_page: 500, - total: 6, - data: [ - { - '@timestamp': '2022-03-23T17:37:07.106Z', - event: { - provider: 'actions', - action: 'execute', - kind: 'action', - start: '2022-03-23T17:37:07.105Z', - end: '2022-03-23T17:37:07.105Z', - duration: '0', - outcome: 'failure', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - }, - }, - }, - saved_objects: [ - { - rel: 'primary', - type: 'action', - id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', - type_id: '.server-log', - }, - { - rel: 'primary', - type: 'alert', - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - type_id: 'example.always-firing', - }, - ], - task: { - scheduled: '2022-03-23T17:37:04.674Z', - schedule_delay: 2431000000, - }, - server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', - version: '8.2.0', - }, - message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', - error: { - message: - 'an error occurred while running the action executor: something funky with the server log', - }, - ecs: { - version: '1.8.0', - }, - }, - { - '@timestamp': '2022-03-23T17:37:07.102Z', - event: { - provider: 'actions', - action: 'execute', - kind: 'action', - start: '2022-03-23T17:37:07.101Z', - end: '2022-03-23T17:37:07.102Z', - duration: '1000000', - outcome: 'failure', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - }, - }, - }, - saved_objects: [ - { - rel: 'primary', - type: 'action', - id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', - type_id: '.server-log', - }, - { - rel: 'primary', - type: 'alert', - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - type_id: 'example.always-firing', - }, - ], - task: { - scheduled: '2022-03-23T17:37:04.676Z', - schedule_delay: 2425000000, - }, - server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', - version: '8.2.0', - }, - message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', - error: { - message: - 'an error occurred while running the action executor: something funky with the server log', - }, - ecs: { - version: '1.8.0', - }, - }, - { - '@timestamp': '2022-03-23T17:37:07.098Z', - event: { - provider: 'actions', - action: 'execute', - kind: 'action', - start: '2022-03-23T17:37:07.098Z', - end: '2022-03-23T17:37:07.098Z', - duration: '0', - outcome: 'failure', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - }, - }, - }, - saved_objects: [ - { - rel: 'primary', - type: 'action', - id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', - type_id: '.server-log', - }, - { - rel: 'primary', - type: 'alert', - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - type_id: 'example.always-firing', - }, - ], - task: { - scheduled: '2022-03-23T17:37:04.673Z', - schedule_delay: 2425000000, - }, - server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', - version: '8.2.0', - }, - message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', - error: { - message: - 'an error occurred while running the action executor: something funky with the server log', - }, - ecs: { - version: '1.8.0', - }, - }, - { - '@timestamp': '2022-03-23T17:37:07.096Z', - event: { - provider: 'actions', - action: 'execute', - kind: 'action', - start: '2022-03-23T17:37:07.095Z', - end: '2022-03-23T17:37:07.096Z', - duration: '1000000', - outcome: 'failure', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - }, - }, - }, - saved_objects: [ - { - rel: 'primary', - type: 'action', - id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', - type_id: '.server-log', - }, - { - rel: 'primary', - type: 'alert', - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - type_id: 'example.always-firing', - }, - ], - task: { - scheduled: '2022-03-23T17:37:04.677Z', - schedule_delay: 2418000000, - }, - server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', - version: '8.2.0', - }, - message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', - error: { - message: - 'an error occurred while running the action executor: something funky with the server log', - }, - ecs: { - version: '1.8.0', - }, - }, - { - '@timestamp': '2022-03-23T17:37:07.086Z', - event: { - provider: 'actions', - action: 'execute', - kind: 'action', - start: '2022-03-23T17:37:07.084Z', - end: '2022-03-23T17:37:07.086Z', - duration: '2000000', - outcome: 'failure', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - }, - }, - }, - saved_objects: [ - { - rel: 'primary', - type: 'action', - id: '9e67b8b0-9e2c-11ec-bd64-774ed95c43ef', - type_id: '.server-log', - }, - { - rel: 'primary', - type: 'alert', - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - type_id: 'example.always-firing', - }, - ], - task: { - scheduled: '2022-03-23T17:37:04.678Z', - schedule_delay: 2406000000, - }, - server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', - version: '8.2.0', - }, - message: 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s', - error: { - message: - 'an error occurred while running the action executor: something funky with the server log', - }, - ecs: { - version: '1.8.0', - }, - }, - { - '@timestamp': '2022-03-23T17:23:05.249Z', - event: { - provider: 'alerting', - action: 'execute', - kind: 'alert', - category: ['AlertingExample'], - start: '2022-03-23T17:23:05.131Z', - outcome: 'failure', - end: '2022-03-23T17:23:05.248Z', - duration: '117000000', - reason: 'execute', - }, - kibana: { - alert: { - rule: { - execution: { - uuid: 'c1c04f04-312e-4e23-8e36-e01eb4332ed6', - }, - }, - }, - saved_objects: [ - { - rel: 'primary', - type: 'alert', - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - type_id: 'example.always-firing', - }, - ], - task: { - scheduled: '2022-03-23T17:22:23.618Z', - schedule_delay: 41512000000, - }, - alerting: { - status: 'error', - }, - server_uuid: '5b2de169-2785-441b-ae8c-186a1936b17d', - version: '8.2.0', - }, - rule: { - id: 'a348a740-9e2c-11ec-bd64-774ed95c43ef', - license: 'basic', - category: 'example.always-firing', - ruleset: 'AlertingExample', - }, - message: - "rule execution failure: example.always-firing:a348a740-9e2c-11ec-bd64-774ed95c43ef: 'test rule'", - error: { - message: 'I am erroring in rule execution!!', - }, - ecs: { - version: '1.8.0', - }, - }, - ], -}; - function getRuleSavedObject(attributes: Partial = {}): SavedObject { return { ...BaseRuleSavedObject, @@ -614,7 +307,6 @@ describe('getExecutionLogForRule()', () => { const ruleSO = getRuleSavedObject({}); unsecuredSavedObjectsClient.get.mockResolvedValueOnce(ruleSO); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); const result = await rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()); expect(result).toEqual({ @@ -661,50 +353,6 @@ describe('getExecutionLogForRule()', () => { schedule_delay_ms: 3345, }, ], - totalErrors: 6, - errors: [ - { - id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - timestamp: '2022-03-23T17:37:07.106Z', - type: 'actions', - message: - 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', - }, - { - id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - timestamp: '2022-03-23T17:37:07.102Z', - type: 'actions', - message: - 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', - }, - { - id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - timestamp: '2022-03-23T17:37:07.098Z', - type: 'actions', - message: - 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', - }, - { - id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - timestamp: '2022-03-23T17:37:07.096Z', - type: 'actions', - message: - 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', - }, - { - id: '08d9b0f5-0b41-47c9-951f-a666b5788ddc', - timestamp: '2022-03-23T17:37:07.086Z', - type: 'actions', - message: - 'action execution failure: .server-log:9e67b8b0-9e2c-11ec-bd64-774ed95c43ef: s - an error occurred while running the action executor: something funky with the server log', - }, - { - id: 'c1c04f04-312e-4e23-8e36-e01eb4332ed6', - timestamp: '2022-03-23T17:23:05.249Z', - type: 'alerting', - message: `rule execution failure: example.always-firing:a348a740-9e2c-11ec-bd64-774ed95c43ef: 'test rule' - I am erroring in rule execution!!`, - }, - ], }); }); @@ -715,7 +363,6 @@ describe('getExecutionLogForRule()', () => { test('calls saved objects and event log client with default params', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); await rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()); @@ -735,19 +382,6 @@ describe('getExecutionLogForRule()', () => { }, undefined, ]); - expect(eventLogClient.findEventsBySavedObjectIds).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObjectIds.mock.calls[0]).toEqual([ - 'alert', - ['1'], - { - per_page: 500, - filter: `(event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout)`, - sort: [{ sort_field: '@timestamp', sort_order: 'desc' }], - end: mockedDateString, - start: '2019-02-12T20:01:22.479Z', - }, - undefined, - ]); }); test('calls event log client with legacy ids param', async () => { @@ -755,7 +389,6 @@ describe('getExecutionLogForRule()', () => { getRuleSavedObject({ legacyId: '99999' }) ); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); await rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()); @@ -775,25 +408,11 @@ describe('getExecutionLogForRule()', () => { }, ['99999'], ]); - expect(eventLogClient.findEventsBySavedObjectIds).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObjectIds.mock.calls[0]).toEqual([ - 'alert', - ['1'], - { - per_page: 500, - filter: `(event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout)`, - sort: [{ sort_field: '@timestamp', sort_order: 'desc' }], - end: mockedDateString, - start: '2019-02-12T20:01:22.479Z', - }, - ['99999'], - ]); }); test('calls event log client with end date if specified', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); await rulesClient.getExecutionLogForRule( getExecutionLogByIdParams({ dateEnd: new Date(Date.now() - 2700000).toISOString() }) @@ -815,25 +434,11 @@ describe('getExecutionLogForRule()', () => { }, undefined, ]); - expect(eventLogClient.findEventsBySavedObjectIds).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObjectIds.mock.calls[0]).toEqual([ - 'alert', - ['1'], - { - per_page: 500, - filter: `(event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout)`, - sort: [{ sort_field: '@timestamp', sort_order: 'desc' }], - end: '2019-02-12T20:16:22.479Z', - start: '2019-02-12T20:01:22.479Z', - }, - undefined, - ]); }); test('calls event log client with filter if specified', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); await rulesClient.getExecutionLogForRule( getExecutionLogByIdParams({ filter: 'event.outcome: success' }) @@ -856,25 +461,11 @@ describe('getExecutionLogForRule()', () => { }, undefined, ]); - expect(eventLogClient.findEventsBySavedObjectIds).toHaveBeenCalledTimes(1); - expect(eventLogClient.findEventsBySavedObjectIds.mock.calls[0]).toEqual([ - 'alert', - ['1'], - { - per_page: 500, - filter: `(event.action:execute AND (event.outcome:failure OR kibana.alerting.status:warning)) OR (event.action:execute-timeout)`, - sort: [{ sort_field: '@timestamp', sort_order: 'desc' }], - end: mockedDateString, - start: '2019-02-12T20:01:22.479Z', - }, - undefined, - ]); }); test('invalid start date throws an error', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); const dateStart = 'ain"t no way this will get parsed as a date'; expect( @@ -887,7 +478,6 @@ describe('getExecutionLogForRule()', () => { test('invalid end date throws an error', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); const dateEnd = 'ain"t no way this will get parsed as a date'; expect( @@ -900,7 +490,6 @@ describe('getExecutionLogForRule()', () => { test('invalid page value throws an error', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); expect( rulesClient.getExecutionLogForRule(getExecutionLogByIdParams({ page: -3 })) @@ -910,7 +499,6 @@ describe('getExecutionLogForRule()', () => { test('invalid perPage value throws an error', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); expect( rulesClient.getExecutionLogForRule(getExecutionLogByIdParams({ perPage: -3 })) @@ -920,7 +508,6 @@ describe('getExecutionLogForRule()', () => { test('invalid sort value throws an error', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); expect( rulesClient.getExecutionLogForRule( @@ -934,7 +521,6 @@ describe('getExecutionLogForRule()', () => { test('throws error when saved object get throws an error', async () => { unsecuredSavedObjectsClient.get.mockRejectedValueOnce(new Error('OMG!')); eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); expect( rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()) @@ -944,23 +530,12 @@ describe('getExecutionLogForRule()', () => { test('throws error when eventLog.aggregateEventsBySavedObjectIds throws an error', async () => { unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); eventLogClient.aggregateEventsBySavedObjectIds.mockRejectedValueOnce(new Error('OMG 2!')); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); expect( rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()) ).rejects.toMatchInlineSnapshot(`[Error: OMG 2!]`); }); - test('throws error when eventLog.findEventsBySavedObjectIds throws an error', async () => { - unsecuredSavedObjectsClient.get.mockResolvedValueOnce(getRuleSavedObject()); - eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockRejectedValueOnce(new Error('OMG 3!')); - - expect( - rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()) - ).rejects.toMatchInlineSnapshot(`[Error: OMG 3!]`); - }); - describe('authorization', () => { beforeEach(() => { const ruleSO = getRuleSavedObject({}); @@ -969,7 +544,6 @@ describe('getExecutionLogForRule()', () => { test('ensures user is authorised to get this type of alert under the consumer', async () => { eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); await rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()); expect(authorization.ensureAuthorized).toHaveBeenCalledWith({ @@ -1006,7 +580,6 @@ describe('getExecutionLogForRule()', () => { test('logs audit event when getting a rule execution log', async () => { eventLogClient.aggregateEventsBySavedObjectIds.mockResolvedValueOnce(aggregateResults); - eventLogClient.findEventsBySavedObjectIds.mockResolvedValueOnce(findResults); await rulesClient.getExecutionLogForRule(getExecutionLogByIdParams()); expect(auditLogger.log).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts index eee8ba8bae4fe..36553966af44f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/index.ts @@ -22,6 +22,8 @@ export { loadRules } from './rules'; export { loadRuleState } from './state'; export type { LoadExecutionLogAggregationsProps } from './load_execution_log_aggregations'; export { loadExecutionLogAggregations } from './load_execution_log_aggregations'; +export type { LoadActionErrorLogProps } from './load_action_error_log'; +export { loadActionErrorLog } from './load_action_error_log'; export { unmuteAlertInstance } from './unmute_alert'; export { unmuteRule, unmuteRules } from './unmute'; export { updateRule } from './update'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.test.ts new file mode 100644 index 0000000000000..d68ced31661ae --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.test.ts @@ -0,0 +1,129 @@ +/* + * Copyright 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 { httpServiceMock } from '@kbn/core/public/mocks'; +import { loadActionErrorLog } from './load_action_error_log'; + +const http = httpServiceMock.createStartContract(); + +const mockResponse: any = { + totalErrors: 12, + errors: [ + { + id: '66b9c04a-d5d3-4ed4-aa7c-94ddaca3ac1d', + timestamp: '2022-03-31T18:03:33.133Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '14fcfe1c-5403-458f-8549-fa8ef59cdea3', + timestamp: '2022-03-31T18:02:30.119Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: 'd53a401e-2a3a-4abe-8913-26e08a5039fd', + timestamp: '2022-03-31T18:01:27.112Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '9cfeae08-24b4-4d5c-b870-a303418f14d6', + timestamp: '2022-03-31T18:00:24.113Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '66b9c04a-d5d3-4ed4-aa7c-94ddaca3ac23', + timestamp: '2022-03-31T18:03:21.133Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '14fcfe1c-5403-458f-8549-fa8ef59cde18', + timestamp: '2022-03-31T18:02:18.119Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: 'd53a401e-2a3a-4abe-8913-26e08a503915', + timestamp: '2022-03-31T18:01:15.112Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '9cfeae08-24b4-4d5c-b870-a303418f1412', + timestamp: '2022-03-31T18:00:12.113Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '66b9c04a-d5d3-4ed4-aa7c-94ddaca3ac09', + timestamp: '2022-03-31T18:03:09.133Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + { + id: '14fcfe1c-5403-458f-8549-fa8ef59cde06', + timestamp: '2022-03-31T18:02:06.119Z', + type: 'alerting', + message: + "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", + }, + ], +}; + +describe('loadActionErrorLog', () => { + test('should call load action error log API', async () => { + http.get.mockResolvedValueOnce(mockResponse); + + const result = await loadActionErrorLog({ + id: 'test-id', + dateStart: '2022-03-23T16:17:53.482Z', + dateEnd: '2022-03-23T16:17:53.482Z', + runId: '123', + message: 'test', + perPage: 10, + page: 0, + sort: [ + { + timestamp: { + order: 'asc', + }, + }, + ], + http, + }); + + expect(result).toEqual(mockResponse); + + expect(http.get.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + "/internal/alerting/rule/test-id/_action_error_log", + Object { + "query": Object { + "date_end": "2022-03-23T16:17:53.482Z", + "date_start": "2022-03-23T16:17:53.482Z", + "filter": "kibana.alert.rule.execution.uuid: 123 and message: \\"test\\"", + "page": 1, + "per_page": 10, + "sort": "[{\\"@timestamp\\":{\\"order\\":\\"asc\\"}}]", + }, + }, + ] + `); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.ts new file mode 100644 index 0000000000000..79d45ef4c51d8 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.ts @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { HttpSetup } from '@kbn/core/public'; +import type { SortOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { IExecutionErrorsResult, ActionErrorLogSortFields } from '@kbn/alerting-plugin/common'; +import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants'; + +export type SortField = Record< + ActionErrorLogSortFields, + { + order: SortOrder; + } +>; + +export interface LoadActionErrorLogProps { + id: string; + runId?: string; + message?: string; + dateStart: string; + dateEnd?: string; + filter?: string[]; + perPage?: number; + page?: number; + sort?: SortField[]; +} + +const SORT_MAP: Record = { + timestamp: '@timestamp', +}; + +// Remaps sorting keys to ones that the server knows how to handle +const getRenamedSort = (sort?: SortField[]) => { + if (!sort) { + return []; + } + return sort.map((o) => { + const sortField = Object.keys(o)[0]; + const sortOrder = o[Object.keys(o)[0]]; + return { + [SORT_MAP[sortField] || sortField]: { + ...sortOrder, + }, + }; + }); +}; + +// TODO (Jiawei): Use node builder instead of strings +const getFilter = ({ runId, message }: { runId?: string; message?: string }) => { + const filter: string[] = []; + + if (runId) { + filter.push(`kibana.alert.rule.execution.uuid: ${runId}`); + } + + if (message) { + filter.push(`message: "${message}"`); + } + + return filter; +}; + +export const loadActionErrorLog = async ({ + id, + http, + dateStart, + dateEnd, + runId, + message, + perPage = 10, + page = 0, + sort, +}: LoadActionErrorLogProps & { http: HttpSetup }) => { + const renamedSort = getRenamedSort(sort); + const filter = getFilter({ runId, message }); + + return http.get( + `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${id}/_action_error_log`, + { + query: { + date_start: dateStart, + date_end: dateEnd, + filter: filter.length ? filter.join(' and ') : undefined, + per_page: perPage, + // Need to add the + 1 for pages because APIs are 1 indexed, + // whereas data grid sorts are 0 indexed. + page: page + 1, + sort: renamedSort.length ? JSON.stringify(renamedSort) : undefined, + }, + } + ); +}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.test.ts index afe52835e1d08..7eccd9be2955b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.test.ts @@ -47,7 +47,7 @@ describe('loadExecutionLogAggregations', () => { id: 'test-id', dateStart: '2022-03-23T16:17:53.482Z', dateEnd: '2022-03-23T16:17:53.482Z', - filter: ['success', 'unknown'], + outcomeFilter: ['success', 'unknown'], perPage: 10, page: 0, sort: [sortTimestamp], @@ -84,7 +84,7 @@ describe('loadExecutionLogAggregations', () => { "query": Object { "date_end": "2022-03-23T16:17:53.482Z", "date_start": "2022-03-23T16:17:53.482Z", - "filter": "success OR unknown", + "filter": "event.outcome: success or unknown", "page": 1, "per_page": 10, "sort": "[{\\"timestamp\\":{\\"order\\":\\"asc\\"}}]", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.ts b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.ts index ed6199c722ee0..8a9dffc3e1b2e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_execution_log_aggregations.ts @@ -9,11 +9,10 @@ import { HttpSetup } from '@kbn/core/public'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; - import { IExecutionLog, ExecutionLogSortFields, - IExecutionLogWithErrorsResult, + IExecutionLogResult, } from '@kbn/alerting-plugin/common'; import { AsApiContract, RewriteRequestCase } from '@kbn/actions-plugin/common'; import { INTERNAL_BASE_ALERTING_API_PATH } from '../../constants'; @@ -36,19 +35,24 @@ const getRenamedLog = (data: IExecutionLog) => { }; }; -const rewriteBodyRes: RewriteRequestCase = ({ - data, - ...rest -}: any) => ({ +const rewriteBodyRes: RewriteRequestCase = ({ data, ...rest }: any) => ({ data: data.map((log: IExecutionLog) => getRenamedLog(log)), ...rest, }); -const getFilter = (filter: string[] | undefined) => { - if (!filter || !filter.length) { - return; +// TODO (Jiawei): Use node builder instead of strings +const getFilter = ({ outcomeFilter, message }: { outcomeFilter?: string[]; message?: string }) => { + const filter: string[] = []; + + if (outcomeFilter && outcomeFilter.length) { + filter.push(`event.outcome: ${outcomeFilter.join(' or ')}`); } - return filter.join(' OR '); + + if (message) { + filter.push(`message: "${message}"`); + } + + return filter; }; export type SortField = Record< @@ -62,7 +66,8 @@ export interface LoadExecutionLogAggregationsProps { id: string; dateStart: string; dateEnd?: string; - filter?: string[]; + outcomeFilter?: string[]; + message?: string; perPage?: number; page?: number; sort?: SortField[]; @@ -73,20 +78,22 @@ export const loadExecutionLogAggregations = async ({ http, dateStart, dateEnd, - filter, + outcomeFilter, + message, perPage = 10, page = 0, sort = [], }: LoadExecutionLogAggregationsProps & { http: HttpSetup }) => { const sortField: any[] = sort; + const filter = getFilter({ outcomeFilter, message }); - const result = await http.get>( + const result = await http.get>( `${INTERNAL_BASE_ALERTING_API_PATH}/rule/${id}/_execution_log`, { query: { date_start: dateStart, date_end: dateEnd, - filter: getFilter(filter), + filter: filter.length ? filter.join(' and ') : undefined, per_page: perPage, // Need to add the + 1 for pages because APIs are 1 indexed, // whereas data grid sorts are 0 indexed. diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx index 1eefd329d2a4d..989a27905cf51 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.test.tsx @@ -250,7 +250,7 @@ describe('with_bulk_rule_api_operations', () => { expect(ruleApi.loadRuleTypes).toHaveBeenCalledWith({ http }); }); - it('loadExecutionLogAggregations calls the loadExecutionLogAggregations api', () => { + it('loadExecutionLogAggregations calls the loadExecutionLogAggregations API', () => { const { http } = useKibanaMock().services; const sortTimestamp = { @@ -283,6 +283,39 @@ describe('with_bulk_rule_api_operations', () => { http, }); }); + + it('loadActionErrorLog calls the loadActionErrorLog API', () => { + const { http } = useKibanaMock().services; + const callProps = { + id: 'test-id', + dateStart: '2022-03-23T16:17:53.482Z', + dateEnd: '2022-03-23T16:17:53.482Z', + filter: ['message: "test"'], + perPage: 10, + page: 0, + sort: [ + { + timestamp: { + order: 'asc' as const, + }, + }, + ], + }; + + const ComponentToExtend = ({ loadActionErrorLog }: ComponentOpts) => { + return ; + }; + + const ExtendedComponent = withBulkRuleOperations(ComponentToExtend); + const component = mount(); + component.find('button').simulate('click'); + + expect(ruleApi.loadActionErrorLog).toHaveBeenCalledTimes(1); + expect(ruleApi.loadActionErrorLog).toHaveBeenCalledWith({ + ...callProps, + http, + }); + }); }); function mockRule(overloads: Partial = {}): Rule { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx index 071f216bbb6c0..f83cffae60c68 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/common/components/with_bulk_rule_api_operations.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { IExecutionLogWithErrorsResult } from '@kbn/alerting-plugin/common'; +import { IExecutionLogResult, IExecutionErrorsResult } from '@kbn/alerting-plugin/common'; import { Rule, RuleType, @@ -37,6 +37,8 @@ import { resolveRule, loadExecutionLogAggregations, LoadExecutionLogAggregationsProps, + loadActionErrorLog, + LoadActionErrorLogProps, snoozeRule, unsnoozeRule, } from '../../../lib/rule_api'; @@ -67,7 +69,8 @@ export interface ComponentOpts { loadRuleTypes: () => Promise; loadExecutionLogAggregations: ( props: LoadExecutionLogAggregationsProps - ) => Promise; + ) => Promise; + loadActionErrorLog: (props: LoadActionErrorLogProps) => Promise; getHealth: () => Promise; resolveRule: (id: Rule['id']) => Promise; snoozeRule: (rule: Rule, snoozeSchedule: SnoozeSchedule) => Promise; @@ -148,6 +151,12 @@ export function withBulkRuleOperations( http, }) } + loadActionErrorLog={async (loadProps: LoadActionErrorLogProps) => + loadActionErrorLog({ + ...loadProps, + http, + }) + } resolveRule={async (ruleId: Rule['id']) => resolveRule({ http, ruleId })} getHealth={async () => alertingFrameworkHealth({ http })} snoozeRule={async (rule: Rule, snoozeSchedule: SnoozeSchedule) => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx index 001cec0738ed3..ac27cab92b1fa 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.test.tsx @@ -19,8 +19,6 @@ const useKibanaMock = useKibana as jest.Mocked; jest.mock('../../../../common/lib/kibana'); const mockLogResponse: any = { - total: 8, - data: [], totalErrors: 12, errors: [ { @@ -93,20 +91,6 @@ const mockLogResponse: any = { message: "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", }, - { - id: 'd53a401e-2a3a-4abe-8913-26e08a503903', - timestamp: '2022-03-31T18:01:03.112Z', - type: 'alerting', - message: - "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", - }, - { - id: '9cfeae08-24b4-4d5c-b870-a303418f1400', - timestamp: '2022-03-31T18:00:00.113Z', - type: 'alerting', - message: - "rule execution failure: .es-query:d87fcbd0-b11b-11ec-88f6-293354dba871: 'Mine' - x_content_parse_exception: [parsing_exception] Reason: unknown query [match_allxxxx] did you mean [match_all]?", - }, ], }; @@ -135,7 +119,7 @@ const mockRule: Rule = { }, }; -const loadExecutionLogAggregationsMock = jest.fn(); +const loadActionErrorLogMock = jest.fn(); describe('rule_error_log', () => { beforeEach(() => { @@ -151,16 +135,13 @@ describe('rule_error_log', () => { ]; } }); - loadExecutionLogAggregationsMock.mockResolvedValue(mockLogResponse); + loadActionErrorLogMock.mockResolvedValue(mockLogResponse); }); it('renders correctly', async () => { const nowMock = jest.spyOn(Date, 'now').mockReturnValue(0); const wrapper = mountWithIntl( - + ); // No data initially @@ -169,16 +150,16 @@ describe('rule_error_log', () => { ); // Run the initial load fetch call - expect(loadExecutionLogAggregationsMock).toHaveBeenCalledTimes(1); + expect(loadActionErrorLogMock).toHaveBeenCalledTimes(1); - expect(loadExecutionLogAggregationsMock).toHaveBeenCalledWith( + expect(loadActionErrorLogMock).toHaveBeenCalledWith( expect.objectContaining({ dateEnd: '1969-12-31T19:00:00-05:00', dateStart: '1969-12-30T19:00:00-05:00', id: '56b61397-13d7-43d0-a583-0fa8c704a46f', page: 0, - perPage: 1, - sort: { timestamp: { order: 'desc' } }, + perPage: 10, + sort: [{ timestamp: { order: 'desc' } }], }) ); @@ -200,20 +181,27 @@ describe('rule_error_log', () => { }); it('can sort on timestamp columns', async () => { + const nowMock = jest.spyOn(Date, 'now').mockReturnValue(0); + const wrapper = mountWithIntl( - + ); await act(async () => { await nextTick(); wrapper.update(); }); - expect( - wrapper.find('.euiTableRow').first().find('.euiTableCellContent').first().text() - ).toEqual('Mar 31, 2022 @ 14:03:33.133'); + + expect(loadActionErrorLogMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + dateEnd: '1969-12-31T19:00:00-05:00', + dateStart: '1969-12-30T19:00:00-05:00', + id: '56b61397-13d7-43d0-a583-0fa8c704a46f', + page: 0, + perPage: 10, + sort: [{ timestamp: { order: 'desc' } }], + }) + ); wrapper.find('button[data-test-subj="tableHeaderSortButton"]').first().simulate('click'); @@ -222,22 +210,30 @@ describe('rule_error_log', () => { wrapper.update(); }); - expect( - wrapper.find('.euiTableRow').first().find('.euiTableCellContent').first().text() - ).toEqual('Mar 31, 2022 @ 14:00:00.113'); + expect(loadActionErrorLogMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + dateEnd: '1969-12-31T19:00:00-05:00', + dateStart: '1969-12-30T19:00:00-05:00', + id: '56b61397-13d7-43d0-a583-0fa8c704a46f', + page: 0, + perPage: 10, + sort: [{ timestamp: { order: 'asc' } }], + }) + ); + + nowMock.mockRestore(); }); it('can paginate', async () => { - loadExecutionLogAggregationsMock.mockResolvedValue({ + const nowMock = jest.spyOn(Date, 'now').mockReturnValue(0); + + loadActionErrorLogMock.mockResolvedValue({ ...mockLogResponse, - total: 100, + totalErrors: 100, }); const wrapper = mountWithIntl( - + ); await act(async () => { @@ -245,6 +241,17 @@ describe('rule_error_log', () => { wrapper.update(); }); + expect(loadActionErrorLogMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + dateEnd: '1969-12-31T19:00:00-05:00', + dateStart: '1969-12-30T19:00:00-05:00', + id: '56b61397-13d7-43d0-a583-0fa8c704a46f', + page: 0, + perPage: 10, + sort: [{ timestamp: { order: 'desc' } }], + }) + ); + expect(wrapper.find('.euiPagination').exists()).toBeTruthy(); // Paginate to the next page @@ -255,17 +262,25 @@ describe('rule_error_log', () => { wrapper.update(); }); - expect(wrapper.find('.euiTableRow').length).toEqual(2); + expect(loadActionErrorLogMock).toHaveBeenLastCalledWith( + expect.objectContaining({ + dateEnd: '1969-12-31T19:00:00-05:00', + dateStart: '1969-12-30T19:00:00-05:00', + id: '56b61397-13d7-43d0-a583-0fa8c704a46f', + page: 1, + perPage: 10, + sort: [{ timestamp: { order: 'desc' } }], + }) + ); + + nowMock.mockRestore(); }); it('can filter by start and end date', async () => { const nowMock = jest.spyOn(Date, 'now').mockReturnValue(0); const wrapper = mountWithIntl( - + ); await act(async () => { @@ -273,14 +288,14 @@ describe('rule_error_log', () => { wrapper.update(); }); - expect(loadExecutionLogAggregationsMock).toHaveBeenLastCalledWith( + expect(loadActionErrorLogMock).toHaveBeenLastCalledWith( expect.objectContaining({ dateEnd: '1969-12-31T19:00:00-05:00', dateStart: '1969-12-30T19:00:00-05:00', id: '56b61397-13d7-43d0-a583-0fa8c704a46f', page: 0, - perPage: 1, - sort: { timestamp: { order: 'desc' } }, + perPage: 10, + sort: [{ timestamp: { order: 'desc' } }], }) ); @@ -297,14 +312,14 @@ describe('rule_error_log', () => { wrapper.update(); }); - expect(loadExecutionLogAggregationsMock).toHaveBeenLastCalledWith( + expect(loadActionErrorLogMock).toHaveBeenLastCalledWith( expect.objectContaining({ dateStart: '1969-12-31T18:45:00-05:00', dateEnd: '1969-12-31T19:00:00-05:00', id: '56b61397-13d7-43d0-a583-0fa8c704a46f', page: 0, - perPage: 1, - sort: { timestamp: { order: 'desc' } }, + perPage: 10, + sort: [{ timestamp: { order: 'desc' } }], }) ); @@ -313,10 +328,7 @@ describe('rule_error_log', () => { it('does not show the refine search prompt normally', async () => { const wrapper = mountWithIntl( - + ); await act(async () => { @@ -328,16 +340,13 @@ describe('rule_error_log', () => { }); it('shows the refine search prompt when our queries return too much data', async () => { - loadExecutionLogAggregationsMock.mockResolvedValue({ + loadActionErrorLogMock.mockResolvedValue({ ...mockLogResponse, totalErrors: 1100, }); const wrapper = mountWithIntl( - + ); await act(async () => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.tsx index 8209703f3f67d..1294cbe5ad40d 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_error_log.tsx @@ -24,7 +24,6 @@ import { IExecutionErrors } from '@kbn/alerting-plugin/common'; import { useKibana } from '../../../../common/lib/kibana'; import { RefineSearchPrompt } from '../refine_search_prompt'; -import { LoadExecutionLogAggregationsProps } from '../../../lib/rule_api'; import { Rule } from '../../../../types'; import { ComponentOpts as RuleApis, @@ -53,23 +52,14 @@ const updateButtonProps = { const MAX_RESULTS = 1000; -const sortErrorLog = ( - a: IExecutionErrors, - b: IExecutionErrors, - direction: 'desc' | 'asc' = 'desc' -) => - direction === 'desc' - ? new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime() - : new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(); - export type RuleErrorLogProps = { rule: Rule; refreshToken?: number; requestRefresh?: () => Promise; -} & Pick; +} & Pick; export const RuleErrorLog = (props: RuleErrorLogProps) => { - const { rule, loadExecutionLogAggregations, refreshToken } = props; + const { rule, loadActionErrorLog, refreshToken } = props; const { uiSettings, notifications } = useKibana().services; @@ -111,18 +101,30 @@ export const RuleErrorLog = (props: RuleErrorLogProps) => { return (pageIndex + 1) * pageSize >= MAX_RESULTS; }, [pagination]); + const formattedSort = useMemo(() => { + if (!sort) { + return; + } + const { field, direction } = sort; + return [ + { + [field]: { + order: direction, + }, + }, + ]; + }, [sort]); + const loadEventLogs = async () => { setIsLoading(true); try { - const result = await loadExecutionLogAggregations({ + const result = await loadActionErrorLog({ id: rule.id, - sort: { - [sort?.field || 'timestamp']: { order: sort?.direction || 'desc' }, - } as unknown as LoadExecutionLogAggregationsProps['sort'], dateStart: getParsedDate(dateStart), dateEnd: getParsedDate(dateEnd), - page: 0, - perPage: 1, + page: pagination.pageIndex, + perPage: pagination.pageSize, + sort: formattedSort, }); setLogs(result.errors); setPagination({ @@ -192,16 +194,10 @@ export const RuleErrorLog = (props: RuleErrorLogProps) => { [dateFormat] ); - const logList = useMemo(() => { - const start = pagination.pageIndex * pagination.pageSize; - const logsSortDesc = logs.sort((a, b) => sortErrorLog(a, b, sort?.direction)); - return logsSortDesc.slice(start, start + pagination.pageSize); - }, [logs, pagination.pageIndex, pagination.pageSize, sort?.direction]); - useEffect(() => { loadEventLogs(); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dateStart, dateEnd]); + }, [dateStart, dateEnd, formattedSort, pagination.pageIndex, pagination.pageSize]); useEffect(() => { if (isInitialized.current) { @@ -237,7 +233,7 @@ export const RuleErrorLog = (props: RuleErrorLogProps) => { { expect.objectContaining({ id: mockRule.id, sort: [], - filter: [], + outcomeFilter: [], page: 0, perPage: 10, }) @@ -224,7 +224,7 @@ describe('rule_event_log_list', () => { }, }, ], - filter: [], + outcomeFilter: [], page: 0, perPage: 10, }) @@ -253,7 +253,7 @@ describe('rule_event_log_list', () => { }, }, ], - filter: [], + outcomeFilter: [], page: 0, perPage: 10, }) @@ -290,7 +290,7 @@ describe('rule_event_log_list', () => { execution_duration: { order: 'asc' }, }, ], - filter: [], + outcomeFilter: [], page: 0, perPage: 10, }) @@ -324,7 +324,7 @@ describe('rule_event_log_list', () => { expect.objectContaining({ id: mockRule.id, sort: [], - filter: ['success'], + outcomeFilter: ['success'], page: 0, perPage: 10, }) @@ -344,7 +344,7 @@ describe('rule_event_log_list', () => { expect.objectContaining({ id: mockRule.id, sort: [], - filter: ['success', 'failure'], + outcomeFilter: ['success', 'failure'], page: 0, perPage: 10, }) @@ -383,7 +383,7 @@ describe('rule_event_log_list', () => { expect.objectContaining({ id: mockRule.id, sort: [], - filter: [], + outcomeFilter: [], page: 1, perPage: 10, }) @@ -403,7 +403,7 @@ describe('rule_event_log_list', () => { expect.objectContaining({ id: mockRule.id, sort: [], - filter: [], + outcomeFilter: [], page: 0, perPage: 50, }) @@ -429,7 +429,7 @@ describe('rule_event_log_list', () => { expect.objectContaining({ id: mockRule.id, sort: [], - filter: [], + outcomeFilter: [], page: 0, perPage: 10, dateStart: '1969-12-30T19:00:00-05:00', @@ -454,7 +454,7 @@ describe('rule_event_log_list', () => { expect.objectContaining({ id: mockRule.id, sort: [], - filter: [], + outcomeFilter: [], page: 0, perPage: 10, dateStart: '1969-12-31T18:45:00-05:00', diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_event_log_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_event_log_list.tsx index 5ec8a7c793231..30e2d0bb4c335 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_event_log_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/rule_details/components/rule_event_log_list.tsx @@ -130,7 +130,7 @@ export const RuleEventLogList = (props: RuleEventLogListProps) => { const result = await loadExecutionLogAggregations({ id: rule.id, sort: formattedSort as LoadExecutionLogAggregationsProps['sort'], - filter, + outcomeFilter: filter, dateStart: getParsedDate(dateStart), dateEnd: getParsedDate(dateEnd), page: pagination.pageIndex, diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 4e1a5a2c94696..d185c923840a8 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -85,6 +85,7 @@ export { Plugin } from './plugin'; // TODO remove this import when we expose the Rules tables as a component export { loadRules } from './application/lib/rule_api/rules'; export { loadExecutionLogAggregations } from './application/lib/rule_api/load_execution_log_aggregations'; +export { loadActionErrorLog } from './application/lib/rule_api/load_action_error_log'; export { loadRuleTypes } from './application/lib/rule_api/rule_types'; export { loadRuleSummary } from './application/lib/rule_api/rule_summary'; export { deleteRules } from './application/lib/rule_api/delete'; diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts new file mode 100644 index 0000000000000..f23daba4d75e3 --- /dev/null +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts @@ -0,0 +1,236 @@ +/* + * Copyright 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 { Spaces } from '../../scenarios'; +import { + getUrlPrefix, + ObjectRemover, + getTestRuleData, + getEventLog, + ESTestIndexTool, +} from '../../../common/lib'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function createGetActionErrorLogTests({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const retry = getService('retry'); + const es = getService('es'); + const esTestIndexTool = new ESTestIndexTool(es, retry); + + const dateStart = new Date(Date.now() - 600000).toISOString(); + + describe('getActionErrorLog', () => { + const objectRemover = new ObjectRemover(supertest); + + beforeEach(async () => { + await esTestIndexTool.destroy(); + await esTestIndexTool.setup(); + }); + + afterEach(() => objectRemover.removeAll()); + + it(`handles non-existent rule`, async () => { + await supertest + .get( + `${getUrlPrefix( + Spaces.space1.id + )}/internal/alerting/rule/1/_action_error_log?date_start=${dateStart}` + ) + .expect(404, { + statusCode: 404, + error: 'Not Found', + message: 'Saved object [alert/1] not found', + }); + }); + + it('returns no action error logs if rule action did not error', async () => { + const { body: createdRule } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send(getTestRuleData({ schedule: { interval: '5s' } })) + .expect(200); + objectRemover.add(Spaces.space1.id, createdRule.id, 'rule', 'alerting'); + + await waitForEvents(createdRule.id, 'alerting', new Map([['execute', { gte: 1 }]])); + const response = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_action_error_log?date_start=${dateStart}` + ); + + expect(response.body.totalErrors).to.eql(0); + expect(response.body.errors).to.eql([]); + }); + + it('gets action error logs for rules with action errors', async () => { + const { body: createdConnector } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'connector that throws', + connector_type_id: 'test.throw', + config: {}, + secrets: {}, + }) + .expect(200); + objectRemover.add(Spaces.space1.id, createdConnector.id, 'action', 'actions'); + + const { body: createdRule } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + rule_type_id: 'test.cumulative-firing', + actions: [ + { + id: createdConnector.id, + group: 'default', + params: {}, + }, + ], + }) + ) + .expect(200); + objectRemover.add(Spaces.space1.id, createdRule.id, 'rule', 'alerting'); + + await waitForEvents(createdRule.id, 'alerting', new Map([['execute', { gte: 1 }]])); + await waitForEvents(createdRule.id, 'actions', new Map([['execute', { gte: 1 }]])); + + const response = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_action_error_log?date_start=${dateStart}` + ); + + expect(response.body.totalErrors).to.eql(1); + expect(response.body.errors.length).to.eql(1); + + for (const errors of response.body.errors) { + expect(errors.type).to.equal('actions'); + expect(errors.message).to.equal( + `action execution failure: test.throw:${createdConnector.id}: connector that throws - an error occurred while running the action: this action is intended to fail` + ); + } + }); + + it('get and filter action error logs for rules with multiple action errors', async () => { + const { body: createdConnector1 } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'connector that throws', + connector_type_id: 'test.throw', + config: {}, + secrets: {}, + }) + .expect(200); + objectRemover.add(Spaces.space1.id, createdConnector1.id, 'action', 'actions'); + + const { body: createdConnector2 } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/actions/connector`) + .set('kbn-xsrf', 'foo') + .send({ + name: 'connector that throws', + connector_type_id: 'test.throw', + config: {}, + secrets: {}, + }) + .expect(200); + objectRemover.add(Spaces.space1.id, createdConnector2.id, 'action', 'actions'); + + const { body: createdRule } = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) + .set('kbn-xsrf', 'foo') + .send( + getTestRuleData({ + rule_type_id: 'test.cumulative-firing', + actions: [ + { + id: createdConnector1.id, + group: 'default', + params: {}, + }, + { + id: createdConnector2.id, + group: 'default', + params: {}, + }, + ], + }) + ) + .expect(200); + objectRemover.add(Spaces.space1.id, createdRule.id, 'rule', 'alerting'); + + await waitForEvents(createdRule.id, 'alerting', new Map([['execute', { gte: 1 }]])); + await waitForEvents(createdRule.id, 'actions', new Map([['execute', { gte: 2 }]])); + + const response = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_action_error_log?date_start=${dateStart}` + ); + + expect(response.body.totalErrors).to.eql(2); + + const filteredResponse = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_action_error_log?filter=message:"${createdConnector1.id}"&date_start=${dateStart}` + ); + + expect(filteredResponse.body.totalErrors).to.eql(1); + + // Fetch rule execution, try to filter on that + const execResponse = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_execution_log?date_start=${dateStart}` + ); + + const runId = execResponse.body.data[0].id; + + const filteredByIdResponse = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_action_error_log?filter=kibana.alert.rule.execution.uuid:${runId}&date_start=${dateStart}` + ); + expect(filteredByIdResponse.body.totalErrors).to.eql(2); + + const filteredByInvalidResponse = await supertest.get( + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ + createdRule.id + }/_action_error_log?filter=kibana.alert.rule.execution.uuid:doesnt_exist&date_start=${dateStart}` + ); + expect(filteredByInvalidResponse.body.totalErrors).to.eql(0); + }); + }); + + async function waitForEvents( + id: string, + provider: string, + actions: Map< + string, + { + gte: number; + } + > + ) { + await retry.try(async () => { + return await getEventLog({ + getService, + spaceId: Spaces.space1.id, + type: 'alert', + id, + provider, + actions, + }); + }); + } +} diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_execution_log.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_execution_log.ts index 6ae75c71d3bcf..1f33f44a20d6a 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_execution_log.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_execution_log.ts @@ -68,8 +68,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(response.status).to.eql(200); expect(response.body.total).to.eql(2); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors).to.eql([]); const execLogs = response.body.data; expect(execLogs.length).to.eql(2); @@ -122,8 +120,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(response.body.total).to.eql(0); expect(response.body.data).to.eql([]); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors).to.eql([]); }); it('gets execution log for rule that is currently running', async () => { @@ -148,8 +144,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo // since these events should have been excluded from the agg, should return empty expect(response.body.total).to.eql(0); expect(response.body.data).to.eql([]); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors).to.eql([]); }); it('gets execution log for rule that performs ES searches', async () => { @@ -178,8 +172,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(response.status).to.eql(200); expect(response.body.total).to.eql(1); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors).to.eql([]); const execLogs = response.body.data; expect(execLogs.length).to.eql(1); @@ -239,16 +231,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo `rule execution failure: test.throw:${createdRule.id}: 'abc' - this alert is intended to fail` ); } - - expect(response.body.totalErrors).to.eql(1); - expect(response.body.errors.length).to.eql(1); - - for (const errors of response.body.errors) { - expect(errors.type).to.equal('alerting'); - expect(errors.message).to.equal( - `rule execution failure: test.throw:${createdRule.id}: 'abc' - this alert is intended to fail` - ); - } }); it('gets execution log for rule that times out', async () => { @@ -284,16 +266,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(log.status).to.equal('success'); expect(log.timed_out).to.equal(true); } - - expect(response.body.totalErrors).to.eql(1); - expect(response.body.errors.length).to.eql(1); - - for (const errors of response.body.errors) { - expect(errors.type).to.equal('alerting'); - expect(errors.message).to.equal( - `rule: test.patternLongRunning:${createdRule.id}: 'abc' execution cancelled due to timeout - exceeded rule type timeout of 3s` - ); - } }); it('gets execution log for rule that triggers actions', async () => { @@ -337,8 +309,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(response.status).to.eql(200); expect(response.body.total).to.eql(1); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors).to.eql([]); const execLogs = response.body.data; expect(execLogs.length).to.eql(1); @@ -412,16 +382,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(log.num_succeeded_actions).to.equal(0); expect(log.num_errored_actions).to.equal(1); } - - expect(response.body.totalErrors).to.eql(1); - expect(response.body.errors.length).to.eql(1); - - for (const errors of response.body.errors) { - expect(errors.type).to.equal('actions'); - expect(errors.message).to.equal( - `action execution failure: test.throw:${createdConnector.id}: connector that throws - an error occurred while running the action: this action is intended to fail` - ); - } }); it('handles date_end if specified', async () => { @@ -446,8 +406,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(response.body.total).to.eql(0); expect(response.body.data.length).to.eql(0); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors.length).to.eql(0); }); it('handles sort query parameter', async () => { @@ -468,8 +426,6 @@ export default function createGetExecutionLogTests({ getService }: FtrProviderCo expect(response.status).to.eql(200); expect(response.body.total).to.eql(3); - expect(response.body.totalErrors).to.eql(0); - expect(response.body.errors).to.eql([]); const execLogs = response.body.data; expect(execLogs.length).to.eql(3); diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts index 795f61d689577..49e652d9a9a4e 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/index.ts @@ -24,6 +24,7 @@ export default function alertingTests({ loadTestFile, getService }: FtrProviderC loadTestFile(require.resolve('./get_alert_state')); loadTestFile(require.resolve('./get_alert_summary')); loadTestFile(require.resolve('./get_execution_log')); + loadTestFile(require.resolve('./get_action_error_log')); loadTestFile(require.resolve('./rule_types')); loadTestFile(require.resolve('./event_log')); loadTestFile(require.resolve('./execution_status')); From d2e4df95b3e33efa44362666869da0ac57aeca7e Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Fri, 22 Jul 2022 15:54:21 -0400 Subject: [PATCH 36/78] [Synthetics UI] Extract enable/disable functionality from component for reuse (#136895) * Extract enable/disable functionality from component to reusable hook. * Extract notification functionality to hook. * Make `labels` a dependency of the notifications effect. --- .../monitor_list_table/monitor_enabled.tsx | 54 ++++------------- .../hooks/use_monitor_enable_handler.tsx | 59 +++++++++++++++++++ 2 files changed, 72 insertions(+), 41 deletions(-) create mode 100644 x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx index ee3896693ff48..4d7fd52e6781f 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/management/monitor_list_table/monitor_enabled.tsx @@ -6,15 +6,12 @@ */ import { EuiSwitch, EuiSwitchEvent, EuiLoadingSpinner } from '@elastic/eui'; -import React, { useEffect, useState } from 'react'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { FETCH_STATUS, useFetcher } from '@kbn/observability-plugin/public'; - +import React from 'react'; +import { FETCH_STATUS } from '@kbn/observability-plugin/public'; import { useCanEditSynthetics } from '../../../../../../hooks/use_capabilities'; import { ConfigKey, EncryptedSyntheticsMonitor } from '../../../../../../../common/runtime_types'; -import { fetchUpsertMonitor } from '../../../../state'; - import * as labels from './labels'; +import { useMonitorEnableHandler } from '../../../../hooks/use_monitor_enable_handler'; interface Props { id: string; @@ -26,41 +23,16 @@ interface Props { export const MonitorEnabled = ({ id, monitor, reloadPage, initialLoading }: Props) => { const isDisabled = !useCanEditSynthetics(); - const [isEnabled, setIsEnabled] = useState(null); - - const { notifications } = useKibana(); - - const { status } = useFetcher(() => { - if (isEnabled !== null) { - return fetchUpsertMonitor({ id, monitor: { ...monitor, [ConfigKey.ENABLED]: isEnabled } }); - } - }, [isEnabled]); - - useEffect(() => { - if (status === FETCH_STATUS.FAILURE) { - notifications.toasts.danger({ - title: ( -

- {labels.getMonitorEnabledUpdateFailureMessage(monitor[ConfigKey.NAME])} -

- ), - toastLifeTimeMs: 3000, - }); - setIsEnabled(null); - } else if (status === FETCH_STATUS.SUCCESS) { - notifications.toasts.success({ - title: ( -

- {isEnabled - ? labels.getMonitorEnabledSuccessLabel(monitor[ConfigKey.NAME]) - : labels.getMonitorDisabledSuccessLabel(monitor[ConfigKey.NAME])} -

- ), - toastLifeTimeMs: 3000, - }); - reloadPage(); - } - }, [status]); // eslint-disable-line react-hooks/exhaustive-deps + const { isEnabled, setIsEnabled, status } = useMonitorEnableHandler({ + id, + monitor, + reloadPage, + labels: { + failureLabel: labels.getMonitorEnabledUpdateFailureMessage(monitor[ConfigKey.NAME]), + enabledSuccessLabel: labels.getMonitorEnabledSuccessLabel(monitor[ConfigKey.NAME]), + disabledSuccessLabel: labels.getMonitorDisabledSuccessLabel(monitor[ConfigKey.NAME]), + }, + }); const enabled = isEnabled ?? monitor[ConfigKey.ENABLED]; const isLoading = status === FETCH_STATUS.LOADING; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx new file mode 100644 index 0000000000000..5062805f84eb2 --- /dev/null +++ b/x-pack/plugins/synthetics/public/apps/synthetics/hooks/use_monitor_enable_handler.tsx @@ -0,0 +1,59 @@ +/* + * Copyright 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 { useKibana } from '@kbn/kibana-react-plugin/public'; +import { FETCH_STATUS, useFetcher } from '@kbn/observability-plugin/public'; +import React, { useEffect, useState } from 'react'; +import { ConfigKey, EncryptedSyntheticsMonitor } from '../components/monitors_page/overview/types'; +import { fetchUpsertMonitor } from '../state'; + +export interface EnableStateMonitorLabels { + failureLabel: string; + enabledSuccessLabel: string; + disabledSuccessLabel: string; +} + +export function useMonitorEnableHandler({ + id, + monitor, + reloadPage, + labels, +}: { + id: string; + monitor: EncryptedSyntheticsMonitor; + reloadPage: () => void; + labels?: EnableStateMonitorLabels; +}) { + const [isEnabled, setIsEnabled] = useState(null); + const { status } = useFetcher(() => { + if (isEnabled !== null) { + return fetchUpsertMonitor({ id, monitor: { ...monitor, [ConfigKey.ENABLED]: isEnabled } }); + } + }, [isEnabled]); + const { notifications } = useKibana(); + useEffect(() => { + if (status === FETCH_STATUS.FAILURE && labels) { + notifications.toasts.danger({ + title:

{labels.failureLabel}

, + toastLifeTimeMs: 3000, + }); + setIsEnabled(null); + } else if (status === FETCH_STATUS.SUCCESS && labels) { + notifications.toasts.success({ + title: ( +

+ {isEnabled ? labels.enabledSuccessLabel : labels.disabledSuccessLabel} +

+ ), + toastLifeTimeMs: 3000, + }); + reloadPage(); + } + }, [status, labels]); // eslint-disable-line react-hooks/exhaustive-deps + + return { isEnabled, setIsEnabled, status }; +} From 5cc74443e6d213e53f90f9dd485675c1eb8e0dc7 Mon Sep 17 00:00:00 2001 From: Kevin Logan <56395104+kevinlog@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:07:39 -0400 Subject: [PATCH 37/78] [Security Solution] Update Windows rollback advanced keys to match Endpoint (#136871) * [Security Solution] Correct the windows rollback advanced keys --- .../common/endpoint/models/policy_config.ts | 18 +++++++++++++++++- .../common/endpoint/types/index.ts | 9 ++++++++- .../common/license/policy_config.test.ts | 18 ++++++++++++++---- .../common/license/policy_config.ts | 5 ++++- .../policy/models/advanced_policy_schema.ts | 7 ++++--- 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/models/policy_config.ts b/x-pack/plugins/security_solution/common/endpoint/models/policy_config.ts index e93179964747b..a6e40325cac4e 100644 --- a/x-pack/plugins/security_solution/common/endpoint/models/policy_config.ts +++ b/x-pack/plugins/security_solution/common/endpoint/models/policy_config.ts @@ -151,6 +151,14 @@ export const policyFactory = (): PolicyConfig => { export const policyFactoryWithoutPaidFeatures = ( policy: PolicyConfig = policyFactory() ): PolicyConfig => { + const rollbackConfig = { + rollback: { + remediation: { + enabled: false, + }, + }, + }; + return { ...policy, windows: { @@ -160,7 +168,15 @@ export const policyFactoryWithoutPaidFeatures = ( ? undefined : { ...policy.windows.advanced, - rollback: undefined, + alerts: + policy.windows.advanced.alerts === undefined + ? { + ...rollbackConfig, + } + : { + ...policy.windows.advanced.alerts, + ...rollbackConfig, + }, }, ransomware: { mode: ProtectionModes.off, diff --git a/x-pack/plugins/security_solution/common/endpoint/types/index.ts b/x-pack/plugins/security_solution/common/endpoint/types/index.ts index 54cff140046ed..69ace6aee7e73 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/index.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/index.ts @@ -913,7 +913,14 @@ export interface PolicyConfig { windows: { advanced?: { [key: string]: unknown; - rollback?: string | boolean; + alerts?: { + [key: string]: unknown; + rollback: { + remediation: { + enabled: boolean; + }; + }; + }; }; events: { dll_and_driver_load: boolean; diff --git a/x-pack/plugins/security_solution/common/license/policy_config.test.ts b/x-pack/plugins/security_solution/common/license/policy_config.test.ts index 74eea2aa9b29c..97e18399cd260 100644 --- a/x-pack/plugins/security_solution/common/license/policy_config.test.ts +++ b/x-pack/plugins/security_solution/common/license/policy_config.test.ts @@ -125,14 +125,14 @@ describe('policy_config and licenses', () => { it('allows advanced rollback option when Platinum', () => { const policy = policyFactory(); - policy.windows.advanced = { rollback: true }; // make policy change + policy.windows.advanced = { alerts: { rollback: { remediation: { enabled: true } } } }; // make policy change const valid = isEndpointPolicyValidForLicense(policy, Platinum); expect(valid).toBeTruthy(); }); it('blocks advanced rollback option when below Platinum', () => { const policy = policyFactory(); - policy.windows.advanced = { rollback: true }; // make policy change + policy.windows.advanced = { alerts: { rollback: { remediation: { enabled: true } } } }; // make policy change let valid = isEndpointPolicyValidForLicense(policy, Gold); expect(valid).toBeFalsy(); @@ -512,8 +512,17 @@ describe('policy_config and licenses', () => { const defaults = policyFactoryWithoutPaidFeatures(); // reference const policy = policyFactory(); // what we will modify, and should be reset - policy.windows.advanced = { rollback: true }; - policy.windows.advanced = { another_advanced: true }; + policy.windows.advanced = { + alerts: { + rollback: { + remediation: { + enabled: true, + }, + }, + cloud_lookup: false, + }, + another_advanced: true, + }; const retPolicy = unsetPolicyFeaturesAccordingToLicenseLevel(policy, Gold); @@ -521,6 +530,7 @@ describe('policy_config and licenses', () => { // Preserves non-license gated advanced settings. expect(retPolicy.windows.advanced?.another_advanced).toEqual(true); + expect(retPolicy.windows.advanced?.alerts?.cloud_lookup).toEqual(false); }); it('sets ransomware supported field to false when license is below Platinum', () => { diff --git a/x-pack/plugins/security_solution/common/license/policy_config.ts b/x-pack/plugins/security_solution/common/license/policy_config.ts index 56f70d650ffeb..ac5f0458958d3 100644 --- a/x-pack/plugins/security_solution/common/license/policy_config.ts +++ b/x-pack/plugins/security_solution/common/license/policy_config.ts @@ -233,7 +233,10 @@ function isEndpointAdvancedPolicyValidForLicense(policy: PolicyConfig, license: const defaults = policyFactoryWithoutPaidFeatures(); // only platinum or higher may use rollback - if (policy.windows.advanced?.rollback !== defaults.windows.advanced?.rollback) { + if ( + policy.windows.advanced?.alerts?.rollback.remediation.enabled !== + defaults.windows.advanced?.alerts?.rollback.remediation.enabled + ) { return false; } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts index bd62bb1647e60..b44af6d60533f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/models/advanced_policy_schema.ts @@ -938,12 +938,13 @@ export const AdvancedPolicySchema: AdvancedPolicySchemaType[] = [ ), }, { - key: 'windows.advanced.rollback', + key: 'windows.advanced.alerts.rollback.remediation.enabled', first_supported_version: '8.4', documentation: i18n.translate( - 'xpack.securitySolution.endpoint.policy.advanced.windows.rollback', + 'xpack.securitySolution.endpoint.policy.advanced.windows.advanced.alerts.rollback.remediation.enabled', { - defaultMessage: 'Experimental', + defaultMessage: + 'Remediate malware artifacts when prevention alerts are triggered. Warning: data loss can occur. Default: false', } ), license: 'platinum', From 20dec08bf1e781a47e390d1ec7fca78abdc6e777 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Fri, 22 Jul 2022 16:23:17 -0400 Subject: [PATCH 38/78] [CI] Parallelize eslint to speed it up (#136972) --- .buildkite/pipelines/on_merge.yml | 4 ++-- .buildkite/pipelines/pull_request/base.yml | 8 ++++++-- .buildkite/scripts/steps/lint.sh | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/.buildkite/pipelines/on_merge.yml b/.buildkite/pipelines/on_merge.yml index 7085bcaeedf7a..73c173ae71cf8 100644 --- a/.buildkite/pipelines/on_merge.yml +++ b/.buildkite/pipelines/on_merge.yml @@ -79,9 +79,9 @@ steps: - command: .buildkite/scripts/steps/lint.sh label: 'Linting' agents: - queue: n2-2-spot + queue: n2-8-spot key: linting - timeout_in_minutes: 90 + timeout_in_minutes: 60 retry: automatic: - exit_status: '-1' diff --git a/.buildkite/pipelines/pull_request/base.yml b/.buildkite/pipelines/pull_request/base.yml index 36989003428e2..43b019f936d83 100644 --- a/.buildkite/pipelines/pull_request/base.yml +++ b/.buildkite/pipelines/pull_request/base.yml @@ -31,9 +31,13 @@ steps: - command: .buildkite/scripts/steps/lint.sh label: 'Linting' agents: - queue: n2-2 + queue: n2-8-spot key: linting - timeout_in_minutes: 90 + timeout_in_minutes: 60 + retry: + automatic: + - exit_status: '-1' + limit: 3 - command: .buildkite/scripts/steps/lint_with_types.sh label: 'Linting (with types)' diff --git a/.buildkite/scripts/steps/lint.sh b/.buildkite/scripts/steps/lint.sh index ad61fced12f50..8c6a2e2e6202a 100755 --- a/.buildkite/scripts/steps/lint.sh +++ b/.buildkite/scripts/steps/lint.sh @@ -16,9 +16,9 @@ echo '--- Lint: eslint' # after possibly commiting fixed files to the repo set +e; if is_pr && ! is_auto_commit_disabled; then - node scripts/eslint --no-cache --fix + git ls-files | grep -E '\.(js|mjs|ts|tsx)$' | xargs -n 250 -P 6 node scripts/eslint --no-cache --fix else - node scripts/eslint --no-cache + git ls-files | grep -E '\.(js|mjs|ts|tsx)$' | xargs -n 250 -P 6 node scripts/eslint --no-cache fi eslint_exit=$? From 812dce0e72c33d966103be186607d8923ec5cfc7 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Fri, 22 Jul 2022 15:35:22 -0500 Subject: [PATCH 39/78] [ML] Add random sampler to Data visualizer document count chart (#136150) * [ML] Show meta code block with random sampler info * [ML] Show EUI slider * [ML] Improve logic for slider, clean up * [ML] Update translation * [ML] Fix types * [ML] Fix missing isDefined check when previously switching initial value from undefined to null * [ML] Reduce precision for approximate doc count to 3 significant figures * [ML] Change to step instead of slider in popup * [ML] Use random sampler in field stats aggs * [ML] Change to slider, format to 100 for ease of use * [ML] Add loading indicator * Revert "[ML] Use random sampler in field stats aggs" This reverts commit c8c5ab6d * [ML] Move search bar up * [ML] Add preference whether to auto pick probability * [ML] Update seed to reflect session, update logic for switching between the modes * [ML] Add spinner for doc count label * Add custom info call out messages * Update texts with latest suggestions Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/types/field_stats.ts | 3 + .../document_count_chart.tsx | 85 +++++--- .../document_count_content.tsx | 201 +++++++++++++++++- .../total_count_header.tsx | 42 +++- .../index_data_visualizer_view.tsx | 87 +++++++- .../constants/random_sampler.ts | 46 ++++ .../hooks/use_data_visualizer_grid_data.ts | 23 +- .../hooks/use_overall_stats.ts | 104 ++++----- .../hooks/use_storage.ts | 4 + .../requests/get_document_stats.ts | 165 +++++++++++++- .../requests/get_numeric_field_stats.ts | 10 +- .../search_strategy/requests/overall_stats.ts | 8 + .../types/index_data_visualizer_state.ts | 7 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 16 files changed, 667 insertions(+), 121 deletions(-) create mode 100644 x-pack/plugins/data_visualizer/public/application/index_data_visualizer/constants/random_sampler.ts diff --git a/x-pack/plugins/data_visualizer/common/types/field_stats.ts b/x-pack/plugins/data_visualizer/common/types/field_stats.ts index 4f0fb1b81d8f9..5aef2b442c1cb 100644 --- a/x-pack/plugins/data_visualizer/common/types/field_stats.ts +++ b/x-pack/plugins/data_visualizer/common/types/field_stats.ts @@ -95,6 +95,9 @@ export interface DocumentCountStats { timeRangeEarliest?: number; timeRangeLatest?: number; totalCount: number; + probability?: number | null; + took?: number; + randomlySampled?: boolean; } export interface FieldExamples { diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx index 2ef8759441fc1..9b802fa768bff 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_chart/document_count_chart.tsx @@ -22,6 +22,7 @@ import { import moment from 'moment'; import { IUiSettingsClient } from '@kbn/core/public'; import { MULTILAYER_TIME_AXIS_STYLE } from '@kbn/charts-plugin/common'; +import { EuiLoadingSpinner, EuiFlexItem } from '@elastic/eui'; import { useDataVisualizerKibana } from '../../../../kibana_context'; export interface DocumentCountChartPoint { @@ -35,6 +36,7 @@ interface Props { timeRangeEarliest: number; timeRangeLatest: number; interval?: number; + loading: boolean; } const SPEC_ID = 'document_count'; @@ -49,12 +51,21 @@ function getTimezone(uiSettings: IUiSettingsClient) { } } +export function LoadingSpinner() { + return ( + + + + ); +} + export const DocumentCountChart: FC = ({ width, chartPoints, timeRangeEarliest, timeRangeLatest, interval, + loading, }) => { const { services: { data, uiSettings, fieldFormats, charts }, @@ -126,40 +137,46 @@ export const DocumentCountChart: FC = ({ const timeZone = getTimezone(uiSettings); return ( -
- - - xAxisFormatter.convert(value)} - timeAxisLayerCount={useLegacyTimeAxis ? 0 : 2} - style={useLegacyTimeAxis ? {} : MULTILAYER_TIME_AXIS_STYLE} - /> - - - +
+ {loading ? ( + + ) : ( + + + xAxisFormatter.convert(value)} + timeAxisLayerCount={useLegacyTimeAxis ? 0 : 2} + style={useLegacyTimeAxis ? {} : MULTILAYER_TIME_AXIS_STYLE} + /> + + + + )}
); }; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_content.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_content.tsx index 66829ad47ae21..911eb851924e3 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_content.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/document_count_content.tsx @@ -5,17 +5,93 @@ * 2.0. */ -import React, { FC } from 'react'; -import { DocumentCountChart, DocumentCountChartPoint } from './document_count_chart'; +import React, { FC, useCallback, useMemo, useState } from 'react'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiPopover, + EuiToolTip, + EuiButtonIcon, + EuiPanel, + EuiSpacer, + EuiCallOut, + EuiRange, + EuiSelect, + EuiFormRow, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { sortedIndex } from 'lodash'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { isDefined } from '../../util/is_defined'; +import type { DocumentCountChartPoint } from './document_count_chart'; +import { + RANDOM_SAMPLER_STEP, + RANDOM_SAMPLER_PROBABILITIES, + RandomSamplerOption, + RANDOM_SAMPLER_SELECT_OPTIONS, + RANDOM_SAMPLER_OPTION, +} from '../../../index_data_visualizer/constants/random_sampler'; import { TotalCountHeader } from './total_count_header'; -import { DocumentCountStats } from '../../../../../common/types/field_stats'; +import type { DocumentCountStats } from '../../../../../common/types/field_stats'; +import { DocumentCountChart } from './document_count_chart'; export interface Props { documentCountStats?: DocumentCountStats; totalCount: number; + samplingProbability?: number | null; + setSamplingProbability?: (value: number) => void; + randomSamplerPreference?: RandomSamplerOption; + setRandomSamplerPreference: (value: RandomSamplerOption) => void; + loading: boolean; } -export const DocumentCountContent: FC = ({ documentCountStats, totalCount }) => { +export const DocumentCountContent: FC = ({ + documentCountStats, + totalCount, + samplingProbability, + setSamplingProbability, + loading, + randomSamplerPreference, + setRandomSamplerPreference, +}) => { + const [showSamplingOptionsPopover, setShowSamplingOptionsPopover] = useState(false); + + const onShowSamplingOptions = useCallback(() => { + setShowSamplingOptionsPopover(!showSamplingOptionsPopover); + }, [showSamplingOptionsPopover]); + + const closeSamplingOptions = useCallback(() => { + setShowSamplingOptionsPopover(false); + }, [setShowSamplingOptionsPopover]); + + const calloutInfoMessage = useMemo(() => { + switch (randomSamplerPreference) { + case RANDOM_SAMPLER_OPTION.OFF: + return i18n.translate('xpack.dataVisualizer.randomSamplerSettingsPopUp.offCalloutMessage', { + defaultMessage: + 'Random sampling can be turned on for the total document count and chart to increase speed although some accuracy will be lost.', + }); + case RANDOM_SAMPLER_OPTION.ON_AUTOMATIC: + return i18n.translate( + 'xpack.dataVisualizer.randomSamplerSettingsPopUp.onAutomaticCalloutMessage', + { + defaultMessage: + 'The total document count and chart use random sampler aggregations. The probability is automatically set to balance accuracy and speed.', + } + ); + + case RANDOM_SAMPLER_OPTION.ON_MANUAL: + default: + return i18n.translate( + 'xpack.dataVisualizer.randomSamplerSettingsPopUp.onManualCalloutMessage', + { + defaultMessage: + 'The total document count and chart use random sampler aggregations. A lower percentage probability increases performance, but some accuracy is lost.', + } + ); + } + }, [randomSamplerPreference]); + if (documentCountStats === undefined) { return totalCount !== undefined ? : null; } @@ -30,14 +106,129 @@ export const DocumentCountContent: FC = ({ documentCountStats, totalCount chartPoints = Object.entries(buckets).map(([time, value]) => ({ time: +time, value })); } + const approximate = documentCountStats.randomlySampled === true; + + const ProbabilityUsed = + randomSamplerPreference !== RANDOM_SAMPLER_OPTION.OFF && isDefined(samplingProbability) ? ( + <> + + + + + ) : null; + return ( <> - + + + + + + + } + isOpen={showSamplingOptionsPopover} + closePopover={closeSamplingOptions} + panelPaddingSize="none" + anchorPosition="downLeft" + > + + + + + + + + + setRandomSamplerPreference(e.target.value as RandomSamplerOption) + } + /> + + + {randomSamplerPreference === RANDOM_SAMPLER_OPTION.ON_MANUAL ? ( + + + + ({ + value: d, + label: d === 0.001 || d >= 5 ? `${d}%` : '', + }))} + onChange={(e) => { + const newProbability = Number(e.currentTarget.value); + const idx = sortedIndex(RANDOM_SAMPLER_PROBABILITIES, newProbability); + const closestPrev = RANDOM_SAMPLER_PROBABILITIES[idx - 1]; + const closestNext = RANDOM_SAMPLER_PROBABILITIES[idx]; + const closestProbability = + Math.abs(closestPrev - newProbability) < + Math.abs(closestNext - newProbability) + ? closestPrev + : closestNext; + + if (setSamplingProbability) { + setSamplingProbability(closestProbability / 100); + } + }} + step={RANDOM_SAMPLER_STEP} + /> + + + ) : ( + ProbabilityUsed + )} + + + + + ); diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx index 2be544a49e05e..99ecd72d29857 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx @@ -5,30 +5,58 @@ * 2.0. */ -import { EuiFlexItem, EuiText } from '@elastic/eui'; +import { EuiFlexItem, EuiText, EuiLoadingSpinner, EuiIconTip } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; +import { i18n } from '@kbn/i18n'; -export const TotalCountHeader = ({ totalCount }: { totalCount: number }) => { +const SIGFIGS_IF_ROUNDING = 3; // Number of sigfigs to use for values < 10 + +export const TotalCountHeader = ({ + totalCount, + approximate, + loading, +}: { + totalCount: number; + loading?: boolean; + approximate?: boolean; +}) => { return ( - - + + + ) : ( ), }} /> + {approximate ? ( + + ) : null} ); }; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx index 079804a47cd7b..e0f4c24e2d96c 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx @@ -23,6 +23,7 @@ import { i18n } from '@kbn/i18n'; import { Filter, Query } from '@kbn/es-query'; import { generateFilters } from '@kbn/data-plugin/public'; import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import { DV_RANDOM_SAMPLER_PREFERENCE, useStorage } from '../../hooks/use_storage'; import { FullTimeRangeSelector } from '../full_time_range_selector'; import { usePageUrlState, useUrlState } from '../../../common/util/url_state'; import { @@ -52,6 +53,7 @@ import { GetAdditionalLinks } from '../../../common/components/results_links'; import { useDataVisualizerGridData } from '../../hooks/use_data_visualizer_grid_data'; import { DataVisualizerGridInput } from '../../embeddables/grid_embeddable/grid_embeddable'; import './_index.scss'; +import { RANDOM_SAMPLER_OPTION, RandomSamplerOption } from '../../constants/random_sampler'; interface DataVisualizerPageState { overallStats: OverallStats; @@ -103,6 +105,8 @@ export const getDefaultDataVisualizerListState = ( showDistributions: true, showAllFields: false, showEmptyFields: false, + probability: null, + rndSamplerPref: RANDOM_SAMPLER_OPTION.ON_AUTOMATIC, ...overrides, }); @@ -112,9 +116,24 @@ export interface IndexDataVisualizerViewProps { currentSessionId?: string; getAdditionalLinks?: GetAdditionalLinks; } -const restorableDefaults = getDefaultDataVisualizerListState(); export const IndexDataVisualizerView: FC = (dataVisualizerProps) => { + const [savedRandomSamplerPreference, saveRandomSamplerPreference] = + useStorage( + DV_RANDOM_SAMPLER_PREFERENCE, + RANDOM_SAMPLER_OPTION.ON_AUTOMATIC + ); + + const restorableDefaults = useMemo( + () => + getDefaultDataVisualizerListState({ + rndSamplerPref: savedRandomSamplerPreference, + }), + // We just need to load the saved preference when the page is first loaded + // eslint-disable-next-line react-hooks/exhaustive-deps + [] + ); + const { services } = useDataVisualizerKibana(); const { docLinks, notifications, uiSettings, data } = services; const { toasts } = notifications; @@ -247,7 +266,42 @@ export const IndexDataVisualizerView: FC = (dataVi setLastRefresh, progress, extendedColumns, - } = useDataVisualizerGridData(input, dataVisualizerListState, setGlobalState); + overallStatsProgress, + } = useDataVisualizerGridData( + input, + dataVisualizerListState, + savedRandomSamplerPreference, + setGlobalState + ); + + useEffect( + () => { + switch (savedRandomSamplerPreference) { + case RANDOM_SAMPLER_OPTION.OFF: + setSamplingProbability(1); + return; + case RANDOM_SAMPLER_OPTION.ON_MANUAL: + setSamplingProbability( + dataVisualizerListState?.probability ?? documentCountStats?.probability ?? null + ); + return; + case RANDOM_SAMPLER_OPTION.ON_AUTOMATIC: + default: + setSamplingProbability(null); + return; + } + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [ + dataVisualizerListState.probability, + documentCountStats?.probability, + savedRandomSamplerPreference, + ] + ); + + const setSamplingProbability = (value: number | null) => { + setDataVisualizerListState({ ...dataVisualizerListState, probability: value }); + }; useEffect(() => { return () => { @@ -436,14 +490,6 @@ export const IndexDataVisualizerView: FC = (dataVi - {overallStats?.totalCount !== undefined && ( - - - - )} = (dataVi showEmptyFields={showEmptyFields} onAddFilter={onAddFilter} /> + + {overallStats?.totalCount !== undefined && ( + <> + + + + + + )} n * 100); + +export const RANDOM_SAMPLER_STEP = 0.00001 * 100; + +export const RANDOM_SAMPLER_OPTION = { + ON_AUTOMATIC: 'on_automatic', + ON_MANUAL: 'on_manual', + OFF: 'off', +} as const; + +export type RandomSamplerOption = typeof RANDOM_SAMPLER_OPTION[keyof typeof RANDOM_SAMPLER_OPTION]; + +export const RANDOM_SAMPLER_SELECT_OPTIONS: Array<{ value: RandomSamplerOption; text: string }> = [ + { + value: RANDOM_SAMPLER_OPTION.ON_AUTOMATIC, + text: i18n.translate('xpack.dataVisualizer.randomSamplerPreference.onAutomaticLabel', { + defaultMessage: 'On - automatic', + }), + }, + { + value: RANDOM_SAMPLER_OPTION.ON_MANUAL, + text: i18n.translate('xpack.dataVisualizer.randomSamplerPreference.onManualLabel', { + defaultMessage: 'On - manual', + }), + }, + { + value: RANDOM_SAMPLER_OPTION.OFF, + text: i18n.translate('xpack.dataVisualizer.randomSamplerPreference.offLabel', { + defaultMessage: 'Off', + }), + }, +]; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts index 5fbf8c447c989..2b9c83c925376 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts @@ -11,6 +11,8 @@ import { merge } from 'rxjs'; import { EuiTableActionsColumnType } from '@elastic/eui/src/components/basic_table/table_types'; import { i18n } from '@kbn/i18n'; import { DataViewField, KBN_FIELD_TYPES, UI_SETTINGS } from '@kbn/data-plugin/common'; +import seedrandom from 'seedrandom'; +import { RandomSamplerOption } from '../constants/random_sampler'; import { DataVisualizerIndexBasedAppState } from '../types/index_data_visualizer_state'; import { useDataVisualizerKibana } from '../../kibana_context'; import { getEsQueryFromSavedSearch } from '../utils/saved_search_utils'; @@ -44,15 +46,29 @@ function isDisplayField(fieldName: string): boolean { export const useDataVisualizerGridData = ( input: DataVisualizerGridInput, dataVisualizerListState: Required, + savedRandomSamplerPreference?: RandomSamplerOption, onUpdate?: (params: Dictionary) => void ) => { const { services } = useDataVisualizerKibana(); - const { uiSettings, data } = services; + const { uiSettings, data, security } = services; const { samplerShardSize, visibleFieldTypes, showEmptyFields } = dataVisualizerListState; const [lastRefresh, setLastRefresh] = useState(0); const searchSessionId = input.sessionId; + const browserSessionSeed = useMemo(() => { + let seed = Math.abs(seedrandom().int32()); + if (security !== undefined) { + security.authc.getCurrentUser().then((user) => { + const username = user.username; + if (username) { + seed = Math.abs(seedrandom(username).int32()); + } + }); + } + return seed; + }, [security]); + const { currentSavedSearch, currentDataView, @@ -215,7 +231,9 @@ export const useDataVisualizerGridData = ( const { overallStats, progress: overallStatsProgress } = useOverallStats( fieldStatsRequest, - lastRefresh + lastRefresh, + browserSessionSeed, + dataVisualizerListState.probability ); const configsWithoutStats = useMemo(() => { @@ -511,6 +529,7 @@ export const useDataVisualizerGridData = ( return { progress: combinedProgress, + overallStatsProgress, configs, searchQueryLanguage, searchString, diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_overall_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_overall_stats.ts index e524164137206..1d4bb35558085 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_overall_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_overall_stats.ts @@ -22,6 +22,8 @@ import { checkAggregatableFieldsExistRequest, checkNonAggregatableFieldExistsRequest, isAggregatableFieldOverallStats, + isNonAggregatableFieldOverallStats, + NonAggregatableFieldOverallStats, processAggregatableFieldsExistResponse, processNonAggregatableFieldsExistResponse, } from '../search_strategy/requests/overall_stats'; @@ -32,12 +34,10 @@ import type { DataStatsFetchProgress, OverallStatsSearchStrategyParams, } from '../../../../common/types/field_stats'; -import { - getDocumentCountStatsRequest, - processDocumentCountStats, -} from '../search_strategy/requests/get_document_stats'; +import { getDocumentCountStats } from '../search_strategy/requests/get_document_stats'; import { getInitialProgress, getReducer } from '../progress_utils'; import { MAX_CONCURRENT_REQUESTS } from '../constants/index_data_visualizer_viewer'; +import { DocumentCountStats } from '../../../../common/types/field_stats'; /** * Helper function to run forkJoin @@ -91,7 +91,9 @@ function displayError(toastNotifications: ToastsStart, index: string, err: any) export function useOverallStats( searchStrategyParams: TParams | undefined, - lastRefresh: number + lastRefresh: number, + browserSessionSeed: number, + probability?: number | null ): { progress: DataStatsFetchProgress; overallStats: OverallStats; @@ -197,61 +199,66 @@ export function useOverallStats( - [documentCountStats$, ...aggregatableOverallStatsObs, ...nonAggregatableFieldsObs], + [ + from( + getDocumentCountStats( + data.search, + searchStrategyParams, + searchOptions, + browserSessionSeed, + probability + ) + ), + ...aggregatableOverallStatsObs, + ...nonAggregatableFieldsObs, + ], MAX_CONCURRENT_REQUESTS ); searchSubscription$.current = sub.subscribe({ next: (value) => { - { - const aggregatableOverallStatsResp: AggregatableFieldOverallStats[] = []; - const nonAggregatableOverallStatsResp: IKibanaSearchResponse[] = []; - const documentCountStatsResp = value[0]; + const aggregatableOverallStatsResp: AggregatableFieldOverallStats[] = []; + const nonAggregatableOverallStatsResp: NonAggregatableFieldOverallStats[] = []; + const documentCountStats = value[0] as DocumentCountStats; - value.forEach((resp, idx) => { - if (!resp) return; - if (isAggregatableFieldOverallStats(resp)) { - aggregatableOverallStatsResp.push(resp); - } else { - nonAggregatableOverallStatsResp.push(resp); - } - }); + value.forEach((resp, idx) => { + if (!resp || idx === 0) return; + if (isAggregatableFieldOverallStats(resp)) { + aggregatableOverallStatsResp.push(resp); + } - const documentCountStats = processDocumentCountStats( - documentCountStatsResp?.rawResponse, - searchStrategyParams - ); + if (isNonAggregatableFieldOverallStats(resp)) { + nonAggregatableOverallStatsResp.push(resp); + } + }); - const totalCount = documentCountStats?.totalCount ?? 0; + const totalCount = documentCountStats?.totalCount ?? 0; - const aggregatableOverallStats = processAggregatableFieldsExistResponse( - aggregatableOverallStatsResp, - aggregatableFields, - samplerShardSize, - totalCount - ); + const aggregatableOverallStats = processAggregatableFieldsExistResponse( + aggregatableOverallStatsResp, + aggregatableFields, + samplerShardSize, + totalCount + ); - const nonAggregatableOverallStats = processNonAggregatableFieldsExistResponse( - nonAggregatableOverallStatsResp, - nonAggregatableFields - ); + const nonAggregatableOverallStats = processNonAggregatableFieldsExistResponse( + nonAggregatableOverallStatsResp, + nonAggregatableFields + ); - setOverallStats({ - documentCountStats, - ...nonAggregatableOverallStats, - ...aggregatableOverallStats, - totalCount, - }); - } + setOverallStats({ + documentCountStats, + ...nonAggregatableOverallStats, + ...aggregatableOverallStats, + totalCount, + }); }, error: (error) => { displayError(toasts, searchStrategyParams.index, extractErrorProperties(error)); @@ -267,7 +274,8 @@ export function useOverallStats { searchSubscription$.current?.unsubscribe(); diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_storage.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_storage.ts index d6b0bb3322c03..cd09967a81fa0 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_storage.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_storage.ts @@ -9,9 +9,13 @@ import { useCallback, useState } from 'react'; import { useDataVisualizerKibana } from '../../kibana_context'; export const DV_FROZEN_TIER_PREFERENCE = 'dataVisualizer.frozenDataTierPreference'; +export const DV_RANDOM_SAMPLER_PREFERENCE = 'dataVisualizer.randomSamplerPreference'; +export const DV_RANDOM_SAMPLER_P_VALUE = 'dataVisualizer.randomSamplerPValue'; export type DV = Partial<{ [DV_FROZEN_TIER_PREFERENCE]: 'exclude_frozen' | 'include_frozen'; + [DV_RANDOM_SAMPLER_PREFERENCE]: 'true' | 'false'; + [DV_RANDOM_SAMPLER_P_VALUE]: number; }> | null; export type DVKey = keyof Exclude; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_document_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_document_stats.ts index dd654e312e0ef..a89b8dec4d705 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_document_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_document_stats.ts @@ -5,15 +5,20 @@ * 2.0. */ -import { each, get } from 'lodash'; +import { each, get, sortedIndex } from 'lodash'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; +import { DataPublicPluginStart, ISearchOptions } from '@kbn/data-plugin/public'; +import seedrandom from 'seedrandom'; +import { isDefined } from '../../../common/util/is_defined'; +import { RANDOM_SAMPLER_PROBABILITIES } from '../../constants/random_sampler'; import { buildBaseFilterCriteria } from '../../../../../common/utils/query_utils'; import type { DocumentCountStats, OverallStatsSearchStrategyParams, } from '../../../../../common/types/field_stats'; +const MINIMUM_RANDOM_SAMPLER_DOC_COUNT = 100000; export const getDocumentCountStatsRequest = (params: OverallStatsSearchStrategyParams) => { const { index, @@ -60,13 +65,162 @@ export const getDocumentCountStatsRequest = (params: OverallStatsSearchStrategyP }; }; +export const getDocumentCountStats = async ( + search: DataPublicPluginStart['search'], + params: OverallStatsSearchStrategyParams, + searchOptions: ISearchOptions, + browserSessionSeed: number, + probability?: number | null, + minimumRandomSamplerDocCount?: number +): Promise => { + const seed = browserSessionSeed ?? Math.abs(seedrandom().int32()); + + const { + index, + timeFieldName, + earliest: earliestMs, + latest: latestMs, + runtimeFieldMap, + searchQuery, + intervalMs, + fieldsToFetch, + } = params; + + const result = { randomlySampled: false, took: 0, totalCount: 0 }; + const filterCriteria = buildBaseFilterCriteria(timeFieldName, earliestMs, latestMs, searchQuery); + + const query = { + bool: { + filter: filterCriteria, + }, + }; + // Don't use the sampler aggregation as this can lead to some potentially + // confusing date histogram results depending on the date range of data amongst shards. + const aggs = { + eventRate: { + date_histogram: { + field: timeFieldName, + fixed_interval: `${intervalMs}ms`, + min_doc_count: 1, + }, + }, + }; + + // If probability is provided, use that + // Else, make an initial query using very low p + // so that we can calculate the next p value that's appropriate for the data set + const initialDefaultProbability = probability ?? 0.000001; + + const getAggsWithRandomSampling = (p: number) => ({ + sampler: { + aggs, + random_sampler: { + probability: p, + seed, + }, + }, + }); + + const getSearchParams = (aggregations: unknown) => ({ + index, + body: { + query, + ...(!fieldsToFetch && + timeFieldName !== undefined && + intervalMs !== undefined && + intervalMs > 0 + ? { aggs: aggregations } + : {}), + ...(isPopulatedObject(runtimeFieldMap) ? { runtime_mappings: runtimeFieldMap } : {}), + }, + track_total_hits: false, + size: 0, + }); + const firstResp = await search + .search( + { + params: getSearchParams(getAggsWithRandomSampling(initialDefaultProbability)), + }, + searchOptions + ) + .toPromise(); + + if (firstResp === undefined) { + throw Error( + `An error occurred with the following query ${JSON.stringify( + getSearchParams(getAggsWithRandomSampling(initialDefaultProbability)) + )}` + ); + } + if (isDefined(probability)) { + return { + ...result, + randomlySampled: probability === 1 ? false : true, + took: firstResp.rawResponse?.took, + probability, + ...processDocumentCountStats(firstResp.rawResponse, params, true), + }; + } + + // @ts-expect-error ES types needs to be updated with doc_count as part random sampler aggregation + const numSampled = firstResp.rawResponse.aggregations?.sampler?.doc_count; + const numDocs = minimumRandomSamplerDocCount ?? MINIMUM_RANDOM_SAMPLER_DOC_COUNT; + if (firstResp !== undefined && numSampled < numDocs) { + const newProbability = + (initialDefaultProbability * numDocs) / (numSampled - 2 * Math.sqrt(numSampled)); + + // If the number of docs sampled is indicative of query with < 10 million docs + // proceed to make a vanilla aggregation without any sampling + if (numSampled === 0 || newProbability === Infinity) { + const vanillaAggResp = await search + .search( + { + params: getSearchParams(getAggsWithRandomSampling(1)), + }, + searchOptions + ) + .toPromise(); + return { + ...result, + randomlySampled: false, + took: firstResp.rawResponse.took + (vanillaAggResp?.rawResponse?.took ?? 0), + ...processDocumentCountStats(vanillaAggResp?.rawResponse, params, true), + probability: 1, + }; + } else { + // Else, make second random sampler + const closestProbability = + RANDOM_SAMPLER_PROBABILITIES[sortedIndex(RANDOM_SAMPLER_PROBABILITIES, newProbability)]; + const secondResp = await search + .search( + { + params: getSearchParams(getAggsWithRandomSampling(closestProbability)), + }, + searchOptions + ) + .toPromise(); + if (secondResp) { + return { + ...result, + randomlySampled: true, + took: firstResp.rawResponse.took + secondResp.rawResponse.took, + ...processDocumentCountStats(secondResp.rawResponse, params, true), + probability: closestProbability, + }; + } + } + } + return result; +}; + export const processDocumentCountStats = ( body: estypes.SearchResponse | undefined, - params: OverallStatsSearchStrategyParams + params: OverallStatsSearchStrategyParams, + randomlySampled = false ): DocumentCountStats | undefined => { if (!body) return undefined; - const totalCount = (body.hits.total as estypes.SearchTotalHits).value ?? body.hits.total ?? 0; + let totalCount = 0; if ( params.intervalMs === undefined || @@ -80,12 +234,15 @@ export const processDocumentCountStats = ( const buckets: { [key: string]: number } = {}; const dataByTimeBucket: Array<{ key: string; doc_count: number }> = get( body, - ['aggregations', 'eventRate', 'buckets'], + randomlySampled + ? ['aggregations', 'sampler', 'eventRate', 'buckets'] + : ['aggregations', 'eventRate', 'buckets'], [] ); each(dataByTimeBucket, (dataForTime) => { const time = dataForTime.key; buckets[time] = dataForTime.doc_count; + totalCount += dataForTime.doc_count; }); return { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_numeric_field_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_numeric_field_stats.ts index 033f4469b0bc2..024fbb3577a48 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_numeric_field_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/get_numeric_field_stats.ts @@ -86,14 +86,12 @@ export const getNumericFieldsStatsRequest = ( // If cardinality >= SAMPLE_TOP_TERMS_THRESHOLD, run the top terms aggregation // in a sampler aggregation, even if no sampling has been specified (samplerShardSize < 1). if (samplerShardSize < 1 && field.cardinality >= SAMPLER_TOP_TERMS_THRESHOLD) { - aggs[`${safeFieldName}_top`] = { - sampler: { - shard_size: SAMPLER_TOP_TERMS_SHARD_SIZE, - }, - aggs: { + aggs[`${safeFieldName}_top`] = buildSamplerAggregation( + { top, }, - }; + 0.05 + ); } else { aggs[`${safeFieldName}_top`] = top; } diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/overall_stats.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/overall_stats.ts index 7bf8640c89fce..80e2044557dca 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/overall_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/requests/overall_stats.ts @@ -91,12 +91,20 @@ export interface AggregatableFieldOverallStats extends IKibanaSearchResponse { aggregatableFields: string[]; } +export type NonAggregatableFieldOverallStats = IKibanaSearchResponse; + export function isAggregatableFieldOverallStats( arg: unknown ): arg is AggregatableFieldOverallStats { return isPopulatedObject(arg, ['aggregatableFields']); } +export function isNonAggregatableFieldOverallStats( + arg: unknown +): arg is NonAggregatableFieldOverallStats { + return isPopulatedObject(arg, ['rawResponse']); +} + export const processAggregatableFieldsExistResponse = ( responses: AggregatableFieldOverallStats[] | undefined, aggregatableFields: string[], diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/types/index_data_visualizer_state.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/types/index_data_visualizer_state.ts index 4a1506dc5b56f..cb3e465683f81 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/types/index_data_visualizer_state.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/types/index_data_visualizer_state.ts @@ -6,8 +6,9 @@ */ import type { Filter } from '@kbn/es-query'; -import { Query } from '@kbn/data-plugin/common/query'; -import { SearchQueryLanguage } from './combined_query'; +import type { Query } from '@kbn/data-plugin/common/query'; +import type { RandomSamplerOption } from '../constants/random_sampler'; +import type { SearchQueryLanguage } from './combined_query'; export interface ListingPageUrlState { pageSize: number; @@ -27,4 +28,6 @@ export interface DataVisualizerIndexBasedAppState extends Omit Date: Fri, 22 Jul 2022 15:44:42 -0500 Subject: [PATCH 40/78] Cleanup x-pack build (#136980) --- package.json | 2 -- x-pack/tasks/build.ts | 33 ++++-------------- x-pack/tasks/helpers/build_version.ts | 13 ------- x-pack/tasks/helpers/flags.ts | 50 --------------------------- x-pack/tasks/helpers/git_info.ts | 38 -------------------- x-pack/tasks/helpers/pkg.ts | 34 ------------------ yarn.lock | 5 --- 7 files changed, 6 insertions(+), 169 deletions(-) delete mode 100644 x-pack/tasks/helpers/build_version.ts delete mode 100644 x-pack/tasks/helpers/flags.ts delete mode 100644 x-pack/tasks/helpers/git_info.ts delete mode 100644 x-pack/tasks/helpers/pkg.ts diff --git a/package.json b/package.json index 1cb365536a16b..2793164ab2a21 100644 --- a/package.json +++ b/package.json @@ -677,7 +677,6 @@ "@types/express": "^4.17.13", "@types/extract-zip": "^1.6.2", "@types/faker": "^5.1.5", - "@types/fancy-log": "^1.3.1", "@types/fetch-mock": "^7.3.1", "@types/file-saver": "^2.0.0", "@types/flot": "^0.0.31", @@ -1070,7 +1069,6 @@ "expect": "^28.1.1", "expose-loader": "^0.7.5", "faker": "^5.1.0", - "fancy-log": "^1.3.2", "fetch-mock": "^7.3.9", "file-loader": "^4.2.0", "form-data": "^4.0.0", diff --git a/x-pack/tasks/build.ts b/x-pack/tasks/build.ts index dacb6b6447aff..d0803e73d96d4 100644 --- a/x-pack/tasks/build.ts +++ b/x-pack/tasks/build.ts @@ -13,18 +13,12 @@ import { pipeline } from 'stream'; import { discoverBazelPackages } from '@kbn/bazel-packages'; import { REPO_ROOT } from '@kbn/utils'; -import { transformFileStream, transformFileWithBabel } from '@kbn/dev-utils'; import { ToolingLog } from '@kbn/tooling-log'; import gulp from 'gulp'; import del from 'del'; -import fancyLog from 'fancy-log'; -import chalk from 'chalk'; import vfs from 'vinyl-fs'; import { generateNoticeFromSource } from '../../src/dev/notice'; -import { gitInfo } from './helpers/git_info'; -import { PKG_NAME } from './helpers/pkg'; -import { BUILD_VERSION } from './helpers/build_version'; const asyncPipeline = promisify(pipeline); @@ -33,29 +27,21 @@ const BUILD_DIR = resolve(XPACK_DIR, 'build'); const PLUGIN_BUILD_DIR = resolve(BUILD_DIR, 'plugin/kibana/x-pack'); async function cleanBuildTask() { - fancyLog('Deleting', BUILD_DIR); + const log = new ToolingLog(); + log.info('Deleting', BUILD_DIR); await del(BUILD_DIR); - fancyLog('[canvas] Deleting Shareable Runtime'); + log.info('[canvas] Deleting Shareable Runtime'); await del(resolve(XPACK_DIR, 'plugins/canvas/shareable_runtime/build')); } -async function reportTask() { - const info = await gitInfo(); - - fancyLog('Package Name', chalk.yellow(PKG_NAME)); - fancyLog('Version', chalk.yellow(BUILD_VERSION)); - fancyLog('Build Number', chalk.yellow(`${info.number}`)); - fancyLog('Build SHA', chalk.yellow(info.sha)); -} - -async function copySourceAndBabelify() { +async function copySource() { // get bazel packages inside x-pack const xpackBazelPackages = (await discoverBazelPackages()) .filter((pkg) => pkg.normalizedRepoRelativeDir.startsWith('x-pack/')) .map((pkg) => `${pkg.normalizedRepoRelativeDir.replace('x-pack/', '')}/**`); - // copy source files and apply some babel transformations in the process + // copy source files await asyncPipeline( vfs.src( [ @@ -99,12 +85,6 @@ async function copySourceAndBabelify() { } ), - transformFileStream(async (file) => { - if (['.js', '.ts', '.tsx'].includes(file.extname)) { - await transformFileWithBabel(file); - } - }), - vfs.dest(PLUGIN_BUILD_DIR) ); } @@ -140,8 +120,7 @@ async function generateNoticeText() { export const buildTask = gulp.series( cleanBuildTask, - reportTask, buildCanvasShareableRuntime, - copySourceAndBabelify, + copySource, generateNoticeText ); diff --git a/x-pack/tasks/helpers/build_version.ts b/x-pack/tasks/helpers/build_version.ts deleted file mode 100644 index c00319b981303..0000000000000 --- a/x-pack/tasks/helpers/build_version.ts +++ /dev/null @@ -1,13 +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 { PKG_VERSION } from './pkg'; -import { FLAGS } from './flags'; - -const snapshotText = FLAGS.release ? '' : '-SNAPSHOT'; -const qualifierText = FLAGS.buildQualifier ? '-' + FLAGS.buildQualifier : ''; -export const BUILD_VERSION = `${PKG_VERSION}${qualifierText}${snapshotText}`; diff --git a/x-pack/tasks/helpers/flags.ts b/x-pack/tasks/helpers/flags.ts deleted file mode 100644 index ed938d32ddbb4..0000000000000 --- a/x-pack/tasks/helpers/flags.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import log from 'fancy-log'; -import getopts from 'getopts'; - -/* - Usage: - Specifying which plugins to run tests can be done with the --plugins flag. - One of more plugins can be specified, and each one should be command separated, like so: - gulp testserver --plugins monitoring,reporting - If using with yarn: - yarn test:mocha --plugins graph -*/ - -const opts = Object.freeze( - getopts(process.argv.slice(2), { - alias: { - release: 'r', - }, - boolean: ['release', 'flags'], - string: ['build-qualifier', 'plugins'], - }) -); - -if (opts.flags) { - log(` - X-Pack Gulpfile Flags: - - --flags Print this message - --plugins Comma-separated list of plugins - --release, -r Build to a release version - --build-qualifier Qualifier to include in the build version - `); - process.exit(0); -} - -export const FLAGS = { - release: !!opts.release, - buildQualifier: opts.buildQualifier as string | undefined, - plugins: opts.plugins - ? String(opts.plugins) - .split(',') - .map((id) => id.trim()) - : undefined, -}; diff --git a/x-pack/tasks/helpers/git_info.ts b/x-pack/tasks/helpers/git_info.ts deleted file mode 100644 index 17d2b02286419..0000000000000 --- a/x-pack/tasks/helpers/git_info.ts +++ /dev/null @@ -1,38 +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 fs from 'fs'; -import path from 'path'; -// @ts-ignore barely used, untyped module -import simpleGit from 'simple-git'; - -const gitDir = path.resolve(__dirname, '..', '..'); - -export async function gitInfo() { - if (!fs.existsSync(path.join(gitDir, '.git'))) { - // This info is only used for debugging purposes in the log - // So if .git is not available for some reason, it's fine to output this - return { - number: 1, - sha: process.env.GIT_COMMIT || process.env.BUILDKITE_COMMIT || 'none', - }; - } - const git = simpleGit(gitDir); - - return new Promise<{ number: number; sha: string }>((resolve, reject) => { - git.log((err: undefined | Error, log: { total: number; latest: { hash: string } }) => { - if (err) { - reject(err); - } else { - resolve({ - number: log.total, - sha: log.latest.hash, - }); - } - }); - }); -} diff --git a/x-pack/tasks/helpers/pkg.ts b/x-pack/tasks/helpers/pkg.ts deleted file mode 100644 index b675210bb6f5b..0000000000000 --- a/x-pack/tasks/helpers/pkg.ts +++ /dev/null @@ -1,34 +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 Fs from 'fs'; -import semverValid from 'semver/functions/valid'; - -interface PackageJson { - name: string; - version: string; - dependencies: Record; - devDependencies: Record; - [key: string]: unknown; -} - -const PKG_PATH = require.resolve('../../package.json'); -export const PKG: PackageJson = JSON.parse(Fs.readFileSync(PKG_PATH, 'utf8')); -export const PKG_VERSION = PKG.version; -export const PKG_NAME = PKG.name; - -if (!PKG_VERSION) { - throw new Error('No "version" found in package.json'); -} - -if (!PKG_NAME) { - throw new Error('No "name" found in package.json'); -} - -if (!semverValid(PKG_VERSION)) { - throw new Error(`Version is not valid semver: ${PKG_VERSION}`); -} diff --git a/yarn.lock b/yarn.lock index e8b2319a61e47..f08fd0fc7a42e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6285,11 +6285,6 @@ resolved "https://registry.yarnpkg.com/@types/faker/-/faker-5.1.5.tgz#f14b015e0100232bb00c6dd7611505efb08709a0" integrity sha512-2uEQFb7bsx68rqD4F8q95wZq6LTLOyexjv6BnvJogCO4jStkyc6IDEkODPQcWfovI6g6M3uPQ2/uD/oedJKkNw== -"@types/fancy-log@^1.3.1": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/fancy-log/-/fancy-log-1.3.1.tgz#dd94fbc8c2e2ab8ab402ca8d04bb8c34965f0696" - integrity sha512-31Dt9JaGfHretvwVxCBrCFL5iC9MQ3zOXpu+8C4qzW0cxc5rJJVGxB5c/vZ+wmeTk/JjPz/D0gv8BZ+Ip6iCqQ== - "@types/fetch-mock@^7.3.1": version "7.3.1" resolved "https://registry.yarnpkg.com/@types/fetch-mock/-/fetch-mock-7.3.1.tgz#df7421e8bcb351b430bfbfa5c52bb353826ac94f" From ef311f22fee24c1124d11172e547d2d026ad2b54 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 22 Jul 2022 16:52:58 -0400 Subject: [PATCH 41/78] skip failing test suite (#137004) --- .../spaces_only/tests/alerting/get_action_error_log.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts index f23daba4d75e3..58c81f80f8092 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/get_action_error_log.ts @@ -26,7 +26,8 @@ export default function createGetActionErrorLogTests({ getService }: FtrProvider const dateStart = new Date(Date.now() - 600000).toISOString(); - describe('getActionErrorLog', () => { + // Failing: See https://github.com/elastic/kibana/issues/137004 + describe.skip('getActionErrorLog', () => { const objectRemover = new ObjectRemover(supertest); beforeEach(async () => { From 64cd107dc361f543636b1affa688942760dbeec5 Mon Sep 17 00:00:00 2001 From: Jack Date: Fri, 22 Jul 2022 16:56:10 -0400 Subject: [PATCH 42/78] [8.4] [Kubernetes Security] K8s vis fix query events without entry leaders (#136907) * Rename add_timerange_and_default_filter_to_query util * Add entry leader entity id filter to all queries --- .../kubernetes_security/common/constants.ts | 18 ++++++- .../container_name_widget/index.tsx | 4 +- .../public/components/count_widget/index.tsx | 8 ++- .../components/percent_widget/index.tsx | 4 +- .../tree_view_container/tree_nav/index.tsx | 4 +- ...erange_and_default_filter_to_query.test.ts | 49 +++++++++++++++++++ ..._timerange_and_default_filter_to_query.ts} | 12 ++--- .../utils/add_timerange_to_query.test.ts | 37 -------------- 8 files changed, 83 insertions(+), 53 deletions(-) create mode 100644 x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts rename x-pack/plugins/kubernetes_security/public/utils/{add_timerange_to_query.ts => add_timerange_and_default_filter_to_query.ts} (78%) delete mode 100644 x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.test.ts diff --git a/x-pack/plugins/kubernetes_security/common/constants.ts b/x-pack/plugins/kubernetes_security/common/constants.ts index f61633fabc14f..002e669c6839f 100644 --- a/x-pack/plugins/kubernetes_security/common/constants.ts +++ b/x-pack/plugins/kubernetes_security/common/constants.ts @@ -23,8 +23,6 @@ export const QUERY_KEY_COUNT_WIDGET = 'kubernetesSecurityCountWidget'; export const QUERY_KEY_CONTAINER_NAME_WIDGET = 'kubernetesSecurityContainerNameWidget'; export const QUERY_KEY_PROCESS_EVENTS = 'kubernetesSecurityProcessEvents'; -export const DEFAULT_QUERY = '{"bool":{"must":[],"filter":[],"should":[],"must_not":[]}}'; - // ECS fields export const ENTRY_LEADER_INTERACTIVE = 'process.entry_leader.interactive'; export const ENTRY_LEADER_USER_ID = 'process.entry_leader.user.id'; @@ -41,3 +39,19 @@ export const COUNT_WIDGET_KEY_NAMESPACE = 'CountNamespaceWidgets'; export const COUNT_WIDGET_KEY_NODES = 'CountNodesWidgets'; export const COUNT_WIDGET_KEY_PODS = 'CountPodsWidgets'; export const COUNT_WIDGET_KEY_CONTAINER_IMAGES = 'CountContainerImagesWidgets'; + +export const DEFAULT_QUERY = '{"bool":{"must":[],"filter":[],"should":[],"must_not":[]}}'; +export const DEFAULT_FILTER_QUERY = + '{"bool":{"must":[],"filter":[{"bool": {"should": [{"exists": {"field": "process.entry_leader.entity_id"}}]}}],"should":[],"must_not":[]}}'; +export const DEFAULT_FILTER = { + bool: { + should: [ + { + exists: { + field: ENTRY_LEADER_ENTITY_ID, + }, + }, + ], + minimum_should_match: 1, + }, +}; diff --git a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.tsx b/x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.tsx index 15f3727efa660..7db821c51cc7b 100644 --- a/x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.tsx +++ b/x-pack/plugins/kubernetes_security/public/components/container_name_widget/index.tsx @@ -11,7 +11,7 @@ import { useStyles } from './styles'; import { ContainerNameRow } from './container_name_row'; import type { IndexPattern, GlobalFilter } from '../../types'; import { useSetFilter, useScroll } from '../../hooks'; -import { addTimerangeToQuery } from '../../utils/add_timerange_to_query'; +import { addTimerangeAndDefaultFilterToQuery } from '../../utils/add_timerange_and_default_filter_to_query'; import { useFetchContainerNameData } from './hooks'; import { CONTAINER_IMAGE_NAME } from '../../../common/constants'; import { @@ -63,7 +63,7 @@ export const ContainerNameWidget = ({ const styles = useStyles(); const filterQueryWithTimeRange = useMemo(() => { - return addTimerangeToQuery( + return addTimerangeAndDefaultFilterToQuery( globalFilter.filterQuery, globalFilter.startDate, globalFilter.endDate diff --git a/x-pack/plugins/kubernetes_security/public/components/count_widget/index.tsx b/x-pack/plugins/kubernetes_security/public/components/count_widget/index.tsx index 534187057b5e9..a6b1638efb002 100644 --- a/x-pack/plugins/kubernetes_security/public/components/count_widget/index.tsx +++ b/x-pack/plugins/kubernetes_security/public/components/count_widget/index.tsx @@ -10,7 +10,7 @@ import { EuiText, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; import { useStyles } from './styles'; import type { IndexPattern, GlobalFilter } from '../../types'; import { addCommasToNumber } from '../../utils/add_commas_to_number'; -import { addTimerangeToQuery } from '../../utils/add_timerange_to_query'; +import { addTimerangeAndDefaultFilterToQuery } from '../../utils/add_timerange_and_default_filter_to_query'; import { useFetchCountWidgetData } from './hooks'; import { addResourceTypeToFilterQuery, numberFormatter } from './helpers'; import { COUNT_WIDGET_KEY_PODS } from '../../../common/constants'; @@ -42,7 +42,11 @@ export const CountWidget = ({ if (widgetKey === COUNT_WIDGET_KEY_PODS) { globalFilterModified = addResourceTypeToFilterQuery(globalFilter.filterQuery, 'pod'); } - return addTimerangeToQuery(globalFilterModified, globalFilter.startDate, globalFilter.endDate); + return addTimerangeAndDefaultFilterToQuery( + globalFilterModified, + globalFilter.startDate, + globalFilter.endDate + ); }, [globalFilter.filterQuery, globalFilter.startDate, globalFilter.endDate, widgetKey]); const { data, isLoading } = useFetchCountWidgetData( diff --git a/x-pack/plugins/kubernetes_security/public/components/percent_widget/index.tsx b/x-pack/plugins/kubernetes_security/public/components/percent_widget/index.tsx index 21c068978a345..181ff9629c4ee 100644 --- a/x-pack/plugins/kubernetes_security/public/components/percent_widget/index.tsx +++ b/x-pack/plugins/kubernetes_security/public/components/percent_widget/index.tsx @@ -10,7 +10,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiProgress, EuiText } from '@elastic/eui'; import { useStyles } from './styles'; import type { IndexPattern, GlobalFilter } from '../../types'; import { useSetFilter } from '../../hooks'; -import { addTimerangeToQuery } from '../../utils/add_timerange_to_query'; +import { addTimerangeAndDefaultFilterToQuery } from '../../utils/add_timerange_and_default_filter_to_query'; import { AggregateResult } from '../../../common/types/aggregate'; import { useFetchPercentWidgetData } from './hooks'; @@ -54,7 +54,7 @@ export const PercentWidget = ({ const styles = useStyles(); const filterQueryWithTimeRange = useMemo(() => { - return addTimerangeToQuery( + return addTimerangeAndDefaultFilterToQuery( globalFilter.filterQuery, globalFilter.startDate, globalFilter.endDate diff --git a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx b/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx index 56ab1c94d93a5..699b83a4146d0 100644 --- a/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx +++ b/x-pack/plugins/kubernetes_security/public/components/tree_view_container/tree_nav/index.tsx @@ -14,7 +14,7 @@ import { import { useStyles } from './styles'; import { IndexPattern, GlobalFilter, TreeNavSelection } from '../../../types'; import { DynamicTreeView } from '../dynamic_tree_view'; -import { addTimerangeToQuery } from '../../../utils/add_timerange_to_query'; +import { addTimerangeAndDefaultFilterToQuery } from '../../../utils/add_timerange_and_default_filter_to_query'; import { INFRASTRUCTURE, LOGICAL, TREE_VIEW } from './constants'; import { TreeViewKind, TreeViewOptionsGroup } from './types'; @@ -31,7 +31,7 @@ export const TreeNav = ({ indexPattern, globalFilter, onSelect, hasSelection }: const [selected, setSelected] = useState(''); const filterQueryWithTimeRange = useMemo(() => { - return addTimerangeToQuery( + return addTimerangeAndDefaultFilterToQuery( globalFilter.filterQuery, globalFilter.startDate, globalFilter.endDate diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts b/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts new file mode 100644 index 0000000000000..33b36574eab92 --- /dev/null +++ b/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DEFAULT_FILTER_QUERY } from '../../common/constants'; +import { addTimerangeAndDefaultFilterToQuery } from './add_timerange_and_default_filter_to_query'; + +const TEST_QUERY = + '{"bool":{"must":[],"filter":[{"bool":{"should":[{"match":{"process.entry_leader.same_as_process":true}}],"minimum_should_match":1}}],"should":[],"must_not":[]}}'; +const TEST_INVALID_QUERY = '{"bool":{"must":['; +const TEST_EMPTY_STRING = ''; +const TEST_DATE = '2022-06-09T22:36:46.628Z'; +const VALID_RESULT = + '{"bool":{"must":[],"filter":[{"bool":{"should":[{"exists":{"field":"process.entry_leader.entity_id"}}],"minimum_should_match":1}},{"bool":{"should":[{"match":{"process.entry_leader.same_as_process":true}}],"minimum_should_match":1}},{"range":{"@timestamp":{"gte":"2022-06-09T22:36:46.628Z","lte":"2022-06-09T22:36:46.628Z"}}}],"should":[],"must_not":[]}}'; + +describe('addTimerangeAndDefaultFilterToQuery(query, startDate, endDate)', () => { + it('works for valid query, startDate, and endDate', () => { + expect(addTimerangeAndDefaultFilterToQuery(TEST_QUERY, TEST_DATE, TEST_DATE)).toEqual( + VALID_RESULT + ); + }); + it('works with missing filter in bool', () => { + expect(addTimerangeAndDefaultFilterToQuery('{"bool":{}}', TEST_DATE, TEST_DATE)).toEqual( + '{"bool":{"filter":[{"range":{"@timestamp":{"gte":"2022-06-09T22:36:46.628Z","lte":"2022-06-09T22:36:46.628Z"}}}]}}' + ); + }); + it('returns default query with invalid JSON query', () => { + expect(addTimerangeAndDefaultFilterToQuery(TEST_INVALID_QUERY, TEST_DATE, TEST_DATE)).toEqual( + DEFAULT_FILTER_QUERY + ); + expect(addTimerangeAndDefaultFilterToQuery(TEST_EMPTY_STRING, TEST_DATE, TEST_DATE)).toEqual( + DEFAULT_FILTER_QUERY + ); + expect(addTimerangeAndDefaultFilterToQuery('{}', TEST_DATE, TEST_DATE)).toEqual( + DEFAULT_FILTER_QUERY + ); + }); + it('returns default query with invalid startDate or endDate', () => { + expect(addTimerangeAndDefaultFilterToQuery(TEST_QUERY, TEST_EMPTY_STRING, TEST_DATE)).toEqual( + DEFAULT_FILTER_QUERY + ); + expect(addTimerangeAndDefaultFilterToQuery(TEST_QUERY, TEST_DATE, TEST_EMPTY_STRING)).toEqual( + DEFAULT_FILTER_QUERY + ); + }); +}); diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.ts b/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts similarity index 78% rename from x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.ts rename to x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts index 0eb1239435483..5b5eca1b8a4d9 100644 --- a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.ts +++ b/x-pack/plugins/kubernetes_security/public/utils/add_timerange_and_default_filter_to_query.ts @@ -5,10 +5,10 @@ * 2.0. */ -import { DEFAULT_QUERY } from '../../common/constants'; +import { DEFAULT_FILTER, DEFAULT_FILTER_QUERY } from '../../common/constants'; /** - * Add startDate and endDate filter for '@timestamp' field into query. + * Add DEFAULT_FILTER and startDate and endDate filter for '@timestamp' field into query. * * Used by frontend components * @@ -20,13 +20,13 @@ import { DEFAULT_QUERY } from '../../common/constants'; * in the right format, return a default query. */ -export const addTimerangeToQuery = ( +export const addTimerangeAndDefaultFilterToQuery = ( query: string | undefined, startDate: string, endDate: string ) => { if (!(query && !isNaN(Date.parse(startDate)) && !isNaN(Date.parse(endDate)))) { - return DEFAULT_QUERY; + return DEFAULT_FILTER_QUERY; } try { @@ -44,13 +44,13 @@ export const addTimerangeToQuery = ( }, }; if (parsedQuery.bool.filter) { - parsedQuery.bool.filter = [...parsedQuery.bool.filter, range]; + parsedQuery.bool.filter = [DEFAULT_FILTER, ...parsedQuery.bool.filter, range]; } else { parsedQuery.bool.filter = [range]; } return JSON.stringify(parsedQuery); } catch { - return DEFAULT_QUERY; + return DEFAULT_FILTER_QUERY; } }; diff --git a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.test.ts b/x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.test.ts deleted file mode 100644 index 20e5e36cb3951..0000000000000 --- a/x-pack/plugins/kubernetes_security/public/utils/add_timerange_to_query.test.ts +++ /dev/null @@ -1,37 +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 { DEFAULT_QUERY } from '../../common/constants'; -import { addTimerangeToQuery } from './add_timerange_to_query'; - -const TEST_QUERY = - '{"bool":{"must":[],"filter":[{"bool":{"should":[{"match":{"process.entry_leader.same_as_process":true}}],"minimum_should_match":1}}],"should":[],"must_not":[]}}'; -const TEST_INVALID_QUERY = '{"bool":{"must":['; -const TEST_EMPTY_STRING = ''; -const TEST_DATE = '2022-06-09T22:36:46.628Z'; -const VALID_RESULT = - '{"bool":{"must":[],"filter":[{"bool":{"should":[{"match":{"process.entry_leader.same_as_process":true}}],"minimum_should_match":1}},{"range":{"@timestamp":{"gte":"2022-06-09T22:36:46.628Z","lte":"2022-06-09T22:36:46.628Z"}}}],"should":[],"must_not":[]}}'; - -describe('addTimerangeToQuery(query, startDate, endDate)', () => { - it('works for valid query, startDate, and endDate', () => { - expect(addTimerangeToQuery(TEST_QUERY, TEST_DATE, TEST_DATE)).toEqual(VALID_RESULT); - }); - it('works with missing filter in bool', () => { - expect(addTimerangeToQuery('{"bool":{}}', TEST_DATE, TEST_DATE)).toEqual( - '{"bool":{"filter":[{"range":{"@timestamp":{"gte":"2022-06-09T22:36:46.628Z","lte":"2022-06-09T22:36:46.628Z"}}}]}}' - ); - }); - it('returns default query with invalid JSON query', () => { - expect(addTimerangeToQuery(TEST_INVALID_QUERY, TEST_DATE, TEST_DATE)).toEqual(DEFAULT_QUERY); - expect(addTimerangeToQuery(TEST_EMPTY_STRING, TEST_DATE, TEST_DATE)).toEqual(DEFAULT_QUERY); - expect(addTimerangeToQuery('{}', TEST_DATE, TEST_DATE)).toEqual(DEFAULT_QUERY); - }); - it('returns default query with invalid startDate or endDate', () => { - expect(addTimerangeToQuery(TEST_QUERY, TEST_EMPTY_STRING, TEST_DATE)).toEqual(DEFAULT_QUERY); - expect(addTimerangeToQuery(TEST_QUERY, TEST_DATE, TEST_EMPTY_STRING)).toEqual(DEFAULT_QUERY); - }); -}); From 703580f944264fce55f332bad7b83f918f667e1e Mon Sep 17 00:00:00 2001 From: Spencer Date: Fri, 22 Jul 2022 14:59:14 -0700 Subject: [PATCH 43/78] [eslint/module_migration] add exact option (#137000) --- .../rules/module_migration.js | 7 +++- .../rules/module_migration.test.js | 41 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/packages/kbn-eslint-plugin-eslint/rules/module_migration.js b/packages/kbn-eslint-plugin-eslint/rules/module_migration.js index 04fbbfd35a565..e34e17a2587ae 100644 --- a/packages/kbn-eslint-plugin-eslint/rules/module_migration.js +++ b/packages/kbn-eslint-plugin-eslint/rules/module_migration.js @@ -12,7 +12,8 @@ const KIBANA_ROOT = findKibanaRoot(); function checkModuleNameNode(context, mappings, node, desc = 'Imported') { const mapping = mappings.find( - (mapping) => mapping.from === node.value || node.value.startsWith(`${mapping.from}/`) + (mapping) => + mapping.from === node.value || (!mapping.exact && node.value.startsWith(`${mapping.from}/`)) ); if (!mapping) { @@ -85,6 +86,10 @@ module.exports = { exclude: { type: 'array', }, + exact: { + type: 'boolean', + default: false, + }, }, anyOf: [ { diff --git a/packages/kbn-eslint-plugin-eslint/rules/module_migration.test.js b/packages/kbn-eslint-plugin-eslint/rules/module_migration.test.js index 2ecaf283133e7..7e8372f21350a 100644 --- a/packages/kbn-eslint-plugin-eslint/rules/module_migration.test.js +++ b/packages/kbn-eslint-plugin-eslint/rules/module_migration.test.js @@ -37,6 +37,21 @@ ruleTester.run('@kbn/eslint/module-migration', rule, { ], ], }, + + { + code: dedent` + import "foo/bar" + `, + options: [ + [ + { + from: 'foo', + to: 'bar', + exact: true, + }, + ], + ], + }, ], invalid: [ @@ -148,5 +163,31 @@ ruleTester.run('@kbn/eslint/module-migration', rule, { import '../../common/foo' `, }, + + { + code: dedent` + import 'foo' + import 'foo/bar' + `, + options: [ + [ + { + from: 'foo', + to: 'bar', + exact: true, + }, + ], + ], + errors: [ + { + line: 1, + message: 'Imported module "foo" should be "bar"', + }, + ], + output: dedent` + import 'bar' + import 'foo/bar' + `, + }, ], }); From 03f1a218c5d07265715279c3686cb5819dbdb374 Mon Sep 17 00:00:00 2001 From: Spencer Date: Fri, 22 Jul 2022 15:04:23 -0700 Subject: [PATCH 44/78] [core] remove root index.ts file (#137001) * [core] remove root index.ts file * remove support for `kibana/*` imports, replace instances in docs --- dev_docs/key_concepts/anatomy_of_a_plugin.mdx | 12 ++++----- dev_docs/key_concepts/performance.mdx | 2 +- dev_docs/tutorials/advanced_settings.mdx | 8 +++--- dev_docs/tutorials/data/search.mdx | 4 +-- dev_docs/tutorials/endpoints.mdx | 26 +++++++++---------- dev_docs/tutorials/testing_plugins.mdx | 4 +-- .../core/application_service.asciidoc | 2 +- .../core/configuration-service.asciidoc | 6 ++--- .../core/elasticsearch-service.asciidoc | 2 +- .../architecture/core/http-service.asciidoc | 4 +-- .../architecture/core/index.asciidoc | 2 +- .../core/logging-service.asciidoc | 2 +- .../core/patterns-scoped-services.asciidoc | 2 +- .../core/uisettings-service.asciidoc | 2 +- .../kibana-platform-plugin-api.asciidoc | 14 +++++----- .../best-practices/performance.asciidoc | 2 +- ...migrating-legacy-plugins-examples.asciidoc | 18 ++++++------- .../plugin/testing-kibana-plugin.asciidoc | 4 +-- .../hooks/use_get_alerts_permissions/index.ts | 2 +- .../src/field_value_lists/index.tsx | 2 +- src/core/index.ts | 12 --------- src/core/server/plugins/types.ts | 2 +- tsconfig.base.json | 3 --- 23 files changed, 61 insertions(+), 76 deletions(-) delete mode 100644 src/core/index.ts diff --git a/dev_docs/key_concepts/anatomy_of_a_plugin.mdx b/dev_docs/key_concepts/anatomy_of_a_plugin.mdx index 4c082fc3bf1db..f99c41ff18d07 100644 --- a/dev_docs/key_concepts/anatomy_of_a_plugin.mdx +++ b/dev_docs/key_concepts/anatomy_of_a_plugin.mdx @@ -122,7 +122,7 @@ If you are developing in TypeScript (which we recommend), you will need to add a core capabilities as an argument. It should return an instance of its plugin class for Kibana to load. ```ts -import type { PluginInitializerContext } from 'kibana/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; import { DemoPlugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { @@ -156,7 +156,7 @@ Using the non-`type` variation will increase the bundle size unnecessarily and m point, but all plugins at Elastic should be consistent in this way. ```ts -import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from 'kibana/server'; +import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from '@kbn/core/server'; export class DemoPlugin implements Plugin { constructor(initializerContext: PluginInitializerContext) {} @@ -184,7 +184,7 @@ export class DemoPlugin implements Plugin { `server/plugin.ts` is the server-side plugin definition. The shape of this plugin is the same as it’s client-side counter-part: ```ts -import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from 'kibana/server'; +import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from '@kbn/core/server'; export class DemoPlugin implements Plugin { constructor(initializerContext: PluginInitializerContext) {} @@ -240,7 +240,7 @@ For example, the core http service exposes a function createRouter to all plugin a plugin just accesses it off of the first argument: ```ts -import type { CoreSetup } from 'kibana/server'; +import type { CoreSetup } from '@kbn/core/server'; export class DemoPlugin { public setup(core: CoreSetup) { @@ -260,7 +260,7 @@ dependency in it’s kibana.json manifest file. ** foobar plugin.ts: ** ```ts -import type { Plugin } from 'kibana/server'; +import type { Plugin } from '@kbn/core/server'; // [1] export interface FoobarPluginSetup { getFoo(): string; @@ -306,7 +306,7 @@ export class MyPlugin implements Plugin { With that specified in the plugin manifest, the appropriate interfaces are then available via the second argument of setup and/or start: ```ts -import type { CoreSetup, CoreStart } from 'kibana/server'; +import type { CoreSetup, CoreStart } from '@kbn/core/server'; import type { FoobarPluginSetup, FoobarPluginStart } from '../../foobar/server'; // [1] diff --git a/dev_docs/key_concepts/performance.mdx b/dev_docs/key_concepts/performance.mdx index 5d955c789ddeb..c57630f508dcd 100644 --- a/dev_docs/key_concepts/performance.mdx +++ b/dev_docs/key_concepts/performance.mdx @@ -33,7 +33,7 @@ some heavy-weight libraries that will also be removed from the initial plugin bundle, therefore, reducing its size by a significant amount. ```ts -import type { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; +import type { Plugin, CoreSetup, AppMountParameters } from '@kbn/core/public'; export class MyPlugin implements Plugin { setup(core: CoreSetup, plugins: SetupDeps) { core.application.register({ diff --git a/dev_docs/tutorials/advanced_settings.mdx b/dev_docs/tutorials/advanced_settings.mdx index 1ca925e24f54a..b0c12ad5e5edd 100644 --- a/dev_docs/tutorials/advanced_settings.mdx +++ b/dev_docs/tutorials/advanced_settings.mdx @@ -54,7 +54,7 @@ The following is a basic example for using the `uiSettings` service: **src/plugins/charts/public/plugin.ts** ```ts -import { Plugin, CoreSetup } from 'kibana/public'; +import { Plugin, CoreSetup } from '@kbn/core/public'; import { ExpressionsSetup } from '../../expressions/public'; import { palette, systemPalette } from '../common'; @@ -132,7 +132,7 @@ The example also shows how plugins can leverage the optional deprecation paramet ```ts import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; -import { CoreSetup, Plugin } from 'kibana/server'; +import { CoreSetup, Plugin } from '@kbn/core/server'; import { COLOR_MAPPING_SETTING, LEGACY_TIME_AXIS, palette, systemPalette } from '../common'; import { ExpressionsServerSetup } from '../../expressions/server'; @@ -192,7 +192,7 @@ For example, changing the time filter refresh interval triggers a prompt in the ```ts import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; -import type { DocLinksServiceSetup, UiSettingsParams } from 'kibana/server'; +import type { DocLinksServiceSetup, UiSettingsParams } from '@kbn/core/server'; import { DEFAULT_QUERY_LANGUAGE, UI_SETTINGS } from '../common'; export function getUiSettings( @@ -231,7 +231,7 @@ For example, in 7.9.0, `siem` as renamed to `securitySolution`, and in 8.0.0, `t **src/core/server/ui_settings/saved_objects/migrations.ts** ```ts -import { SavedObjectUnsanitizedDoc, SavedObjectSanitizedDoc } from 'kibana/server'; +import { SavedObjectUnsanitizedDoc, SavedObjectSanitizedDoc } from '@kbn/core/server'; export const migrations = { '7.9.0': (doc: SavedObjectUnsanitizedDoc): SavedObjectSanitizedDoc => ({ diff --git a/dev_docs/tutorials/data/search.mdx b/dev_docs/tutorials/data/search.mdx index ab5c3f29ea1be..d422eb811b60b 100644 --- a/dev_docs/tutorials/data/search.mdx +++ b/dev_docs/tutorials/data/search.mdx @@ -18,7 +18,7 @@ However, the recommended and easiest way to search Elasticsearch is by using the Here is a basic example for using the `data.search` service from a custom plugin: ```ts -import { CoreStart, Plugin } from 'kibana/public'; +import { CoreStart, Plugin } from '@kbn/core/public'; import { DataPublicPluginStart, isCompleteResponse, isErrorResponse } from import { DataPublicPluginStart, isCompleteResponse, isErrorResponse } from '../../src/plugins/data'; export interface MyPluginStartDependencies { @@ -189,7 +189,7 @@ export const mySearchStrategyProvider = ( ```ts // ./myPlugin/server/plugin.ts -import type { CoreSetup, CoreStart, Plugin } from 'kibana/server'; +import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/server'; import { mySearchStrategyProvider } from './my_strategy'; diff --git a/dev_docs/tutorials/endpoints.mdx b/dev_docs/tutorials/endpoints.mdx index f6367580420db..ab7aeda0e5693 100644 --- a/dev_docs/tutorials/endpoints.mdx +++ b/dev_docs/tutorials/endpoints.mdx @@ -63,7 +63,7 @@ the request. The following snippet demonstrate how to create a basic `GET` endpoint on the `/api/my_plugin/get_object` path: ```ts -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -86,7 +86,7 @@ export class MyPlugin implements Plugin { consuming the endpoint from the client-side using core's `http` service would then look like: ```ts -import { HttpStart } from 'kibana/public'; +import { HttpStart } from '@kbn/core/public'; interface ResponseType { result: string; @@ -105,7 +105,7 @@ of the route definition. ```ts import { schema } from '@kbn/config-schema'; -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -135,7 +135,7 @@ export class MyPlugin implements Plugin { consuming the endpoint from the client-side using core's `http` service would then look like: ```ts -import { HttpStart } from 'kibana/public'; +import { HttpStart } from '@kbn/core/public'; import { MyObjectType } from '../common/types'; async function fetchData(http: HttpStart, id: string) { @@ -150,7 +150,7 @@ must be provided when registering a `post` handler that will access the payload. ```ts import { schema } from '@kbn/config-schema'; -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -182,7 +182,7 @@ export class MyPlugin implements Plugin { consuming the endpoint from the client-side using core's `http` service would then look like: ```ts -import { HttpStart } from 'kibana/public'; +import { HttpStart } from '@kbn/core/public'; interface ResponseType { updated: boolean; @@ -207,7 +207,7 @@ option of the route definition to be accessible from the handler. ```ts import { schema } from '@kbn/config-schema'; -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -236,7 +236,7 @@ export class MyPlugin implements Plugin { consuming the endpoint from the client-side using core's `http` service would then look like: ```ts -import { HttpStart } from 'kibana/public'; +import { HttpStart } from '@kbn/core/public'; import { MyObjectType } from '../common/types'; interface ResponseType { @@ -264,7 +264,7 @@ All APIs of the `response` parameter of the handler accept a `headers` property to define headers to attach to the response. ```ts -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -300,7 +300,7 @@ However, some of the less commonly used return codes don't have such helpers. In and/or `response.customError` APIs should be used. ```ts -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -332,7 +332,7 @@ These observables can either be used directly, or be used to control an `AbortCo ```ts import { schema } from '@kbn/config-schema'; -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -371,7 +371,7 @@ and will return a `401 - Unauthorized` otherwise. It is possible to disable this requirement using the `authRequired` option of the route. ```ts -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -407,7 +407,7 @@ be achieved by using the `url` and `route` properties of the `request` parameter request.url / request.route ```ts -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { diff --git a/dev_docs/tutorials/testing_plugins.mdx b/dev_docs/tutorials/testing_plugins.mdx index 044d610aa3489..b43fa19927cc4 100644 --- a/dev_docs/tutorials/testing_plugins.mdx +++ b/dev_docs/tutorials/testing_plugins.mdx @@ -590,7 +590,7 @@ Objects client: ```typescript // src/plugins/myplugin/server/lib/short_url_lookup.ts import crypto from 'crypto'; -import { SavedObjectsClientContract } from 'kibana/server'; +import { SavedObjectsClientContract } from '@kbn/core/server'; export const shortUrlLookup = { generateUrlId(url: string, savedObjectsClient: SavedObjectsClientContract) { @@ -1025,7 +1025,7 @@ data. ```typescript // src/plugins/myplugin/public/plugin.ts import { METRIC_TYPE } from '@kbn/analytics'; -import { CoreSetup, CoreStart, Plugin } from 'kibana/public'; +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import { DataPublicPluginSetup, DataPublicPluginStart } from '../../data/public'; import { UsageCollectionSetup } from '../../usage_collection/public'; import { SuggestionsService } from './suggestions'; diff --git a/docs/developer/architecture/core/application_service.asciidoc b/docs/developer/architecture/core/application_service.asciidoc index ba3c6bbed72be..2aa50ebafad8d 100644 --- a/docs/developer/architecture/core/application_service.asciidoc +++ b/docs/developer/architecture/core/application_service.asciidoc @@ -6,7 +6,7 @@ NOTE: The Application service is only available client side. [source,typescript] ---- -import { AppMountParameters, CoreSetup, Plugin, DEFAULT_APP_CATEGORIES } from 'kibana/public'; +import { AppMountParameters, CoreSetup, Plugin, DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { diff --git a/docs/developer/architecture/core/configuration-service.asciidoc b/docs/developer/architecture/core/configuration-service.asciidoc index 031135c7b790f..b78414486e3c3 100644 --- a/docs/developer/architecture/core/configuration-service.asciidoc +++ b/docs/developer/architecture/core/configuration-service.asciidoc @@ -38,7 +38,7 @@ export type MyPluginConfigType = TypeOf; *my_plugin/server/index.ts* [source,typescript] ---- -import type { PluginInitializerContext } from 'kibana/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; export class MyPlugin { constructor(initializerContext: PluginInitializerContext) { this.config$ = initializerContext.config.create(); @@ -57,7 +57,7 @@ allow-list property. [source,typescript] ---- import { schema, TypeOf } from '@kbn/config-schema'; -import type { PluginConfigDescriptor } from 'kibana/server'; +import type { PluginConfigDescriptor } from '@kbn/core/server'; const configSchema = schema.object({ secret: schema.string({ defaultValue: 'Only on server' }), @@ -115,7 +115,7 @@ configuration root. [source,typescript] ---- import { schema, TypeOf } from '@kbn/config-schema'; -import type { PluginConfigDescriptor } from 'kibana/server'; +import type { PluginConfigDescriptor } from '@kbn/core/server'; const configSchema = schema.object({ newProperty: schema.string({ defaultValue: 'Some string' }), diff --git a/docs/developer/architecture/core/elasticsearch-service.asciidoc b/docs/developer/architecture/core/elasticsearch-service.asciidoc index 55632c0117938..b65c8859d50dc 100644 --- a/docs/developer/architecture/core/elasticsearch-service.asciidoc +++ b/docs/developer/architecture/core/elasticsearch-service.asciidoc @@ -14,7 +14,7 @@ See <> and <>. [source,typescript] ---- -import { CoreStart, Plugin } from 'kibana/public'; +import { CoreStart, Plugin } from '@kbn/core/public'; export class MyPlugin implements Plugin { public start(core: CoreStart) { diff --git a/docs/developer/architecture/core/http-service.asciidoc b/docs/developer/architecture/core/http-service.asciidoc index 45468d618dd09..6cc171aa7969a 100644 --- a/docs/developer/architecture/core/http-service.asciidoc +++ b/docs/developer/architecture/core/http-service.asciidoc @@ -17,7 +17,7 @@ See {kib-repo}blob/{branch}/docs/development/core/server/kibana-plugin-core-serv [source,typescript] ---- import { schema } from '@kbn/config-schema'; -import type { CoreSetup, Plugin } from 'kibana/server'; +import type { CoreSetup, Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { @@ -54,7 +54,7 @@ The client-side HttpService is a preconfigured wrapper around `window.fetch` tha [source,typescript] ---- -import { CoreStart } from 'kibana/public'; +import { CoreStart } from '@kbn/core/public'; interface ResponseType {…}; interface MyPluginData {…}; async function fetchData(core: CoreStart) { diff --git a/docs/developer/architecture/core/index.asciidoc b/docs/developer/architecture/core/index.asciidoc index 6c70205c3590d..b03e98ffbb57d 100644 --- a/docs/developer/architecture/core/index.asciidoc +++ b/docs/developer/architecture/core/index.asciidoc @@ -8,7 +8,7 @@ These API's are injected into your plugin's lifecycle methods and may be invoked [source,typescript] ---- -import type { PluginInitializerContext, CoreSetup, CoreStart } from 'kibana/server'; +import type { PluginInitializerContext, CoreSetup, CoreStart } from '@kbn/core/server'; export class MyPlugin { constructor(initializerContext: PluginInitializerContext) {} diff --git a/docs/developer/architecture/core/logging-service.asciidoc b/docs/developer/architecture/core/logging-service.asciidoc index 79d8c6d197e10..a4d5a12ff64e7 100644 --- a/docs/developer/architecture/core/logging-service.asciidoc +++ b/docs/developer/architecture/core/logging-service.asciidoc @@ -6,7 +6,7 @@ NOTE: The Logging service is only available server side. [source,typescript] ---- -import type { PluginInitializerContext, CoreSetup, Plugin, Logger } from 'kibana/server'; +import type { PluginInitializerContext, CoreSetup, Plugin, Logger } from '@kbn/core/server'; export class MyPlugin implements Plugin { private readonly logger: Logger; diff --git a/docs/developer/architecture/core/patterns-scoped-services.asciidoc b/docs/developer/architecture/core/patterns-scoped-services.asciidoc index d4618684fc7e4..bfd8b42dbb951 100644 --- a/docs/developer/architecture/core/patterns-scoped-services.asciidoc +++ b/docs/developer/architecture/core/patterns-scoped-services.asciidoc @@ -35,7 +35,7 @@ the request handler context: [source,typescript] ---- -import type { CoreSetup, RequestHandlerContext, IScopedClusterClient } from 'kibana/server'; +import type { CoreSetup, RequestHandlerContext, IScopedClusterClient } from '@kbn/core/server'; interface MyRequestHandlerContext extends RequestHandlerContext { myPlugin: { diff --git a/docs/developer/architecture/core/uisettings-service.asciidoc b/docs/developer/architecture/core/uisettings-service.asciidoc index 32a0058476df8..2d24465b69c32 100644 --- a/docs/developer/architecture/core/uisettings-service.asciidoc +++ b/docs/developer/architecture/core/uisettings-service.asciidoc @@ -82,7 +82,7 @@ The following example shows how to {kib-repo}blob/{branch}/docs/development/core [source,typescript] ---- import { schema } from '@kbn/config-schema'; -import type { CoreSetup,Plugin } from 'kibana/server'; +import type { CoreSetup,Plugin } from '@kbn/core/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { diff --git a/docs/developer/architecture/kibana-platform-plugin-api.asciidoc b/docs/developer/architecture/kibana-platform-plugin-api.asciidoc index 9cf60cda76f75..af3dfa8647656 100644 --- a/docs/developer/architecture/kibana-platform-plugin-api.asciidoc +++ b/docs/developer/architecture/kibana-platform-plugin-api.asciidoc @@ -57,7 +57,7 @@ It should return an instance of its plugin class for [source,typescript] ---- -import type { PluginInitializerContext } from 'kibana/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; import { MyPlugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { @@ -73,7 +73,7 @@ for first-party Elastic plugins]. [source,typescript] ---- -import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from 'kibana/server'; +import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from '@kbn/core/server'; export class MyPlugin implements Plugin { constructor(initializerContext: PluginInitializerContext) {} @@ -99,7 +99,7 @@ entry-point: [source,typescript] ---- -import type { PluginInitializerContext } from 'kibana/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; import { MyPlugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { @@ -112,7 +112,7 @@ shape of this plugin is the same as it’s client-side counter-part: [source,typescript] ---- -import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from 'kibana/server'; +import type { Plugin, PluginInitializerContext, CoreSetup, CoreStart } from '@kbn/core/server'; export class MyPlugin implements Plugin { constructor(initializerContext: PluginInitializerContext) {} @@ -190,7 +190,7 @@ an HTTP route handler, a plugin just accesses it off of the first argument: [source, typescript] ---- -import type { CoreSetup } from 'kibana/server'; +import type { CoreSetup } from '@kbn/core/server'; export class MyPlugin { public setup(core: CoreSetup) { @@ -252,7 +252,7 @@ encouraged to expose types for their plugin interfaces. [source, typescript] ---- -import type { Plugin } from 'kibana/server'; +import type { Plugin } from '@kbn/core/server'; export interface FoobarPluginSetup { <1> getFoo(): string; } @@ -305,7 +305,7 @@ are then available via the second argument of `setup` and/or `start`: [source,typescript] ---- -import type { CoreSetup, CoreStart } from 'kibana/server'; +import type { CoreSetup, CoreStart } from '@kbn/core/server'; import type { FoobarPluginSetup, FoobarPluginStart } from '../../foobar/server'; interface DemoSetupPlugins { <1> diff --git a/docs/developer/best-practices/performance.asciidoc b/docs/developer/best-practices/performance.asciidoc index 5d7bee2d58e6e..05489a36f9c7b 100644 --- a/docs/developer/best-practices/performance.asciidoc +++ b/docs/developer/best-practices/performance.asciidoc @@ -24,7 +24,7 @@ plugin bundle, therefore, reducing its size by a significant amount. [source,typescript] ---- -import type { Plugin, CoreSetup, AppMountParameters } from 'kibana/public'; +import type { Plugin, CoreSetup, AppMountParameters } from '@kbn/core/public'; export class MyPlugin implements Plugin { setup(core: CoreSetup, plugins: SetupDeps) { core.application.register({ diff --git a/docs/developer/plugin/migrating-legacy-plugins-examples.asciidoc b/docs/developer/plugin/migrating-legacy-plugins-examples.asciidoc index e7468c60a2ebc..b674d084a76ca 100644 --- a/docs/developer/plugin/migrating-legacy-plugins-examples.asciidoc +++ b/docs/developer/plugin/migrating-legacy-plugins-examples.asciidoc @@ -60,7 +60,7 @@ in the _constructor_ of the plugin: *plugins/my_plugin/(public|server)/index.ts* [source,typescript] ---- -import type { PluginInitializerContext } from 'kibana/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; import { MyPlugin } from './plugin'; export function plugin(initializerContext: PluginInitializerContext) { @@ -71,7 +71,7 @@ export function plugin(initializerContext: PluginInitializerContext) { *plugins/my_plugin/(public|server)/plugin.ts* [source,typescript] ---- -import { CoreSetup, Logger, Plugin, PluginInitializerContext, PluginName } from 'kibana/server'; +import { CoreSetup, Logger, Plugin, PluginInitializerContext, PluginName } from '@kbn/core/server'; import type { MyPluginConfig } from './config'; export class MyPlugin implements Plugin { @@ -118,7 +118,7 @@ same name in `plugins/demoplugin` with the following files: [source,typescript] ---- import { schema, TypeOf } from '@kbn/config-schema'; -import type { PluginInitializerContext } from 'kibana/server'; +import type { PluginInitializerContext } from '@kbn/core/server'; import { DemoPlugin } from './plugin'; export const config = { @@ -136,7 +136,7 @@ export { DemoPluginSetup } from './plugin'; *plugins/demoplugin/server/plugin.ts* [source,typescript] ---- -import type { PluginInitializerContext, Plugin, CoreSetup } from 'kibana/server'; +import type { PluginInitializerContext, Plugin, CoreSetup } from '@kbn/core/server'; import type { DemoPluginConfig } from '.'; export interface DemoPluginSetup {}; @@ -205,7 +205,7 @@ to the {kib} platform format: [source,typescript] ---- import { schema } from '@kbn/config-schema'; -import type { CoreSetup } from 'kibana/server'; +import type { CoreSetup } from '@kbn/core/server'; export class DemoPlugin { public setup(core: CoreSetup) { @@ -239,7 +239,7 @@ migration is complete: [source,typescript] ---- import { schema } from '@kbn/config-schema'; -import { CoreSetup } from 'kibana/server'; +import { CoreSetup } from '@kbn/core/server'; import Boom from '@hapi/boom'; export class DemoPlugin { @@ -706,7 +706,7 @@ First type: *plugins/demoplugin/server/saved_objects/first_type.ts* [source,typescript] ---- -import type { SavedObjectsType } from 'kibana/server'; +import type { SavedObjectsType } from '@kbn/core/server'; export const firstType: SavedObjectsType = { name: 'first-type', @@ -744,7 +744,7 @@ Second type: *plugins/demoplugin/server/saved_objects/second_type.ts* [source,typescript] ---- -import type { SavedObjectsType } from 'kibana/server'; +import type { SavedObjectsType } from '@kbn/core/server'; export const secondType: SavedObjectsType = { name: 'second-type', @@ -979,7 +979,7 @@ Legacy Elasticsearch library until the additional announcements. [source,typescript] ---- // Kibana provides a few typings for internal purposes -import type { SearchResponse } from 'kibana/server'; +import type { SearchResponse } from '@kbn/core/server'; type SearchSource = {...}; type SearchBody = SearchResponse; const { body } = await client.search(...); diff --git a/docs/developer/plugin/testing-kibana-plugin.asciidoc b/docs/developer/plugin/testing-kibana-plugin.asciidoc index 6e856d2e2578a..7757f47df0c42 100644 --- a/docs/developer/plugin/testing-kibana-plugin.asciidoc +++ b/docs/developer/plugin/testing-kibana-plugin.asciidoc @@ -11,7 +11,7 @@ plugins always rely on valid public contracts: *my_plugin/server/plugin.test.ts* [source,typescript] ---- -import { configServiceMock } from 'kibana/server/mocks'; +import { configServiceMock } from '@kbn/core/server/mocks'; const configService = configServiceMock.create(); configService.atPath.mockReturnValue(config$); @@ -24,7 +24,7 @@ Or if you need to get the whole core `setup` or `start` contracts: *my_plugin/server/plugin.test.ts* [source,typescript] ---- -import { coreMock } from 'kibana/public/mocks'; +import { coreMock } from '@kbn/core/public/mocks'; const coreSetup = coreMock.createSetup(); coreSetup.uiSettings.get.mockImplementation((key: string) => { diff --git a/packages/kbn-alerts/src/hooks/use_get_alerts_permissions/index.ts b/packages/kbn-alerts/src/hooks/use_get_alerts_permissions/index.ts index 2f2c0967c32f2..dc9e3f8ccee57 100644 --- a/packages/kbn-alerts/src/hooks/use_get_alerts_permissions/index.ts +++ b/packages/kbn-alerts/src/hooks/use_get_alerts_permissions/index.ts @@ -9,7 +9,7 @@ import { useEffect, useState } from 'react'; // TODO: I have to use any here for now, but once this is available below, we should use the correct types, https://github.com/elastic/kibana/issues/100715 -// import { Capabilities } from 'kibana/public'; +// import { Capabilities } from '@kbn/core/public'; type Capabilities = any; export interface UseGetUserAlertsPermissionsProps { crud: boolean; diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx index 64432b1480df3..2d87c3523a839 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx @@ -16,7 +16,7 @@ import { filterFieldToList } from '../filter_field_to_list'; import { getGenericComboBoxProps } from '../get_generic_combo_box_props'; // TODO: I have to use any here for now, but once this is available below, we should use the correct types, https://github.com/elastic/kibana/issues/100715 -// import { HttpStart } from 'kibana/public'; +// import { HttpStart } from '@kbn/core/public'; type HttpStart = any; import * as i18n from '../translations'; diff --git a/src/core/index.ts b/src/core/index.ts deleted file mode 100644 index 2dad5167d5524..0000000000000 --- a/src/core/index.ts +++ /dev/null @@ -1,12 +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 * as Public from './public'; -import * as Server from './server'; - -export { Public, Server }; diff --git a/src/core/server/plugins/types.ts b/src/core/server/plugins/types.ts index a07eff177108e..d41be740018a7 100644 --- a/src/core/server/plugins/types.ts +++ b/src/core/server/plugins/types.ts @@ -61,7 +61,7 @@ export type ExposedToBrowserDescriptor = { * ```typescript * // my_plugin/server/index.ts * import { schema, TypeOf } from '@kbn/config-schema'; - * import { PluginConfigDescriptor } from 'kibana/server'; + * import { PluginConfigDescriptor } from '@kbn/core/server'; * * const configSchema = schema.object({ * secret: schema.string({ defaultValue: 'Only on server' }), diff --git a/tsconfig.base.json b/tsconfig.base.json index 1c0c40e18f999..c1c1539e7b043 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -451,9 +451,6 @@ "@kbn/stack-management-usage-test-plugin/*": ["x-pack/test/usage_collection/plugins/stack_management_usage_test/*"], // END AUTOMATED PACKAGE LISTING // Allows for importing from `kibana` package for the exported types. - "kibana": ["./kibana"], - "kibana/public": ["src/core/public"], - "kibana/server": ["src/core/server"], "@emotion/core": ["typings/@emotion"], "resize-observer-polyfill": ["typings/resize-observer-polyfill"] }, From cf359703a2feee1b10e8ef87ec5e1200d253ab2f Mon Sep 17 00:00:00 2001 From: Catherine Liu Date: Fri, 22 Jul 2022 16:15:59 -0700 Subject: [PATCH 45/78] Removed canvas function reference docs generator component (#136955) --- x-pack/plugins/canvas/public/application.tsx | 7 +- .../function_examples.ts | 473 ------------------ .../function_reference_generator.tsx | 38 -- .../generate_function_reference.ts | 281 ----------- .../function_reference_generator/index.ts | 8 - .../help_menu/help_menu.component.tsx | 35 +- .../public/components/help_menu/help_menu.tsx | 4 - 7 files changed, 4 insertions(+), 842 deletions(-) delete mode 100644 x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts delete mode 100644 x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx delete mode 100644 x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts delete mode 100644 x-pack/plugins/canvas/public/components/function_reference_generator/index.ts diff --git a/x-pack/plugins/canvas/public/application.tsx b/x-pack/plugins/canvas/public/application.tsx index 938a7c75c0aef..cc365451b46f0 100644 --- a/x-pack/plugins/canvas/public/application.tsx +++ b/x-pack/plugins/canvas/public/application.tsx @@ -36,7 +36,6 @@ import { services, LegacyServicesProvider, CanvasPluginServices, - pluginServices as canvasServices, } from './services'; import { initFunctions } from './functions'; // @ts-expect-error untyped local @@ -154,11 +153,7 @@ export const initializeCanvas = async ( ReactDOM.render( - + , domNode diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts deleted file mode 100644 index c25e163a0c210..0000000000000 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts +++ /dev/null @@ -1,473 +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 interface FunctionExample { - syntax: string; - usage: { - expression: string; - help?: string; - }; -} - -interface FunctionExampleDict { - [key: string]: FunctionExample; -} - -export const getFunctionExamples = (): FunctionExampleDict => ({ - all: { - syntax: `all {neq "foo"} {neq "bar"} {neq "fizz"} -all condition={gt 10} condition={lt 20}`, - usage: { - expression: `kibana -| selectFilter -| demodata -| math "mean(percent_uptime)" -| formatnumber "0.0%" -| metric "Average uptime" - metricFont={ - font size=48 family="'Open Sans', Helvetica, Arial, sans-serif" - color={ - if {all {gte 0} {lt 0.8}} then="red" else="green" - } - align="center" lHeight=48 - } -| render`, - help: 'This sets the color of the metric text to `"red"` if the context passed into `metric` is greater than or equal to 0 and less than 0.8. Otherwise, the color is set to `"green"`.', - }, - }, - alterColumn: { - syntax: `alterColumn "cost" type="string" -alterColumn column="@timestamp" name="foo"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| alterColumn "time" name="time_in_ms" type="number" -| table -| render`, - help: 'This renames the `time` column to `time_in_ms` and converts the type of the column’s values from `date` to `number`.', - }, - }, - any: { - syntax: `any {eq "foo"} {eq "bar"} {eq "fizz"} -any condition={lte 10} condition={gt 30}`, - usage: { - expression: `kibana -| selectFilter -| demodata -| filterrows { - getCell "project" | any {eq "elasticsearch"} {eq "kibana"} {eq "x-pack"} - } -| pointseries color="project" size="max(price)" -| pie -| render`, - help: 'This filters out any rows that don’t contain `"elasticsearch"`, `"kibana"` or `"x-pack"` in the `project` field.', - }, - }, - as: { - syntax: `as -as "foo" -as name="bar"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| ply by="project" fn={math "count(username)" | as "num_users"} fn={math "mean(price)" | as "price"} -| pointseries x="project" y="num_users" size="price" color="project" -| plot -| render`, - help: `\`as\` casts any primitive value (\`string\`, \`number\`, \`date\`, \`null\`) into a \`datatable\` with a single row and a single column with the given name (or defaults to \`"value"\` if no name is provided). This is useful when piping a primitive value into a function that only takes \`datatable\` as an input. - -In the example, \`ply\` expects each \`fn\` subexpression to return a \`datatable\` in order to merge the results of each \`fn\` back into a \`datatable\`, but using a \`math\` aggregation in the subexpressions returns a single \`math\` value, which is then cast into a \`datatable\` using \`as\`.`, - }, - }, - asset: { - syntax: `asset "asset-52f14f2b-fee6-4072-92e8-cd2642665d02" -asset id="asset-498f7429-4d56-42a2-a7e4-8bf08d98d114"`, - usage: { - expression: `image dataurl={asset "asset-c661a7cc-11be-45a1-a401-d7592ea7917a"} mode="contain" -| render`, - help: 'The image asset stored with the ID `"asset-c661a7cc-11be-45a1-a401-d7592ea7917a"` is passed into the `dataurl` argument of the `image` function to display the stored asset.', - }, - }, - axisConfig: { - syntax: `axisConfig show=false -axisConfig position="right" min=0 max=10 tickSize=1`, - usage: { - expression: `kibana -| selectFilter -| demodata -| pointseries x="size(cost)" y="project" color="project" -| plot defaultStyle={seriesStyle bars=0.75 horizontalBars=true} - legend=false - xaxis={axisConfig position="top" min=0 max=400 tickSize=100} - yaxis={axisConfig position="right"} -| render`, - help: 'This sets the `x-axis` to display on the top of the chart and sets the range of values to `0-400` with ticks displayed at `100` intervals. The `y-axis` is configured to display on the `right`.', - }, - }, - case: { - syntax: `case 0 then="red" -case when=5 then="yellow" -case if={lte 50} then="green"`, - usage: { - expression: `math "random()" -| progress shape="gauge" label={formatnumber "0%"} - font={ - font size=24 family="'Open Sans', Helvetica, Arial, sans-serif" align="center" - color={ - switch {case if={lte 0.5} then="green"} - {case if={all {gt 0.5} {lte 0.75}} then="orange"} - default="red" - } - } - valueColor={ - switch {case if={lte 0.5} then="green"} - {case if={all {gt 0.5} {lte 0.75}} then="orange"} - default="red" - } -| render`, - help: 'This sets the color of the progress indicator and the color of the label to `"green"` if the value is less than or equal to `0.5`, `"orange"` if the value is greater than `0.5` and less than or equal to `0.75`, and `"red"` if `none` of the case conditions are met.', - }, - }, - clog: { - syntax: `clog`, - usage: { - expression: `kibana -| demodata -| clog -| filterrows fn={getCell "age" | gt 70} -| clog -| pointseries x="time" y="mean(price)" -| plot defaultStyle={seriesStyle lines=1 fill=1} -| render`, - help: 'This prints the `datatable` objects in the browser console before and after the `filterrows` function.', - }, - }, - columns: { - syntax: `columns include="@timestamp, projects, cost" -columns exclude="username, country, age"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| columns include="price, cost, state, project" -| table -| render`, - help: 'This only keeps the `price`, `cost`, `state`, and `project` columns from the `demodata` data source and removes all other columns.', - }, - }, - compare: { - syntax: `compare "neq" to="elasticsearch" -compare op="lte" to=100`, - usage: { - expression: `kibana -| selectFilter -| demodata -| mapColumn project - fn={getCell project | - switch - {case if={compare eq to=kibana} then=kibana} - {case if={compare eq to=elasticsearch} then=elasticsearch} - default="other" - } -| pointseries size="size(cost)" color="project" -| pie -| render`, - help: 'This maps all `project` values that aren’t `"kibana"` and `"elasticsearch"` to `"other"`. Alternatively, you can use the individual comparator functions instead of compare.', - }, - }, - containerStyle: { - syntax: `containerStyle backgroundColor="red"’ -containerStyle borderRadius="50px" -containerStyle border="1px solid black" -containerStyle padding="5px" -containerStyle opacity="0.5" -containerStyle overflow="hidden" -containerStyle backgroundImage={asset id=asset-f40d2292-cf9e-4f2c-8c6f-a504a25e949c} - backgroundRepeat="no-repeat" - backgroundSize="cover"`, - usage: { - expression: `shape "star" fill="#E61D35" maintainAspect=true -| render containerStyle={ - containerStyle backgroundColor="#F8D546" - borderRadius="200px" - border="4px solid #05509F" - padding="0px" - opacity="0.9" - overflow="hidden" - }`, - }, - }, - context: { - syntax: `context`, - usage: { - expression: `date -| formatdate "LLLL" -| markdown "Last updated: " {context} -| render`, - help: 'Using the `context` function allows us to pass the output, or _context_, of the previous function as a value to an argument in the next function. Here we get the formatted date string from the previous function and pass it as `content` for the markdown element.', - }, - }, - createTable: { - syntax: `createTable id="a" id="b" -createTable id="a" name="A" id="b" name="B" rowCount=5`, - usage: { - expression: `var_set -name="logs" value={essql "select count(*) as a from kibana_sample_data_logs"} -name="commerce" value={essql "select count(*) as b from kibana_sample_data_ecommerce"} -| createTable ids="totalA" ids="totalB" -| staticColumn name="totalA" value={var "logs" | getCell "a"} -| alterColumn column="totalA" type="number" -| staticColumn name="totalB" value={var "commerce" | getCell "b"} -| alterColumn column="totalB" type="number" -| mathColumn id="percent" name="percent" expression="totalA / totalB" -| render`, - help: 'This creates a table based on the results of two `essql` queries, joined into one table.', - }, - }, - csv: { - syntax: `csv "fruit, stock - kiwi, 10 - Banana, 5"`, - usage: { - expression: `csv "fruit,stock - kiwi,10 - banana,5" -| pointseries color=fruit size=stock -| pie -| render`, - help: 'This creates a `datatable` with `fruit` and `stock` columns with two rows. This is useful for quickly mocking data.', - }, - }, - date: { - syntax: `date -date value=1558735195 -date "2019-05-24T21:59:55+0000" -date "01/31/2019" format="MM/DD/YYYY"`, - usage: { - expression: `date -| formatdate "LLL" -| markdown {context} - font={font family="Arial, sans-serif" size=30 align="left" - color="#000000" - weight="normal" - underline=false - italic=false} -| render`, - help: 'Using `date` without passing any arguments will return the current date and time.', - }, - }, - demodata: { - syntax: `demodata -demodata "ci" -demodata type="shirts"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| table -| render`, - help: '`demodata` is a mock data set that you can use to start playing around in Canvas.', - }, - }, - dropdownControl: { - syntax: `dropdownControl valueColumn=project filterColumn=project -dropdownControl valueColumn=agent filterColumn=agent.keyword filterGroup=group1`, - usage: { - expression: `demodata -| dropdownControl valueColumn=project filterColumn=project -| render`, - help: 'This creates a dropdown filter element. It requires a data source and uses the unique values from the given `valueColumn` (i.e. `project`) and applies the filter to the `project` column. Note: `filterColumn` should point to a keyword type field for Elasticsearch data sources.', - }, - }, - eq: { - syntax: `eq true -eq null -eq 10 -eq "foo"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| mapColumn project - fn={getCell project | - switch - {case if={eq kibana} then=kibana} - {case if={eq elasticsearch} then=elasticsearch} - default="other" - } -| pointseries size="size(cost)" color="project" -| pie -| render`, - help: 'This changes all values in the project column that don’t equal `"kibana"` or `"elasticsearch"` to `"other"`.', - }, - }, - escount: { - syntax: `escount index="logstash-*" -escount "currency:\"EUR\"" index="kibana_sample_data_ecommerce" -escount query="response:404" index="kibana_sample_data_logs"`, - usage: { - expression: `kibana -| selectFilter -| escount "Cancelled:true" index="kibana_sample_data_flights" -| math "value" -| progress shape="semicircle" - label={formatnumber 0,0} - font={font size=24 family="'Open Sans', Helvetica, Arial, sans-serif" color="#000000" align=center} - max={filters | escount index="kibana_sample_data_flights"} -| render`, - help: 'The first `escount` expression retrieves the number of flights that were cancelled. The second `escount` expression retrieves the total number of flights.', - }, - }, - esdocs: { - syntax: `esdocs index="logstash-*" -esdocs "currency:\"EUR\"" index="kibana_sample_data_ecommerce" -esdocs query="response:404" index="kibana_sample_data_logs" -esdocs index="kibana_sample_data_flights" count=100 -esdocs index="kibana_sample_data_flights" sort="AvgTicketPrice, asc"`, - usage: { - expression: `kibana -| selectFilter -| esdocs index="kibana_sample_data_ecommerce" - fields="customer_gender, taxful_total_price, order_date" - sort="order_date, asc" - count=10000 -| mapColumn "order_date" - fn={getCell "order_date" | date {context} | rounddate "YYYY-MM-DD"} -| alterColumn "order_date" type="date" -| pointseries x="order_date" y="sum(taxful_total_price)" color="customer_gender" -| plot defaultStyle={seriesStyle lines=3} - palette={palette "#7ECAE3" "#003A4D" gradient=true} -| render`, - help: 'This retrieves the first 10000 documents data from the `kibana_sample_data_ecommerce` index sorted by `order_date` in ascending order, and only requests the `customer_gender`, `taxful_total_price`, and `order_date` fields.', - }, - }, - essql: { - syntax: `essql query="SELECT * FROM \"logstash*\"" -essql "SELECT * FROM \"apm*\"" count=10000`, - usage: { - expression: `kibana -| selectFilter -| essql query="SELECT Carrier, FlightDelayMin, AvgTicketPrice FROM \"kibana_sample_data_flights\"" -| table -| render`, - help: 'This retrieves the `Carrier`, `FlightDelayMin`, and `AvgTicketPrice` fields from the "kibana_sample_data_flights" index.', - }, - }, - exactly: { - syntax: `exactly "state" value="running" -exactly "age" value=50 filterGroup="group2" -exactly column="project" value="beats"`, - usage: { - expression: `kibana -| selectFilter -| exactly column=project value=elasticsearch -| demodata -| pointseries x=project y="mean(age)" -| plot defaultStyle={seriesStyle bars=1} -| render`, - help: 'The `exactly` filter here is added to existing filters retrieved by the `filters` function and further filters down the data to only have `"elasticsearch"` data. The `exactly` filter only applies to this one specific element and will not affect other elements in the workpad.', - }, - }, - filterrows: { - syntax: `filterrows {getCell "project" | eq "kibana"} -filterrows fn={getCell "age" | gt 50}`, - usage: { - expression: `kibana -| selectFilter -| demodata -| filterrows {getCell "country" | any {eq "IN"} {eq "US"} {eq "CN"}} -| mapColumn "@timestamp" - fn={getCell "@timestamp" | rounddate "YYYY-MM"} -| alterColumn "@timestamp" type="date" -| pointseries x="@timestamp" y="mean(cost)" color="country" -| plot defaultStyle={seriesStyle points="2" lines="1"} - palette={palette "#01A4A4" "#CC6666" "#D0D102" "#616161" "#00A1CB" "#32742C" "#F18D05" "#113F8C" "#61AE24" "#D70060" gradient=false} -| render`, - help: 'This uses `filterrows` to only keep data from India (`IN`), the United States (`US`), and China (`CN`).', - }, - }, - filters: { - syntax: `filters -filters group="timefilter1" -filters group="timefilter2" group="dropdownfilter1" ungrouped=true`, - usage: { - expression: `filters group=group2 ungrouped=true -| demodata -| pointseries x="project" y="size(cost)" color="project" -| plot defaultStyle={seriesStyle bars=0.75} legend=false - font={ - font size=14 - family="'Open Sans', Helvetica, Arial, sans-serif" - align="left" - color="#FFFFFF" - weight="lighter" - underline=true - italic=true - } -| render`, - help: '`filters` sets the existing filters as context and accepts a `group` parameter to opt into specific filter groups. Setting `ungrouped` to `true` opts out of using global filters.', - }, - }, - font: { - syntax: `font size=12 -font family=Arial -font align=middle -font color=pink -font weight=lighter -font underline=true -font italic=false -font lHeight=32`, - usage: { - expression: `kibana -| selectFilter -| demodata -| pointseries x="project" y="size(cost)" color="project" -| plot defaultStyle={seriesStyle bars=0.75} legend=false - font={ - font size=14 - family="'Open Sans', Helvetica, Arial, sans-serif" - align="left" - color="#FFFFFF" - weight="lighter" - underline=true - italic=true - } -| render`, - }, - }, - formatdate: { - syntax: `formatdate format="YYYY-MM-DD" -formatdate "MM/DD/YYYY"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| mapColumn "time" fn={getCell time | formatdate "MMM 'YY"} -| pointseries x="time" y="sum(price)" color="state" -| plot defaultStyle={seriesStyle points=5} -| render`, - help: 'This transforms the dates in the `time` field into strings that look like `"Jan ‘19"`, `"Feb ‘19"`, etc. using a MomentJS format.', - }, - }, - formatnumber: { - syntax: `formatnumber format="$0,0.00" -formatnumber "0.0a"`, - usage: { - expression: `kibana -| selectFilter -| demodata -| math "mean(percent_uptime)" -| progress shape="gauge" - label={formatnumber "0%"} - font={font size=24 family="'Open Sans', Helvetica, Arial, sans-serif" color="#000000" align="center"} -| render`, - help: 'The `formatnumber` subexpression receives the same `context` as the `progress` function, which is the output of the `math` function. It formats the value into a percentage.', - }, - }, -}); diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx b/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx deleted file mode 100644 index 4b54956bcbec1..0000000000000 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/function_reference_generator.tsx +++ /dev/null @@ -1,38 +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, { FC } from 'react'; -import { ExpressionFunction } from '@kbn/expressions-plugin'; -import { EuiButtonEmpty } from '@elastic/eui'; -import copy from 'copy-to-clipboard'; -import { CanvasPluginServices } from '../../services'; - -import { generateFunctionReference } from './generate_function_reference'; - -interface Props { - functionRegistry: Record; - notifyService: CanvasPluginServices['notify']; -} - -export const FunctionReferenceGenerator: FC = ({ functionRegistry, notifyService }) => { - const functionDefinitions = Object.values(functionRegistry); - - const copyDocs = () => { - const functionRefs = generateFunctionReference(functionDefinitions); - copy(functionRefs); - notifyService.success( - `Please paste updated docs into '/kibana/docs/canvas/canvas-function-reference.asciidoc' and commit your changes.`, - { title: 'Copied function docs to clipboard' } - ); - }; - - return ( - - Generate function reference - - ); -}; diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts deleted file mode 100644 index 7c1f11db071b4..0000000000000 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/generate_function_reference.ts +++ /dev/null @@ -1,281 +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. - */ - -// @ts-expect-error untyped lib -import pluralize from 'pluralize'; -import { ExpressionFunction, ExpressionFunctionParameter } from '@kbn/expressions-plugin'; -import { isValidDataUrl } from '@kbn/presentation-util-plugin/public'; -import { functions as browserFunctions } from '../../../canvas_plugin_src/functions/browser'; -import { functions as serverFunctions } from '../../../canvas_plugin_src/functions/server'; -import { DATATABLE_COLUMN_TYPES } from '../../../common/lib'; -import { getFunctionExamples, FunctionExample } from './function_examples'; - -const ALPHABET = 'abcdefghijklmnopqrstuvwxyz'.split(''); -const REQUIRED_ARG_ANNOTATION = '***'; -const MULTI_ARG_ANNOTATION = '†'; -const UNNAMED_ARG = '_Unnamed_'; -const ANY_TYPE = '`any`'; - -const examplesDict = getFunctionExamples(); - -const fnList = [ - ...browserFunctions.map((fn) => fn().name), - ...serverFunctions.map((fn) => fn().name), - 'asset', - 'clog', - 'createTable', - 'embeddable', - 'filters', - 'font', - 'image', - 'kibana', - 'mapColumn', - 'math', - 'mathColumn', - 'metric', - 'palette', - 'pie', - 'plot', - 'progress', - 'removeFilter', - 'repeatImage', - 'revealImage', - 'selectFilter', - 'shape', - 'timelion', - 'to', - 'uiSetting', - 'var', - 'var_set', - - // ignore unsupported embeddables functions for now -].filter((fn) => !['savedSearch'].includes(fn)); - -interface FunctionDictionary { - [key: string]: ExpressionFunction[]; -} - -const wrapInBackTicks = (str: string) => `\`${str}\``; -const wrapInDoubleQuotes = (str: string) => (str.includes('"') ? str : `"${str}"`); -const stringSorter = (a: string, b: string) => { - if (a < b) { - return -1; - } - if (a > b) { - return 1; - } - return 0; -}; - -// Converts reference to another function in a function's help text into an Asciidoc link -const addFunctionLinks = (help: string, options?: { ignoreList?: string[] }) => { - const { ignoreList = [] } = options || {}; - fnList.forEach((name: string) => { - const nameWithBackTicks = wrapInBackTicks(name); - - // ignore functions with the same name as data types, i.e. string, date - if ( - !ignoreList.includes(name) && - !DATATABLE_COLUMN_TYPES.includes(name) && - help.includes(nameWithBackTicks) - ) { - help = help.replace(nameWithBackTicks, `<<${name}_fn>>`); - } - }); - - return help; -}; - -export const generateFunctionReference = (functionDefinitions: ExpressionFunction[]) => { - const functionDefs = functionDefinitions.filter((fn: ExpressionFunction) => - fnList.includes(fn.name) - ); - const functionDictionary: FunctionDictionary = {}; - functionDefs.forEach((fn: ExpressionFunction) => { - const firstLetter = fn.name[0]; - - if (!functionDictionary[firstLetter]) { - functionDictionary[firstLetter] = []; - } - - functionDictionary[firstLetter].push(fn); - }); - return `[role="xpack"] -[[canvas-function-reference]] -== Canvas function reference - -Behind the scenes, Canvas is driven by a powerful expression language, -with dozens of functions and other capabilities, including table transforms, -type casting, and sub-expressions. - -The Canvas expression language also supports <>, which -perform complex math calculations. - -A ${REQUIRED_ARG_ANNOTATION} denotes a required argument. - -A ${MULTI_ARG_ANNOTATION} denotes an argument can be passed multiple times. - -${createAlphabetLinks(functionDictionary)} - -${createFunctionDocs(functionDictionary)}`; -}; - -const createAlphabetLinks = (functionDictionary: FunctionDictionary) => { - return ALPHABET.map((letter: string) => - functionDictionary[letter] ? `<<${letter}_fns>>` : letter.toUpperCase() - ).join(' | '); -}; - -const createFunctionDocs = (functionDictionary: FunctionDictionary) => { - return Object.keys(functionDictionary) - .sort() - .map( - (letter: string) => `[float] -[[${letter}_fns]] -== ${letter.toUpperCase()} - -${functionDictionary[letter] - .sort((a, b) => stringSorter(a.name, b.name)) - .map(getDocBlock) - .join('\n')}` - ) - .join(''); -}; - -const getDocBlock = (fn: ExpressionFunction) => { - const header = `[float] -[[${fn.name}_fn]] -=== \`${fn.name}\``; - - const input = fn.inputTypes; - const output = fn.type; - const args = fn.args; - const examples = examplesDict[fn.name]; - const help = addFunctionLinks(fn.help); - - const argBlock = - !args || Object.keys(args).length === 0 - ? '' - : `\n[cols="3*^<"] -|=== -|Argument |Type |Description - -${getArgsTable(args)} -|===\n`; - - const examplesBlock = !examples ? `` : `${getExamplesBlock(examples)}`; - - return `${header}\n -${help} -${examplesBlock} -*Accepts:* ${input ? input.map(wrapInBackTicks).join(', ') : ANY_TYPE}\n${argBlock} -*Returns:* ${output ? wrapInBackTicks(output) : 'Depends on your input and arguments'}\n\n`; -}; - -const getArgsTable = (args: { [key: string]: ExpressionFunctionParameter }) => { - if (!args || Object.keys(args).length === 0) { - return 'None'; - } - - const argNames = Object.keys(args); - - return argNames - .sort((a: string, b: string) => { - const argA = args[a]; - const argB = args[b]; - - // sorts unnamed arg to the front - if (a === '_' || (argA.aliases && argA.aliases.includes('_'))) { - return -1; - } - if (b === '_' || (argB.aliases && argB.aliases.includes('_'))) { - return 1; - } - return stringSorter(a, b); - }) - .map((argName: string) => { - const arg = args[argName]; - const types = arg.types; - const aliases = arg.aliases ? [...arg.aliases] : []; - let defaultValue = arg.default; - const requiredAnnotation = arg.required === true ? ` ${REQUIRED_ARG_ANNOTATION}` : ''; - const multiAnnotation = arg.multi === true ? ` ${MULTI_ARG_ANNOTATION}` : ''; - - if (typeof defaultValue === 'string') { - defaultValue = defaultValue.replace('{', '${').replace(/[\r\n/]+/g, ''); - if (types && types.includes('string')) { - defaultValue = wrapInDoubleQuotes(defaultValue); - } - } - - let displayName = ''; - - if (argName === '_') { - displayName = UNNAMED_ARG; - } else if (aliases && aliases.includes('_')) { - displayName = UNNAMED_ARG; - aliases[aliases.indexOf('_')] = argName; - } else { - displayName = wrapInBackTicks(argName); - } - - const aliasList = - aliases && aliases.length - ? `\n\n${pluralize('Alias', aliases.length)}: ${aliases - .sort() - .map(wrapInBackTicks) - .join(', ')}` - : ''; - - let defaultBlock = ''; - - if (isValidDataUrl(arg.default)) { - defaultBlock = getDataUrlExampleBlock(displayName, arg.default); - } else { - defaultBlock = - typeof defaultValue !== 'undefined' ? `\n\nDefault: \`${defaultValue}\`` : ''; - } - - return `|${displayName}${requiredAnnotation}${multiAnnotation}${aliasList} -|${types && types.length ? types.map(wrapInBackTicks).join(', ') : ANY_TYPE} -|${arg.help ? addFunctionLinks(arg.help, { ignoreList: argNames }) : ''}${defaultBlock}`; - }) - .join('\n\n'); -}; - -const getDataUrlExampleBlock = ( - argName: string, - value: string -) => `\n\nExample value for the ${argName} argument, formatted as a \`base64\` data URL: -[source, url] ------------- -${value} -------------`; - -const getExamplesBlock = (examples: FunctionExample) => { - const { syntax, usage } = examples; - const { expression, help } = usage || {}; - const syntaxBlock = syntax - ? `\n*Expression syntax* -[source,js] ----- -${syntax} -----\n` - : ''; - - const codeBlock = expression - ? `\n*Code example* -[source,text] ----- -${expression} -----\n` - : ''; - - const codeHelp = help ? `${help}\n` : ''; - - return `${syntaxBlock}${codeBlock}${codeHelp}`; -}; diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/index.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/index.ts deleted file mode 100644 index 212d8f567461d..0000000000000 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/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 { FunctionReferenceGenerator } from './function_reference_generator'; diff --git a/x-pack/plugins/canvas/public/components/help_menu/help_menu.component.tsx b/x-pack/plugins/canvas/public/components/help_menu/help_menu.component.tsx index 020c2ff9d1279..96f63da6f4f7c 100644 --- a/x-pack/plugins/canvas/public/components/help_menu/help_menu.component.tsx +++ b/x-pack/plugins/canvas/public/components/help_menu/help_menu.component.tsx @@ -5,22 +5,10 @@ * 2.0. */ -import React, { FC, lazy, Suspense, useCallback } from 'react'; -import { EuiButtonEmpty, EuiSpacer } from '@elastic/eui'; +import React, { FC, useCallback } from 'react'; +import { EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { ChromeHelpMenuActions } from '@kbn/core/public'; -import { ExpressionFunction } from '@kbn/expressions-plugin'; -import { CanvasPluginServices } from '../../services'; - -let FunctionReferenceGenerator: null | React.LazyExoticComponent = null; - -if (process.env.NODE_ENV === 'development') { - FunctionReferenceGenerator = lazy(() => - import('../function_reference_generator').then((module) => ({ - default: module.FunctionReferenceGenerator, - })) - ); -} const strings = { getKeyboardShortcutsLinkLabel: () => @@ -30,18 +18,11 @@ const strings = { }; interface Props { - functionRegistry: Record; - notifyService: CanvasPluginServices['notify']; showKeyboardShortcutsDocFlyout: () => void; hideHelpMenu: ChromeHelpMenuActions['hideHelpMenu']; } -export const HelpMenu: FC = ({ - functionRegistry, - notifyService, - hideHelpMenu, - showKeyboardShortcutsDocFlyout, -}) => { +export const HelpMenu: FC = ({ hideHelpMenu, showKeyboardShortcutsDocFlyout }) => { const onKeyboardShortcutButtonClick = useCallback(() => { hideHelpMenu(); showKeyboardShortcutsDocFlyout(); @@ -57,16 +38,6 @@ export const HelpMenu: FC = ({ > {strings.getKeyboardShortcutsLinkLabel()} - - {FunctionReferenceGenerator ? ( - - - - - ) : null} ); }; diff --git a/x-pack/plugins/canvas/public/components/help_menu/help_menu.tsx b/x-pack/plugins/canvas/public/components/help_menu/help_menu.tsx index 7fb6824c0d573..5d3f9b28658cb 100644 --- a/x-pack/plugins/canvas/public/components/help_menu/help_menu.tsx +++ b/x-pack/plugins/canvas/public/components/help_menu/help_menu.tsx @@ -6,16 +6,12 @@ */ import React, { FC, useCallback } from 'react'; -import { ExpressionFunction } from '@kbn/expressions-plugin'; import { ChromeHelpMenuActions } from '@kbn/core/public'; import { useDispatch } from 'react-redux'; import { HelpMenu as Component } from './help_menu.component'; -import { CanvasPluginServices } from '../../services'; import { setKeyboardShortcutsDocVisibility } from '../../state/actions/flyouts'; interface Props { - functionRegistry: Record; - notifyService: CanvasPluginServices['notify']; hideHelpMenu: ChromeHelpMenuActions['hideHelpMenu']; } From fd0e49da01cfcd22627b88198460e21e038c7206 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sat, 23 Jul 2022 00:41:38 -0400 Subject: [PATCH 46/78] [api-docs] Daily api_docs build (#137017) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.devdocs.json | 6 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 70 +- api_docs/alerting.mdx | 4 +- api_docs/apm.devdocs.json | 32 +- api_docs/apm.mdx | 4 +- 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_security_posture.devdocs.json | 295 ++++++- api_docs/cloud_security_posture.mdx | 13 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.devdocs.json | 40 +- api_docs/core.mdx | 2 +- api_docs/core_application.mdx | 2 +- api_docs/core_chrome.mdx | 2 +- api_docs/core_saved_objects.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.devdocs.json | 54 +- api_docs/data.mdx | 4 +- api_docs/data_query.mdx | 4 +- api_docs/data_search.devdocs.json | 161 ++++ api_docs/data_search.mdx | 4 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.devdocs.json | 161 +++- api_docs/data_view_field_editor.mdx | 4 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.devdocs.json | 8 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 4 +- api_docs/deprecations_by_plugin.mdx | 21 +- api_docs/deprecations_by_team.mdx | 8 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/elastic_apm_synthtrace.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.devdocs.json | 26 +- api_docs/expressions.mdx | 2 +- api_docs/features.devdocs.json | 12 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/fleet.devdocs.json | 62 +- api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bazel_packages.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_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_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_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 +- ...ticsearch_client_server_mocks.devdocs.json | 96 +-- ...core_elasticsearch_client_server_mocks.mdx | 2 +- ...kbn_core_elasticsearch_server.devdocs.json | 32 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...elasticsearch_server_internal.devdocs.json | 16 +- ...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 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- .../kbn_core_injected_metadata_browser.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- api_docs/kbn_core_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_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_cards.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_kibana_json_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_rule_data_utils.devdocs.json | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- .../kbn_scalability_simulation_generator.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- ...kbn_securitysolution_es_utils.devdocs.json | 16 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ...solution_io_ts_alerting_types.devdocs.json | 8 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- ..._securitysolution_io_ts_types.devdocs.json | 89 ++ api_docs/kbn_securitysolution_io_ts_types.mdx | 4 +- 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 +- .../kbn_securitysolution_rules.devdocs.json | 33 +- api_docs/kbn_securitysolution_rules.mdx | 4 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_components.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- api_docs/kbn_shared_ux_services.mdx | 2 +- api_docs/kbn_shared_ux_storybook.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 32 + api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.devdocs.json | 8 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.devdocs.json | 6 +- api_docs/maps.mdx | 4 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.devdocs.json | 8 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 28 +- api_docs/presentation_util.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.devdocs.json | 42 +- api_docs/rule_registry.mdx | 4 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.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/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.devdocs.json | 803 +++++++++++++++--- api_docs/security.mdx | 4 +- api_docs/security_solution.devdocs.json | 4 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/shared_u_x.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- .../telemetry_collection_manager.devdocs.json | 8 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.devdocs.json | 144 ++-- api_docs/triggers_actions_ui.mdx | 4 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.devdocs.json | 8 +- 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 +- 336 files changed, 2196 insertions(+), 788 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index e4e93b5b885b2..0134daca7d5a8 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github summary: API docs for the actions plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] warning: 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. --- diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index c5205df73c164..1ac4c8d9106e9 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github summary: API docs for the advancedSettings plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] warning: 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. --- diff --git a/api_docs/aiops.devdocs.json b/api_docs/aiops.devdocs.json index e351d2c17883e..84e7d22381d1e 100644 --- a/api_docs/aiops.devdocs.json +++ b/api_docs/aiops.devdocs.json @@ -10,11 +10,11 @@ "tags": [], "label": "ExplainLogRateSpikes", "description": [ - "\nLazy-wrapped ExplainLogRateSpikesWrapper React component" + "\nLazy-wrapped ExplainLogRateSpikesAppState React component" ], "signature": [ "(props: React.PropsWithChildren<", - "ExplainLogRateSpikesWrapperProps", + "ExplainLogRateSpikesAppStateProps", ">) => JSX.Element" ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", @@ -31,7 +31,7 @@ ], "signature": [ "React.PropsWithChildren<", - "ExplainLogRateSpikesWrapperProps", + "ExplainLogRateSpikesAppStateProps", ">" ], "path": "x-pack/plugins/aiops/public/shared_lazy_components.tsx", diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index a664068bdd054..4e105828cb108 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github summary: API docs for the aiops plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] warning: 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. --- diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index cd60d093f2898..882b50b8524ba 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3002,8 +3002,18 @@ "pluginId": "alerting", "scope": "common", "docId": "kibAlertingPluginApi", - "section": "def-common.IExecutionLogWithErrorsResult", - "text": "IExecutionLogWithErrorsResult" + "section": "def-common.IExecutionLogResult", + "text": "IExecutionLogResult" + }, + ">; getActionErrorLog: ({ id, dateStart, dateEnd, filter, page, perPage, sort, }: ", + "GetActionErrorLogByIdParams", + ") => Promise<", + { + "pluginId": "alerting", + "scope": "common", + "docId": "kibAlertingPluginApi", + "section": "def-common.IExecutionErrorsResult", + "text": "IExecutionErrorsResult" }, ">; bulkEdit: ; }; dataViews: { setup: {}; start: () => Promise<", + { + "pluginId": "dataViews", + "scope": "server", + "docId": "kibDataViewsPluginApi", + "section": "def-server.DataViewsServerPluginStart", + "text": "DataViewsServerPluginStart" + }, ">; }; actions?: { setup: ", { "pluginId": "actions", @@ -772,7 +778,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/dynamic\" | \"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}\" | \"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/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/{serviceName}/serviceNodes\" | \"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\" | \"POST /api/apm/services/{serviceName}/annotation\" | \"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}/profiling/timeline\" | \"GET /internal/apm/services/{serviceName}/profiling/statistics\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/sorted_and_filtered_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/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\" | \"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/alerts/chart_preview/transaction_error_rate\" | \"GET /internal/apm/alerts/chart_preview/transaction_duration\" | \"GET /internal/apm/alerts/chart_preview/transaction_error_count\" | \"GET /api/apm/settings/agent-configuration\" | \"GET /api/apm/settings/agent-configuration/view\" | \"DELETE /api/apm/settings/agent-configuration\" | \"PUT /api/apm/settings/agent-configuration\" | \"POST /api/apm/settings/agent-configuration/search\" | \"GET /api/apm/settings/agent-configuration/environments\" | \"GET /api/apm/settings/agent-configuration/agent_name\" | \"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\" | \"POST /api/apm/sourcemaps\" | \"DELETE /api/apm/sourcemaps/{id}\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema\" | \"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\" | \"POST /internal/apm/correlations/field_stats/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\" | \"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\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/title\" | \"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}\" | \"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/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/{serviceName}/serviceNodes\" | \"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\" | \"POST /api/apm/services/{serviceName}/annotation\" | \"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}/profiling/timeline\" | \"GET /internal/apm/services/{serviceName}/profiling/statistics\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/sorted_and_filtered_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/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\" | \"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/alerts/chart_preview/transaction_error_rate\" | \"GET /internal/apm/alerts/chart_preview/transaction_duration\" | \"GET /internal/apm/alerts/chart_preview/transaction_error_count\" | \"GET /api/apm/settings/agent-configuration\" | \"GET /api/apm/settings/agent-configuration/view\" | \"DELETE /api/apm/settings/agent-configuration\" | \"PUT /api/apm/settings/agent-configuration\" | \"POST /api/apm/settings/agent-configuration/search\" | \"GET /api/apm/settings/agent-configuration/environments\" | \"GET /api/apm/settings/agent-configuration/agent_name\" | \"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\" | \"POST /api/apm/sourcemaps\" | \"DELETE /api/apm/sourcemaps/{id}\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema\" | \"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\" | \"POST /internal/apm/correlations/field_stats/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\" | \"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\"" ], "path": "x-pack/plugins/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -5258,9 +5264,9 @@ "NonEmptyStringBrand", ">)[]; }, ", "APMRouteCreateOptions", - ">; \"GET /internal/apm/data_view/dynamic\": ", + ">; \"GET /internal/apm/data_view/title\": ", "ServerRoute", - "<\"GET /internal/apm/data_view/dynamic\", undefined, ", + "<\"GET /internal/apm/data_view/title\", undefined, ", { "pluginId": "apm", "scope": "server", @@ -5268,9 +5274,7 @@ "section": "def-server.APMRouteHandlerResources", "text": "APMRouteHandlerResources" }, - ", { dynamicDataView: ", - "DataViewTitleAndFields", - " | undefined; }, ", + ", { apmDataViewTitle: string; }, ", "APMRouteCreateOptions", ">; \"POST /internal/apm/data_view/static\": ", "ServerRoute", @@ -5282,7 +5286,15 @@ "section": "def-server.APMRouteHandlerResources", "text": "APMRouteHandlerResources" }, - ", { created: boolean; }, ", + ", { dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + " | undefined; }, ", "APMRouteCreateOptions", ">; }" ], diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index cb5c8f3f82278..ecadca13f26da 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github summary: API docs for the apm plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [APM UI](https://github.com/orgs/elastic/teams/apm-ui) for questions reg | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 40 | 0 | 40 | 55 | +| 40 | 0 | 40 | 53 | ## Client diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index f19576f5e913e..677a562bde529 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github summary: API docs for the banners plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] warning: 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. --- diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 967773ebb9054..10023c44fd2ee 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github summary: API docs for the bfetch plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] warning: 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. --- diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index c0888a7d25ece..160bc7a1f1735 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github summary: API docs for the canvas plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] warning: 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. --- diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 1bfd2904be3bd..4868c36d6c034 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github summary: API docs for the cases plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] warning: 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. --- diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 91a54232253e0..efca78338a22f 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github summary: API docs for the charts plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] warning: 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. --- diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index c764715e4845e..db47b033725e7 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloud plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] warning: 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. --- diff --git a/api_docs/cloud_security_posture.devdocs.json b/api_docs/cloud_security_posture.devdocs.json index 5f991959da895..3f894ca0ec0b7 100644 --- a/api_docs/cloud_security_posture.devdocs.json +++ b/api_docs/cloud_security_posture.devdocs.json @@ -2,10 +2,255 @@ "id": "cloudSecurityPosture", "client": { "classes": [], - "functions": [], - "interfaces": [], + "functions": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.getSecuritySolutionDashboardLinks", + "type": "Function", + "tags": [], + "label": "getSecuritySolutionDashboardLinks", + "description": [ + "\nGets the cloud security posture links for navigation in the security solution's \"Dashboards\" section." + ], + "signature": [ + "(extensions?: Partial>> | undefined) => TLinkItem" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.getSecuritySolutionDashboardLinks.$1", + "type": "Object", + "tags": [], + "label": "extensions", + "description": [ + "extended configuration for the links." + ], + "signature": [ + "Partial>> | undefined" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.getSecuritySolutionManageLinks", + "type": "Function", + "tags": [], + "label": "getSecuritySolutionManageLinks", + "description": [ + "\nGets the cloud security posture links for navigation in the security solution's \"Manage\" section." + ], + "signature": [ + "(extensions?: Partial>> | undefined) => TLinkItem" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.getSecuritySolutionManageLinks.$1", + "type": "Object", + "tags": [], + "label": "extensions", + "description": [ + "extended configuration for the links." + ], + "signature": [ + "Partial>> | undefined" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.getSecuritySolutionRootLinks", + "type": "Function", + "tags": [], + "label": "getSecuritySolutionRootLinks", + "description": [ + "\nGets the cloud security posture links for top-level navigation in the security solution." + ], + "signature": [ + "(extensions?: Partial>> | undefined) => TLinkItem" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.getSecuritySolutionRootLinks.$1", + "type": "Object", + "tags": [], + "label": "extensions", + "description": [ + "extended configuration for the links." + ], + "signature": [ + "Partial>> | undefined" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/security_solution_links.ts", + "deprecated": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CspSecuritySolutionContext", + "type": "Interface", + "tags": [], + "label": "CspSecuritySolutionContext", + "description": [ + "\nMethods exposed from the security solution to the cloud security posture application." + ], + "path": "x-pack/plugins/cloud_security_posture/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CspSecuritySolutionContext.getFiltersGlobalComponent", + "type": "Function", + "tags": [], + "label": "getFiltersGlobalComponent", + "description": [ + "Gets the `FiltersGlobal` component for embedding a filter bar in the security solution application." + ], + "signature": [ + "() => React.ComponentType<{ children: React.ReactNode; }>" + ], + "path": "x-pack/plugins/cloud_security_posture/public/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CspSecuritySolutionContext.getSpyRouteComponent", + "type": "Function", + "tags": [], + "label": "getSpyRouteComponent", + "description": [ + "Gets the `SpyRoute` component for navigation highlighting and breadcrumbs." + ], + "signature": [ + "() => React.ComponentType<{ pageName?: ", + { + "pluginId": "cloudSecurityPosture", + "scope": "public", + "docId": "kibCloudSecurityPosturePluginApi", + "section": "def-public.CloudSecurityPosturePageId", + "text": "CloudSecurityPosturePageId" + }, + " | undefined; }>" + ], + "path": "x-pack/plugins/cloud_security_posture/public/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CLOUD_SECURITY_POSTURE_BASE_PATH", + "type": "string", + "tags": [], + "label": "CLOUD_SECURITY_POSTURE_BASE_PATH", + "description": [ + "The base path for all cloud security posture pages." + ], + "signature": [ + "\"/cloud_security_posture\"" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/constants.ts", + "deprecated": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CloudSecurityPosturePageId", + "type": "Type", + "tags": [], + "label": "CloudSecurityPosturePageId", + "description": [ + "\nAll the IDs for the cloud security posture pages.\nThis needs to match the cloud security posture page entries in `SecurityPageName` in `x-pack/plugins/security_solution/common/constants.ts`." + ], + "signature": [ + "\"cloud_security_posture-dashboard\" | \"cloud_security_posture-findings\" | \"cloud_security_posture-benchmarks\" | \"cloud_security_posture-rules\"" + ], + "path": "x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts", + "deprecated": false, + "initialIsOpen": false + } + ], "objects": [], "setup": { "parentPluginId": "cloudSecurityPosture", @@ -13,7 +258,9 @@ "type": "Interface", "tags": [], "label": "CspClientPluginSetup", - "description": [], + "description": [ + "\nThe cloud security posture's public plugin setup interface." + ], "path": "x-pack/plugins/cloud_security_posture/public/types.ts", "deprecated": false, "children": [], @@ -26,10 +273,38 @@ "type": "Interface", "tags": [], "label": "CspClientPluginStart", - "description": [], + "description": [ + "\nThe cloud security posture's public plugin start interface." + ], "path": "x-pack/plugins/cloud_security_posture/public/types.ts", "deprecated": false, - "children": [], + "children": [ + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CspClientPluginStart.getCloudSecurityPostureRouter", + "type": "Function", + "tags": [], + "label": "getCloudSecurityPostureRouter", + "description": [ + "Gets the cloud security posture router component for embedding in the security solution." + ], + "signature": [ + "() => React.ComponentType<{ securitySolutionContext: ", + { + "pluginId": "cloudSecurityPosture", + "scope": "public", + "docId": "kibCloudSecurityPosturePluginApi", + "section": "def-public.CspSecuritySolutionContext", + "text": "CspSecuritySolutionContext" + }, + "; }>" + ], + "path": "x-pack/plugins/cloud_security_posture/public/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] + } + ], "lifecycle": "start", "initialIsOpen": true } @@ -80,7 +355,9 @@ "type": "string", "tags": [], "label": "PLUGIN_ID", - "description": [], + "description": [ + "ID of the cloud security posture plugin." + ], "signature": [ "\"csp\"" ], @@ -94,7 +371,9 @@ "type": "string", "tags": [], "label": "PLUGIN_NAME", - "description": [], + "description": [ + "Display name of the cloud security posture application." + ], "signature": [ "\"Cloud Security\"" ], diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 8819cdb2dbf98..ff7b5e72894ee 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloudSecurityPosture plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-pos | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 6 | 0 | 6 | 0 | +| 18 | 0 | 2 | 0 | ## Client @@ -28,6 +28,15 @@ Contact [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-pos ### Start +### Functions + + +### Interfaces + + +### Consts, variables and types + + ## Server ### Setup diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 2ac8609de1c2d..084de900709cf 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github summary: API docs for the console plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] warning: 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. --- diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 2e1ead774b332..1003829b5e8e2 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github summary: API docs for the controls plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] warning: 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. --- diff --git a/api_docs/core.devdocs.json b/api_docs/core.devdocs.json index d585e1ee6dece..3bb474a84715f 100644 --- a/api_docs/core.devdocs.json +++ b/api_docs/core.devdocs.json @@ -16152,7 +16152,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -16384,9 +16386,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -18894,7 +18894,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -19126,9 +19128,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -20097,7 +20097,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -20329,9 +20331,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -24395,7 +24395,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -24627,9 +24629,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -28681,7 +28681,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -28913,9 +28915,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/core.mdx b/api_docs/core.mdx index d28df876f874b..a03683437b7a1 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github summary: API docs for the core plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] warning: 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. --- diff --git a/api_docs/core_application.mdx b/api_docs/core_application.mdx index fd2623489a3fc..eed2740c51871 100644 --- a/api_docs/core_application.mdx +++ b/api_docs/core_application.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-application title: "core.application" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.application plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.application'] warning: 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. --- diff --git a/api_docs/core_chrome.mdx b/api_docs/core_chrome.mdx index 4ab17c53c6f88..805e3cb4eca18 100644 --- a/api_docs/core_chrome.mdx +++ b/api_docs/core_chrome.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-chrome title: "core.chrome" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.chrome plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.chrome'] warning: 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. --- diff --git a/api_docs/core_saved_objects.mdx b/api_docs/core_saved_objects.mdx index a5447ba4f8890..246fa8145282c 100644 --- a/api_docs/core_saved_objects.mdx +++ b/api_docs/core_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-savedObjects title: "core.savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.savedObjects plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.savedObjects'] warning: 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. --- diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 84d0776f301fa..6ac77b0c1cb81 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github summary: API docs for the customIntegrations plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] warning: 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. --- diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 638f9b8762e51..311ed5ef08ca0 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboard plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] warning: 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. --- diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index d62cf5f63e4f0..e7af9b3df0b35 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboardEnhanced plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] warning: 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. --- diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 2da5b6e5e0737..b194298050a08 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -5807,6 +5807,52 @@ "path": "src/plugins/data/common/search/aggs/types.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-public.AggFunctionsMapping.aggValueCount", + "type": "Object", + "tags": [], + "label": "aggValueCount", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"aggValueCount\", any, AggArgs, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggExpressionType", + "text": "AggExpressionType" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableRecord", + ">>" + ], + "path": "src/plugins/data/common/search/aggs/types.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-public.AggFunctionsMapping.aggCount", @@ -15202,7 +15248,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -15434,9 +15482,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index b9302925c9423..febfa26f6104c 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github summary: API docs for the data plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3086 | 34 | 2413 | 21 | +| 3094 | 34 | 2421 | 21 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index cfd2b7af1bf3e..77319a74366ab 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.query plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3086 | 34 | 2413 | 21 | +| 3094 | 34 | 2421 | 21 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index f0ca8ca100b12..70e0543078f6a 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -11365,6 +11365,22 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.aggValueCount", + "type": "Function", + "tags": [], + "label": "aggValueCount", + "description": [], + "signature": [ + "() => FunctionDefinition" + ], + "path": "src/plugins/data/common/search/aggs/metrics/value_count_fn.ts", + "deprecated": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.calcAutoIntervalLessThan", @@ -14282,6 +14298,38 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.getValueCountMetricAgg", + "type": "Function", + "tags": [], + "label": "getValueCountMetricAgg", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.MetricAggType", + "text": "MetricAggType" + }, + "<", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IMetricAggConfig", + "text": "IMetricAggConfig" + }, + ">" + ], + "path": "src/plugins/data/common/search/aggs/metrics/value_count.ts", + "deprecated": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.handleRequest", @@ -16969,6 +17017,52 @@ "path": "src/plugins/data/common/search/aggs/types.ts", "deprecated": false }, + { + "parentPluginId": "data", + "id": "def-common.AggFunctionsMapping.aggValueCount", + "type": "Object", + "tags": [], + "label": "aggValueCount", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionFunctionDefinition", + "text": "ExpressionFunctionDefinition" + }, + "<\"aggValueCount\", any, AggArgs, ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggExpressionType", + "text": "AggExpressionType" + }, + ", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableRecord", + ">>" + ], + "path": "src/plugins/data/common/search/aggs/types.ts", + "deprecated": false + }, { "parentPluginId": "data", "id": "def-common.AggFunctionsMapping.aggCount", @@ -20898,6 +20992,59 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.AggParamsValueCount", + "type": "Interface", + "tags": [], + "label": "AggParamsValueCount", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggParamsValueCount", + "text": "AggParamsValueCount" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.BaseAggParams", + "text": "BaseAggParams" + } + ], + "path": "src/plugins/data/common/search/aggs/metrics/value_count.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.AggParamsValueCount.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "path": "src/plugins/data/common/search/aggs/metrics/value_count.ts", + "deprecated": false + }, + { + "parentPluginId": "data", + "id": "def-common.AggParamsValueCount.emptyAsNull", + "type": "CompoundType", + "tags": [], + "label": "emptyAsNull", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/data/common/search/aggs/metrics/value_count.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.AggsCommonSetup", @@ -27086,6 +27233,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.aggValueCountFnName", + "type": "string", + "tags": [], + "label": "aggValueCountFnName", + "description": [], + "signature": [ + "\"aggValueCount\"" + ], + "path": "src/plugins/data/common/search/aggs/metrics/value_count_fn.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.autoInterval", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index c17b9a595d304..027b3d76bee80 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.search plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3086 | 34 | 2413 | 21 | +| 3094 | 34 | 2421 | 21 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index ed1cb304e6fc1..2f68c63587826 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewEditor plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] warning: 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. --- diff --git a/api_docs/data_view_field_editor.devdocs.json b/api_docs/data_view_field_editor.devdocs.json index 7f38835b2639d..6d4d840a9c85e 100644 --- a/api_docs/data_view_field_editor.devdocs.json +++ b/api_docs/data_view_field_editor.devdocs.json @@ -170,6 +170,117 @@ ], "functions": [], "interfaces": [ + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field", + "type": "Interface", + "tags": [], + "label": "Field", + "description": [ + "\nThe data model for the field editor" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nname / path used for the field" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field.type", + "type": "CompoundType", + "tags": [], + "label": "type", + "description": [ + "\nES type" + ], + "signature": [ + "\"boolean\" | \"date\" | \"keyword\" | \"ip\" | \"geo_point\" | \"long\" | \"double\" | \"composite\"" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field.script", + "type": "Object", + "tags": [], + "label": "script", + "description": [ + "\nsource of the runtime field script" + ], + "signature": [ + "{ source: string; } | undefined" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field.customLabel", + "type": "string", + "tags": [], + "label": "customLabel", + "description": [ + "\ncustom label for display" + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field.popularity", + "type": "number", + "tags": [], + "label": "popularity", + "description": [ + "\ncustom popularity" + ], + "signature": [ + "number | undefined" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false + }, + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.Field.format", + "type": "Object", + "tags": [], + "label": "format", + "description": [ + "\nconfiguration of the field format" + ], + "signature": [ + { + "pluginId": "fieldFormats", + "scope": "common", + "docId": "kibFieldFormatsPluginApi", + "section": "def-common.SerializedFieldFormat", + "text": "SerializedFieldFormat" + }, + "<{}, ", + "SerializableRecord", + "> | undefined" + ], + "path": "src/plugins/data_view_field_editor/public/types.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "dataViewFieldEditor", "id": "def-public.FormatEditorProps", @@ -381,7 +492,9 @@ "type": "Interface", "tags": [], "label": "OpenFieldEditorOptions", - "description": [], + "description": [ + "\nOptions for opening the field editor" + ], "path": "src/plugins/data_view_field_editor/public/open_editor.tsx", "deprecated": false, "children": [ @@ -391,7 +504,9 @@ "type": "Object", "tags": [], "label": "ctx", - "description": [], + "description": [ + "\ncontext containing the data view the field belongs to" + ], "signature": [ "{ dataView: ", { @@ -412,7 +527,9 @@ "type": "Function", "tags": [], "label": "onSave", - "description": [], + "description": [ + "\naction to take after field is saved" + ], "signature": [ "((field: ", { @@ -456,12 +573,36 @@ "type": "string", "tags": [], "label": "fieldName", - "description": [], + "description": [ + "\nfield to edit, for existing field" + ], "signature": [ "string | undefined" ], "path": "src/plugins/data_view_field_editor/public/open_editor.tsx", "deprecated": false + }, + { + "parentPluginId": "dataViewFieldEditor", + "id": "def-public.OpenFieldEditorOptions.fieldToCreate", + "type": "Object", + "tags": [], + "label": "fieldToCreate", + "description": [ + "\npre-selectable options for new field creation" + ], + "signature": [ + { + "pluginId": "dataViewFieldEditor", + "scope": "public", + "docId": "kibDataViewFieldEditorPluginApi", + "section": "def-public.Field", + "text": "Field" + }, + " | undefined" + ], + "path": "src/plugins/data_view_field_editor/public/open_editor.tsx", + "deprecated": false } ], "initialIsOpen": false @@ -527,7 +668,9 @@ "type": "Interface", "tags": [], "label": "PluginSetup", - "description": [], + "description": [ + "\nPublic setup contract of data view field editor" + ], "path": "src/plugins/data_view_field_editor/public/types.ts", "deprecated": false, "children": [ @@ -562,7 +705,9 @@ "type": "Interface", "tags": [], "label": "PluginStart", - "description": [], + "description": [ + "\nPublic start contract of data view field editor" + ], "path": "src/plugins/data_view_field_editor/public/types.ts", "deprecated": false, "children": [ @@ -572,7 +717,9 @@ "type": "Function", "tags": [], "label": "openEditor", - "description": [], + "description": [ + "\nmethod to open the data view field editor fly-out" + ], "signature": [ "(options: ", { diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 73b86d9bbed4b..8ed4c3151a99d 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewFieldEditor plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [App Services](https://github.com/orgs/elastic/teams/kibana-app-services | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 41 | 0 | 36 | 3 | +| 49 | 0 | 29 | 3 | ## Client diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index a42fafc5fa07e..5d5008515d608 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewManagement plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] warning: 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. --- diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index cdea7a2a4f3df..cf34d189d2a61 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -11160,7 +11160,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -11392,9 +11394,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index faaaffbfeb5bd..9ea5bd140131c 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViews plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] warning: 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. --- diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 4c398fd506e85..5365385ba7463 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataVisualizer plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] warning: 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. --- diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index fc4f8e7c711fe..90821e977b63f 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- @@ -53,7 +53,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | canvas | - | | | canvas | - | | | canvas | - | -| | management, spaces, ml, canvas, enterpriseSearch, osquery | - | +| | management, spaces, ml, canvas, enterpriseSearch, osquery, home | - | | | management, enterpriseSearch | - | | | enterpriseSearch | - | | | actions, ml, enterpriseSearch, savedObjectsTagging | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 8700a288b406e..5b6ba84b15f67 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- @@ -82,16 +82,16 @@ so TS and code-reference navigation might not highlight them. | | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context) | - | | | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | -| | [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | +| | [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | | | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getTypes), [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getTypes), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getTypes) | - | | | [state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/types/state.ts#:~:text=Render), [state.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/types/state.ts#:~:text=Render), [markdown.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts#:~:text=Render), [markdown.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/markdown.ts#:~:text=Render), [timefilterControl.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilterControl.ts#:~:text=Render), [timefilterControl.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/timefilterControl.ts#:~:text=Render), [pie.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/pie.ts#:~:text=Render), [pie.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/pie.ts#:~:text=Render), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/plot/index.ts#:~:text=Render), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/functions/plot/index.ts#:~:text=Render)+ 2 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context) | - | | | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getFunction) | - | -| | [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | +| | [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getFunctions), [functions.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.test.ts#:~:text=getFunctions) | - | | | [setup_expressions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/setup_expressions.ts#:~:text=getTypes), [application.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/application.tsx#:~:text=getTypes), [functions.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/server/routes/functions/functions.ts#:~:text=getTypes) | - | -| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context) | - | +| | [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/demodata/index.ts#:~:text=context), [embeddable.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/external/embeddable.ts#:~:text=context), [esdocs.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/esdocs.ts#:~:text=context), [escount.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts#:~:text=context), [filters.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/common/functions/filters.ts#:~:text=context), [neq.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts#:~:text=context), [index.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts#:~:text=context) | - | | | [home.component.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/components/home/home.component.tsx#:~:text=KibanaPageTemplate), [home.component.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/components/home/home.component.tsx#:~:text=KibanaPageTemplate), [home.component.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/canvas/public/components/home/home.component.tsx#:~:text=KibanaPageTemplate) | - | @@ -273,7 +273,8 @@ so TS and code-reference navigation might not highlight them. | | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/application.tsx#:~:text=RedirectAppLinks), [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/application.tsx#:~:text=RedirectAppLinks), [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/application.tsx#:~:text=RedirectAppLinks), [add_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/add_data/add_data.tsx#:~:text=RedirectAppLinks), [add_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/add_data/add_data.tsx#:~:text=RedirectAppLinks), [add_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/add_data/add_data.tsx#:~:text=RedirectAppLinks) | - | +| | [home.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/home.tsx#:~:text=KibanaPageTemplate), [home.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/home.tsx#:~:text=KibanaPageTemplate), [home.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/home.tsx#:~:text=KibanaPageTemplate) | - | +| | [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/application.tsx#:~:text=RedirectAppLinks), [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/application.tsx#:~:text=RedirectAppLinks), [application.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/application.tsx#:~:text=RedirectAppLinks), [add_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/add_data/add_data.tsx#:~:text=RedirectAppLinks), [add_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/add_data/add_data.tsx#:~:text=RedirectAppLinks), [add_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/add_data/add_data.tsx#:~:text=RedirectAppLinks), [manage_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/manage_data/manage_data.tsx#:~:text=RedirectAppLinks), [manage_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/manage_data/manage_data.tsx#:~:text=RedirectAppLinks), [manage_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/manage_data/manage_data.tsx#:~:text=RedirectAppLinks), [manage_data.tsx](https://github.com/elastic/kibana/tree/master/src/plugins/home/public/application/components/manage_data/manage_data.tsx#:~:text=RedirectAppLinks)+ 1 more | - | @@ -506,13 +507,13 @@ so TS and code-reference navigation might not highlight them. | | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | +| | [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | | | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | 8.8.0 This is relied on by the reporting feature, and should be removed once reporting migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/issues/19914 | -| | [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | -| | [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | +| | [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | +| | [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | | | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | 8.8.0 This is relied on by the reporting feature, and should be removed once reporting diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 90cdb88c76719..f22f5366de12b 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team summary: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- @@ -119,13 +119,13 @@ so TS and code-reference navigation might not highlight them. | | --------|-------|-----------|-----------| | spaces | | [on_post_auth_interceptor.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.ts#:~:text=getKibanaFeatures), [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=getKibanaFeatures), [on_post_auth_interceptor.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.test.ts#:~:text=getKibanaFeatures), [app_authorization.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 17 more | 8.8.0 | | spaces | | [spaces_usage_collector.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/plugin.ts#:~:text=license%24), [spaces_usage_collector.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.test.ts#:~:text=license%24), [plugin.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | 8.8.0 | -| security | | [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | +| security | | [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | | security | | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | 8.8.0 This is relied on by the reporting feature, and should be removed once reporting migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/issues/19914 | -| security | | [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | -| security | | [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | +| security | | [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | +| security | | [elasticsearch_role.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [role_utils.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/lib/role_utils.ts#:~:text=disabled), [primary_feature_privilege.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/model/primary_feature_privilege.ts#:~:text=disabled), [elasticsearch_role.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/roles/elasticsearch_role.test.ts#:~:text=disabled), [kibana_features.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts#:~:text=disabled), [put.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/put.test.ts#:~:text=disabled), [put_payload.test.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/routes/authorization/roles/model/put_payload.test.ts#:~:text=disabled) | 8.8.0 | | security | | [disable_ui_capabilities.ts](https://github.com/elastic/kibana/tree/master/x-pack/plugins/security/server/authorization/disable_ui_capabilities.ts#:~:text=requiredRoles) | 8.8.0 This is relied on by the reporting feature, and should be removed once reporting diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 60222078eda57..9ac7a72d498b7 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github summary: API docs for the devTools plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] warning: 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. --- diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 45d0050b1cc8f..2a85470ce6620 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github summary: API docs for the discover plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] warning: 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. --- diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index db63e68c44460..7d985ae3f37c5 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the discoverEnhanced plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] warning: 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. --- diff --git a/api_docs/elastic_apm_synthtrace.mdx b/api_docs/elastic_apm_synthtrace.mdx index c36caef8f8d99..13fd288cd2c64 100644 --- a/api_docs/elastic_apm_synthtrace.mdx +++ b/api_docs/elastic_apm_synthtrace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/elastic-apm-synthtrace title: "@elastic/apm-synthtrace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @elastic/apm-synthtrace plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@elastic/apm-synthtrace'] warning: 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. --- diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 19901ef7baadc..f6dbf15d7523e 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddable plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] warning: 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. --- diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index d38d9355b4af1..36e518e4a4c59 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddableEnhanced plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] warning: 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. --- diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 175b53c208516..6ca6ff487542c 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the encryptedSavedObjects plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] warning: 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. --- diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 8602d4912ab67..7db76930a2bfd 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the enterpriseSearch plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] warning: 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. --- diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index eedeccb9fa79d..991972ba6b32c 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github summary: API docs for the esUiShared plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] warning: 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. --- diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 8d2b8901ef022..c4ab23bab3f5a 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventAnnotation plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] warning: 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. --- diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index b8d7e127c2c4a..e8ba248d2a921 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventLog plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] warning: 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. --- diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index b3272bd7915f1..ad8f44e115bdf 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionError plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] warning: 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. --- diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index af5daf6b1cc04..5a05a426d3c9e 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionGauge plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] warning: 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. --- diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index eb66314db0c97..745cf29908745 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionHeatmap plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] warning: 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. --- diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 365204524afdf..0fd63a41b742a 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionImage plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] warning: 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. --- diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 232d9bcc89609..6ca3492e72bd7 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionLegacyMetricVis plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] warning: 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. --- diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 69127b95f6437..369868f2627d8 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetric plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] warning: 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. --- diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 0124949974691..93c3a75000f9d 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetricVis plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] warning: 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. --- diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index abe7e79bd5b97..b228122c8582a 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionPartitionVis plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] warning: 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. --- diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 5682ab533ae87..fe5dc2347bfe8 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRepeatImage plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] warning: 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. --- diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index b6f4af6c4fe09..2696406bea25e 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRevealImage plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] warning: 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. --- diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index ec420ee0a5c5b..c625e7680d886 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionShape plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] warning: 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. --- diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 19139335ba9cd..df130e23b62c1 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionTagcloud plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] warning: 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. --- diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index fa0985f05dd16..0f4d71a40d2ac 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionXY plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] warning: 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. --- diff --git a/api_docs/expressions.devdocs.json b/api_docs/expressions.devdocs.json index debb0fcd46543..5a5acc6595d1b 100644 --- a/api_docs/expressions.devdocs.json +++ b/api_docs/expressions.devdocs.json @@ -7953,7 +7953,7 @@ }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts" }, { "plugin": "canvas", @@ -7961,11 +7961,11 @@ }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts" }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts" }, { "plugin": "visTypeXy", @@ -11874,10 +11874,6 @@ "path": "src/plugins/expressions/common/service/expressions_services.ts", "deprecated": true, "references": [ - { - "plugin": "canvas", - "path": "x-pack/plugins/canvas/public/application.tsx" - }, { "plugin": "canvas", "path": "x-pack/plugins/canvas/server/routes/functions/functions.ts" @@ -18378,7 +18374,7 @@ }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts" }, { "plugin": "canvas", @@ -18386,11 +18382,11 @@ }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts" }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts" }, { "plugin": "visTypeXy", @@ -30181,7 +30177,7 @@ }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts" }, { "plugin": "canvas", @@ -30189,11 +30185,11 @@ }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/browser/escount.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts" }, { "plugin": "canvas", - "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/common/neq.ts" + "path": "x-pack/plugins/canvas/canvas_plugin_src/functions/server/pointseries/index.ts" }, { "plugin": "visTypeXy", @@ -31066,10 +31062,6 @@ "path": "src/plugins/expressions/common/service/expressions_services.ts", "deprecated": true, "references": [ - { - "plugin": "canvas", - "path": "x-pack/plugins/canvas/public/application.tsx" - }, { "plugin": "canvas", "path": "x-pack/plugins/canvas/server/routes/functions/functions.ts" diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 495ff0029117e..44150b58ccd23 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressions plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] warning: 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. --- diff --git a/api_docs/features.devdocs.json b/api_docs/features.devdocs.json index 3c5e6d30268ea..64be256167cf0 100644 --- a/api_docs/features.devdocs.json +++ b/api_docs/features.devdocs.json @@ -320,7 +320,7 @@ "references": [ { "plugin": "security", - "path": "x-pack/plugins/security/server/lib/role_utils.ts" + "path": "x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts" }, { "plugin": "security", @@ -328,7 +328,7 @@ }, { "plugin": "security", - "path": "x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts" + "path": "x-pack/plugins/security/server/lib/role_utils.ts" }, { "plugin": "security", @@ -1554,7 +1554,7 @@ "references": [ { "plugin": "security", - "path": "x-pack/plugins/security/server/lib/role_utils.ts" + "path": "x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts" }, { "plugin": "security", @@ -1562,7 +1562,7 @@ }, { "plugin": "security", - "path": "x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts" + "path": "x-pack/plugins/security/server/lib/role_utils.ts" }, { "plugin": "security", @@ -3254,7 +3254,7 @@ "references": [ { "plugin": "security", - "path": "x-pack/plugins/security/server/lib/role_utils.ts" + "path": "x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts" }, { "plugin": "security", @@ -3262,7 +3262,7 @@ }, { "plugin": "security", - "path": "x-pack/plugins/security/server/authorization/roles/elasticsearch_role.ts" + "path": "x-pack/plugins/security/server/lib/role_utils.ts" }, { "plugin": "security", diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 81da435cc1883..d995a85b724d1 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github summary: API docs for the features plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] warning: 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. --- diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index e4716963a319a..9e387fc36f729 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github summary: API docs for the fieldFormats plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] warning: 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. --- diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 1e4f1b75f78ad..d4cf35818988c 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github summary: API docs for the fileUpload plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] warning: 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. --- diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index b4c9f70575844..710982e7065b1 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -11154,7 +11154,7 @@ { "parentPluginId": "fleet", "id": "def-common.CreatePackagePolicyRequest.body", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "body", "description": [], @@ -11165,7 +11165,8 @@ "docId": "kibFleetPluginApi", "section": "def-common.NewPackagePolicy", "text": "NewPackagePolicy" - } + }, + " & { force?: boolean | undefined; }" ], "path": "x-pack/plugins/fleet/common/types/rest_spec/package_policy.ts", "deprecated": false @@ -13831,6 +13832,32 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.GetAgentTagsResponse", + "type": "Interface", + "tags": [], + "label": "GetAgentTagsResponse", + "description": [], + "path": "x-pack/plugins/fleet/common/types/rest_spec/agent.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-common.GetAgentTagsResponse.items", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + "string[]" + ], + "path": "x-pack/plugins/fleet/common/types/rest_spec/agent.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.GetCategoriesRequest", @@ -20248,7 +20275,7 @@ "section": "def-common.ValueOf", "text": "ValueOf" }, - "<{ readonly Active: \"active\"; readonly Inactive: \"inactive\"; }>; name: string; description?: string | undefined; updated_at: string; namespace: string; updated_by: string; is_managed: boolean; is_default?: boolean | undefined; is_default_fleet_server?: boolean | undefined; has_fleet_server?: boolean | undefined; monitoring_enabled?: (\"metrics\" | \"logs\")[] | undefined; unenroll_timeout?: number | undefined; is_preconfigured?: boolean | undefined; data_output_id?: string | null | undefined; monitoring_output_id?: string | null | undefined; download_source_id?: string | null | undefined; package_policies: string[] | ", + "<{ readonly Active: \"active\"; readonly Inactive: \"inactive\"; }>; name: string; namespace: string; description?: string | undefined; updated_at: string; updated_by: string; is_managed: boolean; is_default?: boolean | undefined; is_default_fleet_server?: boolean | undefined; has_fleet_server?: boolean | undefined; monitoring_enabled?: (\"metrics\" | \"logs\")[] | undefined; unenroll_timeout?: number | undefined; is_preconfigured?: boolean | undefined; data_output_id?: string | null | undefined; monitoring_output_id?: string | null | undefined; download_source_id?: string | null | undefined; package_policies: string[] | ", { "pluginId": "fleet", "scope": "common", @@ -22295,7 +22322,7 @@ "label": "PackagePolicySOAttributes", "description": [], "signature": [ - "{ name: string; package?: ", + "{ name: string; namespace: string; package?: ", { "pluginId": "fleet", "scope": "common", @@ -22303,7 +22330,7 @@ "section": "def-common.PackagePolicyPackage", "text": "PackagePolicyPackage" }, - " | undefined; description?: string | undefined; enabled: boolean; updated_at: string; namespace: string; created_at: string; created_by: string; updated_by: string; vars?: ", + " | undefined; description?: string | undefined; enabled: boolean; updated_at: string; created_at: string; created_by: string; updated_by: string; vars?: ", { "pluginId": "fleet", "scope": "common", @@ -23225,6 +23252,16 @@ "description": [], "path": "x-pack/plugins/fleet/common/constants/routes.ts", "deprecated": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.AGENT_API_ROUTES.LIST_TAGS_PATTERN", + "type": "string", + "tags": [], + "label": "LIST_TAGS_PATTERN", + "description": [], + "path": "x-pack/plugins/fleet/common/constants/routes.ts", + "deprecated": false } ], "initialIsOpen": false @@ -23972,6 +24009,21 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-common.agentRouteService.getListTagsPath", + "type": "Function", + "tags": [], + "label": "getListTagsPath", + "description": [], + "signature": [ + "() => string" + ], + "path": "x-pack/plugins/fleet/common/services/routes.ts", + "deprecated": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 673ffd7bc97fb..0b1cca6a1a0ad 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github summary: API docs for the fleet plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Fleet](https://github.com/orgs/elastic/teams/fleet) for questions regar | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1537 | 8 | 1405 | 10 | +| 1541 | 8 | 1409 | 10 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 1397a035d6aa9..92002dcab1193 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the globalSearch plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] warning: 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. --- diff --git a/api_docs/home.mdx b/api_docs/home.mdx index fb3cb37e32840..66e5a8efa84d9 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github summary: API docs for the home plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] warning: 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. --- diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 5a2f6de2a153b..f0315e1eb4c6b 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexLifecycleManagement plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] warning: 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. --- diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index d45b99ea439d5..9a229d1767a1b 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexManagement plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] warning: 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. --- diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 3cfb85eb02149..484b674317861 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github summary: API docs for the infra plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] warning: 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. --- diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index f1ab6a34dca51..ce77e4c344138 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github summary: API docs for the inspector plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] warning: 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. --- diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 1057cd01ec9c7..4ee201ee1ccb0 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github summary: API docs for the interactiveSetup plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] warning: 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. --- diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 1f538f24ff5ce..608a56c34803e 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ace plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] warning: 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. --- diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 2f3e318399ca9..b5f835b4eb4b7 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-components plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] warning: 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. --- diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index a4364b69bf804..8a54ec27d2103 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] warning: 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. --- diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 8237e1823c1e2..5ca3cff2d7ae1 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/alerts plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] warning: 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. --- diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index bcbcd23d29d5d..79315e2449002 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] warning: 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. --- diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 8c17f5eea1c48..92fba9f9ab3e1 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-client plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 58f9460e8cc34..9184e3c84aa40 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index b9c6c63a52837..b79f7e5a5fdcc 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 5760168691ff5..1fad9c6f261b5 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 84dd085574922..f2d25e7dfc4d4 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] warning: 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. --- diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index c2eb0136d6093..6abab19dfa83e 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-config-loader plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] warning: 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. --- diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 460805a5fb39d..552ee5e273368 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] warning: 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. --- diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 13f5bbd65400e..d2528d087969d 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/axe-config plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] warning: 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. --- diff --git a/api_docs/kbn_bazel_packages.mdx b/api_docs/kbn_bazel_packages.mdx index 6444e34bdf4d7..6ecd4e27ad897 100644 --- a/api_docs/kbn_bazel_packages.mdx +++ b/api_docs/kbn_bazel_packages.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-bazel-packages title: "@kbn/bazel-packages" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/bazel-packages plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bazel-packages'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 81fad440a6c28..b467a02387373 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-core plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 8191aa89ffd1f..dad1a02ab2563 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index c64b5c3265c9d..879465b4f9dfb 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] warning: 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. --- diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 0344d2f8611a1..0f191d9c3ca5c 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/cli-dev-mode plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] warning: 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. --- diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 7aebcd60f94e7..82dc60459f29a 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/coloring plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] warning: 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. --- diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index ea3fdb7278815..bec7c1aa5b8a5 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] warning: 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. --- diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 6abf693f2b890..0782fd09fb8b0 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] warning: 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. --- diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index f74c5c397e633..71d7e7775e838 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-schema plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 1b0bff6e47699..dbba8497b96f5 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 802f2afde9052..12014d2a06644 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index ba9648170c925..34ed5252ed0e7 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index abf6ecd29afed..997647a851cfa 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 9f3757ecd60fe..9840f5040b9a6 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 9214d4630d364..e9da96f84e096 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 995f3f40a3c43..25067777a1bd2 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 6043b49384639..bca9a29aa9dd5 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-common plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] warning: 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. --- diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 1770d4fb9bffb..eace6c7e5d171 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 91ca0d26a1d91..dd00fa47b1c89 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index a9ae9a29cea73..35f3704702f12 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-config-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 2588bd484a5e7..572ac6ccad16a 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 0ccb7015ddc6d..2e290bb7fd2c7 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 9d003ec4cc742..a94672b7473b0 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index be6e6e89eccc6..c41431205bfce 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-common plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 3c13531c11286..5a573b500e069 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index a48729d788b48..29944d9489357 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 7ec4297504729..1ee8d18e9285d 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index b3d7b83af1675..a3014be3dc0ab 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index ac9f3dd92cb5b..623b01dcf4934 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json b/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json index 5c8e817862e05..6c37dcaa78b83 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json @@ -251,7 +251,17 @@ "SearchRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; eql: ", + " | undefined]>; cluster: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "server", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-server.DeeplyMockedApi", + "text": "DeeplyMockedApi" + }, + "<", + "default", + ">; eql: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -491,17 +501,7 @@ "ClearScrollRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; cluster: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "server", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-server.DeeplyMockedApi", - "text": "DeeplyMockedApi" - }, - "<", - "default", - ">; count: ", + " | undefined]>; count: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -1359,7 +1359,17 @@ "SearchRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; eql: ", + " | undefined]>; cluster: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "server", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-server.DeeplyMockedApi", + "text": "DeeplyMockedApi" + }, + "<", + "default", + ">; eql: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -1599,17 +1609,7 @@ "ClearScrollRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; cluster: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "server", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-server.DeeplyMockedApi", - "text": "DeeplyMockedApi" - }, - "<", - "default", - ">; count: ", + " | undefined]>; count: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -2423,7 +2423,17 @@ "SearchRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; eql: ", + " | undefined]>; cluster: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "server", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-server.DeeplyMockedApi", + "text": "DeeplyMockedApi" + }, + "<", + "default", + ">; eql: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -2663,17 +2673,7 @@ "ClearScrollRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; cluster: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "server", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-server.DeeplyMockedApi", - "text": "DeeplyMockedApi" - }, - "<", - "default", - ">; count: ", + " | undefined]>; count: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -3552,7 +3552,17 @@ "SearchRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; eql: ", + " | undefined]>; cluster: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "server", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-server.DeeplyMockedApi", + "text": "DeeplyMockedApi" + }, + "<", + "default", + ">; eql: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", @@ -3792,17 +3802,7 @@ "ClearScrollRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; cluster: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "server", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-server.DeeplyMockedApi", - "text": "DeeplyMockedApi" - }, - "<", - "default", - ">; count: ", + " | undefined]>; count: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "server", diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index ce313726ce4ec..f03a11de301cc 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server.devdocs.json b/api_docs/kbn_core_elasticsearch_server.devdocs.json index 34fcca1ce932d..c15c677a756a6 100644 --- a/api_docs/kbn_core_elasticsearch_server.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_server.devdocs.json @@ -864,7 +864,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -1096,9 +1098,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -2455,7 +2455,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -2687,9 +2689,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -3658,7 +3658,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -3890,9 +3892,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -5095,7 +5095,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -5327,9 +5329,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 4f54deec4a46f..9a6b4dd87fed9 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json b/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json index 90140f7c867b8..5575c998117a1 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json @@ -78,7 +78,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -310,9 +312,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -1637,7 +1637,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -1869,9 +1871,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index a245dd8c3e868..397ea32ff4746 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index ea9ee00142b8a..ff20309df2980 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 4944f90328807..8c4278073b895 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 816511b4bcc36..baf0721d910bb 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 4f50244edc99d..a922d66bc7ca6 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index a36860b255061..db7ff979a60f8 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index aacf458110749..2fb078b1c28f9 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 397e43f7e2299..b191a1e8b646d 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-common plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index bd9e9f1605d66..82e5332623438 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 8464b8aa5b158..aa9b87e104872 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 593fb884cd1cf..d0ec1247f7b23 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index a75b4c96775df..b000d4a834415 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index bc3abd9f2efaa..0f32d7526f5d2 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index ccc8e7c05b72d..6651293333944 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index f4e6ff72c7448..773e1296da695 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 10415ce0daf10..693ce67a12b30 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index 65acbf6c0b3c3..effd9e67eeab6 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-common plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] warning: 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. --- diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index ad51debd76a56..9cee569074734 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 60236d487f84a..a633f7efd836f 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index cf10d83665e90..97f52dab0bbdb 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 356aef7943208..f1c1d6ebe2705 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 0add63b4b81ed..7d2133116f97c 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index b978ae048a09b..2073c8c70051a 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 44b7bd58b4fbe..a220c0b7e7b3d 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 7a4b1a2682887..277e129849424 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index df6e704caad33..06b76282765dc 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index a442b21efbc88..8bd39159c955a 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index a18af4967bb96..ea82d4bf17b02 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index ec0b1925575a6..c18655f052588 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 35fc812231a86..8965cccb526bc 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 0fb30630f1e4c..bf7ca8ef72dd0 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index bf6eb4ccdc65b..47df69f8ff345 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 4f450dcad814a..c2fd38ade32df 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index d0ca7e19a2b23..59f9f93c54fbd 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 78bba5b5be9c8..5388233a7964c 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 43ac9a0b254ba..f8dfa26237024 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] warning: 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. --- diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 286e3baa38e99..ba9ea12edab69 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] warning: 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. --- 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 5f53a7d96ad16..255151010e1e8 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index dc289ede9ef84..575096875f269 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 0543918c258f1..cd53e021c2a4c 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 5f542c0148e47..698bd1d4ee9ce 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 48b7968f2151e..ed0cea5a682ff 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 48a062f1b5a5f..299e7cfc12586 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 7da614bc77c67..db22615e409d0 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 40e5efa51cbc6..df75d7396bffb 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] warning: 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. --- diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index a44ee989a88c4..1079df724a69c 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] warning: 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. --- diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 9bd514039791d..66da1fdd25ace 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto-browser plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] warning: 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. --- diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index cf247471d7fd9..5d293f8dc0984 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/datemath plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] warning: 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. --- diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 017b9604ae446..6119cb88e81c5 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-errors plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] warning: 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. --- diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 33659d48e96fd..fa520338d0e4c 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-runner plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] warning: 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. --- diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 319e5586d35d5..4da705e53d899 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-proc-runner plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] warning: 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. --- diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 0d72af44aaf89..2c2d3f1c76762 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] warning: 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. --- diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 6e40d06996033..db92240858158 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/doc-links plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] warning: 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. --- diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 28fd79184e220..94116f14a5085 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/docs-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] warning: 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. --- diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 8938d1ed2e16d..60ea8aa5846ca 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-archiver plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] warning: 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. --- diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 0c1f3228a831f..c8a2401523d60 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-errors plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] warning: 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. --- diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 7184c9741bcce..f297315405e5d 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-query plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] warning: 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. --- diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 8754bafc3bc3f..e825b62d1f2bc 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] warning: 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. --- diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index db6964da3df6d..75a2417b03c0d 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/field-types plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] warning: 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. --- diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 352b796c58971..989ffdcf0d686 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/find-used-node-modules plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] warning: 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. --- diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 63d0e276c9e0b..5d76e00f4934c 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/generate plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] warning: 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. --- diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 16575004f0ae8..91fe3bea9dfb4 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/handlebars plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] warning: 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. --- diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index dab741464b2fe..03c180291c571 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/hapi-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] warning: 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. --- diff --git a/api_docs/kbn_home_sample_data_cards.mdx b/api_docs/kbn_home_sample_data_cards.mdx index 819636e3003d9..82868d9f0b12d 100644 --- a/api_docs/kbn_home_sample_data_cards.mdx +++ b/api_docs/kbn_home_sample_data_cards.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-cards title: "@kbn/home-sample-data-cards" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/home-sample-data-cards plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-cards'] warning: 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. --- diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index d7c6246e716bf..ea872236e1fc1 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/i18n plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] warning: 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. --- diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 297f02c37ccfc..744f1883a188b 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/import-resolver plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] warning: 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. --- diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index d49c720284ba2..c8366d0eb83a3 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/interpreter plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] warning: 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. --- diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 6b74d2f52aa0b..7bfe1bfd881c2 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/io-ts-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 30243df5946b0..6689bb642608a 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/jest-serializers plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] warning: 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. --- diff --git a/api_docs/kbn_kibana_json_schema.mdx b/api_docs/kbn_kibana_json_schema.mdx index 9ec81b2617532..76e81086a1a45 100644 --- a/api_docs/kbn_kibana_json_schema.mdx +++ b/api_docs/kbn_kibana_json_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-json-schema title: "@kbn/kibana-json-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/kibana-json-schema plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-json-schema'] warning: 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. --- diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 576002e22bda2..147007f7953aa 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] warning: 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. --- diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 22b0aee3554b9..7608ecc255c8c 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging-mocks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] warning: 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. --- diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 2595a8c9b0441..f9d10058276dd 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/mapbox-gl plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] warning: 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. --- diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 5c589ffc87d53..404cb6a701aee 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-agg-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] warning: 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. --- diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index c0becc0d82edf..b5875455eea84 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] warning: 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. --- diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 8252825eb29ff..fccf4dfb16c01 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-string-hash plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] warning: 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. --- diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 0da82fc17f868..14fb34fd96b62 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/monaco plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] warning: 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. --- diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 5297efc966986..7217e44595c97 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] warning: 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. --- diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 233b9b1883c07..aecdf5ebd52bc 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] warning: 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. --- diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 5a9588db59b5d..11057410d150c 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] warning: 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. --- diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 932b042f139d7..4d633bde53096 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-generator plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] warning: 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. --- diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index ea87b55d7218e..54420007501f6 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-helpers plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] warning: 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. --- diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 3425b53186a54..f16cba03d8357 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/react-field plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] warning: 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. --- diff --git a/api_docs/kbn_rule_data_utils.devdocs.json b/api_docs/kbn_rule_data_utils.devdocs.json index cb7a49077cc22..613fa11df6755 100644 --- a/api_docs/kbn_rule_data_utils.devdocs.json +++ b/api_docs/kbn_rule_data_utils.devdocs.json @@ -1009,7 +1009,7 @@ "label": "TechnicalRuleDataFieldName", "description": [], "signature": [ - "\"tags\" | \"kibana\" | \"@timestamp\" | \"event.action\" | \"kibana.alert.rule.parameters\" | \"kibana.alert.rule.rule_type_id\" | \"kibana.alert.rule.consumer\" | \"kibana.alert.rule.producer\" | \"kibana.space_ids\" | \"kibana.alert.uuid\" | \"kibana.alert.instance.id\" | \"kibana.alert.start\" | \"kibana.alert.end\" | \"kibana.alert.duration.us\" | \"kibana.alert.severity\" | \"kibana.alert.status\" | \"kibana.version\" | \"ecs.version\" | \"kibana.alert.risk_score\" | \"kibana.alert.workflow_status\" | \"kibana.alert.workflow_user\" | \"kibana.alert.workflow_reason\" | \"kibana.alert.system_status\" | \"kibana.alert.action_group\" | \"kibana.alert.reason\" | \"kibana.alert.rule.author\" | \"kibana.alert.rule.category\" | \"kibana.alert.rule.uuid\" | \"kibana.alert.rule.created_at\" | \"kibana.alert.rule.created_by\" | \"kibana.alert.rule.description\" | \"kibana.alert.rule.enabled\" | \"kibana.alert.rule.execution.uuid\" | \"kibana.alert.rule.from\" | \"kibana.alert.rule.interval\" | \"kibana.alert.rule.license\" | \"kibana.alert.rule.name\" | \"kibana.alert.rule.note\" | \"kibana.alert.rule.references\" | \"kibana.alert.rule.rule_id\" | \"kibana.alert.rule.rule_name_override\" | \"kibana.alert.rule.tags\" | \"kibana.alert.rule.to\" | \"kibana.alert.rule.type\" | \"kibana.alert.rule.updated_at\" | \"kibana.alert.rule.updated_by\" | \"kibana.alert.rule.version\" | \"event.kind\" | \"event.module\" | \"kibana.alert.evaluation.threshold\" | \"kibana.alert.evaluation.value\" | \"kibana.alert\" | \"kibana.alert.building_block_type\" | \"kibana.alert.rule\" | \"kibana.alert.rule.exceptions_list\" | \"kibana.alert.rule.namespace\"" + "\"tags\" | \"kibana\" | \"@timestamp\" | \"event.action\" | \"kibana.alert.rule.parameters\" | \"kibana.alert.rule.rule_type_id\" | \"kibana.alert.rule.consumer\" | \"kibana.alert.rule.producer\" | \"kibana.space_ids\" | \"kibana.alert.uuid\" | \"kibana.alert.instance.id\" | \"kibana.alert.start\" | \"kibana.alert.end\" | \"kibana.alert.duration.us\" | \"kibana.alert.severity\" | \"kibana.alert.status\" | \"kibana.version\" | \"ecs.version\" | \"kibana.alert.risk_score\" | \"kibana.alert.workflow_status\" | \"kibana.alert.workflow_user\" | \"kibana.alert.workflow_reason\" | \"kibana.alert.system_status\" | \"kibana.alert.action_group\" | \"kibana.alert.reason\" | \"kibana.alert.rule.author\" | \"kibana.alert.rule.category\" | \"kibana.alert.rule.uuid\" | \"kibana.alert.rule.created_at\" | \"kibana.alert.rule.created_by\" | \"kibana.alert.rule.description\" | \"kibana.alert.rule.enabled\" | \"kibana.alert.rule.execution.uuid\" | \"kibana.alert.rule.from\" | \"kibana.alert.rule.interval\" | \"kibana.alert.rule.license\" | \"kibana.alert.rule.name\" | \"kibana.alert.rule.note\" | \"kibana.alert.rule.references\" | \"kibana.alert.rule.rule_id\" | \"kibana.alert.rule.rule_name_override\" | \"kibana.alert.rule.tags\" | \"kibana.alert.rule.to\" | \"kibana.alert.rule.type\" | \"kibana.alert.rule.updated_at\" | \"kibana.alert.rule.updated_by\" | \"kibana.alert.rule.version\" | \"event.kind\" | \"event.module\" | \"kibana.alert.evaluation.threshold\" | \"kibana.alert.evaluation.value\" | \"kibana.alert.building_block_type\" | \"kibana.alert.rule.exceptions_list\" | \"kibana.alert.rule.namespace\" | \"kibana.alert\" | \"kibana.alert.rule\"" ], "path": "packages/kbn-rule-data-utils/src/technical_field_names.ts", "deprecated": false, diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index ecfd0baeafc49..12d25107617f1 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/rule-data-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] warning: 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. --- diff --git a/api_docs/kbn_scalability_simulation_generator.mdx b/api_docs/kbn_scalability_simulation_generator.mdx index 7c81f25980a85..e351e15f85945 100644 --- a/api_docs/kbn_scalability_simulation_generator.mdx +++ b/api_docs/kbn_scalability_simulation_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-scalability-simulation-generator title: "@kbn/scalability-simulation-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/scalability-simulation-generator plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scalability-simulation-generator'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 7ca8d7e4409ad..fa556968c7fd1 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_es_utils.devdocs.json b/api_docs/kbn_securitysolution_es_utils.devdocs.json index 69ef8607a3716..9a04e2bad87aa 100644 --- a/api_docs/kbn_securitysolution_es_utils.devdocs.json +++ b/api_docs/kbn_securitysolution_es_utils.devdocs.json @@ -422,7 +422,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -650,9 +652,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", @@ -1664,7 +1664,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -1892,9 +1894,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 0dfe99a6afd46..7da8265ea3202 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index c7db4caa23acc..754259715d87b 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.devdocs.json b/api_docs/kbn_securitysolution_io_ts_alerting_types.devdocs.json index 91614a6831f7c..3254f3ff0380c 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.devdocs.json @@ -846,7 +846,7 @@ "label": "Type", "description": [], "signature": [ - "\"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\"" + "\"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\" | \"new_terms\"" ], "path": "packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts", "deprecated": false, @@ -860,7 +860,7 @@ "label": "TypeOrUndefined", "description": [], "signature": [ - "\"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\" | undefined" + "\"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\" | \"new_terms\" | undefined" ], "path": "packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts", "deprecated": false, @@ -2833,7 +2833,7 @@ "description": [], "signature": [ "KeyofC", - "<{ eql: null; machine_learning: null; query: null; saved_query: null; threshold: null; threat_match: null; }>" + "<{ eql: null; machine_learning: null; query: null; saved_query: null; threshold: null; threat_match: null; new_terms: null; }>" ], "path": "packages/kbn-securitysolution-io-ts-alerting-types/src/type/index.ts", "deprecated": false, @@ -2850,7 +2850,7 @@ "UnionC", "<[", "KeyofC", - "<{ eql: null; machine_learning: null; query: null; saved_query: null; threshold: null; threat_match: null; }>, ", + "<{ eql: null; machine_learning: null; query: null; saved_query: null; threshold: null; threat_match: null; new_terms: null; }>, ", "UndefinedC", "]>" ], diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 7de804c412eaf..be8034e0b7157 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 0cab345c37d28..5248e893b276e 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_types.devdocs.json b/api_docs/kbn_securitysolution_io_ts_types.devdocs.json index 88eded8297819..0832cc7688b06 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.devdocs.json +++ b/api_docs/kbn_securitysolution_io_ts_types.devdocs.json @@ -115,6 +115,95 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-types", + "id": "def-common.LimitedSizeArray", + "type": "Function", + "tags": [], + "label": "LimitedSizeArray", + "description": [], + "signature": [ + "({ codec, minSize, maxSize, name, }: { codec: C; minSize?: number | undefined; maxSize?: number | undefined; name?: string | undefined; }) => ", + "Type", + "<", + "TypeOf", + "[], ", + "TypeOf", + "[], unknown>" + ], + "path": "packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/securitysolution-io-ts-types", + "id": "def-common.LimitedSizeArray.$1", + "type": "Object", + "tags": [], + "label": "{\n codec,\n minSize,\n maxSize,\n name = `LimitedSizeArray<${codec.name}>`,\n}", + "description": [], + "path": "packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "@kbn/securitysolution-io-ts-types", + "id": "def-common.LimitedSizeArray.$1.codec", + "type": "Uncategorized", + "tags": [], + "label": "codec", + "description": [], + "signature": [ + "C" + ], + "path": "packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts", + "deprecated": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-types", + "id": "def-common.LimitedSizeArray.$1.minSize", + "type": "number", + "tags": [], + "label": "minSize", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts", + "deprecated": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-types", + "id": "def-common.LimitedSizeArray.$1.maxSize", + "type": "number", + "tags": [], + "label": "maxSize", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts", + "deprecated": false + }, + { + "parentPluginId": "@kbn/securitysolution-io-ts-types", + "id": "def-common.LimitedSizeArray.$1.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-securitysolution-io-ts-types/src/limited_size_array/index.ts", + "deprecated": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-io-ts-types", "id": "def-common.NonEmptyArray", diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index b2dc14154d537..38c4020b6208d 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 26 | 0 | +| 54 | 0 | 32 | 0 | ## Common diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index e70d76b16b7f2..bc16ab6dab5de 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index f68b381acb1b5..16bba69c50a76 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 17dc6ff4d5bc9..87d7dbf950524 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index e8a4b4a3bc140..ec70a2bf5726a 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 32049ff4a6765..bb8c9fd5213bc 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_rules.devdocs.json b/api_docs/kbn_securitysolution_rules.devdocs.json index 655b25e326c28..f7c30d88d58f1 100644 --- a/api_docs/kbn_securitysolution_rules.devdocs.json +++ b/api_docs/kbn_securitysolution_rules.devdocs.json @@ -72,7 +72,7 @@ "label": "isRuleType", "description": [], "signature": [ - "(ruleType: unknown) => ruleType is \"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\"" + "(ruleType: unknown) => ruleType is \"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\" | \"new_terms\"" ], "path": "packages/kbn-securitysolution-rules/src/utils.ts", "deprecated": false, @@ -195,6 +195,20 @@ "deprecated": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/securitysolution-rules", + "id": "def-common.NEW_TERMS_RULE_TYPE_ID", + "type": "string", + "tags": [], + "label": "NEW_TERMS_RULE_TYPE_ID", + "description": [], + "signature": [ + "\"siem.newTermsRule\"" + ], + "path": "packages/kbn-securitysolution-rules/src/rule_type_constants.ts", + "deprecated": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/securitysolution-rules", "id": "def-common.QUERY_RULE_TYPE_ID", @@ -217,7 +231,7 @@ "label": "RuleType", "description": [], "signature": [ - "\"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\"" + "\"eql\" | \"query\" | \"threshold\" | \"machine_learning\" | \"saved_query\" | \"threat_match\" | \"new_terms\"" ], "path": "packages/kbn-securitysolution-rules/src/rule_type_mappings.ts", "deprecated": false, @@ -231,7 +245,7 @@ "label": "RuleTypeId", "description": [], "signature": [ - "\"siem.eqlRule\" | \"siem.indicatorRule\" | \"siem.mlRule\" | \"siem.queryRule\" | \"siem.savedQueryRule\" | \"siem.thresholdRule\"" + "\"siem.eqlRule\" | \"siem.indicatorRule\" | \"siem.mlRule\" | \"siem.queryRule\" | \"siem.savedQueryRule\" | \"siem.thresholdRule\" | \"siem.newTermsRule\"" ], "path": "packages/kbn-securitysolution-rules/src/rule_type_mappings.ts", "deprecated": false, @@ -372,6 +386,19 @@ ], "path": "packages/kbn-securitysolution-rules/src/rule_type_mappings.ts", "deprecated": false + }, + { + "parentPluginId": "@kbn/securitysolution-rules", + "id": "def-common.ruleTypeMappings.new_terms", + "type": "string", + "tags": [], + "label": "new_terms", + "description": [], + "signature": [ + "\"siem.newTermsRule\"" + ], + "path": "packages/kbn-securitysolution-rules/src/rule_type_mappings.ts", + "deprecated": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 93571fe88ac6b..61d8b360ce064 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-rules plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 24 | 0 | 21 | 0 | +| 26 | 0 | 23 | 0 | ## Common diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 484d5a7edb1a6..e396176be6de4 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index d0bd223287c16..a0256eddd88f1 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] warning: 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. --- diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 5f205fd84bcf2..3fac51050b25c 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-http-tools plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] warning: 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. --- diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index c7463d5124ca5..c2ca0ce4cad77 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-route-repository plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index ced61b6f38f3e..09f37df8be92e 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 59bb08c3c821c..f73093e1d0336 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_components.mdx b/api_docs/kbn_shared_ux_components.mdx index d075a8dec67bd..dc4b426beb955 100644 --- a/api_docs/kbn_shared_ux_components.mdx +++ b/api_docs/kbn_shared_ux_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-components title: "@kbn/shared-ux-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-components plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-components'] warning: 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. --- 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 912328432fa07..acdaf9eb28cf2 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] warning: 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. --- 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 6fd8a00d23d42..21d297bc07199 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 3921f1b5b20f2..df6a15a59b826 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] warning: 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. --- 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 5be5bc806857b..28ed692bd6db0 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_services.mdx b/api_docs/kbn_shared_ux_services.mdx index f424253222c18..0111abfff4225 100644 --- a/api_docs/kbn_shared_ux_services.mdx +++ b/api_docs/kbn_shared_ux_services.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-services title: "@kbn/shared-ux-services" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-services plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-services'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_storybook.mdx b/api_docs/kbn_shared_ux_storybook.mdx index 0b8a44c7ed3c9..b78f584cd1d8f 100644 --- a/api_docs/kbn_shared_ux_storybook.mdx +++ b/api_docs/kbn_shared_ux_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook title: "@kbn/shared-ux-storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-storybook plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 94b7400e26ce9..ae1d4d795c056 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-utility plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] warning: 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. --- diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 4d30563f0472e..56a9ba3444920 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/some-dev-log plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] warning: 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. --- diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index a03553ab2226f..084a960f07d9c 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/sort-package-json plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] warning: 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. --- diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 14e372a11b46c..da32e331c6ce3 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/std plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] warning: 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. --- diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index c5a91c587880a..c3212c6b1c063 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] warning: 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. --- diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index ecd444d79ef9f..18ba72061b018 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/storybook plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] warning: 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. --- diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 279da0e20e252..74c06df376185 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/telemetry-tools plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] warning: 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. --- diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 5931e2a461f9a..54bf10f065019 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] warning: 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. --- diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 39b38ded78fb8..24700c156b5a4 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test-jest-helpers plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] warning: 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. --- diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 022b568ba89fa..6233848f6ce9e 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/tooling-log plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] warning: 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. --- diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index 5f4103d3353f9..4fb2a9ae3105f 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] warning: 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. --- diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index a5c2dc2735f19..b507e165be88b 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer-core plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] warning: 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. --- diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index cfcba3f2617ea..c8a3df54b8200 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/typed-react-router-config plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] warning: 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. --- diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 27fa5bee06190..361ab0db49798 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ui-theme plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] warning: 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. --- diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 8d1a50f622a85..888b491059797 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] warning: 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. --- diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 8c04ac129fdbb..391d1479a3a64 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types-jest plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] warning: 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. --- diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 71490fcf884d1..2d252321b43ea 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] warning: 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. --- diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 95655debe2d93..51188323fbf1a 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] warning: 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. --- diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 21eb07803b791..db4e630e4f7c2 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaOverview plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] warning: 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. --- diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 3d697378ee293..2b8ec3ae15917 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -1155,6 +1155,18 @@ { "plugin": "osquery", "path": "x-pack/plugins/osquery/public/components/empty_state.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/home.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/home.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/home.tsx" } ], "children": [ @@ -2067,6 +2079,26 @@ { "plugin": "home", "path": "src/plugins/home/public/application/components/add_data/add_data.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/manage_data/manage_data.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/manage_data/manage_data.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/manage_data/manage_data.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/manage_data/manage_data.tsx" + }, + { + "plugin": "home", + "path": "src/plugins/home/public/application/components/manage_data/manage_data.tsx" } ], "children": [ diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index dbc0a2280b085..ece65df3d66e3 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaReact plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] warning: 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. --- diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 6db935f383b05..d1401bf1d3359 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaUtils plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] warning: 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. --- diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index c4e9f87be81e2..6a0c7601c3330 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github summary: API docs for the kubernetesSecurity plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] warning: 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. --- diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 82c63213914de..0fab8f7b6efad 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github summary: API docs for the lens plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] warning: 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. --- diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index dfc74c4453659..880956430495c 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseApiGuard plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] warning: 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. --- diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 7f03b02317db6..d6b515b34f414 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseManagement plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] warning: 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. --- diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 0ef77ee5e15b9..858a255b3920f 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github summary: API docs for the licensing plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] warning: 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. --- diff --git a/api_docs/lists.devdocs.json b/api_docs/lists.devdocs.json index 499891e69adff..b996412bec0b1 100644 --- a/api_docs/lists.devdocs.json +++ b/api_docs/lists.devdocs.json @@ -3997,7 +3997,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -4229,9 +4231,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 09d9e7d561925..7a37aaae8c9bb 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github summary: API docs for the lists plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] warning: 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. --- diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 7888d4ee4dfb8..5a8ef4efd3e66 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github summary: API docs for the management plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] warning: 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. --- diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index 4732fd45134ad..050fc20374fa3 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -3458,7 +3458,11 @@ "signature": [ "{ currentLayerType: string; numberOfJoins: number; onChange: (...args: ", "OnSourceChangeArgs", - "[]) => Promise; }" + "[]) => Promise; onStyleDescriptorChange: (styleDescriptor: ", + "StyleDescriptor", + ") => void; style: ", + "IStyle", + "; }" ], "path": "x-pack/plugins/maps/public/classes/sources/source.ts", "deprecated": false, diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index c95018c79778b..044ad81986586 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github summary: API docs for the maps plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [GIS](https://github.com/orgs/elastic/teams/kibana-gis) for questions re | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 250 | 0 | 249 | 24 | +| 250 | 0 | 249 | 25 | ## Client diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 53d0c7877bf85..b1883fdf3fc65 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github summary: API docs for the mapsEms plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] warning: 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. --- diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index db60536fd0ff3..48994a2ca2028 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github summary: API docs for the ml plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] warning: 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. --- diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 27bcb23624c38..6347ed3c81845 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoring plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] warning: 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. --- diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index ce91bad4a8357..515f3b315e19d 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoringCollection plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] warning: 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. --- diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 615f685f55735..a90a0999ac0dc 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github summary: API docs for the navigation plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] warning: 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. --- diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index ac9c25bafbd3c..2aa9754788a87 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github summary: API docs for the newsfeed plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] warning: 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. --- diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 84b5b8b401f4f..5e64c2d86ab6b 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -5416,7 +5416,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -5648,9 +5650,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 2b0b022c59b7e..a4121e20a70a5 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github summary: API docs for the observability plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] warning: 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. --- diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 4c15df3238d8c..2c63d9837c26a 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github summary: API docs for the osquery plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] warning: 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. --- diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 5c317f64abad5..372ce05777755 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -3,7 +3,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory summary: Directory of public APIs available through plugins or packages. -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: 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. --- @@ -18,7 +18,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 27911 | 176 | 19808 | 880 | +| 27979 | 176 | 19807 | 881 | ## Plugin Directory @@ -27,15 +27,15 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 241 | 0 | 236 | 19 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 23 | 0 | 19 | 1 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 9 | 0 | 0 | 1 | -| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 367 | 0 | 358 | 20 | -| | [APM UI](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 40 | 0 | 40 | 55 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 368 | 0 | 359 | 21 | +| | [APM UI](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 40 | 0 | 40 | 53 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 78 | 1 | 69 | 2 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | | | [ResponseOps](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 81 | 0 | 65 | 28 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 272 | 2 | 253 | 9 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 29 | 0 | 24 | 0 | -| | [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-posture-security) | The cloud security posture plugin | 6 | 0 | 6 | 0 | +| | [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-posture-security) | The cloud security posture plugin | 18 | 0 | 2 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 13 | 0 | 13 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 206 | 0 | 198 | 7 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2470 | 5 | 664 | 17 | @@ -43,9 +43,9 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 102 | 0 | 83 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 143 | 0 | 141 | 12 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 52 | 0 | 51 | 0 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3086 | 34 | 2413 | 21 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3094 | 34 | 2421 | 21 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 15 | 0 | 7 | 0 | -| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Reusable data view field editor across Kibana | 41 | 0 | 36 | 3 | +| | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Reusable data view field editor across Kibana | 49 | 0 | 29 | 3 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data view management app | 2 | 0 | 2 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 945 | 0 | 203 | 0 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 28 | 3 | 24 | 1 | @@ -76,7 +76,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 222 | 0 | 95 | 2 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Index pattern fields and ambiguous values formatters | 288 | 5 | 249 | 3 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | -| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1537 | 8 | 1405 | 10 | +| | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1541 | 8 | 1409 | 10 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | globalSearchProviders | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -102,7 +102,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Security detections response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 198 | 0 | 90 | 49 | | logstash | [Logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 41 | 0 | 41 | 6 | -| | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 250 | 0 | 249 | 24 | +| | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 250 | 0 | 249 | 25 | | | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 67 | 0 | 67 | 0 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 244 | 9 | 71 | 30 | | | [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitoring-ui) | - | 11 | 0 | 9 | 1 | @@ -116,7 +116,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 4 | 0 | 4 | 0 | | | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 36 | 0 | 16 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 21 | 0 | 21 | 0 | -| | [RAC](https://github.com/orgs/elastic/teams/rac) | - | 205 | 0 | 177 | 10 | +| | [RAC](https://github.com/orgs/elastic/teams/rac) | - | 208 | 0 | 180 | 10 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 24 | 0 | 19 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 192 | 2 | 151 | 5 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 125 | 0 | 112 | 0 | @@ -125,7 +125,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 32 | 0 | 13 | 0 | | | [Kibana Reporting Services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 27 | 0 | 8 | 4 | | searchprofiler | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | -| | [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 197 | 0 | 100 | 0 | +| | [Platform Security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 225 | 0 | 90 | 0 | | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 52 | 0 | 51 | 22 | | | [Security Team](https://github.com/orgs/elastic/teams/security-team) | - | 3 | 0 | 3 | 1 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds URL Service and sharing capabilities to Kibana | 114 | 0 | 55 | 10 | @@ -142,7 +142,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Security solution](https://github.com/orgs/elastic/teams/security-solution) | - | 447 | 1 | 342 | 32 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [Kibana Localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 424 | 0 | 403 | 41 | +| | [Response Ops](https://github.com/orgs/elastic/teams/response-ops) | - | 420 | 0 | 399 | 42 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Adds UI Actions service to Kibana | 130 | 0 | 91 | 11 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Extends UI Actions plugin with more functionality | 205 | 0 | 142 | 9 | | | [Unified Search](https://github.com/orgs/elastic/teams/kibana-app-services) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 84 | 2 | 80 | 13 | @@ -306,13 +306,13 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [Owner missing] | Security Solution utilities for React hooks | 15 | 0 | 7 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 148 | 0 | 129 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 458 | 1 | 446 | 0 | -| | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 48 | 0 | 26 | 0 | +| | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 54 | 0 | 32 | 0 | | | [Owner missing] | io ts utilities and types to be shared with plugins from the security solution project | 28 | 0 | 21 | 0 | | | [Owner missing] | security solution list REST API | 59 | 0 | 58 | 0 | | | [Owner missing] | security solution list constants to use across plugins such lists, security_solution, cases, etc... | 26 | 0 | 12 | 0 | | | [Owner missing] | Security solution list ReactJS hooks | 56 | 0 | 44 | 0 | | | [Owner missing] | security solution list utilities | 235 | 0 | 187 | 0 | -| | [Owner missing] | security solution rule utilities to use across plugins | 24 | 0 | 21 | 0 | +| | [Owner missing] | security solution rule utilities to use across plugins | 26 | 0 | 23 | 0 | | | [Owner missing] | security solution t-grid packages will allow sharing components between timelines and security_solution plugin until we transfer all functionality to timelines plugin | 120 | 0 | 116 | 0 | | | [Owner missing] | security solution utilities to use across plugins such lists, security_solution, cases, etc... | 31 | 0 | 29 | 0 | | | [Owner missing] | - | 53 | 0 | 50 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index b4b49b91a3da6..51ab27eb9d27f 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github summary: API docs for the presentationUtil plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] warning: 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. --- diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index ed83709b35570..e8351305cd759 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github summary: API docs for the remoteClusters plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] warning: 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. --- diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index c96754733b84a..f28d2cbd9ae7d 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github summary: API docs for the reporting plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] warning: 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. --- diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 0dc3febe2c59f..db30749a838e1 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github summary: API docs for the rollup plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] warning: 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. --- diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index 59d7ede718741..0ee80d8c5d8b9 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -1143,7 +1143,7 @@ "label": "resourceType", "description": [], "signature": [ - "\"index\" | \"namespace\"" + "\"namespace\" | \"index\"" ], "path": "x-pack/plugins/rule_registry/server/rule_data_plugin_service/errors.ts", "deprecated": false, @@ -2723,6 +2723,16 @@ ], "path": "x-pack/plugins/rule_registry/server/utils/persistence_types.ts", "deprecated": false + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-server.PersistenceAlertServiceResult.alertsWereTruncated", + "type": "boolean", + "tags": [], + "label": "alertsWereTruncated", + "description": [], + "path": "x-pack/plugins/rule_registry/server/utils/persistence_types.ts", + "deprecated": false } ], "initialIsOpen": false @@ -2745,7 +2755,7 @@ "label": "alertWithPersistence", "description": [], "signature": [ - "(alerts: { _id: string; _source: T; }[], refresh: boolean | \"wait_for\") => Promise<", + "(alerts: { _id: string; _source: T; }[], refresh: boolean | \"wait_for\", maxAlerts?: number | undefined) => Promise<", { "pluginId": "ruleRegistry", "scope": "server", @@ -2784,6 +2794,19 @@ ], "path": "x-pack/plugins/rule_registry/server/utils/persistence_types.ts", "deprecated": false + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-server.PersistenceServices.alertWithPersistence.$3", + "type": "number", + "tags": [], + "label": "maxAlerts", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/rule_registry/server/utils/persistence_types.ts", + "deprecated": false } ] } @@ -3248,7 +3271,7 @@ "label": "PersistenceAlertService", "description": [], "signature": [ - "(alerts: { _id: string; _source: T; }[], refresh: boolean | \"wait_for\") => Promise<", + "(alerts: { _id: string; _source: T; }[], refresh: boolean | \"wait_for\", maxAlerts?: number | undefined) => Promise<", { "pluginId": "ruleRegistry", "scope": "server", @@ -3287,6 +3310,19 @@ ], "path": "x-pack/plugins/rule_registry/server/utils/persistence_types.ts", "deprecated": false + }, + { + "parentPluginId": "ruleRegistry", + "id": "def-server.PersistenceAlertService.$3", + "type": "number", + "tags": [], + "label": "maxAlerts", + "description": [], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/rule_registry/server/utils/persistence_types.ts", + "deprecated": false } ], "initialIsOpen": false diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 35ce73d45bb03..5f86177d210c3 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github summary: API docs for the ruleRegistry plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [RAC](https://github.com/orgs/elastic/teams/rac) for questions regarding | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 205 | 0 | 177 | 10 | +| 208 | 0 | 180 | 10 | ## Server diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 75fea26ef7b10..e3d8d5a5c93e8 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github summary: API docs for the runtimeFields plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] warning: 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. --- diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 7878e82d46d2f..7125d90da1463 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjects plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] warning: 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. --- diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 9142384a0be56..e5e76cefee365 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsManagement plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 5fbbbc0c29b12..f208c48cf917a 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTagging plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index e985c1e4e60ba..ccc0dd5cf51fb 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTaggingOss plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] warning: 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. --- diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 610c0b2cf4816..6c9681c3f11fa 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotMode plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] warning: 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. --- diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 93c8e4f9553bc..310dddc4a1bd3 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotting plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] warning: 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. --- diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index d254687ce1d47..8812e523128d3 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -1363,7 +1363,9 @@ "type": "Interface", "tags": [], "label": "CheckPrivilegesPayload", - "description": [], + "description": [ + "\nPrivileges that can be checked for the Kibana users." + ], "path": "x-pack/plugins/security/server/authorization/types.ts", "deprecated": false, "children": [ @@ -1373,7 +1375,9 @@ "type": "CompoundType", "tags": [], "label": "kibana", - "description": [], + "description": [ + "\nA list of the Kibana specific privileges (usually generated with `security.authz.actions.*.get(...)`)." + ], "signature": [ "string | string[] | undefined" ], @@ -1386,7 +1390,9 @@ "type": "Object", "tags": [], "label": "elasticsearch", - "description": [], + "description": [ + "\nA set of the Elasticsearch cluster and index privileges." + ], "signature": [ "{ cluster: string[]; index: Record; } | undefined" ], @@ -1610,6 +1616,315 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileBulkGetParams", + "type": "Interface", + "tags": [], + "label": "UserProfileBulkGetParams", + "description": [ + "\nParameters for the bulk get API." + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.UserProfileBulkGetParams.uids", + "type": "Object", + "tags": [], + "label": "uids", + "description": [ + "\nList of user profile identifiers." + ], + "signature": [ + "Set" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileBulkGetParams.dataPath", + "type": "string", + "tags": [], + "label": "dataPath", + "description": [ + "\nBy default, suggest API returns user information, but does not return any user data. The optional \"dataPath\"\nparameter can be used to return personal data for this user (within `kibana` namespace only)." + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileRequiredPrivileges", + "type": "Interface", + "tags": [], + "label": "UserProfileRequiredPrivileges", + "description": [ + "\nThe set of privileges that users associated with the suggested user profile should have for a specified space id." + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.UserProfileRequiredPrivileges.spaceId", + "type": "string", + "tags": [], + "label": "spaceId", + "description": [ + "\nThe id of the Kibana Space." + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileRequiredPrivileges.privileges", + "type": "Object", + "tags": [], + "label": "privileges", + "description": [ + "\nThe set of the Kibana specific application privileges." + ], + "signature": [ + "{ kibana: string[]; }" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileServiceStart", + "type": "Interface", + "tags": [], + "label": "UserProfileServiceStart", + "description": [ + "\nA set of methods to work with Kibana user profiles." + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.UserProfileServiceStart.bulkGet", + "type": "Function", + "tags": [], + "label": "bulkGet", + "description": [ + "\nRetrieves multiple user profiles by their identifiers." + ], + "signature": [ + "(params: ", + { + "pluginId": "security", + "scope": "server", + "docId": "kibSecurityPluginApi", + "section": "def-server.UserProfileBulkGetParams", + "text": "UserProfileBulkGetParams" + }, + ") => Promise<", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfile", + "text": "UserProfile" + }, + "[]>" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.UserProfileServiceStart.bulkGet.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "Bulk get operation parameters." + ], + "signature": [ + { + "pluginId": "security", + "scope": "server", + "docId": "kibSecurityPluginApi", + "section": "def-server.UserProfileBulkGetParams", + "text": "UserProfileBulkGetParams" + } + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileServiceStart.suggest", + "type": "Function", + "tags": [], + "label": "suggest", + "description": [ + "\nRetrieves a single user profile by identifier." + ], + "signature": [ + "(params: ", + { + "pluginId": "security", + "scope": "server", + "docId": "kibSecurityPluginApi", + "section": "def-server.UserProfileSuggestParams", + "text": "UserProfileSuggestParams" + }, + ") => Promise<", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfile", + "text": "UserProfile" + }, + "[]>" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.UserProfileServiceStart.suggest.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [ + "Suggest operation parameters." + ], + "signature": [ + { + "pluginId": "security", + "scope": "server", + "docId": "kibSecurityPluginApi", + "section": "def-server.UserProfileSuggestParams", + "text": "UserProfileSuggestParams" + } + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileSuggestParams", + "type": "Interface", + "tags": [], + "label": "UserProfileSuggestParams", + "description": [ + "\nParameters for the suggest API." + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-server.UserProfileSuggestParams.name", + "type": "string", + "tags": [], + "label": "name", + "description": [ + "\nQuery string used to match name-related fields in user profiles. The following fields are treated as\nname-related: username, full_name and email." + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileSuggestParams.size", + "type": "number", + "tags": [], + "label": "size", + "description": [ + "\nDesired number of suggestion to return. The default value is 10." + ], + "signature": [ + "number | undefined" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileSuggestParams.dataPath", + "type": "string", + "tags": [], + "label": "dataPath", + "description": [ + "\nBy default, suggest API returns user information, but does not return any user data. The optional \"dataPath\"\nparameter can be used to return personal data for this user (within `kibana` namespace only)." + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-server.UserProfileSuggestParams.requiredPrivileges", + "type": "Object", + "tags": [], + "label": "requiredPrivileges", + "description": [ + "\nThe set of the privileges that users associated with the suggested user profile should have in the specified space.\nIf not specified, privileges check isn't performed and all matched profiles are returned irrespective to the\nprivileges of the associated users." + ], + "signature": [ + { + "pluginId": "security", + "scope": "server", + "docId": "kibSecurityPluginApi", + "section": "def-server.UserProfileRequiredPrivileges", + "text": "UserProfileRequiredPrivileges" + }, + " | undefined" + ], + "path": "x-pack/plugins/security/server/user_profile/user_profile_service.ts", + "deprecated": false + } + ], + "initialIsOpen": false } ], "enums": [], @@ -1968,6 +2283,27 @@ ], "path": "x-pack/plugins/security/server/plugin.ts", "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-server.SecurityPluginStart.userProfiles", + "type": "Object", + "tags": [], + "label": "userProfiles", + "description": [ + "\nUser profiles services to retrieve user profiles." + ], + "signature": [ + { + "pluginId": "security", + "scope": "server", + "docId": "kibSecurityPluginApi", + "section": "def-server.UserProfileServiceStart", + "text": "UserProfileServiceStart" + } + ], + "path": "x-pack/plugins/security/server/plugin.ts", + "deprecated": false } ], "lifecycle": "start", @@ -2193,69 +2529,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "security", - "id": "def-common.AuthenticatedUserProfile", - "type": "Interface", - "tags": [], - "label": "AuthenticatedUserProfile", - "description": [ - "\nUser profile enriched with session information." - ], - "signature": [ - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.AuthenticatedUserProfile", - "text": "AuthenticatedUserProfile" - }, - " extends ", - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.UserProfile", - "text": "UserProfile" - }, - "" - ], - "path": "x-pack/plugins/security/common/model/user_profile.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "security", - "id": "def-common.AuthenticatedUserProfile.user", - "type": "CompoundType", - "tags": [], - "label": "user", - "description": [ - "\nInformation about the currently authenticated user that owns the profile." - ], - "signature": [ - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.UserInfo", - "text": "UserInfo" - }, - " & Pick<", - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.AuthenticatedUser", - "text": "AuthenticatedUser" - }, - ", \"authentication_provider\">" - ], - "path": "x-pack/plugins/security/common/model/user_profile.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "security", "id": "def-common.AuthenticationProvider", @@ -2274,7 +2547,9 @@ "type": "string", "tags": [], "label": "type", - "description": [], + "description": [ + "\nType of the Kibana authentication provider." + ], "path": "x-pack/plugins/security/common/model/authentication_provider.ts", "deprecated": false }, @@ -2284,7 +2559,9 @@ "type": "string", "tags": [], "label": "name", - "description": [], + "description": [ + "\nName of the Kibana authentication provider (arbitrary string)." + ], "path": "x-pack/plugins/security/common/model/authentication_provider.ts", "deprecated": false } @@ -2303,15 +2580,86 @@ "children": [ { "parentPluginId": "security", - "id": "def-common.FeaturesPrivileges.Unnamed", - "type": "IndexSignature", + "id": "def-common.FeaturesPrivileges.Unnamed", + "type": "IndexSignature", + "tags": [], + "label": "[featureId: string]: string[]", + "description": [], + "signature": [ + "[featureId: string]: string[]" + ], + "path": "x-pack/plugins/security/common/model/features_privileges.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-common.GetUserProfileResponse", + "type": "Interface", + "tags": [], + "label": "GetUserProfileResponse", + "description": [ + "\nUser profile enriched with session information." + ], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.GetUserProfileResponse", + "text": "GetUserProfileResponse" + }, + " extends ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfileWithSecurity", + "text": "UserProfileWithSecurity" + }, + "" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-common.GetUserProfileResponse.user", + "type": "CompoundType", "tags": [], - "label": "[featureId: string]: string[]", - "description": [], + "label": "user", + "description": [ + "\nInformation about the currently authenticated user that owns the profile." + ], "signature": [ - "[featureId: string]: string[]" + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfileUserInfoWithSecurity", + "text": "UserProfileUserInfoWithSecurity" + }, + " & Pick<", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + ", \"authentication_provider\">" ], - "path": "x-pack/plugins/security/common/model/features_privileges.ts", + "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false } ], @@ -3003,7 +3351,9 @@ "type": "Interface", "tags": [], "label": "User", - "description": [], + "description": [ + "\nA set of fields describing Kibana user." + ], "path": "x-pack/plugins/security/common/model/user.ts", "deprecated": false, "children": [ @@ -3084,10 +3434,95 @@ }, { "parentPluginId": "security", - "id": "def-common.UserAvatarData", + "id": "def-common.UserProfile", + "type": "Interface", + "tags": [], + "label": "UserProfile", + "description": [ + "\nDescribes basic properties stored in user profile." + ], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfile", + "text": "UserProfile" + }, + "" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "security", + "id": "def-common.UserProfile.uid", + "type": "string", + "tags": [], + "label": "uid", + "description": [ + "\nUnique ID for of the user profile." + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfile.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [ + "\nIndicates whether user profile is enabled or not." + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfile.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [ + "\nInformation about the user that owns profile." + ], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfileUserInfo", + "text": "UserProfileUserInfo" + } + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfile.data", + "type": "Object", + "tags": [], + "label": "data", + "description": [ + "\nUser specific data associated with the profile." + ], + "signature": [ + "{ [P in keyof D]?: D[P] | undefined; }" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileAvatarData", "type": "Interface", "tags": [], - "label": "UserAvatarData", + "label": "UserProfileAvatarData", "description": [ "\nAvatar stored in user profile." ], @@ -3096,11 +3531,13 @@ "children": [ { "parentPluginId": "security", - "id": "def-common.UserAvatarData.initials", + "id": "def-common.UserProfileAvatarData.initials", "type": "string", "tags": [], "label": "initials", - "description": [], + "description": [ + "\nOptional initials (two letters) of the user to use as avatar if avatar picture isn't specified." + ], "signature": [ "string | undefined" ], @@ -3109,11 +3546,13 @@ }, { "parentPluginId": "security", - "id": "def-common.UserAvatarData.color", + "id": "def-common.UserProfileAvatarData.color", "type": "string", "tags": [], "label": "color", - "description": [], + "description": [ + "\nBackground color of the avatar when initials are used." + ], "signature": [ "string | undefined" ], @@ -3122,11 +3561,13 @@ }, { "parentPluginId": "security", - "id": "def-common.UserAvatarData.imageUrl", + "id": "def-common.UserProfileAvatarData.imageUrl", "type": "string", "tags": [], "label": "imageUrl", - "description": [], + "description": [ + "\nBase64 data URL for the user avatar image." + ], "signature": [ "string | undefined" ], @@ -3138,40 +3579,70 @@ }, { "parentPluginId": "security", - "id": "def-common.UserInfo", + "id": "def-common.UserProfileUserInfo", "type": "Interface", "tags": [], - "label": "UserInfo", + "label": "UserProfileUserInfo", "description": [ - "\nUser information returned in user profile." - ], - "signature": [ - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.UserInfo", - "text": "UserInfo" - }, - " extends ", - { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.User", - "text": "User" - } + "\nBasic user information returned in user profile." ], "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false, "children": [ { "parentPluginId": "security", - "id": "def-common.UserInfo.active", - "type": "boolean", + "id": "def-common.UserProfileUserInfo.username", + "type": "string", "tags": [], - "label": "active", - "description": [], + "label": "username", + "description": [ + "\nUsername of the user." + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileUserInfo.email", + "type": "string", + "tags": [], + "label": "email", + "description": [ + "\nOptional email of the user." + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileUserInfo.full_name", + "type": "string", + "tags": [], + "label": "full_name", + "description": [ + "\nOptional full name of the user." + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileUserInfo.display_name", + "type": "string", + "tags": [], + "label": "display_name", + "description": [ + "\nOptional display name of the user." + ], + "signature": [ + "string | undefined" + ], "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false } @@ -3180,53 +3651,111 @@ }, { "parentPluginId": "security", - "id": "def-common.UserProfile", + "id": "def-common.UserProfileUserInfoWithSecurity", "type": "Interface", "tags": [], - "label": "UserProfile", + "label": "UserProfileUserInfoWithSecurity", "description": [ - "\nDescribes properties stored in user profile." + "\nExtended user information returned in user profile (both basic and security related properties)." ], "signature": [ { "pluginId": "security", "scope": "common", "docId": "kibSecurityPluginApi", - "section": "def-common.UserProfile", - "text": "UserProfile" + "section": "def-common.UserProfileUserInfoWithSecurity", + "text": "UserProfileUserInfoWithSecurity" }, - "" + " extends ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfileUserInfo", + "text": "UserProfileUserInfo" + } ], "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false, "children": [ { "parentPluginId": "security", - "id": "def-common.UserProfile.uid", + "id": "def-common.UserProfileUserInfoWithSecurity.roles", + "type": "Object", + "tags": [], + "label": "roles", + "description": [ + "\nList of the user roles." + ], + "signature": [ + "readonly string[]" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileUserInfoWithSecurity.realm_name", "type": "string", "tags": [], - "label": "uid", + "label": "realm_name", "description": [ - "\nUnique ID for of the user profile." + "\nName of the Elasticsearch security realm that was used to authenticate user." ], "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false }, { "parentPluginId": "security", - "id": "def-common.UserProfile.enabled", - "type": "boolean", + "id": "def-common.UserProfileUserInfoWithSecurity.realm_domain", + "type": "string", "tags": [], - "label": "enabled", + "label": "realm_domain", "description": [ - "\nIndicates whether user profile is enabled or not." + "\nOptional name of the security domain that Elasticsearch security realm that was\nused to authenticate user resides in (if any)." + ], + "signature": [ + "string | undefined" ], "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileWithSecurity", + "type": "Interface", + "tags": [], + "label": "UserProfileWithSecurity", + "description": [ + "\nDescribes all properties stored in user profile (both basic and security related properties)." + ], + "signature": [ + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfileWithSecurity", + "text": "UserProfileWithSecurity" + }, + " extends ", + { + "pluginId": "security", + "scope": "common", + "docId": "kibSecurityPluginApi", + "section": "def-common.UserProfile", + "text": "UserProfile" }, + "" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false, + "children": [ { "parentPluginId": "security", - "id": "def-common.UserProfile.user", + "id": "def-common.UserProfileWithSecurity.user", "type": "Object", "tags": [], "label": "user", @@ -3238,8 +3767,8 @@ "pluginId": "security", "scope": "common", "docId": "kibSecurityPluginApi", - "section": "def-common.UserInfo", - "text": "UserInfo" + "section": "def-common.UserProfileUserInfoWithSecurity", + "text": "UserProfileUserInfoWithSecurity" } ], "path": "x-pack/plugins/security/common/model/user_profile.ts", @@ -3247,15 +3776,15 @@ }, { "parentPluginId": "security", - "id": "def-common.UserProfile.data", + "id": "def-common.UserProfileWithSecurity.labels", "type": "Uncategorized", "tags": [], - "label": "data", + "label": "labels", "description": [ - "\nUser specific data associated with the profile." + "\nUser specific _searchable_ labels associated with the profile. Note that labels are considered\nsecurity related field since it's going to be used to store user's space ID." ], "signature": [ - "T" + "L" ], "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false @@ -3323,10 +3852,10 @@ }, { "parentPluginId": "security", - "id": "def-common.UserData", + "id": "def-common.UserProfileData", "type": "Type", "tags": [], - "label": "UserData", + "label": "UserProfileData", "description": [ "\nPlaceholder for data stored in user profile." ], @@ -3336,6 +3865,22 @@ "path": "x-pack/plugins/security/common/model/user_profile.ts", "deprecated": false, "initialIsOpen": false + }, + { + "parentPluginId": "security", + "id": "def-common.UserProfileLabels", + "type": "Type", + "tags": [], + "label": "UserProfileLabels", + "description": [ + "\nType of the user profile labels structure (currently" + ], + "signature": [ + "{ [x: string]: string; }" + ], + "path": "x-pack/plugins/security/common/model/user_profile.ts", + "deprecated": false, + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/security.mdx b/api_docs/security.mdx index e85d2da409c64..862b8895bef28 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github summary: API docs for the security plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Platform Security](https://github.com/orgs/elastic/teams/kibana-securit | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 197 | 0 | 100 | 0 | +| 225 | 0 | 90 | 0 | ## Client diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 98575276e9149..55f725bd37567 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -62,7 +62,7 @@ "label": "experimentalFeatures", "description": [], "signature": [ - "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly disableIsolationUIPendingStatuses: boolean; readonly riskyHostsEnabled: boolean; readonly riskyUsersEnabled: boolean; readonly pendingActionResponsesWithAck: boolean; readonly policyListEnabled: boolean; readonly policyResponseInFleetEnabled: boolean; readonly groupedNavigation: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly responseActionsConsoleEnabled: boolean; readonly cloudSecurityPostureNavigation: boolean; }" + "{ readonly tGridEnabled: boolean; readonly tGridEventRenderedViewEnabled: boolean; readonly excludePoliciesInFilterEnabled: boolean; readonly kubernetesEnabled: boolean; readonly disableIsolationUIPendingStatuses: boolean; readonly riskyHostsEnabled: boolean; readonly riskyUsersEnabled: boolean; readonly pendingActionResponsesWithAck: boolean; readonly policyListEnabled: boolean; readonly policyResponseInFleetEnabled: boolean; readonly previewTelemetryUrlEnabled: boolean; readonly responseActionsConsoleEnabled: boolean; readonly cloudSecurityPostureNavigation: boolean; readonly insightsRelatedAlertsByProcessAncestry: boolean; }" ], "path": "x-pack/plugins/security_solution/public/plugin.tsx", "deprecated": false @@ -1003,7 +1003,7 @@ "label": "ConfigType", "description": [], "signature": [ - "Readonly<{} & { signalsIndex: string; maxRuleImportExportSize: number; maxRuleImportPayloadBytes: number; maxTimelineImportExportSize: number; maxTimelineImportPayloadBytes: number; alertMergeStrategy: \"allFields\" | \"missingFields\" | \"noFields\"; alertIgnoreFields: string[]; enableExperimental: string[]; packagerTaskInterval: string; prebuiltRulesFromFileSystem: boolean; prebuiltRulesFromSavedObjects: boolean; }> & { experimentalFeatures: Readonly<{ tGridEnabled: boolean; tGridEventRenderedViewEnabled: boolean; excludePoliciesInFilterEnabled: boolean; kubernetesEnabled: boolean; disableIsolationUIPendingStatuses: boolean; riskyHostsEnabled: boolean; riskyUsersEnabled: boolean; pendingActionResponsesWithAck: boolean; policyListEnabled: boolean; policyResponseInFleetEnabled: boolean; groupedNavigation: boolean; previewTelemetryUrlEnabled: boolean; responseActionsConsoleEnabled: boolean; cloudSecurityPostureNavigation: boolean; }>; }" + "Readonly<{} & { signalsIndex: string; maxRuleImportExportSize: number; maxRuleImportPayloadBytes: number; maxTimelineImportExportSize: number; maxTimelineImportPayloadBytes: number; alertMergeStrategy: \"allFields\" | \"missingFields\" | \"noFields\"; alertIgnoreFields: string[]; enableExperimental: string[]; packagerTaskInterval: string; prebuiltRulesFromFileSystem: boolean; prebuiltRulesFromSavedObjects: boolean; }> & { experimentalFeatures: Readonly<{ tGridEnabled: boolean; tGridEventRenderedViewEnabled: boolean; excludePoliciesInFilterEnabled: boolean; kubernetesEnabled: boolean; disableIsolationUIPendingStatuses: boolean; riskyHostsEnabled: boolean; riskyUsersEnabled: boolean; pendingActionResponsesWithAck: boolean; policyListEnabled: boolean; policyResponseInFleetEnabled: boolean; previewTelemetryUrlEnabled: boolean; responseActionsConsoleEnabled: boolean; cloudSecurityPostureNavigation: boolean; insightsRelatedAlertsByProcessAncestry: boolean; }>; }" ], "path": "x-pack/plugins/security_solution/server/config.ts", "deprecated": false, diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 2c5a6f87d6d2e..1c3bcbf4db864 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github summary: API docs for the securitySolution plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] warning: 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. --- diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index b0c1ef4d8449c..23bd0d4ec0f3e 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github summary: API docs for the sessionView plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] warning: 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. --- diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 8ca697ee5550e..d6a5c7eccdecd 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github summary: API docs for the share plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] warning: 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. --- diff --git a/api_docs/shared_u_x.mdx b/api_docs/shared_u_x.mdx index 398a1d8b11776..7e11ac998838d 100644 --- a/api_docs/shared_u_x.mdx +++ b/api_docs/shared_u_x.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sharedUX title: "sharedUX" image: https://source.unsplash.com/400x175/?github summary: API docs for the sharedUX plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sharedUX'] warning: 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. --- diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index b54095e27938f..3e86873e2da2b 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github summary: API docs for the snapshotRestore plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] warning: 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. --- diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index f66f6cc7e7937..9076a159ff0c1 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github summary: API docs for the spaces plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] warning: 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. --- diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index a0c2912cdafff..9008b7c72cd15 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the stackAlerts plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] warning: 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. --- diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index cdbf52a2e94c7..e038ebdb99aa3 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the taskManager plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] warning: 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. --- diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 0fda91198a13a..5765f3a652b4e 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetry plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] warning: 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. --- diff --git a/api_docs/telemetry_collection_manager.devdocs.json b/api_docs/telemetry_collection_manager.devdocs.json index c0fb8f6a4001d..85ea9702a12ca 100644 --- a/api_docs/telemetry_collection_manager.devdocs.json +++ b/api_docs/telemetry_collection_manager.devdocs.json @@ -106,7 +106,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -338,9 +340,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 14242c2198785..0009e825fa9ca 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionManager plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] warning: 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. --- diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index f6c40db167e04..ed43092ec47f2 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionXpack plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] warning: 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. --- diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 451728f73beef..7046e7c720fdd 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryManagementSection plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] warning: 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. --- diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 41b11077a845f..f956b552272de 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github summary: API docs for the timelines plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] warning: 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. --- diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 96a1c52c6f933..820e1ef542b98 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github summary: API docs for the transform plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] warning: 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. --- diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index e3cb591260fb4..410f43f674d33 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -809,6 +809,52 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.loadActionErrorLog", + "type": "Function", + "tags": [], + "label": "loadActionErrorLog", + "description": [], + "signature": [ + "({ id, http, dateStart, dateEnd, runId, message, perPage, page, sort, }: ", + "LoadActionErrorLogProps", + " & { http: ", + "HttpSetup", + "; }) => Promise<", + { + "pluginId": "alerting", + "scope": "common", + "docId": "kibAlertingPluginApi", + "section": "def-common.IExecutionErrorsResult", + "text": "IExecutionErrorsResult" + }, + ">" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.ts", + "deprecated": false, + "children": [ + { + "parentPluginId": "triggersActionsUi", + "id": "def-public.loadActionErrorLog.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n id,\n http,\n dateStart,\n dateEnd,\n runId,\n message,\n perPage = 10,\n page = 0,\n sort,\n}", + "description": [], + "signature": [ + "LoadActionErrorLogProps", + " & { http: ", + "HttpSetup", + "; }" + ], + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/rule_api/load_action_error_log.ts", + "deprecated": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "triggersActionsUi", "id": "def-public.loadActionTypes", @@ -921,7 +967,7 @@ "label": "loadExecutionLogAggregations", "description": [], "signature": [ - "({ id, http, dateStart, dateEnd, filter, perPage, page, sort, }: ", + "({ id, http, dateStart, dateEnd, outcomeFilter, message, perPage, page, sort, }: ", "LoadExecutionLogAggregationsProps", " & { http: ", "HttpSetup", @@ -930,8 +976,8 @@ "pluginId": "alerting", "scope": "common", "docId": "kibAlertingPluginApi", - "section": "def-common.IExecutionLogWithErrorsResult", - "text": "IExecutionLogWithErrorsResult" + "section": "def-common.IExecutionLogResult", + "text": "IExecutionLogResult" }, ">" ], @@ -943,7 +989,7 @@ "id": "def-public.loadExecutionLogAggregations.$1", "type": "CompoundType", "tags": [], - "label": "{\n id,\n http,\n dateStart,\n dateEnd,\n filter,\n perPage = 10,\n page = 0,\n sort = [],\n}", + "label": "{\n id,\n http,\n dateStart,\n dateEnd,\n outcomeFilter,\n message,\n perPage = 10,\n page = 0,\n sort = [],\n}", "description": [], "signature": [ "LoadExecutionLogAggregationsProps", @@ -1896,8 +1942,9 @@ "label": "alert", "description": [], "signature": [ - "{ [x: `email.to.${number}`]: string[]; [x: `email.cc.${number}`]: string[]; [x: `email.bcc.${number}`]: string[]; [x: `email.attachments.${number}`]: string[]; [x: `user.roles.${number}`]: string[]; [x: `user.target.roles.${number}`]: string[]; [x: `user.changes.roles.${number}`]: string[]; [x: `user.effective.roles.${number}`]: string[]; [x: `source.user.roles.${number}`]: string[]; [x: `tags.${number}`]: string[]; [x: `client.user.roles.${number}`]: string[]; [x: `file.attributes.${number}`]: string[]; [x: `file.elf.exports.${number}`]: string[]; [x: `file.elf.imports.${number}`]: string[]; [x: `file.elf.sections.${number}`]: string[]; [x: `file.elf.segments.${number}`]: string[]; [x: `file.elf.shared_libraries.${number}`]: string[]; [x: `file.x509.issuer.organization.${number}`]: string[]; [x: `file.x509.issuer.common_name.${number}`]: string[]; [x: `file.x509.issuer.country.${number}`]: string[]; [x: `file.x509.issuer.locality.${number}`]: string[]; [x: `file.x509.issuer.organizational_unit.${number}`]: string[]; [x: `file.x509.issuer.state_or_province.${number}`]: string[]; [x: `file.x509.subject.organization.${number}`]: string[]; [x: `file.x509.subject.common_name.${number}`]: string[]; [x: `file.x509.subject.country.${number}`]: string[]; [x: `file.x509.subject.locality.${number}`]: string[]; [x: `file.x509.subject.organizational_unit.${number}`]: string[]; [x: `file.x509.subject.state_or_province.${number}`]: string[]; [x: `file.x509.alternative_names.${number}`]: string[]; [x: `host.ip.${number}`]: string[]; [x: `host.mac.${number}`]: string[]; [x: `container.image.tag.${number}`]: string[]; [x: `server.user.roles.${number}`]: string[]; [x: `rule.author.${number}`]: string[]; [x: `event.type.${number}`]: string[]; [x: `event.category.${number}`]: string[]; [x: `registry.data.strings.${number}`]: string[]; [x: `destination.user.roles.${number}`]: string[]; [x: `dns.answers.${number}`]: string[]; [x: `dns.header_flags.${number}`]: string[]; [x: `dns.resolved_ip.${number}`]: string[]; [x: `observer.ip.${number}`]: string[]; [x: `observer.mac.${number}`]: string[]; [x: `process.elf.exports.${number}`]: string[]; [x: `process.elf.imports.${number}`]: string[]; [x: `process.elf.sections.${number}`]: string[]; [x: `process.elf.segments.${number}`]: string[]; [x: `process.elf.shared_libraries.${number}`]: string[]; [x: `process.args.${number}`]: string[]; [x: `process.target.args.${number}`]: string[]; [x: `process.parent.args.${number}`]: string[]; [x: `process.target.elf.exports.${number}`]: string[]; [x: `process.target.elf.imports.${number}`]: string[]; [x: `process.target.elf.sections.${number}`]: string[]; [x: `process.target.elf.segments.${number}`]: string[]; [x: `process.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.args.${number}`]: string[]; [x: `process.target.parent.args.${number}`]: string[]; [x: `process.parent.elf.exports.${number}`]: string[]; [x: `process.parent.elf.imports.${number}`]: string[]; [x: `process.parent.elf.sections.${number}`]: string[]; [x: `process.parent.elf.segments.${number}`]: string[]; [x: `process.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.args.${number}`]: string[]; [x: `process.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `related.ip.${number}`]: string[]; [x: `related.user.${number}`]: string[]; [x: `related.hash.${number}`]: string[]; [x: `related.hosts.${number}`]: string[]; [x: `threat.group.alias.${number}`]: string[]; [x: `threat.indicator.x509.issuer.organization.${number}`]: string[]; [x: `threat.indicator.x509.issuer.common_name.${number}`]: string[]; [x: `threat.indicator.x509.issuer.country.${number}`]: string[]; [x: `threat.indicator.x509.issuer.locality.${number}`]: string[]; [x: `threat.indicator.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.indicator.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.indicator.x509.subject.organization.${number}`]: string[]; [x: `threat.indicator.x509.subject.common_name.${number}`]: string[]; [x: `threat.indicator.x509.subject.country.${number}`]: string[]; [x: `threat.indicator.x509.subject.locality.${number}`]: string[]; [x: `threat.indicator.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.indicator.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.indicator.x509.alternative_names.${number}`]: string[]; [x: `threat.indicator.file.attributes.${number}`]: string[]; [x: `threat.indicator.file.elf.exports.${number}`]: string[]; [x: `threat.indicator.file.elf.imports.${number}`]: string[]; [x: `threat.indicator.file.elf.sections.${number}`]: string[]; [x: `threat.indicator.file.elf.segments.${number}`]: string[]; [x: `threat.indicator.file.elf.shared_libraries.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.organization.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.common_name.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.country.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.locality.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.organization.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.common_name.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.country.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.locality.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.indicator.file.x509.alternative_names.${number}`]: string[]; [x: `threat.indicator.registry.data.strings.${number}`]: string[]; [x: `threat.enrichments.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.alternative_names.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.attributes.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.exports.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.imports.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.sections.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.segments.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.shared_libraries.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.alternative_names.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.registry.data.strings.${number}`]: string[]; [x: `threat.software.platforms.${number}`]: string[]; [x: `threat.tactic.id.${number}`]: string[]; [x: `threat.tactic.name.${number}`]: string[]; [x: `threat.tactic.reference.${number}`]: string[]; [x: `threat.technique.id.${number}`]: string[]; [x: `threat.technique.name.${number}`]: string[]; [x: `threat.technique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `tls.client.x509.issuer.organization.${number}`]: string[]; [x: `tls.client.x509.issuer.common_name.${number}`]: string[]; [x: `tls.client.x509.issuer.country.${number}`]: string[]; [x: `tls.client.x509.issuer.locality.${number}`]: string[]; [x: `tls.client.x509.issuer.organizational_unit.${number}`]: string[]; [x: `tls.client.x509.issuer.state_or_province.${number}`]: string[]; [x: `tls.client.x509.subject.organization.${number}`]: string[]; [x: `tls.client.x509.subject.common_name.${number}`]: string[]; [x: `tls.client.x509.subject.country.${number}`]: string[]; [x: `tls.client.x509.subject.locality.${number}`]: string[]; [x: `tls.client.x509.subject.organizational_unit.${number}`]: string[]; [x: `tls.client.x509.subject.state_or_province.${number}`]: string[]; [x: `tls.client.x509.alternative_names.${number}`]: string[]; [x: `tls.client.certificate_chain.${number}`]: string[]; [x: `tls.client.supported_ciphers.${number}`]: string[]; [x: `tls.server.x509.issuer.organization.${number}`]: string[]; [x: `tls.server.x509.issuer.common_name.${number}`]: string[]; [x: `tls.server.x509.issuer.country.${number}`]: string[]; [x: `tls.server.x509.issuer.locality.${number}`]: string[]; [x: `tls.server.x509.issuer.organizational_unit.${number}`]: string[]; [x: `tls.server.x509.issuer.state_or_province.${number}`]: string[]; [x: `tls.server.x509.subject.organization.${number}`]: string[]; [x: `tls.server.x509.subject.common_name.${number}`]: string[]; [x: `tls.server.x509.subject.country.${number}`]: string[]; [x: `tls.server.x509.subject.locality.${number}`]: string[]; [x: `tls.server.x509.subject.organizational_unit.${number}`]: string[]; [x: `tls.server.x509.subject.state_or_province.${number}`]: string[]; [x: `tls.server.x509.alternative_names.${number}`]: string[]; [x: `tls.server.certificate_chain.${number}`]: string[]; [x: `vulnerability.category.${number}`]: string[]; } & ", - "BasicFields" + "{ [x: `container.image.tag.${number}`]: string[]; [x: `email.to.${number}`]: string[]; [x: `email.cc.${number}`]: string[]; [x: `email.bcc.${number}`]: string[]; [x: `email.attachments.${number}`]: string[]; [x: `user.roles.${number}`]: string[]; [x: `user.target.roles.${number}`]: string[]; [x: `user.changes.roles.${number}`]: string[]; [x: `user.effective.roles.${number}`]: string[]; [x: `source.user.roles.${number}`]: string[]; [x: `tags.${number}`]: string[]; [x: `client.user.roles.${number}`]: string[]; [x: `file.attributes.${number}`]: string[]; [x: `file.elf.exports.${number}`]: string[]; [x: `file.elf.imports.${number}`]: string[]; [x: `file.elf.sections.${number}`]: string[]; [x: `file.elf.segments.${number}`]: string[]; [x: `file.elf.shared_libraries.${number}`]: string[]; [x: `file.x509.issuer.organization.${number}`]: string[]; [x: `file.x509.issuer.common_name.${number}`]: string[]; [x: `file.x509.issuer.country.${number}`]: string[]; [x: `file.x509.issuer.locality.${number}`]: string[]; [x: `file.x509.issuer.organizational_unit.${number}`]: string[]; [x: `file.x509.issuer.state_or_province.${number}`]: string[]; [x: `file.x509.subject.organization.${number}`]: string[]; [x: `file.x509.subject.common_name.${number}`]: string[]; [x: `file.x509.subject.country.${number}`]: string[]; [x: `file.x509.subject.locality.${number}`]: string[]; [x: `file.x509.subject.organizational_unit.${number}`]: string[]; [x: `file.x509.subject.state_or_province.${number}`]: string[]; [x: `file.x509.alternative_names.${number}`]: string[]; [x: `host.ip.${number}`]: string[]; [x: `host.mac.${number}`]: string[]; [x: `server.user.roles.${number}`]: string[]; [x: `rule.author.${number}`]: string[]; [x: `event.type.${number}`]: string[]; [x: `event.category.${number}`]: string[]; [x: `registry.data.strings.${number}`]: string[]; [x: `destination.user.roles.${number}`]: string[]; [x: `dns.answers.${number}`]: string[]; [x: `dns.header_flags.${number}`]: string[]; [x: `dns.resolved_ip.${number}`]: string[]; [x: `observer.ip.${number}`]: string[]; [x: `observer.mac.${number}`]: string[]; [x: `process.elf.exports.${number}`]: string[]; [x: `process.elf.imports.${number}`]: string[]; [x: `process.elf.sections.${number}`]: string[]; [x: `process.elf.segments.${number}`]: string[]; [x: `process.elf.shared_libraries.${number}`]: string[]; [x: `process.args.${number}`]: string[]; [x: `process.target.args.${number}`]: string[]; [x: `process.parent.args.${number}`]: string[]; [x: `process.target.elf.exports.${number}`]: string[]; [x: `process.target.elf.imports.${number}`]: string[]; [x: `process.target.elf.sections.${number}`]: string[]; [x: `process.target.elf.segments.${number}`]: string[]; [x: `process.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.args.${number}`]: string[]; [x: `process.target.parent.args.${number}`]: string[]; [x: `process.parent.elf.exports.${number}`]: string[]; [x: `process.parent.elf.imports.${number}`]: string[]; [x: `process.parent.elf.sections.${number}`]: string[]; [x: `process.parent.elf.segments.${number}`]: string[]; [x: `process.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.args.${number}`]: string[]; [x: `process.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.target.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.target.parent.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.target.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.target.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.target.parent.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.target.parent.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.target.parent.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.target.parent.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.exports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.imports.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.sections.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.segments.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.elf.shared_libraries.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.target.args.${number}`]: string[]; [x: `process.parent.parent.parent.parent.parent.parent.parent.parent.args.${number}`]: string[]; [x: `related.ip.${number}`]: string[]; [x: `related.user.${number}`]: string[]; [x: `related.hash.${number}`]: string[]; [x: `related.hosts.${number}`]: string[]; [x: `threat.group.alias.${number}`]: string[]; [x: `threat.indicator.x509.issuer.organization.${number}`]: string[]; [x: `threat.indicator.x509.issuer.common_name.${number}`]: string[]; [x: `threat.indicator.x509.issuer.country.${number}`]: string[]; [x: `threat.indicator.x509.issuer.locality.${number}`]: string[]; [x: `threat.indicator.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.indicator.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.indicator.x509.subject.organization.${number}`]: string[]; [x: `threat.indicator.x509.subject.common_name.${number}`]: string[]; [x: `threat.indicator.x509.subject.country.${number}`]: string[]; [x: `threat.indicator.x509.subject.locality.${number}`]: string[]; [x: `threat.indicator.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.indicator.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.indicator.x509.alternative_names.${number}`]: string[]; [x: `threat.indicator.file.attributes.${number}`]: string[]; [x: `threat.indicator.file.elf.exports.${number}`]: string[]; [x: `threat.indicator.file.elf.imports.${number}`]: string[]; [x: `threat.indicator.file.elf.sections.${number}`]: string[]; [x: `threat.indicator.file.elf.segments.${number}`]: string[]; [x: `threat.indicator.file.elf.shared_libraries.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.organization.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.common_name.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.country.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.locality.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.indicator.file.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.organization.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.common_name.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.country.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.locality.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.indicator.file.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.indicator.file.x509.alternative_names.${number}`]: string[]; [x: `threat.indicator.registry.data.strings.${number}`]: string[]; [x: `threat.enrichments.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.x509.alternative_names.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.attributes.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.exports.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.imports.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.sections.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.segments.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.elf.shared_libraries.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.issuer.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.organization.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.common_name.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.country.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.locality.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.organizational_unit.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.subject.state_or_province.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.file.x509.alternative_names.${number}`]: string[]; [x: `threat.enrichments.${number}.indicator.registry.data.strings.${number}`]: string[]; [x: `threat.software.platforms.${number}`]: string[]; [x: `threat.tactic.id.${number}`]: string[]; [x: `threat.tactic.name.${number}`]: string[]; [x: `threat.tactic.reference.${number}`]: string[]; [x: `threat.technique.id.${number}`]: string[]; [x: `threat.technique.name.${number}`]: string[]; [x: `threat.technique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.id.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.name.${number}`]: string[]; [x: `threat.technique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.subtechnique.reference.${number}`]: string[]; [x: `tls.client.x509.issuer.organization.${number}`]: string[]; [x: `tls.client.x509.issuer.common_name.${number}`]: string[]; [x: `tls.client.x509.issuer.country.${number}`]: string[]; [x: `tls.client.x509.issuer.locality.${number}`]: string[]; [x: `tls.client.x509.issuer.organizational_unit.${number}`]: string[]; [x: `tls.client.x509.issuer.state_or_province.${number}`]: string[]; [x: `tls.client.x509.subject.organization.${number}`]: string[]; [x: `tls.client.x509.subject.common_name.${number}`]: string[]; [x: `tls.client.x509.subject.country.${number}`]: string[]; [x: `tls.client.x509.subject.locality.${number}`]: string[]; [x: `tls.client.x509.subject.organizational_unit.${number}`]: string[]; [x: `tls.client.x509.subject.state_or_province.${number}`]: string[]; [x: `tls.client.x509.alternative_names.${number}`]: string[]; [x: `tls.client.certificate_chain.${number}`]: string[]; [x: `tls.client.supported_ciphers.${number}`]: string[]; [x: `tls.server.x509.issuer.organization.${number}`]: string[]; [x: `tls.server.x509.issuer.common_name.${number}`]: string[]; [x: `tls.server.x509.issuer.country.${number}`]: string[]; [x: `tls.server.x509.issuer.locality.${number}`]: string[]; [x: `tls.server.x509.issuer.organizational_unit.${number}`]: string[]; [x: `tls.server.x509.issuer.state_or_province.${number}`]: string[]; [x: `tls.server.x509.subject.organization.${number}`]: string[]; [x: `tls.server.x509.subject.common_name.${number}`]: string[]; [x: `tls.server.x509.subject.country.${number}`]: string[]; [x: `tls.server.x509.subject.locality.${number}`]: string[]; [x: `tls.server.x509.subject.organizational_unit.${number}`]: string[]; [x: `tls.server.x509.subject.state_or_province.${number}`]: string[]; [x: `tls.server.x509.alternative_names.${number}`]: string[]; [x: `tls.server.certificate_chain.${number}`]: string[]; [x: `vulnerability.category.${number}`]: string[]; } & ", + "BasicFields", + " & { tags?: string[] | undefined; kibana?: string[] | undefined; \"@timestamp\"?: string[] | undefined; \"event.action\"?: string[] | undefined; \"kibana.alert.rule.parameters\"?: string[] | undefined; \"kibana.alert.rule.rule_type_id\"?: string[] | undefined; \"kibana.alert.rule.consumer\"?: string[] | undefined; \"kibana.alert.rule.producer\"?: string[] | undefined; \"kibana.space_ids\"?: string[] | undefined; \"kibana.alert.uuid\"?: string[] | undefined; \"kibana.alert.instance.id\"?: string[] | undefined; \"kibana.alert.start\"?: string[] | undefined; \"kibana.alert.end\"?: string[] | undefined; \"kibana.alert.duration.us\"?: string[] | undefined; \"kibana.alert.severity\"?: string[] | undefined; \"kibana.alert.status\"?: string[] | undefined; \"kibana.version\"?: string[] | undefined; \"ecs.version\"?: string[] | undefined; \"kibana.alert.risk_score\"?: string[] | undefined; \"kibana.alert.workflow_status\"?: string[] | undefined; \"kibana.alert.workflow_user\"?: string[] | undefined; \"kibana.alert.workflow_reason\"?: string[] | undefined; \"kibana.alert.system_status\"?: string[] | undefined; \"kibana.alert.action_group\"?: string[] | undefined; \"kibana.alert.reason\"?: string[] | undefined; \"kibana.alert.rule.author\"?: string[] | undefined; \"kibana.alert.rule.category\"?: string[] | undefined; \"kibana.alert.rule.uuid\"?: 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.execution.uuid\"?: string[] | undefined; \"kibana.alert.rule.from\"?: string[] | undefined; \"kibana.alert.rule.interval\"?: string[] | undefined; \"kibana.alert.rule.license\"?: string[] | undefined; \"kibana.alert.rule.name\"?: 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.tags\"?: 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; \"event.kind\"?: string[] | undefined; \"event.module\"?: string[] | undefined; \"kibana.alert.evaluation.threshold\"?: string[] | undefined; \"kibana.alert.evaluation.value\"?: string[] | undefined; \"kibana.alert.building_block_type\"?: string[] | undefined; \"kibana.alert.rule.exceptions_list\"?: string[] | undefined; \"kibana.alert.rule.namespace\"?: string[] | undefined; \"kibana.alert\"?: string[] | undefined; \"kibana.alert.rule\"?: string[] | undefined; }" ], "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false @@ -1952,25 +1999,6 @@ "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false }, - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.AlertsTableProps.bulkActions", - "type": "Object", - "tags": [], - "label": "bulkActions", - "description": [], - "signature": [ - { - "pluginId": "triggersActionsUi", - "scope": "public", - "docId": "kibTriggersActionsUiPluginApi", - "section": "def-public.BulkActionsObjectProp", - "text": "BulkActionsObjectProp" - } - ], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false - }, { "parentPluginId": "triggersActionsUi", "id": "def-public.AlertsTableProps.deletedEventIds", @@ -2047,16 +2075,6 @@ "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false }, - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.AlertsTableProps.showCheckboxes", - "type": "boolean", - "tags": [], - "label": "showCheckboxes", - "description": [], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false - }, { "parentPluginId": "triggersActionsUi", "id": "def-public.AlertsTableProps.showExpandToDetails", @@ -2396,58 +2414,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.BulkActionsObjectProp", - "type": "Interface", - "tags": [], - "label": "BulkActionsObjectProp", - "description": [], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false, - "children": [ - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.BulkActionsObjectProp.alertStatusActions", - "type": "CompoundType", - "tags": [], - "label": "alertStatusActions", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false - }, - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.BulkActionsObjectProp.onAlertStatusActionSuccess", - "type": "Uncategorized", - "tags": [], - "label": "onAlertStatusActionSuccess", - "description": [], - "signature": [ - "void | undefined" - ], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false - }, - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.BulkActionsObjectProp.onAlertStatusActionFailure", - "type": "Uncategorized", - "tags": [], - "label": "onAlertStatusActionFailure", - "description": [], - "signature": [ - "void | undefined" - ], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "triggersActionsUi", "id": "def-public.Comparator", @@ -4436,8 +4402,8 @@ "pluginId": "alerting", "scope": "common", "docId": "kibAlertingPluginApi", - "section": "def-common.IExecutionLogWithErrorsResult", - "text": "IExecutionLogWithErrorsResult" + "section": "def-common.IExecutionLogResult", + "text": "IExecutionLogResult" }, ">) | undefined; } & Pick<", "ComponentOpts", diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index e5b8b3b89a473..9db334f7f7c61 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github summary: API docs for the triggersActionsUi plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Response Ops](https://github.com/orgs/elastic/teams/response-ops) for q | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 424 | 0 | 403 | 41 | +| 420 | 0 | 399 | 42 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 810bf7786a23c..68004901beae0 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActions plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] warning: 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. --- diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 5e06184da804a..2a6631645b19a 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActionsEnhanced plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] warning: 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. --- diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index fe1c1e34d9084..a14a4a8e65e38 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] warning: 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. --- diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 09913e9f81170..5af7a65a6e4f4 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch.autocomplete plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] warning: 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. --- diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index bba044756a3e5..08512163e647e 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github summary: API docs for the urlForwarding plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] warning: 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. --- diff --git a/api_docs/usage_collection.devdocs.json b/api_docs/usage_collection.devdocs.json index 15be4b7419387..f0311a525f3f4 100644 --- a/api_docs/usage_collection.devdocs.json +++ b/api_docs/usage_collection.devdocs.json @@ -360,7 +360,9 @@ "TransportRequestOptions", " | undefined): Promise<", "SearchResponse", - ">; }; eql: ", + ">; }; cluster: ", + "default", + "; eql: ", "default", "; create: { (this: That, params: ", "CreateRequest", @@ -592,9 +594,7 @@ "TransportRequestOptions", " | undefined): Promise<", "ClearScrollResponse", - ">; }; cluster: ", - "default", - "; count: { (this: That, params?: ", + ">; }; count: { (this: That, params?: ", "CountRequest", " | ", "CountRequest", diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 8b5951511ec66..b389a4b61392f 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the usageCollection plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] warning: 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. --- diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 19591e87ac33b..1a4eb77b731e1 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github summary: API docs for the ux plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] warning: 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. --- diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index c4589d09ebe34..11e5d284b1ac4 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the visDefaultEditor plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] warning: 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. --- diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 03dc8680146f9..112791f474303 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeGauge plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] warning: 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. --- diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index badaca88ade08..bdabcc6b6d49a 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeHeatmap plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] warning: 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. --- diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 0e9ed563204de..53446ee8d04e0 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypePie plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] warning: 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. --- diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 55863cf2dbfbc..5ec6254e3cf3a 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTable plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] warning: 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. --- diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 163f83446d7f2..4785334369559 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimelion plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] warning: 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. --- diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index f2bf1be662080..20e6b63023887 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimeseries plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] warning: 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. --- diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 4b0ec1cd90ea5..e20edad9e7ebc 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVega plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] warning: 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. --- diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 4d3fd2c027564..ee7e96005f9aa 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVislib plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] warning: 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. --- diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 706d4b035a156..3ced4a5304eb7 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeXy plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] warning: 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. --- diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 0e5e93c410bc3..9040d9553cc79 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github summary: API docs for the visualizations plugin -date: 2022-07-21 +date: 2022-07-23 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] warning: 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. --- From 770802b1cbcd739244e8e3dc2b13fbed0f89b738 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Sun, 24 Jul 2022 00:40:11 -0400 Subject: [PATCH 47/78] [api-docs] Daily api_docs build (#137019) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/core_application.mdx | 2 +- api_docs/core_chrome.mdx | 2 +- api_docs/core_saved_objects.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/elastic_apm_synthtrace.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_common.mdx | 2 +- api_docs/kbn_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bazel_packages.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- api_docs/kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- api_docs/kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- api_docs/kbn_core_deprecations_browser_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_client_server_internal.mdx | 2 +- api_docs/kbn_core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- api_docs/kbn_core_elasticsearch_server_internal.mdx | 2 +- api_docs/kbn_core_elasticsearch_server_mocks.mdx | 2 +- api_docs/kbn_core_environment_server_internal.mdx | 2 +- api_docs/kbn_core_environment_server_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_browser.mdx | 2 +- api_docs/kbn_core_execution_context_browser_internal.mdx | 2 +- api_docs/kbn_core_execution_context_browser_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_common.mdx | 2 +- api_docs/kbn_core_execution_context_server.mdx | 2 +- api_docs/kbn_core_execution_context_server_internal.mdx | 2 +- api_docs/kbn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- api_docs/kbn_core_http_context_server_mocks.mdx | 2 +- api_docs/kbn_core_http_router_server_internal.mdx | 2 +- api_docs/kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_injected_metadata_browser.mdx | 2 +- api_docs/kbn_core_injected_metadata_browser_mocks.mdx | 2 +- api_docs/kbn_core_integrations_browser_internal.mdx | 2 +- api_docs/kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- api_docs/kbn_core_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_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- api_docs/kbn_core_ui_settings_browser_internal.mdx | 2 +- api_docs/kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_cards.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_kibana_json_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_scalability_simulation_generator.mdx | 2 +- api_docs/kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_alerting_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- api_docs/kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_components.mdx | 2 +- api_docs/kbn_shared_ux_page_analytics_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- api_docs/kbn_shared_ux_prompt_no_data_views.mdx | 2 +- api_docs/kbn_shared_ux_services.mdx | 2 +- api_docs/kbn_shared_ux_storybook.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/shared_u_x.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.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/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_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 306 files changed, 306 insertions(+), 306 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 0134daca7d5a8..5e9f02a781b17 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github summary: API docs for the actions plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] warning: 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. --- diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 1ac4c8d9106e9..895da0b2f72b4 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github summary: API docs for the advancedSettings plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] warning: 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. --- diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 4e105828cb108..786e5e5b62948 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github summary: API docs for the aiops plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] warning: 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. --- diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 048915d0d72a2..4f845853e5938 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github summary: API docs for the alerting plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] warning: 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. --- diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index ecadca13f26da..ce098b3e5634a 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github summary: API docs for the apm plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] warning: 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. --- diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 677a562bde529..34ceaf287d4d0 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github summary: API docs for the banners plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] warning: 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. --- diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 10023c44fd2ee..3de0cfb260b9a 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github summary: API docs for the bfetch plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] warning: 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. --- diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 160bc7a1f1735..69db34c2dca67 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github summary: API docs for the canvas plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] warning: 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. --- diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 4868c36d6c034..63ff0fae859d6 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github summary: API docs for the cases plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] warning: 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. --- diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index efca78338a22f..70506fd0ec271 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github summary: API docs for the charts plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] warning: 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. --- diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index db47b033725e7..24932fe38468e 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloud plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] warning: 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. --- diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index ff7b5e72894ee..5d847529da320 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloudSecurityPosture plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] warning: 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. --- diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 084de900709cf..9682c6e61533b 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github summary: API docs for the console plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] warning: 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. --- diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 1003829b5e8e2..d7dbf50e011c6 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github summary: API docs for the controls plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] warning: 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. --- diff --git a/api_docs/core.mdx b/api_docs/core.mdx index a03683437b7a1..a288c94871051 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github summary: API docs for the core plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] warning: 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. --- diff --git a/api_docs/core_application.mdx b/api_docs/core_application.mdx index eed2740c51871..57c629ed2ac66 100644 --- a/api_docs/core_application.mdx +++ b/api_docs/core_application.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-application title: "core.application" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.application plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.application'] warning: 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. --- diff --git a/api_docs/core_chrome.mdx b/api_docs/core_chrome.mdx index 805e3cb4eca18..8c5cbecbe5390 100644 --- a/api_docs/core_chrome.mdx +++ b/api_docs/core_chrome.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-chrome title: "core.chrome" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.chrome plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.chrome'] warning: 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. --- diff --git a/api_docs/core_saved_objects.mdx b/api_docs/core_saved_objects.mdx index 246fa8145282c..eddecbb52e211 100644 --- a/api_docs/core_saved_objects.mdx +++ b/api_docs/core_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-savedObjects title: "core.savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.savedObjects plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.savedObjects'] warning: 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. --- diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 6ac77b0c1cb81..fec8441db9c7b 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github summary: API docs for the customIntegrations plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] warning: 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. --- diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 311ed5ef08ca0..ada23628c012e 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboard plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] warning: 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. --- diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index e7af9b3df0b35..e6c47633dd06c 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboardEnhanced plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] warning: 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. --- diff --git a/api_docs/data.mdx b/api_docs/data.mdx index febfa26f6104c..e4c42d7307851 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github summary: API docs for the data plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] warning: 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. --- diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 77319a74366ab..678f2a6395d0b 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.query plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] warning: 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. --- diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 027b3d76bee80..d1f8746b76404 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.search plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] warning: 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. --- diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 2f68c63587826..f64ccdb4b6775 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewEditor plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] warning: 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. --- diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 8ed4c3151a99d..911e718c01a49 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewFieldEditor plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] warning: 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. --- diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 5d5008515d608..b5dc487a6d6a9 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewManagement plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] warning: 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. --- diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 9ea5bd140131c..70b0146ebe168 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViews plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] warning: 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. --- diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 5365385ba7463..3a7869facdffc 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataVisualizer plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] warning: 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. --- diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 90821e977b63f..76a46212832db 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 5b6ba84b15f67..cfe03cbb3cfb6 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index f22f5366de12b..0277888a9cf5a 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team summary: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 9ac7a72d498b7..40ddf1bde5e98 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github summary: API docs for the devTools plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] warning: 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. --- diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 2a85470ce6620..1a5e00a9c9ec5 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github summary: API docs for the discover plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] warning: 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. --- diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 7d985ae3f37c5..2446c122d332a 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the discoverEnhanced plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] warning: 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. --- diff --git a/api_docs/elastic_apm_synthtrace.mdx b/api_docs/elastic_apm_synthtrace.mdx index 13fd288cd2c64..50992fa9a6d38 100644 --- a/api_docs/elastic_apm_synthtrace.mdx +++ b/api_docs/elastic_apm_synthtrace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/elastic-apm-synthtrace title: "@elastic/apm-synthtrace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @elastic/apm-synthtrace plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@elastic/apm-synthtrace'] warning: 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. --- diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index f6dbf15d7523e..2ec5d6a8964a4 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddable plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] warning: 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. --- diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 36e518e4a4c59..04a717135d0b7 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddableEnhanced plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] warning: 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. --- diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 6ca6ff487542c..b13bf60d9d3ff 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the encryptedSavedObjects plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] warning: 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. --- diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 7db76930a2bfd..829f2b370bfb3 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the enterpriseSearch plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] warning: 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. --- diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 991972ba6b32c..dbf250a034d6e 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github summary: API docs for the esUiShared plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] warning: 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. --- diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index c4ab23bab3f5a..511bd380b8f9a 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventAnnotation plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] warning: 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. --- diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index e8ba248d2a921..0abc43b1fddcf 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventLog plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] warning: 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. --- diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index ad8f44e115bdf..280d382d33dbb 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionError plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] warning: 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. --- diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 5a05a426d3c9e..5473b90fde371 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionGauge plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] warning: 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. --- diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 745cf29908745..33e75c7435687 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionHeatmap plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] warning: 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. --- diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 0fd63a41b742a..7e3d7ba3e501e 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionImage plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] warning: 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. --- diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 6ca3492e72bd7..82922e6aa2d43 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionLegacyMetricVis plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] warning: 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. --- diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 369868f2627d8..2a1f31e36cd90 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetric plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] warning: 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. --- diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 93c3a75000f9d..5e0cb5ae445c4 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetricVis plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] warning: 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. --- diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index b228122c8582a..5f54880b89666 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionPartitionVis plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] warning: 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. --- diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index fe5dc2347bfe8..66523df1af41b 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRepeatImage plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] warning: 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. --- diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 2696406bea25e..30b935815cab2 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRevealImage plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] warning: 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. --- diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index c625e7680d886..1f5062ebeeb45 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionShape plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] warning: 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. --- diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index df130e23b62c1..86996d96faf15 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionTagcloud plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] warning: 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. --- diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 0f4d71a40d2ac..9270763b2116d 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionXY plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] warning: 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. --- diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 44150b58ccd23..95a4ccfb45673 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressions plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] warning: 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. --- diff --git a/api_docs/features.mdx b/api_docs/features.mdx index d995a85b724d1..55596d8a81130 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github summary: API docs for the features plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] warning: 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. --- diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 9e387fc36f729..cc17cc647a6f5 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github summary: API docs for the fieldFormats plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] warning: 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. --- diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index d4cf35818988c..ffdf8b1cd1a94 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github summary: API docs for the fileUpload plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] warning: 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. --- diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 0b1cca6a1a0ad..826a222685bcf 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github summary: API docs for the fleet plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] warning: 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. --- diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 92002dcab1193..95b673999fffe 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the globalSearch plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] warning: 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. --- diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 66e5a8efa84d9..b150c64b251e9 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github summary: API docs for the home plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] warning: 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. --- diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index f0315e1eb4c6b..46a75aae00988 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexLifecycleManagement plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] warning: 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. --- diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 9a229d1767a1b..d91616652ed32 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexManagement plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] warning: 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. --- diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 484b674317861..6471fe040f4d2 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github summary: API docs for the infra plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] warning: 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. --- diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index ce77e4c344138..c93e48f63cbb8 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github summary: API docs for the inspector plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] warning: 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. --- diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 4ee201ee1ccb0..a8aaa261c708f 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github summary: API docs for the interactiveSetup plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] warning: 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. --- diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 608a56c34803e..e48ae1f76ab1e 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ace plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] warning: 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. --- diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index b5f835b4eb4b7..2a42f08c4c3b9 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-components plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] warning: 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. --- diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 8a54ec27d2103..27f986a1c576a 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] warning: 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. --- diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 5ca3cff2d7ae1..a60e489efeb78 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/alerts plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] warning: 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. --- diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 79315e2449002..ebc88760d35d9 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] warning: 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. --- diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 92fba9f9ab3e1..e4ab47f729eaa 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-client plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 9184e3c84aa40..3e4e07babdc38 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index b79f7e5a5fdcc..dbb506ea5b2e1 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 1fad9c6f261b5..023903f75b886 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index f2d25e7dfc4d4..4a00eb7f80ac8 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] warning: 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. --- diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 6abab19dfa83e..c87f389b06a8b 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-config-loader plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] warning: 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. --- diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 552ee5e273368..7fa2ffcdb80f9 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] warning: 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. --- diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index d2528d087969d..612b585fc6dbc 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/axe-config plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] warning: 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. --- diff --git a/api_docs/kbn_bazel_packages.mdx b/api_docs/kbn_bazel_packages.mdx index 6ecd4e27ad897..240064f90ffde 100644 --- a/api_docs/kbn_bazel_packages.mdx +++ b/api_docs/kbn_bazel_packages.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-bazel-packages title: "@kbn/bazel-packages" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/bazel-packages plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bazel-packages'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index b467a02387373..7385a99cf16af 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-core plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index dad1a02ab2563..2fe5fcbaf906b 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 879465b4f9dfb..ac326153aa5d1 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] warning: 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. --- diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 0f191d9c3ca5c..e4b0e0faa2a1d 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/cli-dev-mode plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] warning: 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. --- diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 82dc60459f29a..20cac0a5ee7d1 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/coloring plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] warning: 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. --- diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index bec7c1aa5b8a5..47910d1ab251f 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] warning: 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. --- diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 0782fd09fb8b0..3384510ba2779 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] warning: 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. --- diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 71d7e7775e838..0b27d7fe64c1f 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-schema plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index dbba8497b96f5..d7f0b7dd9d968 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 12014d2a06644..eb567622eeca5 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 34ed5252ed0e7..9defd33efb7b1 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 997647a851cfa..63fdda117d306 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 9840f5040b9a6..35e621fbf698c 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index e9da96f84e096..8781691e22ae6 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 25067777a1bd2..3cd19fb03bc65 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index bca9a29aa9dd5..6622da62d5454 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-common plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] warning: 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. --- diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index eace6c7e5d171..72dffb58e100d 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index dd00fa47b1c89..6b6e226200d1a 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 35f3704702f12..6d25343e7e829 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-config-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 572ac6ccad16a..a58fe0a10fcfd 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 2e290bb7fd2c7..59c4be8a271dc 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index a94672b7473b0..98feb095ae27e 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index c41431205bfce..ff1abd11b939e 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-common plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 5a573b500e069..8ed58d7c9bc29 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 29944d9489357..cce690b809c79 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 1ee8d18e9285d..22e824c0c5088 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index a3014be3dc0ab..115f7e0e12ee5 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 623b01dcf4934..507ba66649901 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index f03a11de301cc..1405894741cda 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 9a6b4dd87fed9..cb600196c7449 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 397ea32ff4746..2905f013fa992 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index ff20309df2980..088aa56335b11 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 8c4278073b895..ffbeebbfc4033 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index baf0721d910bb..86f9b2adcbe1c 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index a922d66bc7ca6..9e75c281bd794 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index db7ff979a60f8..efd0b26f88ab5 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 2fb078b1c28f9..18ff020100794 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index b191a1e8b646d..6b0790a4c93a7 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-common plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 82e5332623438..adfa898dfe7c9 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index aa9b87e104872..b72c243aad295 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index d0ec1247f7b23..cb45fa480ee18 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index b000d4a834415..a90a80f9bfb3f 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 0f32d7526f5d2..452556918f782 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 6651293333944..7d6b5f676dbce 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 773e1296da695..947801b0904a4 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 693ce67a12b30..7ef7ba5eb734c 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index effd9e67eeab6..ac3a68ed547c3 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-common plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] warning: 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. --- diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 9cee569074734..c7f3b466fcc2e 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index a633f7efd836f..ac444e27cffa3 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 97f52dab0bbdb..1b13a7f395c5b 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index f1c1d6ebe2705..b34d6faf68dca 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 7d2133116f97c..aad8d7e214ce2 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 2073c8c70051a..2a5ad74f0b833 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index a220c0b7e7b3d..01a75859c87fe 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 277e129849424..2033759daa762 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 06b76282765dc..cefe62e9aa5cc 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 8bd39159c955a..b2600a663b36e 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index ea82d4bf17b02..0b50302ee9432 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index c18655f052588..4c70a405f5600 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 8965cccb526bc..e7433132d6d6d 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index bf7ca8ef72dd0..e2517cfb50233 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 47df69f8ff345..e363332bcf975 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index c2fd38ade32df..9ae51bd19ab35 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 59f9f93c54fbd..3f3d16455292d 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 5388233a7964c..3042b639bbf25 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index f8dfa26237024..845db99cea76f 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] warning: 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. --- diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index ba9ea12edab69..5d1cb6066a37c 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] warning: 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. --- 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 255151010e1e8..1e156a43f0e58 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index 575096875f269..e63a1754e3eb7 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index cd53e021c2a4c..acddcfe775d8f 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 698bd1d4ee9ce..b1ec0d72d8e87 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index ed0cea5a682ff..aab75d9e120b9 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 299e7cfc12586..d80c08bd04c5e 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index db22615e409d0..6212614e6555f 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index df75d7396bffb..b8e281250f5d3 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] warning: 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. --- diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 1079df724a69c..e743083074323 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] warning: 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. --- diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index 66da1fdd25ace..ee0af8ebaada5 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto-browser plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] warning: 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. --- diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 5d293f8dc0984..f6c90410a8dd0 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/datemath plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] warning: 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. --- diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 6119cb88e81c5..e0961a2209344 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-errors plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] warning: 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. --- diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index fa520338d0e4c..3b63cdbbfee38 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-runner plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] warning: 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. --- diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 4da705e53d899..4216581400f19 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-proc-runner plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] warning: 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. --- diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 2c2d3f1c76762..752ed0ea79568 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] warning: 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. --- diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index db92240858158..f30d0d82555e8 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/doc-links plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] warning: 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. --- diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 94116f14a5085..37baca05ffaf0 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/docs-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] warning: 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. --- diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 60ea8aa5846ca..e0e1f9f34e339 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-archiver plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] warning: 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. --- diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index c8a2401523d60..01c570730f47b 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-errors plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] warning: 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. --- diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index f297315405e5d..9744172586d40 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-query plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] warning: 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. --- diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index e825b62d1f2bc..0d5d305347121 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] warning: 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. --- diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 75a2417b03c0d..95e22fe054f3b 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/field-types plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] warning: 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. --- diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 989ffdcf0d686..12364ea68b4e3 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/find-used-node-modules plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] warning: 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. --- diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 5d76e00f4934c..b09d847de544b 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/generate plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] warning: 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. --- diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 91fe3bea9dfb4..fe1267be59c63 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/handlebars plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] warning: 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. --- diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 03c180291c571..6ba566fbe6d97 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/hapi-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] warning: 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. --- diff --git a/api_docs/kbn_home_sample_data_cards.mdx b/api_docs/kbn_home_sample_data_cards.mdx index 82868d9f0b12d..ef844e6e622dd 100644 --- a/api_docs/kbn_home_sample_data_cards.mdx +++ b/api_docs/kbn_home_sample_data_cards.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-cards title: "@kbn/home-sample-data-cards" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/home-sample-data-cards plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-cards'] warning: 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. --- diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index ea872236e1fc1..4b0500f0a9783 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/i18n plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] warning: 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. --- diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 744f1883a188b..7d4c82d7674dd 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/import-resolver plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] warning: 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. --- diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index c8366d0eb83a3..188024e0dfcac 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/interpreter plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] warning: 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. --- diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 7bfe1bfd881c2..e4f4a579f53e0 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/io-ts-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 6689bb642608a..2a122ac9713ab 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/jest-serializers plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] warning: 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. --- diff --git a/api_docs/kbn_kibana_json_schema.mdx b/api_docs/kbn_kibana_json_schema.mdx index 76e81086a1a45..655a40536c487 100644 --- a/api_docs/kbn_kibana_json_schema.mdx +++ b/api_docs/kbn_kibana_json_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-json-schema title: "@kbn/kibana-json-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/kibana-json-schema plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-json-schema'] warning: 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. --- diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 147007f7953aa..f21da57ffc298 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] warning: 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. --- diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 7608ecc255c8c..98efc6794dde4 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging-mocks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] warning: 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. --- diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index f9d10058276dd..4288a370e0ea0 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/mapbox-gl plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] warning: 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. --- diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 404cb6a701aee..ca964414485b5 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-agg-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] warning: 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. --- diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index b5875455eea84..1ea2a9a574173 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] warning: 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. --- diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index fccf4dfb16c01..e986fe88e9678 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-string-hash plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] warning: 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. --- diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 14fb34fd96b62..21d7f87bf495e 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/monaco plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] warning: 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. --- diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 7217e44595c97..e557e348b39b2 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] warning: 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. --- diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index aecdf5ebd52bc..c1eeb62319e35 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] warning: 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. --- diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 11057410d150c..2fa7f22f74a38 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] warning: 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. --- diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 4d633bde53096..fc3a2bebfa267 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-generator plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] warning: 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. --- diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 54420007501f6..a98e73f3bd579 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-helpers plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] warning: 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. --- diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index f16cba03d8357..eae0ecadfdaed 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/react-field plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] warning: 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. --- diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 12d25107617f1..691e660696c9b 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/rule-data-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] warning: 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. --- diff --git a/api_docs/kbn_scalability_simulation_generator.mdx b/api_docs/kbn_scalability_simulation_generator.mdx index e351e15f85945..1dbfa222eb2d3 100644 --- a/api_docs/kbn_scalability_simulation_generator.mdx +++ b/api_docs/kbn_scalability_simulation_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-scalability-simulation-generator title: "@kbn/scalability-simulation-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/scalability-simulation-generator plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scalability-simulation-generator'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index fa556968c7fd1..26214132a37d4 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 7da8265ea3202..ae875bfa2fe7b 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 754259715d87b..419c5270f7151 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index be8034e0b7157..faf1c70f288e3 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 5248e893b276e..85b573a3bfb89 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 38c4020b6208d..0256318fd5b7d 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index bc16ab6dab5de..a75c7028d6e30 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 16bba69c50a76..6eccb374b49f9 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 87d7dbf950524..148463eb1b3a2 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index ec70a2bf5726a..a9cf56d0c820b 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index bb8c9fd5213bc..19cf35406857f 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 61d8b360ce064..3576d53aae50b 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-rules plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index e396176be6de4..a6c856ce34db8 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index a0256eddd88f1..9787ef9664183 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] warning: 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. --- diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 3fac51050b25c..e719d1d785909 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-http-tools plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] warning: 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. --- diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index c2ca0ce4cad77..eb35c7188fb51 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-route-repository plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 09f37df8be92e..f793c5663a3e8 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index f73093e1d0336..946390d8e607e 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_components.mdx b/api_docs/kbn_shared_ux_components.mdx index dc4b426beb955..c24971b2361a5 100644 --- a/api_docs/kbn_shared_ux_components.mdx +++ b/api_docs/kbn_shared_ux_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-components title: "@kbn/shared-ux-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-components plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-components'] warning: 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. --- 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 acdaf9eb28cf2..aaeaac72b1e36 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] warning: 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. --- 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 21d297bc07199..c2c0f12936215 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index df6a15a59b826..f4027003c9cdb 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] warning: 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. --- 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 28ed692bd6db0..ef5ba18dc6d83 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_services.mdx b/api_docs/kbn_shared_ux_services.mdx index 0111abfff4225..e1944df7c4bb3 100644 --- a/api_docs/kbn_shared_ux_services.mdx +++ b/api_docs/kbn_shared_ux_services.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-services title: "@kbn/shared-ux-services" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-services plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-services'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_storybook.mdx b/api_docs/kbn_shared_ux_storybook.mdx index b78f584cd1d8f..46874472e583f 100644 --- a/api_docs/kbn_shared_ux_storybook.mdx +++ b/api_docs/kbn_shared_ux_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook title: "@kbn/shared-ux-storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-storybook plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index ae1d4d795c056..cc24cc1c99b28 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-utility plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] warning: 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. --- diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 56a9ba3444920..1242936639085 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/some-dev-log plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] warning: 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. --- diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index 084a960f07d9c..fc4f2f2483820 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/sort-package-json plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] warning: 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. --- diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index da32e331c6ce3..2f989d96fd122 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/std plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] warning: 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. --- diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index c3212c6b1c063..8b694178bc242 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] warning: 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. --- diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 18ba72061b018..cf3cfa1730880 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/storybook plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] warning: 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. --- diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 74c06df376185..7af6474ac852b 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/telemetry-tools plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] warning: 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. --- diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 54bf10f065019..9ad22f3277826 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] warning: 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. --- diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 24700c156b5a4..6fe1a7cbcc4fb 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test-jest-helpers plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] warning: 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. --- diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 6233848f6ce9e..db61859f12a3f 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/tooling-log plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] warning: 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. --- diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index 4fb2a9ae3105f..bd3b039bc84d6 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] warning: 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. --- diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index b507e165be88b..d663c520845af 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer-core plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] warning: 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. --- diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index c8a3df54b8200..8c1dd9b05730c 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/typed-react-router-config plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] warning: 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. --- diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 361ab0db49798..8254ec208ecd1 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ui-theme plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] warning: 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. --- diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 888b491059797..6e85efab91bce 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] warning: 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. --- diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index 391d1479a3a64..bb5869ca6cfab 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types-jest plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] warning: 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. --- diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 2d252321b43ea..281168556a5cf 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] warning: 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. --- diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 51188323fbf1a..6c2efe49ce303 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] warning: 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. --- diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index db4e630e4f7c2..cf811fb12c7ba 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaOverview plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] warning: 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. --- diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index ece65df3d66e3..0257cb1f37f03 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaReact plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] warning: 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. --- diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index d1401bf1d3359..b8461b18319cf 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaUtils plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] warning: 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. --- diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 6a0c7601c3330..ae87478c93a36 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github summary: API docs for the kubernetesSecurity plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] warning: 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. --- diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 0fab8f7b6efad..6108f32c3b487 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github summary: API docs for the lens plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] warning: 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. --- diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 880956430495c..2e10bb5486442 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseApiGuard plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] warning: 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. --- diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index d6b515b34f414..f2ff8801cae26 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseManagement plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] warning: 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. --- diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 858a255b3920f..7098aca2fa9bc 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github summary: API docs for the licensing plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] warning: 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. --- diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 7a37aaae8c9bb..3101089ac4bf5 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github summary: API docs for the lists plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] warning: 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. --- diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 5a8ef4efd3e66..7c9c269ed6613 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github summary: API docs for the management plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] warning: 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. --- diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 044ad81986586..ce12dc00a0c6c 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github summary: API docs for the maps plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] warning: 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. --- diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index b1883fdf3fc65..4b3d83b8ae04c 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github summary: API docs for the mapsEms plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] warning: 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. --- diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 48994a2ca2028..a851d9dbc63ff 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github summary: API docs for the ml plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] warning: 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. --- diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 6347ed3c81845..33c9b9c3beabc 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoring plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] warning: 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. --- diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 515f3b315e19d..6b63b7429d1eb 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoringCollection plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] warning: 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. --- diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index a90a0999ac0dc..5b044936fd3c3 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github summary: API docs for the navigation plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] warning: 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. --- diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 2aa9754788a87..734c8164371f7 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github summary: API docs for the newsfeed plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] warning: 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. --- diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index a4121e20a70a5..5e2cf43ba10cb 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github summary: API docs for the observability plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] warning: 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. --- diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 2c63d9837c26a..fa7c910b6fc65 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github summary: API docs for the osquery plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] warning: 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. --- diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 372ce05777755..b5c170da6b79c 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -3,7 +3,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory summary: Directory of public APIs available through plugins or packages. -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: 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. --- diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 51ab27eb9d27f..5f7b3a304430a 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github summary: API docs for the presentationUtil plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] warning: 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. --- diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index e8351305cd759..d43545eabf038 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github summary: API docs for the remoteClusters plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] warning: 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. --- diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index f28d2cbd9ae7d..5f799ac5260a2 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github summary: API docs for the reporting plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] warning: 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. --- diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index db30749a838e1..b6500d00a0333 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github summary: API docs for the rollup plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] warning: 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. --- diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 5f86177d210c3..f9c2d858a8a97 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github summary: API docs for the ruleRegistry plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] warning: 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. --- diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index e3d8d5a5c93e8..3f1865e4ab5e2 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github summary: API docs for the runtimeFields plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] warning: 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. --- diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 7125d90da1463..d267095bcbddb 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjects plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] warning: 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. --- diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index e5e76cefee365..334db759d1f83 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsManagement plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index f208c48cf917a..aa6c6ff7be684 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTagging plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index ccc0dd5cf51fb..c3bcf76cfc81b 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTaggingOss plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] warning: 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. --- diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 6c9681c3f11fa..8083f9bd35c15 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotMode plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] warning: 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. --- diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 310dddc4a1bd3..4302b31592053 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotting plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] warning: 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. --- diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 862b8895bef28..b19294544720d 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github summary: API docs for the security plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] warning: 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. --- diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 1c3bcbf4db864..88062d6f8267d 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github summary: API docs for the securitySolution plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] warning: 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. --- diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 23bd0d4ec0f3e..64fb00ad7d336 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github summary: API docs for the sessionView plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] warning: 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. --- diff --git a/api_docs/share.mdx b/api_docs/share.mdx index d6a5c7eccdecd..0800de9aac0bb 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github summary: API docs for the share plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] warning: 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. --- diff --git a/api_docs/shared_u_x.mdx b/api_docs/shared_u_x.mdx index 7e11ac998838d..f2e5c1ea13beb 100644 --- a/api_docs/shared_u_x.mdx +++ b/api_docs/shared_u_x.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sharedUX title: "sharedUX" image: https://source.unsplash.com/400x175/?github summary: API docs for the sharedUX plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sharedUX'] warning: 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. --- diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 3e86873e2da2b..0d192ce0af434 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github summary: API docs for the snapshotRestore plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] warning: 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. --- diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 9076a159ff0c1..82ffde4c77857 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github summary: API docs for the spaces plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] warning: 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. --- diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 9008b7c72cd15..0a21a2b9a8fe8 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the stackAlerts plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] warning: 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. --- diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index e038ebdb99aa3..3a487e2233f50 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the taskManager plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] warning: 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. --- diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index 5765f3a652b4e..d8fd26e1efa9b 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetry plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] warning: 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. --- diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 0009e825fa9ca..e01e14d7c434c 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionManager plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] warning: 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. --- diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index ed43092ec47f2..27095c728b16f 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionXpack plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] warning: 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. --- diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 7046e7c720fdd..eb0b2a9e4feb5 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryManagementSection plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] warning: 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. --- diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index f956b552272de..9203a9f337811 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github summary: API docs for the timelines plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] warning: 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. --- diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 820e1ef542b98..095581a935c5a 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github summary: API docs for the transform plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] warning: 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. --- diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 9db334f7f7c61..5ebe0a96a7d2a 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github summary: API docs for the triggersActionsUi plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] warning: 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. --- diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 68004901beae0..370f78f524cd2 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActions plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] warning: 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. --- diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index 2a6631645b19a..df488cc4f3622 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActionsEnhanced plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] warning: 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. --- diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index a14a4a8e65e38..9514e23b8719d 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] warning: 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. --- diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 5af7a65a6e4f4..c7ac9cb96bdec 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch.autocomplete plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] warning: 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. --- diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 08512163e647e..a81efae865fe6 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github summary: API docs for the urlForwarding plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] warning: 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. --- diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index b389a4b61392f..1deac8e359ba1 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the usageCollection plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] warning: 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. --- diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 1a4eb77b731e1..3ad534c65ce45 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github summary: API docs for the ux plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] warning: 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. --- diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 11e5d284b1ac4..6cdad86713115 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the visDefaultEditor plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] warning: 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. --- diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 112791f474303..040619237e0e8 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeGauge plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] warning: 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. --- diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index bdabcc6b6d49a..39a90c537d6fd 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeHeatmap plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] warning: 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. --- diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index 53446ee8d04e0..cf149ab27072b 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypePie plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] warning: 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. --- diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 5ec6254e3cf3a..47abc256a7372 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTable plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] warning: 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. --- diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 4785334369559..ce1fa397d32d5 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimelion plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] warning: 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. --- diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 20e6b63023887..73eb82c1f7b09 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimeseries plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] warning: 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. --- diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index e20edad9e7ebc..4884d7f353e1c 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVega plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] warning: 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. --- diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index ee7e96005f9aa..b4a2fd0b0554f 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVislib plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] warning: 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. --- diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 3ced4a5304eb7..0f89adef701fc 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeXy plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] warning: 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. --- diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 9040d9553cc79..60695448f4734 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github summary: API docs for the visualizations plugin -date: 2022-07-23 +date: 2022-07-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] warning: 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. --- From b61625cec62b42be0e0347f9725fe6816b2fa521 Mon Sep 17 00:00:00 2001 From: Ari Aviran Date: Sun, 24 Jul 2022 11:03:40 +0300 Subject: [PATCH 48/78] [Cloud Posture] Implement breadcrumbs for security solution (#136821) --- .../public/common/navigation/types.ts | 5 ++ .../common/navigation/use_csp_breadcrumbs.ts | 52 ++++++++++--------- .../public/pages/findings/findings.tsx | 17 ++++-- .../latest_findings_container.tsx | 4 -- .../findings_by_resource_container.tsx | 3 -- .../resource_findings_container.tsx | 2 - .../public/pages/rules/index.tsx | 50 +++++++++++------- .../cloud_security_posture/public/types.ts | 4 +- .../public/cloud_security_posture/routes.tsx | 3 ++ .../navigation/breadcrumbs/index.ts | 11 +++- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 13 files changed, 91 insertions(+), 63 deletions(-) diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts index 92e1c5579057c..4b6b0804a7b6f 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/types.ts @@ -26,3 +26,8 @@ export type CloudSecurityPosturePageId = | 'cloud_security_posture-findings' | 'cloud_security_posture-benchmarks' | 'cloud_security_posture-rules'; + +export interface BreadcrumbEntry { + readonly name: string; + readonly path: string; +} diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts index e3a9ac8c0c06e..d9b540e755bfa 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/use_csp_breadcrumbs.ts @@ -4,21 +4,17 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import type { MouseEvent } from 'react'; import type { ChromeBreadcrumb, CoreStart } from '@kbn/core/public'; import { useEffect } from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { type RouteProps, useRouteMatch, useHistory } from 'react-router-dom'; +import { type RouteProps, useRouteMatch } from 'react-router-dom'; import type { EuiBreadcrumb } from '@elastic/eui'; import { string } from 'io-ts'; -import { i18n } from '@kbn/i18n'; -import { CLOUD_SECURITY_POSTURE_BASE_PATH } from '../..'; -import type { CspNavigationItem } from './types'; +import useObservable from 'react-use/lib/useObservable'; +import type { BreadcrumbEntry } from './types'; -const getClickableBreadcrumb = ( - routeMatch: RouteProps['path'], - breadcrumbPath: CspNavigationItem['path'] -) => { +const getClickableBreadcrumb = (routeMatch: RouteProps['path'], breadcrumbPath: string) => { const hasParams = breadcrumbPath.includes(':'); if (hasParams) return; @@ -27,15 +23,20 @@ const getClickableBreadcrumb = ( } }; -export const useCspBreadcrumbs = (breadcrumbs: CspNavigationItem[]) => { +export const useCspBreadcrumbs = (breadcrumbs: BreadcrumbEntry[]) => { const { services: { chrome: { setBreadcrumbs, docTitle }, - application: { getUrlForApp }, + application: { currentAppId$, applications$, navigateToApp }, }, } = useKibana(); + const match = useRouteMatch(); - const history = useHistory(); + + const appId = useObservable(currentAppId$); + const applications = useObservable(applications$); + const application = appId ? applications?.get(appId) : undefined; + const appTitle = application?.title; useEffect(() => { const additionalBreadCrumbs: ChromeBreadcrumb[] = breadcrumbs.map((breadcrumb) => { @@ -43,31 +44,32 @@ export const useCspBreadcrumbs = (breadcrumbs: CspNavigationItem[]) => { return { text: breadcrumb.name, - ...(clickableLink && { - onClick: (e) => { - e.preventDefault(); - history.push(clickableLink); - }, - }), + ...(clickableLink && + appId && { + onClick: (e) => { + e.preventDefault(); + void navigateToApp(appId, { path: clickableLink }); + }, + }), }; }); const nextBreadcrumbs = [ { - text: i18n.translate('xpack.csp.navigation.cloudPostureBreadcrumbLabel', { - defaultMessage: 'Cloud Posture', + text: appTitle, + ...(appId && { + onClick: (e: MouseEvent) => { + e.preventDefault(); + void navigateToApp(appId); + }, }), - onClick: (e: React.MouseEvent) => { - e.preventDefault(); - history.push(CLOUD_SECURITY_POSTURE_BASE_PATH); - }, }, ...additionalBreadCrumbs, ]; setBreadcrumbs(nextBreadcrumbs); docTitle.change(getTextBreadcrumbs(nextBreadcrumbs)); - }, [match.path, getUrlForApp, setBreadcrumbs, breadcrumbs, history, docTitle]); + }, [match.path, setBreadcrumbs, breadcrumbs, docTitle, appTitle, appId, navigateToApp]); }; const getTextBreadcrumbs = (breadcrumbs: EuiBreadcrumb[]) => diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx index 36d0918c52d5e..12af30a11708a 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings.tsx @@ -7,6 +7,7 @@ import React from 'react'; import type { UseQueryResult } from 'react-query'; import { Redirect, Switch, Route, useLocation } from 'react-router-dom'; +import { useCspBreadcrumbs } from '../../common/navigation/use_csp_breadcrumbs'; import { CloudPosturePage } from '../../components/cloud_posture_page'; import { useFindingsEsPit } from './es_pit/use_findings_es_pit'; import { FindingsEsPitContext } from './es_pit/findings_es_pit_context'; @@ -68,8 +69,14 @@ export const FindingsNoPageTemplate = () => { ); }; -export const Findings = () => ( - - - -); +const FINDINGS_BREADCRUMBS = [cloudPosturePages.findings]; + +export const Findings = () => { + useCspBreadcrumbs(FINDINGS_BREADCRUMBS); + + return ( + + + + ); +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.tsx index 54d9e35e1dd30..c41b6835fb4ff 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.tsx @@ -26,8 +26,6 @@ import { } from '../utils'; import { PageWrapper, PageTitle, PageTitleText } from '../layout/findings_layout'; import { FindingsGroupBySelector } from '../layout/findings_group_by_selector'; -import { useCspBreadcrumbs } from '../../../common/navigation/use_csp_breadcrumbs'; -import { findingsNavigation } from '../../../common/navigation/constants'; import { useUrlQuery } from '../../../common/hooks/use_url_query'; import { ErrorCallout } from '../layout/error_callout'; @@ -43,8 +41,6 @@ export const getDefaultQuery = ({ }); export const LatestFindingsContainer = ({ dataView }: FindingsBaseProps) => { - useCspBreadcrumbs([findingsNavigation.findings_default]); - const getPersistedDefaultQuery = usePersistedQuery(getDefaultQuery); const { urlQuery, setUrlQuery } = useUrlQuery(getPersistedDefaultQuery); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/findings_by_resource_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/findings_by_resource_container.tsx index adebb18e69901..e55af94202e3c 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/findings_by_resource_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/findings_by_resource_container.tsx @@ -26,7 +26,6 @@ import { import { PageTitle, PageTitleText, PageWrapper } from '../layout/findings_layout'; import { FindingsGroupBySelector } from '../layout/findings_group_by_selector'; import { findingsNavigation } from '../../../common/navigation/constants'; -import { useCspBreadcrumbs } from '../../../common/navigation/use_csp_breadcrumbs'; import { ResourceFindings } from './resource_findings/resource_findings_container'; import { ErrorCallout } from '../layout/error_callout'; import { FindingsDistributionBar } from '../layout/findings_distribution_bar'; @@ -57,8 +56,6 @@ export const FindingsByResourceContainer = ({ dataView }: FindingsBaseProps) => ); const LatestFindingsByResource = ({ dataView }: FindingsBaseProps) => { - useCspBreadcrumbs([findingsNavigation.findings_by_resource]); - const getPersistedDefaultQuery = usePersistedQuery(getDefaultQuery); const { urlQuery, setUrlQuery } = useUrlQuery(getPersistedDefaultQuery); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/resource_findings/resource_findings_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/resource_findings/resource_findings_container.tsx index cd37e6d189f0e..1302dfafe6603 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/resource_findings/resource_findings_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings_by_resource/resource_findings/resource_findings_container.tsx @@ -13,7 +13,6 @@ import { generatePath } from 'react-router-dom'; import { i18n } from '@kbn/i18n'; import * as TEST_SUBJECTS from '../../test_subjects'; import { PageWrapper, PageTitle, PageTitleText } from '../../layout/findings_layout'; -import { useCspBreadcrumbs } from '../../../../common/navigation/use_csp_breadcrumbs'; import { findingsNavigation } from '../../../../common/navigation/constants'; import { ResourceFindingsQuery, useResourceFindings } from './use_resource_findings'; import { useUrlQuery } from '../../../../common/hooks/use_url_query'; @@ -54,7 +53,6 @@ const BackToResourcesButton = () => ( ); export const ResourceFindings = ({ dataView }: FindingsBaseProps) => { - useCspBreadcrumbs([findingsNavigation.findings_default]); const { euiTheme } = useEuiTheme(); const params = useParams<{ resourceId: string }>(); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx index 5acd1c5b8b2e1..20016bc79bf78 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/index.tsx @@ -5,31 +5,56 @@ * 2.0. */ -import React, { useMemo } from 'react'; +import React, { useContext, useMemo } from 'react'; import { generatePath, Link, type RouteComponentProps } from 'react-router-dom'; import { EuiTextColor, EuiButtonEmpty, EuiFlexGroup, EuiPageHeader, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { pagePathGetters } from '@kbn/fleet-plugin/public'; +import type { BreadcrumbEntry } from '../../common/navigation/types'; import { RulesContainer, type PageUrlParams } from './rules_container'; import { cloudPosturePages } from '../../common/navigation/constants'; import { useCspBreadcrumbs } from '../../common/navigation/use_csp_breadcrumbs'; -import type { CspPageNavigationItem } from '../../common/navigation/types'; import { useCspIntegrationInfo } from './use_csp_integration'; import { CspPageTemplate } from '../../components/csp_page_template'; import { useKibana } from '../../common/hooks/use_kibana'; import { CloudPosturePage } from '../../components/cloud_posture_page'; +import { SecuritySolutionContext } from '../../application/security_solution_context'; -const getRulesBreadcrumbs = (name?: string): CspPageNavigationItem[] => - [cloudPosturePages.benchmarks, { ...cloudPosturePages.rules, name }].filter( - (breadcrumb): breadcrumb is CspPageNavigationItem => !!breadcrumb.name - ); +const getRulesBreadcrumbs = ( + name?: string, + manageBreadcrumb?: BreadcrumbEntry +): BreadcrumbEntry[] => { + const breadCrumbs: BreadcrumbEntry[] = []; + if (manageBreadcrumb) { + breadCrumbs.push(manageBreadcrumb); + } + + breadCrumbs.push(cloudPosturePages.benchmarks); + + if (name) { + breadCrumbs.push({ ...cloudPosturePages.rules, name }); + } else { + breadCrumbs.push(cloudPosturePages.rules); + } + + return breadCrumbs; +}; export const RulesNoPageTemplate = ({ match: { params } }: RouteComponentProps) => { const { http } = useKibana().services; const integrationInfo = useCspIntegrationInfo(params); + const securitySolutionContext = useContext(SecuritySolutionContext); const [packageInfo, agentInfo] = integrationInfo.data || []; + const breadcrumbs = useMemo( + () => + getRulesBreadcrumbs(packageInfo?.name, securitySolutionContext?.getManageBreadcrumbEntry()), + [packageInfo?.name, securitySolutionContext] + ); + + useCspBreadcrumbs(breadcrumbs); + return ( ) => { - const { params } = props.match; - const integrationInfo = useCspIntegrationInfo(params); - - const [packageInfo] = integrationInfo.data || []; - - const breadcrumbs = useMemo( - // TODO: make benchmark breadcrumb navigable - () => getRulesBreadcrumbs(packageInfo?.name), - [packageInfo?.name] - ); - - useCspBreadcrumbs(breadcrumbs); - return ( diff --git a/x-pack/plugins/cloud_security_posture/public/types.ts b/x-pack/plugins/cloud_security_posture/public/types.ts index 5e491a5ac3b66..889642d39dc52 100755 --- a/x-pack/plugins/cloud_security_posture/public/types.ts +++ b/x-pack/plugins/cloud_security_posture/public/types.ts @@ -10,7 +10,7 @@ import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/ import type { DataPublicPluginSetup, DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { DiscoverStart } from '@kbn/discover-plugin/public'; -import type { CloudSecurityPosturePageId } from './common/navigation/types'; +import type { BreadcrumbEntry, CloudSecurityPosturePageId } from './common/navigation/types'; /** * The cloud security posture's public plugin setup interface. @@ -52,4 +52,6 @@ export interface CspSecuritySolutionContext { getFiltersGlobalComponent: () => ComponentType<{ children: ReactNode }>; /** Gets the `SpyRoute` component for navigation highlighting and breadcrumbs. */ getSpyRouteComponent: () => ComponentType<{ pageName?: CloudSecurityPosturePageId }>; + /** Gets the `Manage` breadcrumb entry. */ + getManageBreadcrumbEntry: () => BreadcrumbEntry; } diff --git a/x-pack/plugins/security_solution/public/cloud_security_posture/routes.tsx b/x-pack/plugins/security_solution/public/cloud_security_posture/routes.tsx index 3d8b1c96cb10b..1bc9bad3c9007 100644 --- a/x-pack/plugins/security_solution/public/cloud_security_posture/routes.tsx +++ b/x-pack/plugins/security_solution/public/cloud_security_posture/routes.tsx @@ -12,11 +12,13 @@ import { type CspSecuritySolutionContext, } from '@kbn/cloud-security-posture-plugin/public'; import { TrackApplicationView } from '@kbn/usage-collection-plugin/public'; +import { MANAGE_PATH } from '../../common/constants'; import type { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; import { useKibana } from '../common/lib/kibana'; import { SecuritySolutionPageWrapper } from '../common/components/page_wrapper'; import { SpyRoute } from '../common/utils/route/spy_routes'; import { FiltersGlobal } from '../common/components/filters_global'; +import { MANAGE } from '../app/translations'; // This exists only for the type signature cast const CloudPostureSpyRoute = ({ pageName }: { pageName?: CloudSecurityPosturePageId }) => ( @@ -29,6 +31,7 @@ const CloudSecurityPosture = memo(() => { const securitySolutionContext: CspSecuritySolutionContext = { getFiltersGlobalComponent: () => FiltersGlobal, getSpyRouteComponent: () => CloudPostureSpyRoute, + getManageBreadcrumbEntry: () => ({ name: MANAGE, path: MANAGE_PATH }), }; return ( diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts index aec9f2b12caaf..704a0c7a4d41b 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/navigation/breadcrumbs/index.ts @@ -80,7 +80,13 @@ export const getBreadcrumbsForRoute = ( ): ChromeBreadcrumb[] | null => { const spyState: RouteSpyState = omit('navTabs', object); - if (!spyState || !object.navTabs || !spyState.pageName || isCaseRoutes(spyState)) { + if ( + !spyState || + !object.navTabs || + !spyState.pageName || + isCaseRoutes(spyState) || + isCloudSecurityPostureManagedRoutes(spyState) + ) { return null; } @@ -164,6 +170,9 @@ const isRulesRoutes = (spyState: RouteSpyState): spyState is AdministrationRoute spyState.pageName === SecurityPageName.rules || spyState.pageName === SecurityPageName.rulesCreate; +const isCloudSecurityPostureManagedRoutes = (spyState: RouteSpyState) => + spyState.pageName === SecurityPageName.cloudSecurityPostureRules; + const emptyLastBreadcrumbUrl = (breadcrumbs: ChromeBreadcrumb[]) => { const leadingBreadCrumbs = breadcrumbs.slice(0, -1); const lastBreadcrumb = last(breadcrumbs); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index b235d2422a413..91d192146b905 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -10429,7 +10429,6 @@ "xpack.csp.findings.groupBySelector.groupByResourceIdLabel": "Ressource", "xpack.csp.findings.resourceFindings.backToResourcesPageButtonLabel": "Retour à la vue de regroupement par ressource", "xpack.csp.findings.searchBar.searchPlaceholder": "Rechercher dans les résultats (par ex. rule.section.keyword : \"serveur d'API\")", - "xpack.csp.navigation.cloudPostureBreadcrumbLabel": "Niveau du cloud", "xpack.csp.rules.activateAllButtonLabel": "Activer {count, plural, one {# règle} other {# règles}}", "xpack.csp.rules.clearSelectionButtonLabel": "Effacer la sélection", "xpack.csp.rules.deactivateAllButtonLabel": "Désactiver {count, plural, one {# règle} other {# règles}}", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a454c3e5d6327..455bebbf84c0d 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10421,7 +10421,6 @@ "xpack.csp.findings.groupBySelector.groupByResourceIdLabel": "リソース", "xpack.csp.findings.resourceFindings.backToResourcesPageButtonLabel": "リソース別グループビューに戻る", "xpack.csp.findings.searchBar.searchPlaceholder": "検索結果(例:rule.section.keyword:\"API Server\")", - "xpack.csp.navigation.cloudPostureBreadcrumbLabel": "クラウド態勢", "xpack.csp.rules.activateAllButtonLabel": "{count, plural, other {#個のルール}}をアクティブ化", "xpack.csp.rules.clearSelectionButtonLabel": "選択した項目をクリア", "xpack.csp.rules.deactivateAllButtonLabel": "{count, plural, other {#個のルール}}を非アクティブ化", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 1506d7825990f..5b31d30036851 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -10436,7 +10436,6 @@ "xpack.csp.findings.groupBySelector.groupByResourceIdLabel": "资源", "xpack.csp.findings.resourceFindings.backToResourcesPageButtonLabel": "返回到按资源视图分组", "xpack.csp.findings.searchBar.searchPlaceholder": "搜索结果(例如,rule.section.keyword:“APM 服务器”)", - "xpack.csp.navigation.cloudPostureBreadcrumbLabel": "云态势", "xpack.csp.rules.activateAllButtonLabel": "激活 {count, plural, other {# 个规则}}", "xpack.csp.rules.clearSelectionButtonLabel": "清除所选内容", "xpack.csp.rules.deactivateAllButtonLabel": "停用 {count, plural, other {# 个规则}}", From e348f74d50f739ec1b57117f661e0073567effa4 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Mon, 25 Jul 2022 00:41:39 -0400 Subject: [PATCH 49/78] [api-docs] Daily api_docs build (#137027) --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_security_posture.devdocs.json | 18 ++++++++++++++++++ api_docs/cloud_security_posture.mdx | 4 ++-- api_docs/console.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/core.mdx | 2 +- api_docs/core_application.mdx | 2 +- api_docs/core_chrome.mdx | 2 +- api_docs/core_saved_objects.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/elastic_apm_synthtrace.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerts.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ...n_analytics_shippers_elastic_v3_browser.mdx | 2 +- ...bn_analytics_shippers_elastic_v3_common.mdx | 2 +- ...bn_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_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bazel_packages.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- api_docs/kbn_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_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- .../kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_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 +- ...re_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 +- api_docs/kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...core_execution_context_browser_internal.mdx | 2 +- ...bn_core_execution_context_browser_mocks.mdx | 2 +- api_docs/kbn_core_execution_context_common.mdx | 2 +- api_docs/kbn_core_execution_context_server.mdx | 2 +- ..._core_execution_context_server_internal.mdx | 2 +- ...kbn_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 +- .../kbn_core_http_router_server_internal.mdx | 2 +- api_docs/kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- .../kbn_core_injected_metadata_browser.mdx | 2 +- ...bn_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_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- api_docs/kbn_core_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_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- ...bn_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_home_sample_data_cards.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_kibana_json_schema.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- ...n_performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- .../kbn_scalability_simulation_generator.mdx | 2 +- api_docs/kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ...n_securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_components.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_kibana_no_data.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- api_docs/kbn_shared_ux_services.mdx | 2 +- api_docs/kbn_shared_ux_storybook.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_sort_package_json.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_type_summarizer.mdx | 2 +- api_docs/kbn_type_summarizer_core.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 6 +++--- api_docs/presentation_util.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/shared_u_x.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.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/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_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 307 files changed, 327 insertions(+), 309 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 5e9f02a781b17..5ac6dbd9bd365 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github summary: API docs for the actions plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] warning: 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. --- diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 895da0b2f72b4..0fec295fa5200 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github summary: API docs for the advancedSettings plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] warning: 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. --- diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 786e5e5b62948..f967b22c85a53 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github summary: API docs for the aiops plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] warning: 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. --- diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 4f845853e5938..f8a33dc9954a6 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github summary: API docs for the alerting plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] warning: 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. --- diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index ce098b3e5634a..7c5955f02a982 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github summary: API docs for the apm plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] warning: 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. --- diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 34ceaf287d4d0..305fd9705a851 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github summary: API docs for the banners plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] warning: 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. --- diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 3de0cfb260b9a..8f729a1bd75d1 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github summary: API docs for the bfetch plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] warning: 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. --- diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 69db34c2dca67..a88f12d1aea65 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github summary: API docs for the canvas plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] warning: 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. --- diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index 63ff0fae859d6..8916379f49378 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github summary: API docs for the cases plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] warning: 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. --- diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 70506fd0ec271..cb5a8ef23a6eb 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github summary: API docs for the charts plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] warning: 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. --- diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 24932fe38468e..80b75143f5f31 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloud plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] warning: 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. --- diff --git a/api_docs/cloud_security_posture.devdocs.json b/api_docs/cloud_security_posture.devdocs.json index 3f894ca0ec0b7..cb6c6f086b077 100644 --- a/api_docs/cloud_security_posture.devdocs.json +++ b/api_docs/cloud_security_posture.devdocs.json @@ -211,6 +211,24 @@ "deprecated": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "cloudSecurityPosture", + "id": "def-public.CspSecuritySolutionContext.getManageBreadcrumbEntry", + "type": "Function", + "tags": [], + "label": "getManageBreadcrumbEntry", + "description": [ + "Gets the `Manage` breadcrumb entry." + ], + "signature": [ + "() => ", + "BreadcrumbEntry" + ], + "path": "x-pack/plugins/cloud_security_posture/public/types.ts", + "deprecated": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 5d847529da320..077355b1574a5 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github summary: API docs for the cloudSecurityPosture plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] warning: 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. --- @@ -18,7 +18,7 @@ Contact [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-pos | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 18 | 0 | 2 | 0 | +| 19 | 0 | 2 | 1 | ## Client diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 9682c6e61533b..7fbe7aa0106bc 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github summary: API docs for the console plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] warning: 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. --- diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index d7dbf50e011c6..15491442d2922 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github summary: API docs for the controls plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] warning: 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. --- diff --git a/api_docs/core.mdx b/api_docs/core.mdx index a288c94871051..97ec05bb3b98c 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github summary: API docs for the core plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] warning: 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. --- diff --git a/api_docs/core_application.mdx b/api_docs/core_application.mdx index 57c629ed2ac66..faa8242147241 100644 --- a/api_docs/core_application.mdx +++ b/api_docs/core_application.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-application title: "core.application" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.application plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.application'] warning: 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. --- diff --git a/api_docs/core_chrome.mdx b/api_docs/core_chrome.mdx index 8c5cbecbe5390..4a287852be382 100644 --- a/api_docs/core_chrome.mdx +++ b/api_docs/core_chrome.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-chrome title: "core.chrome" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.chrome plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.chrome'] warning: 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. --- diff --git a/api_docs/core_saved_objects.mdx b/api_docs/core_saved_objects.mdx index eddecbb52e211..bb5997e1aabc1 100644 --- a/api_docs/core_saved_objects.mdx +++ b/api_docs/core_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/core-savedObjects title: "core.savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the core.savedObjects plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core.savedObjects'] warning: 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. --- diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index fec8441db9c7b..0325ba11ebea6 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github summary: API docs for the customIntegrations plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] warning: 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. --- diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index ada23628c012e..30d452fec9127 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboard plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] warning: 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. --- diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index e6c47633dd06c..5a900660f8d1a 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the dashboardEnhanced plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] warning: 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. --- diff --git a/api_docs/data.mdx b/api_docs/data.mdx index e4c42d7307851..d2f327f704b20 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github summary: API docs for the data plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] warning: 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. --- diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 678f2a6395d0b..cd8f81684c820 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.query plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] warning: 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. --- diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index d1f8746b76404..38648661fae66 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github summary: API docs for the data.search plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] warning: 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. --- diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index f64ccdb4b6775..61558ccc4caec 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewEditor plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] warning: 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. --- diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 911e718c01a49..bc6a7a489e400 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewFieldEditor plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] warning: 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. --- diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index b5dc487a6d6a9..91f66526cbe57 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViewManagement plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] warning: 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. --- diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 70b0146ebe168..0c3622e2e8bbf 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataViews plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] warning: 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. --- diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 3a7869facdffc..13c671cdf32a0 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the dataVisualizer plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] warning: 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. --- diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 76a46212832db..b7c34a1340efd 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index cfe03cbb3cfb6..ed5dd2e368bba 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin summary: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0277888a9cf5a..a2f6ac121a73f 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -3,7 +3,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team summary: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 40ddf1bde5e98..4d4d3c8a66789 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github summary: API docs for the devTools plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] warning: 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. --- diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 1a5e00a9c9ec5..cbd1a280af510 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github summary: API docs for the discover plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] warning: 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. --- diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 2446c122d332a..facd0dd2b2486 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the discoverEnhanced plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] warning: 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. --- diff --git a/api_docs/elastic_apm_synthtrace.mdx b/api_docs/elastic_apm_synthtrace.mdx index 50992fa9a6d38..5ba7415409db2 100644 --- a/api_docs/elastic_apm_synthtrace.mdx +++ b/api_docs/elastic_apm_synthtrace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/elastic-apm-synthtrace title: "@elastic/apm-synthtrace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @elastic/apm-synthtrace plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@elastic/apm-synthtrace'] warning: 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. --- diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 2ec5d6a8964a4..decc6fe39b002 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddable plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] warning: 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. --- diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 04a717135d0b7..0eb8a45fb7501 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the embeddableEnhanced plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] warning: 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. --- diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index b13bf60d9d3ff..4850b00506010 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the encryptedSavedObjects plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] warning: 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. --- diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 829f2b370bfb3..a3b8f1389f601 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the enterpriseSearch plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] warning: 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. --- diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index dbf250a034d6e..198e13afcb211 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github summary: API docs for the esUiShared plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] warning: 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. --- diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 511bd380b8f9a..ba67617f018e3 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventAnnotation plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] warning: 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. --- diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 0abc43b1fddcf..062d5f2e698ef 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github summary: API docs for the eventLog plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] warning: 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. --- diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 280d382d33dbb..9571784b2d30a 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionError plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] warning: 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. --- diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 5473b90fde371..7df785946005c 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionGauge plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] warning: 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. --- diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 33e75c7435687..35ab1eeec5ff2 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionHeatmap plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] warning: 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. --- diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 7e3d7ba3e501e..d0e3a2f9e4710 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionImage plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] warning: 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. --- diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 82922e6aa2d43..8dc562688ec7d 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionLegacyMetricVis plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] warning: 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. --- diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 2a1f31e36cd90..70e487f7c8816 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetric plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] warning: 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. --- diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 5e0cb5ae445c4..12d537a8b96d1 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionMetricVis plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] warning: 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. --- diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 5f54880b89666..2e884a38ff280 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionPartitionVis plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] warning: 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. --- diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 66523df1af41b..85fc81011e933 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRepeatImage plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] warning: 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. --- diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 30b935815cab2..1efde7185a94f 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionRevealImage plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] warning: 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. --- diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 1f5062ebeeb45..cd22557118dfd 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionShape plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] warning: 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. --- diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 86996d96faf15..083ed5e42d5a5 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionTagcloud plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] warning: 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. --- diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 9270763b2116d..ebeb5a6a6c320 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressionXY plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] warning: 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. --- diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 95a4ccfb45673..e16ab9f61112c 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github summary: API docs for the expressions plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] warning: 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. --- diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 55596d8a81130..c08f02b79acce 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github summary: API docs for the features plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] warning: 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. --- diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index cc17cc647a6f5..39b4434d80a71 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github summary: API docs for the fieldFormats plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] warning: 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. --- diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index ffdf8b1cd1a94..aaf2ff28bf05e 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github summary: API docs for the fileUpload plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] warning: 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. --- diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 826a222685bcf..198b522880ac4 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github summary: API docs for the fleet plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] warning: 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. --- diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 95b673999fffe..138d9292e017c 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the globalSearch plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] warning: 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. --- diff --git a/api_docs/home.mdx b/api_docs/home.mdx index b150c64b251e9..469f76a82daa7 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github summary: API docs for the home plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] warning: 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. --- diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 46a75aae00988..d750ba0bfedf6 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexLifecycleManagement plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] warning: 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. --- diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index d91616652ed32..fa4c82bfc3692 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the indexManagement plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] warning: 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. --- diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 6471fe040f4d2..ad8d9532d9448 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github summary: API docs for the infra plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] warning: 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. --- diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index c93e48f63cbb8..8d198076655b8 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github summary: API docs for the inspector plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] warning: 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. --- diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index a8aaa261c708f..03596635b7803 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github summary: API docs for the interactiveSetup plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] warning: 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. --- diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index e48ae1f76ab1e..4f6918007222f 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ace plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] warning: 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. --- diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 2a42f08c4c3b9..53b75509415c7 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-components plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] warning: 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. --- diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 27f986a1c576a..93bdadf5e3c98 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/aiops-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] warning: 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. --- diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index a60e489efeb78..82a0831707ec3 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/alerts plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] warning: 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. --- diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index ebc88760d35d9..8cd6863bcc014 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] warning: 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. --- diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index e4ab47f729eaa..427df038bf768 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-client plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 3e4e07babdc38..174b74afb37d6 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index dbb506ea5b2e1..839d8440fa084 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 023903f75b886..a9f334faae6cc 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] warning: 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. --- diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 4a00eb7f80ac8..be6aa8a761dcc 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] warning: 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. --- diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index c87f389b06a8b..b451b5caab525 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-config-loader plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] warning: 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. --- diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 7fa2ffcdb80f9..410356df20b16 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/apm-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] warning: 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. --- diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 612b585fc6dbc..3be0a54d0c062 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/axe-config plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] warning: 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. --- diff --git a/api_docs/kbn_bazel_packages.mdx b/api_docs/kbn_bazel_packages.mdx index 240064f90ffde..f8fbdf71d00ec 100644 --- a/api_docs/kbn_bazel_packages.mdx +++ b/api_docs/kbn_bazel_packages.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-bazel-packages title: "@kbn/bazel-packages" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/bazel-packages plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bazel-packages'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index 7385a99cf16af..9315de94d343b 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-core plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 2fe5fcbaf906b..2cce41bb2f569 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] warning: 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. --- diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index ac326153aa5d1..2ceb66379377d 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] warning: 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. --- diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index e4b0e0faa2a1d..3a84b45e49a40 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/cli-dev-mode plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] warning: 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. --- diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 20cac0a5ee7d1..3fafe1b2a4f60 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/coloring plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] warning: 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. --- diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index 47910d1ab251f..04931728e3bcc 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] warning: 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. --- diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 3384510ba2779..28d11c965e04d 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] warning: 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. --- diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 0b27d7fe64c1f..a2344d9e96931 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/config-schema plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index d7f0b7dd9d968..4525e1515ef38 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index eb567622eeca5..523927d717040 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 9defd33efb7b1..a511e020de5e3 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 63fdda117d306..9f290e7ea5e22 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index 35e621fbf698c..351a210df51b5 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 8781691e22ae6..081177c99a98f 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 3cd19fb03bc65..ed0b71bac6f13 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 6622da62d5454..bf48dca91867e 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-common plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] warning: 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. --- diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 72dffb58e100d..8c26ec9f48f2c 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 6b6e226200d1a..9bc5edb9166ec 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 6d25343e7e829..b3bef97d2a0b2 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-config-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index a58fe0a10fcfd..a47eb8f892514 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 59c4be8a271dc..6b70841c7c44f 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 98feb095ae27e..12bcfdf0d9b0d 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index ff1abd11b939e..e6b4ba595ed11 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-deprecations-common plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 8ed58d7c9bc29..0b432ea64e157 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index cce690b809c79..58fc41442e071 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index 22e824c0c5088..c9473e051533a 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-doc-links-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] warning: 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. --- diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 115f7e0e12ee5..4bc5144dee9c5 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 507ba66649901..436a19133c04d 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 1405894741cda..3f8bdb1ccc5e7 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index cb600196c7449..38c2f52355da8 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 2905f013fa992..8a67fafb0847a 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 088aa56335b11..d9330e1d085b9 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index ffbeebbfc4033..c58cc1053a9e9 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 86f9b2adcbe1c..ba32b3a98898d 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index 9e75c281bd794..4b716b687e5d6 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index efd0b26f88ab5..f98309a462f02 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 18ff020100794..57bbe5df972d0 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 6b0790a4c93a7..6e01ae5e7e51c 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-common plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index adfa898dfe7c9..95f6819b84693 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-execution-context-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index b72c243aad295..97bb66d9bc69d 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index cb45fa480ee18..c2cc546cb0054 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index a90a80f9bfb3f..468fc9c786f5a 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 452556918f782..34ecaaf215d48 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 7d6b5f676dbce..f09b679fd8875 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 947801b0904a4..14c498bf34609 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 7ef7ba5eb734c..e258b08d0246a 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index ac3a68ed547c3..8686433f0f5eb 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-common plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] warning: 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. --- diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index c7f3b466fcc2e..1ca4e94e9e68f 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index ac444e27cffa3..aed723b666999 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 1b13a7f395c5b..410841cb60b0e 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index b34d6faf68dca..c379244d786c1 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index aad8d7e214ce2..95b48e48c4159 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 2a5ad74f0b833..c14b440bd5756 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index 01a75859c87fe..fac0f7abc9f2e 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 2033759daa762..d8c92a67a846a 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index cefe62e9aa5cc..d0d1c3bf2b36e 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index b2600a663b36e..1dae921f02232 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 0b50302ee9432..0bf09bb15b09f 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 4c70a405f5600..803a0bc51525e 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index e7433132d6d6d..d5e90ad7448cb 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index e2517cfb50233..bc3703794a115 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index e363332bcf975..e70c8136502ef 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 9ae51bd19ab35..771481a9866a8 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 3f3d16455292d..6e3209cdf3691 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 3042b639bbf25..e941782524d93 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 845db99cea76f..4f7f5321339a2 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] warning: 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. --- diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 5d1cb6066a37c..e66f371cdd47e 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] warning: 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. --- 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 1e156a43f0e58..bfc04759fd1af 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index e63a1754e3eb7..4079008bc27fe 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index acddcfe775d8f..65fdd07253d6c 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index b1ec0d72d8e87..87bba69eee64c 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index aab75d9e120b9..abbf5fcc84603 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index d80c08bd04c5e..447c772e42006 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 6212614e6555f..35d3dfb6d9491 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] warning: 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. --- diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index b8e281250f5d3..726cfe303bb15 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] warning: 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. --- diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index e743083074323..5790208158059 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] warning: 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. --- diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index ee0af8ebaada5..ea37452a297d8 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/crypto-browser plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] warning: 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. --- diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index f6c90410a8dd0..a63ad54dc1990 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/datemath plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] warning: 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. --- diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index e0961a2209344..441415f638b09 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-errors plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] warning: 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. --- diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 3b63cdbbfee38..6eb94c110fc6c 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-cli-runner plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] warning: 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. --- diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 4216581400f19..6da72300a846f 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-proc-runner plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] warning: 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. --- diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 752ed0ea79568..a2291b31698d8 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/dev-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] warning: 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. --- diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index f30d0d82555e8..aa388e93b05ab 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/doc-links plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] warning: 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. --- diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 37baca05ffaf0..c3ea7e5bb066f 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/docs-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] warning: 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. --- diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index e0e1f9f34e339..37a042bd92260 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-archiver plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] warning: 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. --- diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 01c570730f47b..70341c11f5b06 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-errors plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] warning: 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. --- diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 9744172586d40..f026f2aaffe96 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/es-query plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] warning: 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. --- diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 0d5d305347121..3a0976af09b77 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] warning: 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. --- diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 95e22fe054f3b..cfef42f78d2ca 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/field-types plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] warning: 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. --- diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 12364ea68b4e3..215c427b5191f 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/find-used-node-modules plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] warning: 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. --- diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index b09d847de544b..e8b12b3e9b4af 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/generate plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] warning: 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. --- diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index fe1267be59c63..e219c44e50f5e 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/handlebars plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] warning: 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. --- diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 6ba566fbe6d97..1c34fb6d61d27 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/hapi-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] warning: 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. --- diff --git a/api_docs/kbn_home_sample_data_cards.mdx b/api_docs/kbn_home_sample_data_cards.mdx index ef844e6e622dd..4d565fba08035 100644 --- a/api_docs/kbn_home_sample_data_cards.mdx +++ b/api_docs/kbn_home_sample_data_cards.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-cards title: "@kbn/home-sample-data-cards" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/home-sample-data-cards plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-cards'] warning: 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. --- diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 4b0500f0a9783..653d86246a440 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/i18n plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] warning: 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. --- diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 7d4c82d7674dd..0d852067de75a 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/import-resolver plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] warning: 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. --- diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 188024e0dfcac..66eb6c3c402a0 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/interpreter plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] warning: 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. --- diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index e4f4a579f53e0..bf3b4104e2529 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/io-ts-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 2a122ac9713ab..6d24376bd2802 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/jest-serializers plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] warning: 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. --- diff --git a/api_docs/kbn_kibana_json_schema.mdx b/api_docs/kbn_kibana_json_schema.mdx index 655a40536c487..66cfa32bf9d52 100644 --- a/api_docs/kbn_kibana_json_schema.mdx +++ b/api_docs/kbn_kibana_json_schema.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-json-schema title: "@kbn/kibana-json-schema" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/kibana-json-schema plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-json-schema'] warning: 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. --- diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index f21da57ffc298..387ccb0954458 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] warning: 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. --- diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 98efc6794dde4..651baf085e5a5 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/logging-mocks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] warning: 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. --- diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 4288a370e0ea0..4b7d0d093df24 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/mapbox-gl plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] warning: 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. --- diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index ca964414485b5..6ccf92497cad3 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-agg-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] warning: 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. --- diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 1ea2a9a574173..1daa5c7e0fa7d 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] warning: 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. --- diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index e986fe88e9678..e0aa28a449e9f 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ml-string-hash plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] warning: 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. --- diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 21d7f87bf495e..225c163f07976 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/monaco plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] warning: 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. --- diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index e557e348b39b2..6ff2b8ab05a1f 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] warning: 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. --- diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index c1eeb62319e35..7fc2334b9c158 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] warning: 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. --- diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 2fa7f22f74a38..4a09a1853c4f5 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] warning: 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. --- diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index fc3a2bebfa267..a4b8f708dc36f 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-generator plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] warning: 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. --- diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index a98e73f3bd579..2c86335dfaa5b 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/plugin-helpers plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] warning: 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. --- diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index eae0ecadfdaed..051f0dc8cb55d 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/react-field plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] warning: 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. --- diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 691e660696c9b..d91c08a14958e 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/rule-data-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] warning: 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. --- diff --git a/api_docs/kbn_scalability_simulation_generator.mdx b/api_docs/kbn_scalability_simulation_generator.mdx index 1dbfa222eb2d3..cc6881d2c192b 100644 --- a/api_docs/kbn_scalability_simulation_generator.mdx +++ b/api_docs/kbn_scalability_simulation_generator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-scalability-simulation-generator title: "@kbn/scalability-simulation-generator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/scalability-simulation-generator plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/scalability-simulation-generator'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 26214132a37d4..e8e8ccd1301b3 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index ae875bfa2fe7b..065f69c227eae 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 419c5270f7151..51f8061227ab2 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index faf1c70f288e3..6ea3a8b36235a 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 85b573a3bfb89..d7485fdede25d 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 0256318fd5b7d..aa470af6bd3be 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index a75c7028d6e30..93f74333cd11e 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 6eccb374b49f9..d2cb6b2348fc9 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 148463eb1b3a2..c164641ad2374 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index a9cf56d0c820b..16f6e99c1fc92 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 19cf35406857f..7dd727ebc3b72 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 3576d53aae50b..41b247d6c1adf 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-rules plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index a6c856ce34db8..c74c48629ded7 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] warning: 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. --- diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 9787ef9664183..0b958c0fe05dd 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/securitysolution-utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] warning: 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. --- diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index e719d1d785909..648f53e64da5c 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-http-tools plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] warning: 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. --- diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index eb35c7188fb51..5256dfcf7be64 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/server-route-repository plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index f793c5663a3e8..7354ab061730e 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 946390d8e607e..c14fa909fbf1c 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_components.mdx b/api_docs/kbn_shared_ux_components.mdx index c24971b2361a5..20c4e2fbd6625 100644 --- a/api_docs/kbn_shared_ux_components.mdx +++ b/api_docs/kbn_shared_ux_components.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-components title: "@kbn/shared-ux-components" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-components plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-components'] warning: 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. --- 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 aaeaac72b1e36..1aa54e6331c81 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] warning: 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. --- 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 c2c0f12936215..ef5350e540679 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index f4027003c9cdb..d94970f4d7b61 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] warning: 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. --- 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 ef5ba18dc6d83..ab5818b4c215b 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -4,7 +4,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 summary: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_services.mdx b/api_docs/kbn_shared_ux_services.mdx index e1944df7c4bb3..fb59cbfc47978 100644 --- a/api_docs/kbn_shared_ux_services.mdx +++ b/api_docs/kbn_shared_ux_services.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-services title: "@kbn/shared-ux-services" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-services plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-services'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_storybook.mdx b/api_docs/kbn_shared_ux_storybook.mdx index 46874472e583f..d560a995409cb 100644 --- a/api_docs/kbn_shared_ux_storybook.mdx +++ b/api_docs/kbn_shared_ux_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook title: "@kbn/shared-ux-storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-storybook plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook'] warning: 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. --- diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index cc24cc1c99b28..449d0f6d12f34 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/shared-ux-utility plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] warning: 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. --- diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 1242936639085..912d8694af12d 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/some-dev-log plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] warning: 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. --- diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index fc4f2f2483820..bc78001f9fe27 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/sort-package-json plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] warning: 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. --- diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 2f989d96fd122..890f5d40b5cfb 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/std plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] warning: 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. --- diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 8b694178bc242..58afeec1e90ae 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] warning: 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. --- diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index cf3cfa1730880..75b41dc9af22f 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/storybook plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] warning: 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. --- diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 7af6474ac852b..59f8526ef2dd3 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/telemetry-tools plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] warning: 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. --- diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 9ad22f3277826..9c1f05707b951 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] warning: 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. --- diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 6fe1a7cbcc4fb..2e5a4a1619e14 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/test-jest-helpers plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] warning: 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. --- diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index db61859f12a3f..d6229cb4815bd 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/tooling-log plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] warning: 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. --- diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index bd3b039bc84d6..3cbc3cf3af9ae 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] warning: 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. --- diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index d663c520845af..df67565d332c5 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/type-summarizer-core plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] warning: 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. --- diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 8c1dd9b05730c..f85562ff1c229 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/typed-react-router-config plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] warning: 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. --- diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 8254ec208ecd1..16db3eb30ae34 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/ui-theme plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] warning: 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. --- diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 6e85efab91bce..972c937e45d1b 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] warning: 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. --- diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index bb5869ca6cfab..fd921df9bd744 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utility-types-jest plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] warning: 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. --- diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 281168556a5cf..851184bf3f4d2 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/utils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] warning: 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. --- diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 6c2efe49ce303..69d617e80f88c 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github summary: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] warning: 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. --- diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index cf811fb12c7ba..e1804c29c810f 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaOverview plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] warning: 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. --- diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 0257cb1f37f03..93911c6d475ef 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaReact plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] warning: 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. --- diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index b8461b18319cf..bba70dd6387f1 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github summary: API docs for the kibanaUtils plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] warning: 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. --- diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index ae87478c93a36..7e2a2bcce98e3 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github summary: API docs for the kubernetesSecurity plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] warning: 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. --- diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 6108f32c3b487..d8d848751bc51 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github summary: API docs for the lens plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] warning: 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. --- diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 2e10bb5486442..bb2243b550c19 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseApiGuard plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] warning: 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. --- diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index f2ff8801cae26..506fe03b5b45c 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the licenseManagement plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] warning: 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. --- diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 7098aca2fa9bc..7f7b279727574 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github summary: API docs for the licensing plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] warning: 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. --- diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 3101089ac4bf5..d20878cc0c890 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github summary: API docs for the lists plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] warning: 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. --- diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 7c9c269ed6613..7b51cd12823a1 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github summary: API docs for the management plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] warning: 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. --- diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index ce12dc00a0c6c..01b109c680ad6 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github summary: API docs for the maps plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] warning: 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. --- diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 4b3d83b8ae04c..3205a03142b17 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github summary: API docs for the mapsEms plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] warning: 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. --- diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index a851d9dbc63ff..33e8248a7c78b 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github summary: API docs for the ml plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] warning: 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. --- diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 33c9b9c3beabc..0d22de8925869 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoring plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] warning: 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. --- diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 6b63b7429d1eb..69c1d0a0e8f3f 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the monitoringCollection plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] warning: 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. --- diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 5b044936fd3c3..fd380ca88a7e1 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github summary: API docs for the navigation plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] warning: 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. --- diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 734c8164371f7..af7b5e812db40 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github summary: API docs for the newsfeed plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] warning: 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. --- diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 5e2cf43ba10cb..09f340dde85c8 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github summary: API docs for the observability plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] warning: 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. --- diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index fa7c910b6fc65..5dd65abe02ac4 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github summary: API docs for the osquery plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] warning: 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. --- diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index b5c170da6b79c..2a080a8847b52 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -3,7 +3,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory summary: Directory of public APIs available through plugins or packages. -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana'] warning: 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. --- @@ -18,7 +18,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 27979 | 176 | 19807 | 881 | +| 27980 | 176 | 19807 | 882 | ## Plugin Directory @@ -35,7 +35,7 @@ warning: This document is auto-generated and is meant to be viewed inside our ex | | [ResponseOps](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 81 | 0 | 65 | 28 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-vis-editors) | - | 272 | 2 | 253 | 9 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 29 | 0 | 24 | 0 | -| | [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-posture-security) | The cloud security posture plugin | 18 | 0 | 2 | 0 | +| | [Cloud Security Posture](https://github.com/orgs/elastic/teams/cloud-posture-security) | The cloud security posture plugin | 19 | 0 | 2 | 1 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 13 | 0 | 13 | 1 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 206 | 0 | 198 | 7 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2470 | 5 | 664 | 17 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 5f7b3a304430a..097409834d83e 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github summary: API docs for the presentationUtil plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] warning: 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. --- diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index d43545eabf038..28e2e6c19e2d1 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github summary: API docs for the remoteClusters plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] warning: 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. --- diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 5f799ac5260a2..d34463567e3ca 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github summary: API docs for the reporting plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] warning: 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. --- diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index b6500d00a0333..6235cf3fbcda3 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github summary: API docs for the rollup plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] warning: 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. --- diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index f9c2d858a8a97..86081fa33aaca 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github summary: API docs for the ruleRegistry plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] warning: 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. --- diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 3f1865e4ab5e2..691dd8bfb0355 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github summary: API docs for the runtimeFields plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] warning: 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. --- diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index d267095bcbddb..e5b7eaa7a0bc5 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjects plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] warning: 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. --- diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 334db759d1f83..399ae8e016837 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsManagement plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index aa6c6ff7be684..3814574b9cbaa 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTagging plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] warning: 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. --- diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index c3bcf76cfc81b..bec2172fa830a 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github summary: API docs for the savedObjectsTaggingOss plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] warning: 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. --- diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 8083f9bd35c15..3d42974c08a83 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotMode plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] warning: 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. --- diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index 4302b31592053..c5d5a62f6afaf 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github summary: API docs for the screenshotting plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] warning: 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. --- diff --git a/api_docs/security.mdx b/api_docs/security.mdx index b19294544720d..430c80112dff9 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github summary: API docs for the security plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] warning: 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. --- diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 88062d6f8267d..a956b02859281 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github summary: API docs for the securitySolution plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] warning: 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. --- diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 64fb00ad7d336..5a619f77c5a8a 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github summary: API docs for the sessionView plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] warning: 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. --- diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 0800de9aac0bb..f1d46c68e89a3 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github summary: API docs for the share plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] warning: 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. --- diff --git a/api_docs/shared_u_x.mdx b/api_docs/shared_u_x.mdx index f2e5c1ea13beb..a84bba398d673 100644 --- a/api_docs/shared_u_x.mdx +++ b/api_docs/shared_u_x.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/sharedUX title: "sharedUX" image: https://source.unsplash.com/400x175/?github summary: API docs for the sharedUX plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sharedUX'] warning: 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. --- diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 0d192ce0af434..e9b6897e263ed 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github summary: API docs for the snapshotRestore plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] warning: 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. --- diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 82ffde4c77857..b84e5834b6041 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github summary: API docs for the spaces plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] warning: 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. --- diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 0a21a2b9a8fe8..7a5c7f7e8a390 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github summary: API docs for the stackAlerts plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] warning: 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. --- diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index 3a487e2233f50..e8486f67da3c5 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the taskManager plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] warning: 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. --- diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index d8fd26e1efa9b..b9f1058ebc65b 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetry plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] warning: 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. --- diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index e01e14d7c434c..3bb0307fde48d 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionManager plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] warning: 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. --- diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 27095c728b16f..04ba3b4d1e7d8 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryCollectionXpack plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] warning: 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. --- diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index eb0b2a9e4feb5..d9aa42a2f9f9a 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github summary: API docs for the telemetryManagementSection plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] warning: 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. --- diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 9203a9f337811..c1bcea8720eba 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github summary: API docs for the timelines plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] warning: 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. --- diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 095581a935c5a..9facda1df93e6 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github summary: API docs for the transform plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] warning: 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. --- diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 5ebe0a96a7d2a..ab9062aef1710 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github summary: API docs for the triggersActionsUi plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] warning: 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. --- diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 370f78f524cd2..31775949773ac 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActions plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] warning: 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. --- diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index df488cc4f3622..32387f565d3b4 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github summary: API docs for the uiActionsEnhanced plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] warning: 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. --- diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 9514e23b8719d..9a63519fa57cb 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] warning: 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. --- diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index c7ac9cb96bdec..5070d9de44d78 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github summary: API docs for the unifiedSearch.autocomplete plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] warning: 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. --- diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index a81efae865fe6..e81d0d6ff12f6 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github summary: API docs for the urlForwarding plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] warning: 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. --- diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 1deac8e359ba1..e2b8b431277b2 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github summary: API docs for the usageCollection plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] warning: 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. --- diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 3ad534c65ce45..41f8f07ec0bb0 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github summary: API docs for the ux plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] warning: 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. --- diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index 6cdad86713115..f32881a729064 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github summary: API docs for the visDefaultEditor plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] warning: 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. --- diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 040619237e0e8..f4138181c2392 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeGauge plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] warning: 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. --- diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index 39a90c537d6fd..58b9056b20e22 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeHeatmap plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] warning: 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. --- diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index cf149ab27072b..9aa0d06dcdb73 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypePie plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] warning: 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. --- diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 47abc256a7372..6f719edc75a7a 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTable plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] warning: 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. --- diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index ce1fa397d32d5..7e4d6c02f93eb 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimelion plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] warning: 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. --- diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 73eb82c1f7b09..7b83ffcc71974 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeTimeseries plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] warning: 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. --- diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 4884d7f353e1c..d71121e566d73 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVega plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] warning: 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. --- diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index b4a2fd0b0554f..4f637e3b3db09 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeVislib plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] warning: 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. --- diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 0f89adef701fc..85cdc093b14bb 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github summary: API docs for the visTypeXy plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] warning: 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. --- diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 60695448f4734..a04ddfc4bb41d 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -4,7 +4,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github summary: API docs for the visualizations plugin -date: 2022-07-24 +date: 2022-07-25 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] warning: 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. --- From 06aa51602d02c36118a7a9e5fb51e84faaa0b7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patryk=20Kopyci=C5=84ski?= Date: Mon, 25 Jul 2022 09:16:21 +0200 Subject: [PATCH 50/78] [Osquery] Run packs live (#132198) --- x-pack/plugins/osquery/common/constants.ts | 2 + .../osquery/common/schemas/common/schemas.ts | 43 ++ .../create_action_request_body_schema.ts | 24 - .../create_live_query_request_body_schema.ts | 35 + .../routes/{action => live_query}/index.ts | 2 +- .../common/search_strategy/common/index.ts | 8 - .../search_strategy/osquery/actions/index.ts | 58 +- .../search_strategy/osquery/agents/index.ts | 4 +- .../common/search_strategy/osquery/index.ts | 1 + .../search_strategy/osquery/results/index.ts | 4 +- x-pack/plugins/osquery/common/types.ts | 45 -- .../common/utils/build_query/filters.ts | 20 +- .../integration/all/add_integration.spec.ts | 3 +- .../cypress/integration/all/alerts.spec.ts | 4 +- .../integration/all/live_query.spec.ts | 20 + .../cypress/integration/all/packs.spec.ts | 2 +- .../integration/roles/alert_test.spec.ts | 2 +- .../integration/roles/t1_analyst.spec.ts | 3 +- .../integration/roles/t2_analyst.spec.ts | 2 +- .../osquery/cypress/tasks/saved_queries.ts | 2 +- x-pack/plugins/osquery/kibana.json | 1 + .../action_results/action_agents_status.tsx | 92 --- .../action_results/action_results_summary.tsx | 8 +- .../action_results/use_action_results.ts | 29 +- .../osquery/public/actions/actions_table.tsx | 73 +- .../public/actions/use_action_details.ts | 70 -- .../osquery/public/actions/use_all_actions.ts | 3 - .../public/actions/use_live_query_details.ts | 81 ++ .../public/agent_policies/use_agent_policy.ts | 4 +- .../osquery/public/agents/agents_table.tsx | 8 +- .../osquery/public/agents/use_agent_groups.ts | 11 +- .../osquery/public/agents/use_all_agents.ts | 5 +- .../public/assets/use_import_assets.ts | 27 +- .../plugins/osquery/public/common/helpers.ts | 1 - .../common/hooks/use_logs_data_view.tsx | 31 + .../osquery/public/common/validations.ts | 14 +- .../public/components/main_navigation.tsx | 2 +- ...managed_policy_create_import_extension.tsx | 3 +- .../public/live_queries/form/index.tsx | 369 ++++++--- .../form/pack_queries_status_table.tsx | 718 ++++++++++++++++++ .../form/packs_combobox_field.tsx | 160 ++++ .../public/live_queries/form/schema.ts | 7 + .../osquery/public/live_queries/index.tsx | 47 +- .../use_create_live_query_action.tsx | 67 ++ .../public/packs/active_state_switch.tsx | 19 +- .../osquery/public/packs/form/index.tsx | 16 +- .../public/packs/form/queries_field.tsx | 13 +- .../packs/pack_queries_status_table.tsx | 164 ++-- .../public/packs/pack_queries_table.tsx | 30 +- .../osquery/public/packs/packs_table.tsx | 7 +- .../public/packs/queries/query_flyout.tsx | 4 +- .../packs/queries/use_pack_query_form.tsx | 42 +- .../public/packs/queries/validations.ts | 17 +- x-pack/plugins/osquery/public/packs/types.ts | 25 +- .../osquery/public/packs/use_create_pack.ts | 7 +- .../osquery/public/packs/use_delete_pack.ts | 2 +- .../plugins/osquery/public/packs/use_pack.ts | 21 +- .../public/packs/use_pack_query_errors.ts | 3 +- .../packs/use_pack_query_last_results.ts | 25 +- .../plugins/osquery/public/packs/use_packs.ts | 21 +- .../osquery/public/packs/use_update_pack.ts | 26 +- .../osquery/public/results/results_table.tsx | 39 +- .../osquery/public/results/use_all_results.ts | 4 +- .../routes/live_queries/details/index.tsx | 37 +- .../public/routes/packs/details/index.tsx | 9 +- .../public/routes/saved_queries/edit/form.tsx | 5 +- .../routes/saved_queries/edit/index.tsx | 11 +- .../public/routes/saved_queries/edit/tabs.tsx | 59 +- .../routes/saved_queries/list/index.tsx | 12 +- .../public/routes/saved_queries/new/form.tsx | 5 +- .../public/routes/saved_queries/new/index.tsx | 11 +- .../form/use_saved_query_form.tsx | 46 +- .../saved_queries/saved_queries_dropdown.tsx | 25 +- .../saved_queries/saved_query_flyout.tsx | 7 +- .../saved_queries/use_create_saved_query.ts | 12 +- .../saved_queries/use_delete_saved_query.ts | 2 +- .../public/saved_queries/use_saved_queries.ts | 20 +- .../public/saved_queries/use_saved_query.ts | 16 +- .../saved_queries/use_update_saved_query.ts | 6 +- .../use_is_osquery_available.ts | 14 +- .../plugins/osquery/public/shared_imports.ts | 1 + x-pack/plugins/osquery/server/common/types.ts | 4 +- .../osquery/server/create_data_views/index.ts | 19 + .../action_responses_mapping.ts | 96 +++ .../server/create_indices/actions_mapping.ts | 115 +++ .../create_transforms_indices.ts | 67 ++ .../action_responses_transform.ts | 47 ++ .../create_transforms.test.ts | 128 ++++ .../create_transforms/create_transforms.ts | 108 +++ .../osquery/server/lib/parse_agent_groups.ts | 15 +- .../osquery/server/lib/telemetry/constants.ts | 3 +- .../osquery/server/lib/telemetry/helpers.ts | 40 +- .../osquery/server/lib/telemetry/receiver.ts | 40 +- .../server/lib/telemetry/tasks/configs.ts | 57 ++ .../server/lib/telemetry/tasks/index.ts | 7 +- x-pack/plugins/osquery/server/plugin.ts | 63 +- .../routes/action/create_action_route.ts | 123 --- .../osquery/server/routes/action/index.ts | 14 - x-pack/plugins/osquery/server/routes/index.ts | 10 +- .../live_query/create_live_query_route.ts | 199 +++++ .../get_live_query_details_route.ts | 133 ++++ .../get_live_query_results_route.ts | 115 +++ .../osquery/server/routes/live_query/index.ts | 22 + .../osquery/server/routes/live_query/utils.ts | 88 +++ .../server/routes/pack/create_pack_route.ts | 14 +- .../server/routes/pack/delete_pack_route.ts | 2 +- .../server/routes/pack/find_pack_route.ts | 34 +- .../osquery/server/routes/pack/index.ts | 4 +- .../server/routes/pack/read_pack_route.ts | 18 +- .../server/routes/pack/update_pack_route.ts | 4 +- .../osquery/server/routes/pack/utils.ts | 13 +- .../saved_query/create_saved_query_route.ts | 18 +- .../saved_query/delete_saved_query_route.ts | 2 +- .../saved_query/find_saved_query_route.ts | 29 +- .../saved_query/read_saved_query_route.ts | 4 +- .../saved_query/update_saved_query_route.ts | 4 +- .../routes/status/create_status_route.ts | 33 +- .../osquery/factory/actions/all/index.ts | 8 - .../actions/all/query.all_actions.dsl.ts | 5 +- .../osquery/factory/actions/details/index.ts | 5 +- .../details/query.action_details.dsl.ts | 5 +- .../osquery/factory/actions/results/index.ts | 16 +- .../results/query.action_results.dsl.ts | 7 +- .../osquery/factory/agents/index.ts | 8 - .../factory/agents/query.all_agents.dsl.ts | 3 +- .../osquery/factory/results/index.ts | 8 - .../server/search_strategy/osquery/index.ts | 58 +- x-pack/plugins/osquery/server/types.ts | 2 + .../plugins/osquery/server/usage/fetchers.ts | 10 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../api_integration/apis/osquery/packs.ts | 16 +- 133 files changed, 3531 insertions(+), 1213 deletions(-) delete mode 100644 x-pack/plugins/osquery/common/schemas/routes/action/create_action_request_body_schema.ts create mode 100644 x-pack/plugins/osquery/common/schemas/routes/live_query/create_live_query_request_body_schema.ts rename x-pack/plugins/osquery/common/schemas/routes/{action => live_query}/index.ts (81%) delete mode 100644 x-pack/plugins/osquery/public/action_results/action_agents_status.tsx delete mode 100644 x-pack/plugins/osquery/public/actions/use_action_details.ts create mode 100644 x-pack/plugins/osquery/public/actions/use_live_query_details.ts create mode 100644 x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx create mode 100644 x-pack/plugins/osquery/public/live_queries/form/pack_queries_status_table.tsx create mode 100644 x-pack/plugins/osquery/public/live_queries/form/packs_combobox_field.tsx create mode 100644 x-pack/plugins/osquery/public/live_queries/use_create_live_query_action.tsx create mode 100644 x-pack/plugins/osquery/server/create_data_views/index.ts create mode 100644 x-pack/plugins/osquery/server/create_indices/action_responses_mapping.ts create mode 100644 x-pack/plugins/osquery/server/create_indices/actions_mapping.ts create mode 100644 x-pack/plugins/osquery/server/create_indices/create_transforms_indices.ts create mode 100644 x-pack/plugins/osquery/server/create_transforms/action_responses_transform.ts create mode 100644 x-pack/plugins/osquery/server/create_transforms/create_transforms.test.ts create mode 100644 x-pack/plugins/osquery/server/create_transforms/create_transforms.ts create mode 100644 x-pack/plugins/osquery/server/lib/telemetry/tasks/configs.ts delete mode 100644 x-pack/plugins/osquery/server/routes/action/create_action_route.ts delete mode 100644 x-pack/plugins/osquery/server/routes/action/index.ts create mode 100644 x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts create mode 100644 x-pack/plugins/osquery/server/routes/live_query/get_live_query_details_route.ts create mode 100644 x-pack/plugins/osquery/server/routes/live_query/get_live_query_results_route.ts create mode 100644 x-pack/plugins/osquery/server/routes/live_query/index.ts create mode 100644 x-pack/plugins/osquery/server/routes/live_query/utils.ts diff --git a/x-pack/plugins/osquery/common/constants.ts b/x-pack/plugins/osquery/common/constants.ts index 5354332fd89f8..4d6be1f3f2ae8 100644 --- a/x-pack/plugins/osquery/common/constants.ts +++ b/x-pack/plugins/osquery/common/constants.ts @@ -9,3 +9,5 @@ export const DEFAULT_MAX_TABLE_QUERY_SIZE = 10000; export const DEFAULT_DARK_MODE = 'theme:darkMode'; export const OSQUERY_INTEGRATION_NAME = 'osquery_manager'; export const BASE_PATH = '/app/osquery'; +export const ACTIONS_INDEX = `.logs-${OSQUERY_INTEGRATION_NAME}.actions`; +export const ACTION_RESPONSES_INDEX = `.logs-${OSQUERY_INTEGRATION_NAME}.action.responses`; diff --git a/x-pack/plugins/osquery/common/schemas/common/schemas.ts b/x-pack/plugins/osquery/common/schemas/common/schemas.ts index 24eaa11a7bf84..fda6e2cec8b50 100644 --- a/x-pack/plugins/osquery/common/schemas/common/schemas.ts +++ b/x-pack/plugins/osquery/common/schemas/common/schemas.ts @@ -53,6 +53,20 @@ export type SavedQueryId = t.TypeOf; export const savedQueryIdOrUndefined = t.union([savedQueryId, t.undefined]); export type SavedQueryIdOrUndefined = t.TypeOf; +export const packId = t.string; +export type PackId = t.TypeOf; +export const packIdOrUndefined = t.union([packId, t.undefined]); +export type PackIdOrUndefined = t.TypeOf; + +export const executionContext = t.type({ + name: t.union([t.string, t.undefined]), + url: t.union([t.string, t.undefined]), +}); + +export type ExecutionContext = t.TypeOf; +export const executionContextOrUndefined = t.union([executionContext, t.undefined]); +export type ExecutionContextOrUndefined = t.TypeOf; + export const ecsMapping = t.record( t.string, t.partial({ @@ -63,3 +77,32 @@ export const ecsMapping = t.record( export type ECSMapping = t.TypeOf; export const ecsMappingOrUndefined = t.union([ecsMapping, t.undefined]); export type ECSMappingOrUndefined = t.TypeOf; + +export const stringArrayOrUndefined = t.union([t.array(t.string), t.undefined]); +export type StringArrayOrUndefined = t.TypeOf; + +export const arrayQueries = t.array( + t.type({ + id, + query, + ecsMapping, + version, + platform, + }) +); +export type ArrayQueries = t.TypeOf; +export const objectQueries = t.record( + t.string, + t.type({ + query, + ecsMapping: ecsMappingOrUndefined, + version: versionOrUndefined, + platform: platformOrUndefined, + saved_query_id: savedQueryIdOrUndefined, + }) +); +export type ObjectQueries = t.TypeOf; +export const queries = t.union([arrayQueries, objectQueries]); +export type Queries = t.TypeOf; +export const queriesOrUndefined = t.union([queries, t.undefined]); +export type QueriesOrUndefined = t.TypeOf; diff --git a/x-pack/plugins/osquery/common/schemas/routes/action/create_action_request_body_schema.ts b/x-pack/plugins/osquery/common/schemas/routes/action/create_action_request_body_schema.ts deleted file mode 100644 index a85471a95a137..0000000000000 --- a/x-pack/plugins/osquery/common/schemas/routes/action/create_action_request_body_schema.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as t from 'io-ts'; - -import { - query, - agentSelection, - ecsMappingOrUndefined, - savedQueryIdOrUndefined, -} from '../../common/schemas'; - -export const createActionRequestBodySchema = t.type({ - agentSelection, - query, - saved_query_id: savedQueryIdOrUndefined, - ecs_mapping: ecsMappingOrUndefined, -}); - -export type CreateActionRequestBodySchema = t.OutputOf; diff --git a/x-pack/plugins/osquery/common/schemas/routes/live_query/create_live_query_request_body_schema.ts b/x-pack/plugins/osquery/common/schemas/routes/live_query/create_live_query_request_body_schema.ts new file mode 100644 index 0000000000000..6d37ab6d56288 --- /dev/null +++ b/x-pack/plugins/osquery/common/schemas/routes/live_query/create_live_query_request_body_schema.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; + +import { + ecsMappingOrUndefined, + savedQueryIdOrUndefined, + packIdOrUndefined, + queryOrUndefined, + queriesOrUndefined, + stringArrayOrUndefined, +} from '../../common/schemas'; + +export const createLiveQueryRequestBodySchema = t.type({ + agent_ids: stringArrayOrUndefined, + agent_all: t.union([t.boolean, t.undefined]), + agent_platforms: stringArrayOrUndefined, + agent_policy_ids: stringArrayOrUndefined, + query: queryOrUndefined, + queries: queriesOrUndefined, + saved_query_id: savedQueryIdOrUndefined, + ecs_mapping: ecsMappingOrUndefined, + pack_id: packIdOrUndefined, + alert_ids: stringArrayOrUndefined, + case_ids: stringArrayOrUndefined, + event_ids: stringArrayOrUndefined, + metadata: t.union([t.object, t.undefined]), +}); + +export type CreateLiveQueryRequestBodySchema = t.OutputOf; diff --git a/x-pack/plugins/osquery/common/schemas/routes/action/index.ts b/x-pack/plugins/osquery/common/schemas/routes/live_query/index.ts similarity index 81% rename from x-pack/plugins/osquery/common/schemas/routes/action/index.ts rename to x-pack/plugins/osquery/common/schemas/routes/live_query/index.ts index 286aa2e5128b2..0438204e6c86e 100644 --- a/x-pack/plugins/osquery/common/schemas/routes/action/index.ts +++ b/x-pack/plugins/osquery/common/schemas/routes/live_query/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export * from './create_action_request_body_schema'; +export * from './create_live_query_request_body_schema'; diff --git a/x-pack/plugins/osquery/common/search_strategy/common/index.ts b/x-pack/plugins/osquery/common/search_strategy/common/index.ts index a0b7b5719cbcc..6139682935b66 100644 --- a/x-pack/plugins/osquery/common/search_strategy/common/index.ts +++ b/x-pack/plugins/osquery/common/search_strategy/common/index.ts @@ -20,12 +20,6 @@ export interface Inspect { dsl: string[]; } -export interface PageInfoPaginated { - activePage: number; - fakeTotalCount: number; - showMorePagesIndicator: boolean; -} - export interface CursorType { value?: Maybe; tiebreaker?: Maybe; @@ -64,8 +58,6 @@ export interface PaginationInputPaginated { activePage: number; /** The cursorStart parameter defines the start of the results to be displayed */ cursorStart: number; - /** The fakePossibleCount parameter determines the total count in order to show 5 additional pages */ - fakePossibleCount: number; /** The querySize parameter is the number of items to be returned */ querySize: number; } diff --git a/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts b/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts index 217f150f514a4..283ae46269422 100644 --- a/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts +++ b/x-pack/plugins/osquery/common/search_strategy/osquery/actions/index.ts @@ -6,9 +6,9 @@ */ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { IEsSearchResponse } from '@kbn/data-plugin/common'; +import type { IEsSearchResponse, IKibanaSearchResponse } from '@kbn/data-plugin/common'; -import type { Inspect, Maybe, PageInfoPaginated } from '../../common'; +import type { Inspect, Maybe } from '../../common'; import type { RequestOptions, RequestOptionsPaginated } from '../..'; export type ActionEdges = estypes.SearchResponse['hits']['hits']; @@ -16,16 +16,40 @@ export type ActionEdges = estypes.SearchResponse['hits']['hits']; export type ActionResultEdges = estypes.SearchResponse['hits']['hits']; export interface ActionsStrategyResponse extends IEsSearchResponse { edges: ActionEdges; - totalCount: number; - pageInfo: PageInfoPaginated; inspect?: Maybe; } +export interface ActionDetails { + action_id: string; + expiration: string; + '@timestamp': string; + agent_all: boolean; + agent_ids: string[]; + agent_platforoms: string[]; + agent_policy_ids: string[]; + agents: string[]; + user_id?: string; + pack_id?: string; + pack_name?: string; + pack_prebuilt?: boolean; + status?: string; + queries?: Array<{ + action_id: string; + id: string; + query: string; + agents: string[]; + ecs_mapping?: unknown; + version?: string; + platform?: string; + saved_query_id?: string; + expiration?: string; + }>; +} + export type ActionsRequestOptions = RequestOptionsPaginated; export interface ActionDetailsStrategyResponse extends IEsSearchResponse { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - actionDetails: Record; + actionDetails: estypes.SearchHit; inspect?: Maybe; } @@ -33,10 +57,26 @@ export interface ActionDetailsRequestOptions extends RequestOptions { actionId: string; } -export interface ActionResultsStrategyResponse extends IEsSearchResponse { +export interface ActionResultsStrategyResponse + extends IKibanaSearchResponse< + estypes.SearchResponse< + object, + { + aggs: { + responses_by_action_id: estypes.AggregationsSingleBucketAggregateBase & { + rows_count: estypes.AggregationsSumAggregate; + responses: { + buckets: Array<{ + key: string; + doc_count: number; + }>; + }; + }; + }; + } + > + > { edges: ActionResultEdges; - totalCount: number; - pageInfo: PageInfoPaginated; inspect?: Maybe; } diff --git a/x-pack/plugins/osquery/common/search_strategy/osquery/agents/index.ts b/x-pack/plugins/osquery/common/search_strategy/osquery/agents/index.ts index 53492f937db58..06447beb18eac 100644 --- a/x-pack/plugins/osquery/common/search_strategy/osquery/agents/index.ts +++ b/x-pack/plugins/osquery/common/search_strategy/osquery/agents/index.ts @@ -7,14 +7,12 @@ import type { IEsSearchResponse } from '@kbn/data-plugin/common'; -import type { Inspect, Maybe, PageInfoPaginated } from '../../common'; +import type { Inspect, Maybe } from '../../common'; import type { RequestOptionsPaginated } from '../..'; import type { Agent } from '../../../shared_imports'; export interface AgentsStrategyResponse extends IEsSearchResponse { edges: Agent[]; - totalCount: number; - pageInfo: PageInfoPaginated; inspect?: Maybe; } diff --git a/x-pack/plugins/osquery/common/search_strategy/osquery/index.ts b/x-pack/plugins/osquery/common/search_strategy/osquery/index.ts index b089d1fcf6484..b8985297b3062 100644 --- a/x-pack/plugins/osquery/common/search_strategy/osquery/index.ts +++ b/x-pack/plugins/osquery/common/search_strategy/osquery/index.ts @@ -40,6 +40,7 @@ export interface RequestBasicOptions extends IEsSearchRequest { aggregations?: Record; docValueFields?: DocValueFields[]; factoryQueryType?: FactoryQueryTypes; + componentTemplateExists?: boolean; } /** A mapping of semantic fields to their document counterparts */ diff --git a/x-pack/plugins/osquery/common/search_strategy/osquery/results/index.ts b/x-pack/plugins/osquery/common/search_strategy/osquery/results/index.ts index 5a0e14f99ed70..d7777e389dde8 100644 --- a/x-pack/plugins/osquery/common/search_strategy/osquery/results/index.ts +++ b/x-pack/plugins/osquery/common/search_strategy/osquery/results/index.ts @@ -8,15 +8,13 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { IEsSearchResponse } from '@kbn/data-plugin/common'; -import type { Inspect, Maybe, PageInfoPaginated, SortField } from '../../common'; +import type { Inspect, Maybe, SortField } from '../../common'; import type { RequestOptionsPaginated } from '../..'; export type ResultEdges = estypes.SearchResponse['hits']['hits']; export interface ResultsStrategyResponse extends IEsSearchResponse { edges: ResultEdges; - totalCount: number; - pageInfo: PageInfoPaginated; inspect?: Maybe; } diff --git a/x-pack/plugins/osquery/common/types.ts b/x-pack/plugins/osquery/common/types.ts index ef2c077056b86..981dbef21de7c 100644 --- a/x-pack/plugins/osquery/common/types.ts +++ b/x-pack/plugins/osquery/common/types.ts @@ -5,12 +5,6 @@ * 2.0. */ -import type { - PackagePolicy, - PackagePolicyInput, - PackagePolicyInputStream, -} from '@kbn/fleet-plugin/common'; - export const savedQuerySavedObjectType = 'osquery-saved-query'; export const packSavedObjectType = 'osquery-pack'; export const packAssetSavedObjectType = 'osquery-pack-asset'; @@ -36,42 +30,3 @@ export type RequiredKeepUndefined = { [K in keyof T]-?: [T[K]] } extends infe ? { [K in keyof U]: U[K][0] } : never : never; - -export interface OsqueryManagerPackagePolicyConfigRecordEntry { - type: string; - value: string; - frozen?: boolean; -} - -export interface OsqueryManagerPackagePolicyConfigRecord { - id: OsqueryManagerPackagePolicyConfigRecordEntry; - query: OsqueryManagerPackagePolicyConfigRecordEntry; - interval: OsqueryManagerPackagePolicyConfigRecordEntry; - platform?: OsqueryManagerPackagePolicyConfigRecordEntry; - version?: OsqueryManagerPackagePolicyConfigRecordEntry; - ecs_mapping?: - | { - value: Record< - string, - { - field: string; - } - >; - } - | undefined; -} - -export interface OsqueryManagerPackagePolicyInputStream - extends Omit { - config?: OsqueryManagerPackagePolicyConfigRecord; - vars?: OsqueryManagerPackagePolicyConfigRecord; -} - -export interface OsqueryManagerPackagePolicyInput extends Omit { - streams: OsqueryManagerPackagePolicyInputStream[]; -} - -export interface OsqueryManagerPackagePolicy extends Omit { - inputs: OsqueryManagerPackagePolicyInput[]; - read_only?: boolean; -} diff --git a/x-pack/plugins/osquery/common/utils/build_query/filters.ts b/x-pack/plugins/osquery/common/utils/build_query/filters.ts index a9a9b3319661b..0d82a581e27d9 100644 --- a/x-pack/plugins/osquery/common/utils/build_query/filters.ts +++ b/x-pack/plugins/osquery/common/utils/build_query/filters.ts @@ -6,8 +6,26 @@ */ import { isEmpty, isString } from 'lodash/fp'; - +import type { PaginationInputPaginated, Inspect } from '../../search_strategy'; import type { ESQuery } from '../../typed_json'; export const createQueryFilterClauses = (filterQuery: ESQuery | string | undefined) => !isEmpty(filterQuery) ? [isString(filterQuery) ? JSON.parse(filterQuery) : filterQuery] : []; + +export const createFilter = (filterQuery: ESQuery | string | undefined) => + isString(filterQuery) ? filterQuery : JSON.stringify(filterQuery); + +export type InspectResponse = Inspect & { response: string[] }; + +export const generateTablePaginationOptions = ( + activePage: number, + limit: number +): PaginationInputPaginated => { + const cursorStart = activePage * limit; + + return { + activePage, + cursorStart, + querySize: limit, + }; +}; diff --git a/x-pack/plugins/osquery/cypress/integration/all/add_integration.spec.ts b/x-pack/plugins/osquery/cypress/integration/all/add_integration.spec.ts index 1ad43e5003827..a6850e7fdbc03 100644 --- a/x-pack/plugins/osquery/cypress/integration/all/add_integration.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/all/add_integration.spec.ts @@ -76,7 +76,8 @@ describe('ALL - Add Integration', () => { addIntegration(); cy.contains('osquery_manager-'); }); - it('should have integration and packs copied when upgrading integration', () => { + + it.skip('should have integration and packs copied when upgrading integration', () => { const packageName = 'osquery_manager'; const oldVersion = '1.2.0'; const newVersion = '1.3.1'; diff --git a/x-pack/plugins/osquery/cypress/integration/all/alerts.spec.ts b/x-pack/plugins/osquery/cypress/integration/all/alerts.spec.ts index 4ef3e263df01c..80516f480e803 100644 --- a/x-pack/plugins/osquery/cypress/integration/all/alerts.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/all/alerts.spec.ts @@ -58,11 +58,11 @@ describe('Alert Event Details', () => { cy.getBySel('ruleSwitch').should('have.attr', 'aria-checked', 'true'); }); - it('should be able to run live query and add to timeline (-depending on the previous test)', () => { + it.skip('should be able to run live query and add to timeline (-depending on the previous test)', () => { const TIMELINE_NAME = 'Untitled timeline'; cy.visit('/app/security/alerts'); cy.getBySel('header-page-title').contains('Alerts').should('exist'); - cy.getBySel('timeline-context-menu-button').first().click({ force: true }); + cy.getBySel('timeline-context-menu-button').first().click(); cy.getBySel('osquery-action-item').should('exist').contains('Run Osquery'); cy.getBySel('expand-event').first().click(); cy.getBySel('take-action-dropdown-btn').click(); diff --git a/x-pack/plugins/osquery/cypress/integration/all/live_query.spec.ts b/x-pack/plugins/osquery/cypress/integration/all/live_query.spec.ts index 930d1e29c2ebf..731802a021ae4 100644 --- a/x-pack/plugins/osquery/cypress/integration/all/live_query.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/all/live_query.spec.ts @@ -17,6 +17,7 @@ import { typeInOsqueryFieldInput, } from '../../tasks/live_query'; import { + LIVE_QUERY_EDITOR, RESULTS_TABLE, RESULTS_TABLE_BUTTON, RESULTS_TABLE_CELL_WRRAPER, @@ -92,4 +93,23 @@ describe('ALL - Live Query', () => { cy.react('ReactAce', { props: { value: 'select * from users' } }).should('exist'); }); + + it.skip('should run live pack', () => { + cy.contains('New live query').click(); + cy.contains('Run a set of queries in a pack.').click(); + cy.get(LIVE_QUERY_EDITOR).should('not.exist'); + cy.getBySel('select-live-pack').click(); + cy.contains('Integration').click(); + cy.contains('This table contains 1 rows.'); + cy.contains('Integration ('); + cy.contains('system_memory_linux_elastic'); + selectAllAgents(); + submitQuery(); + cy.getBySel('live-query-loading').should('exist'); + cy.getBySel('live-query-loading', { timeout: 10000 }).should('not.exist'); + cy.getBySel('toggleIcon-events').click(); + checkResults(); + navigateTo('/app/osquery'); + cy.contains('Integration'); + }); }); diff --git a/x-pack/plugins/osquery/cypress/integration/all/packs.spec.ts b/x-pack/plugins/osquery/cypress/integration/all/packs.spec.ts index 4a8842d21c9b1..260408ca428c1 100644 --- a/x-pack/plugins/osquery/cypress/integration/all/packs.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/all/packs.spec.ts @@ -96,7 +96,7 @@ describe('ALL - Packs', () => { cy.contains('ID must be unique').should('exist'); cy.react('EuiFlyoutFooter').react('EuiButtonEmpty').contains('Cancel').click(); }); - it('should open lens in new tab', () => { + it.skip('should open lens in new tab', () => { let lensUrl = ''; cy.window().then((win) => { cy.stub(win, 'open') diff --git a/x-pack/plugins/osquery/cypress/integration/roles/alert_test.spec.ts b/x-pack/plugins/osquery/cypress/integration/roles/alert_test.spec.ts index 5d25b6599b13c..b68cd0d17e466 100644 --- a/x-pack/plugins/osquery/cypress/integration/roles/alert_test.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/roles/alert_test.spec.ts @@ -13,7 +13,7 @@ import { preparePack } from '../../tasks/packs'; import { closeModalIfVisible } from '../../tasks/integrations'; import { navigateTo } from '../../tasks/navigation'; -describe('Alert_Test', () => { +describe.skip('Alert_Test', () => { before(() => { runKbnArchiverScript(ArchiverMethod.LOAD, 'pack'); runKbnArchiverScript(ArchiverMethod.LOAD, 'rule'); diff --git a/x-pack/plugins/osquery/cypress/integration/roles/t1_analyst.spec.ts b/x-pack/plugins/osquery/cypress/integration/roles/t1_analyst.spec.ts index 51270332e0a51..57995296cfb17 100644 --- a/x-pack/plugins/osquery/cypress/integration/roles/t1_analyst.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/roles/t1_analyst.spec.ts @@ -12,7 +12,7 @@ import { checkResults, selectAllAgents, submitQuery } from '../../tasks/live_que import { ArchiverMethod, runKbnArchiverScript } from '../../tasks/archiver'; import { getSavedQueriesDropdown, LIVE_QUERY_EDITOR } from '../../screens/live_query'; -describe('T1 Analyst - READ + runSavedQueries ', () => { +describe.skip('T1 Analyst - READ + runSavedQueries ', () => { const SAVED_QUERY_ID = 'Saved-Query-Id'; beforeEach(() => { @@ -50,7 +50,6 @@ describe('T1 Analyst - READ + runSavedQueries ', () => { cy.contains('select * from uptime'); cy.wait(1000); cy.react('EuiTableBody').first().react('DefaultItemAction').first().click(); - selectAllAgents(); cy.contains(SAVED_QUERY_ID); submitQuery(); checkResults(); diff --git a/x-pack/plugins/osquery/cypress/integration/roles/t2_analyst.spec.ts b/x-pack/plugins/osquery/cypress/integration/roles/t2_analyst.spec.ts index 901b18f1461c7..cf91a49e9dad6 100644 --- a/x-pack/plugins/osquery/cypress/integration/roles/t2_analyst.spec.ts +++ b/x-pack/plugins/osquery/cypress/integration/roles/t2_analyst.spec.ts @@ -19,7 +19,7 @@ import { import { ArchiverMethod, runKbnArchiverScript } from '../../tasks/archiver'; import { getSavedQueriesComplexTest } from '../../tasks/saved_queries'; -describe('T2 Analyst - READ + Write Live/Saved + runSavedQueries ', () => { +describe.skip('T2 Analyst - READ + Write Live/Saved + runSavedQueries ', () => { const SAVED_QUERY_ID = 'Saved-Query-Id'; const NEW_SAVED_QUERY_ID = 'Saved-Query-Id-T2'; const NEW_SAVED_QUERY_DESCRIPTION = 'Test saved query description T2'; diff --git a/x-pack/plugins/osquery/cypress/tasks/saved_queries.ts b/x-pack/plugins/osquery/cypress/tasks/saved_queries.ts index 66e606132b05e..d288584b6a169 100644 --- a/x-pack/plugins/osquery/cypress/tasks/saved_queries.ts +++ b/x-pack/plugins/osquery/cypress/tasks/saved_queries.ts @@ -75,7 +75,7 @@ export const getSavedQueriesComplexTest = (savedQueryId: string, savedQueryDescr // visit Status results cy.react('EuiTab', { props: { id: 'status' } }).click(); cy.react('EuiTableRow').should('have.lengthOf', 1); - cy.contains('Successful').siblings().contains(1); + // cy.contains('Successful').siblings().contains(1); // play saved query cy.contains('Saved queries').click(); diff --git a/x-pack/plugins/osquery/kibana.json b/x-pack/plugins/osquery/kibana.json index 1ea8468529b85..539c2f7dc18dc 100644 --- a/x-pack/plugins/osquery/kibana.json +++ b/x-pack/plugins/osquery/kibana.json @@ -12,6 +12,7 @@ "requiredPlugins": [ "actions", "data", + "dataViews", "discover", "features", "navigation", diff --git a/x-pack/plugins/osquery/public/action_results/action_agents_status.tsx b/x-pack/plugins/osquery/public/action_results/action_agents_status.tsx deleted file mode 100644 index f5b952af8acd4..0000000000000 --- a/x-pack/plugins/osquery/public/action_results/action_agents_status.tsx +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; -import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useEffect, useMemo, useState } from 'react'; - -import { Direction } from '../../common/search_strategy'; -import { AgentStatusBar } from './action_agents_status_bar'; -import { ActionAgentsStatusBadges } from './action_agents_status_badges'; -import { useActionResults } from './use_action_results'; - -interface ActionAgentsStatusProps { - actionId: string; - expirationDate?: string; - agentIds?: string[]; -} - -const ActionAgentsStatusComponent: React.FC = ({ - actionId, - expirationDate, - agentIds, -}) => { - const [isLive, setIsLive] = useState(true); - const expired = useMemo( - () => (!expirationDate ? false : new Date(expirationDate) < new Date()), - [expirationDate] - ); - const { - // @ts-expect-error update types - data: { aggregations }, - } = useActionResults({ - actionId, - activePage: 0, - agentIds, - limit: 0, - direction: Direction.asc, - sortField: '@timestamp', - isLive, - }); - - const agentStatus = useMemo(() => { - const notRespondedCount = !agentIds?.length ? 0 : agentIds.length - aggregations.totalResponded; - - return { - success: aggregations.successful, - pending: notRespondedCount, - failed: aggregations.failed, - }; - }, [agentIds?.length, aggregations.failed, aggregations.successful, aggregations.totalResponded]); - - useEffect( - () => - setIsLive(() => { - if (!agentIds?.length || expired) return false; - - return !!(aggregations.totalResponded !== agentIds?.length); - }), - [agentIds?.length, aggregations.totalResponded, expired] - ); - - return ( - <> - - - - - - - - - - - - - - - - - ); -}; - -export const ActionAgentsStatus = React.memo(ActionAgentsStatusComponent); diff --git a/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx b/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx index e04f783608420..29d823560d6e3 100644 --- a/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx +++ b/x-pack/plugins/osquery/public/action_results/action_results_summary.tsx @@ -5,8 +5,6 @@ * 2.0. */ -/* eslint-disable @typescript-eslint/no-unused-vars */ - import { i18n } from '@kbn/i18n'; import { EuiInMemoryTable, EuiCodeBlock } from '@elastic/eui'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; @@ -33,10 +31,8 @@ const ActionResultsSummaryComponent: React.FC = ({ expirationDate, agentIds, }) => { - // @ts-expect-error update types - const [pageIndex, setPageIndex] = useState(0); - // @ts-expect-error update types - const [pageSize, setPageSize] = useState(50); + const [pageIndex] = useState(0); + const [pageSize] = useState(50); const expired = useMemo( () => (!expirationDate ? false : new Date(expirationDate) < new Date()), [expirationDate] diff --git a/x-pack/plugins/osquery/public/action_results/use_action_results.ts b/x-pack/plugins/osquery/public/action_results/use_action_results.ts index 629c490660a2e..964feb9eafb3b 100644 --- a/x-pack/plugins/osquery/public/action_results/use_action_results.ts +++ b/x-pack/plugins/osquery/public/action_results/use_action_results.ts @@ -5,9 +5,9 @@ * 2.0. */ +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { flatten, reverse, uniqBy } from 'lodash/fp'; import { useQuery } from 'react-query'; - import { i18n } from '@kbn/i18n'; import { lastValueFrom } from 'rxjs'; import type { InspectResponse } from '../common/helpers'; @@ -19,7 +19,6 @@ import { import { useKibana } from '../common/lib/kibana'; import type { ResultEdges, - PageInfoPaginated, ActionResultsRequestOptions, ActionResultsStrategyResponse, Direction, @@ -35,8 +34,6 @@ export interface ResultsArgs { id: string; inspect: InspectResponse; isInspected: boolean; - pageInfo: PageInfoPaginated; - totalCount: number; } export interface UseActionResults { @@ -65,7 +62,7 @@ export const useActionResults = ({ const { data } = useKibana().services; const setErrorToast = useErrorToast(); - return useQuery( + return useQuery<{}, Error, ActionResultsStrategyResponse>( ['actionResults', { actionId }], async () => { const responseData = await lastValueFrom( @@ -87,22 +84,23 @@ export const useActionResults = ({ ); const totalResponded = - // @ts-expect-error update types responseData.rawResponse?.aggregations?.aggs.responses_by_action_id?.doc_count ?? 0; const totalRowCount = - // @ts-expect-error update types responseData.rawResponse?.aggregations?.aggs.responses_by_action_id?.rows_count?.value ?? 0; const aggsBuckets = - // @ts-expect-error update types responseData.rawResponse?.aggregations?.aggs.responses_by_action_id?.responses.buckets; - const cachedData = queryClient.getQueryData(['actionResults', { actionId }]); + const cachedData = queryClient.getQueryData([ + 'actionResults', + { actionId }, + ]); - // @ts-expect-error update types const previousEdges = cachedData?.edges.length - ? // @ts-expect-error update types - cachedData?.edges - : agentIds?.map((agentId) => ({ fields: { agent_id: [agentId] } })) ?? []; + ? cachedData?.edges + : agentIds?.map( + (agentId) => + ({ fields: { agent_id: [agentId] } } as unknown as estypes.SearchHit) + ) ?? []; return { ...responseData, @@ -110,9 +108,7 @@ export const useActionResults = ({ aggregations: { totalRowCount, totalResponded, - // @ts-expect-error update types successful: aggsBuckets?.find((bucket) => bucket.key === 'success')?.doc_count ?? 0, - // @ts-expect-error update types failed: aggsBuckets?.find((bucket) => bucket.key === 'error')?.doc_count ?? 0, }, inspect: getInspectResponse(responseData, {} as InspectResponse), @@ -124,7 +120,6 @@ export const useActionResults = ({ aggregations: { totalResponded: 0, successful: 0, - // @ts-expect-error update types pending: agentIds?.length ?? 0, failed: 0, }, @@ -133,7 +128,7 @@ export const useActionResults = ({ keepPreviousData: true, enabled: !skip && !!agentIds?.length, onSuccess: () => setErrorToast(), - onError: (error: Error) => + onError: (error) => setErrorToast(error, { title: i18n.translate('xpack.osquery.action_results.fetchError', { defaultMessage: 'Error while fetching action results', diff --git a/x-pack/plugins/osquery/public/actions/actions_table.tsx b/x-pack/plugins/osquery/public/actions/actions_table.tsx index 2f81394bccde8..25c35d09e1ba0 100644 --- a/x-pack/plugins/osquery/public/actions/actions_table.tsx +++ b/x-pack/plugins/osquery/public/actions/actions_table.tsx @@ -7,7 +7,15 @@ import { isArray, isEmpty, pickBy } from 'lodash'; import { i18n } from '@kbn/i18n'; -import { EuiBasicTable, EuiButtonIcon, EuiCodeBlock, formatDate } from '@elastic/eui'; +import { + EuiBasicTable, + EuiButtonIcon, + EuiCodeBlock, + formatDate, + EuiIcon, + EuiFlexItem, + EuiFlexGroup, +} from '@elastic/eui'; import React, { useState, useCallback, useMemo } from 'react'; import { useHistory } from 'react-router-dom'; @@ -47,14 +55,24 @@ const ActionsTableComponent = () => { setPageSize(size); }, []); - const renderQueryColumn = useCallback( - (_, item) => ( + const renderQueryColumn = useCallback((_, item) => { + if (item._source.pack_name) { + return ( + + + + + {item._source.pack_name} + + ); + } + + return ( - {item._source.data.query} + {item._source.queries[0].query} - ), - [] - ); + ); + }, []); const renderAgentsColumn = useCallback((_, item) => <>{item.fields.agents?.length ?? 0}, []); @@ -71,18 +89,43 @@ const ActionsTableComponent = () => { ); const handlePlayClick = useCallback( - (item) => + (item) => { + const packId = item._source.pack_id; + + if (packId) { + return push('/live_queries/new', { + form: pickBy( + { + packId: item._source.pack_id, + agentSelection: { + agents: item._source.agent_ids, + allAgentsSelected: item._source.agent_all, + platformsSelected: item._source.agent_platforms, + policiesSelected: item._source.agent_policy_ids, + }, + }, + (value) => !isEmpty(value) + ), + }); + } + push('/live_queries/new', { form: pickBy( { - agentIds: item.fields.agents, - query: item._source.data.query, - ecs_mapping: item._source.data.ecs_mapping, - savedQueryId: item._source.data.saved_query_id, + query: item._source.queries[0].query, + ecs_mapping: item._source.queries[0].ecs_mapping, + savedQueryId: item._source.queries[0].saved_query_id, + agentSelection: { + agents: item._source.agent_ids, + allAgentsSelected: item._source.agent_all, + platformsSelected: item._source.agent_platforms, + policiesSelected: item._source.agent_policy_ids, + }, }, (value) => !isEmpty(value) ), - }), + }); + }, [push] ); const isPlayButtonAvailable = useCallback( @@ -156,10 +199,10 @@ const ActionsTableComponent = () => { () => ({ pageIndex, pageSize, - totalItemCount: actionsData?.totalCount ?? 0, + totalItemCount: actionsData?.total ?? 0, pageSizeOptions: [20, 50, 100], }), - [actionsData?.totalCount, pageIndex, pageSize] + [actionsData?.total, pageIndex, pageSize] ); return ( diff --git a/x-pack/plugins/osquery/public/actions/use_action_details.ts b/x-pack/plugins/osquery/public/actions/use_action_details.ts deleted file mode 100644 index 39abf4ac23852..0000000000000 --- a/x-pack/plugins/osquery/public/actions/use_action_details.ts +++ /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 { useQuery } from 'react-query'; - -import { i18n } from '@kbn/i18n'; -import { lastValueFrom } from 'rxjs'; -import { createFilter } from '../common/helpers'; -import { useKibana } from '../common/lib/kibana'; -import type { - ActionDetailsRequestOptions, - ActionDetailsStrategyResponse, -} from '../../common/search_strategy'; -import { OsqueryQueries } from '../../common/search_strategy'; -import type { ESTermQuery } from '../../common/typed_json'; -import { useErrorToast } from '../common/hooks/use_error_toast'; - -export interface ActionDetailsArgs { - actionDetails: Record; - id: string; -} - -interface UseActionDetails { - actionId: string; - filterQuery?: ESTermQuery | string; - skip?: boolean; -} - -export const useActionDetails = ({ actionId, filterQuery, skip = false }: UseActionDetails) => { - const { data } = useKibana().services; - const setErrorToast = useErrorToast(); - - return useQuery( - ['actionDetails', { actionId, filterQuery }], - async () => { - const responseData = await lastValueFrom( - data.search.search( - { - actionId, - factoryQueryType: OsqueryQueries.actionDetails, - filterQuery: createFilter(filterQuery), - }, - { - strategy: 'osquerySearchStrategy', - } - ) - ); - - if (!responseData.actionDetails) throw new Error(); - - return responseData; - }, - { - enabled: !skip, - onSuccess: () => setErrorToast(), - onError: (error: Error) => - setErrorToast(error, { - title: i18n.translate('xpack.osquery.action_details.fetchError', { - defaultMessage: 'Error while fetching action details', - }), - }), - refetchOnWindowFocus: false, - retryDelay: 1000, - } - ); -}; diff --git a/x-pack/plugins/osquery/public/actions/use_all_actions.ts b/x-pack/plugins/osquery/public/actions/use_all_actions.ts index a0a53ab4566bd..fc3f2a6d123ac 100644 --- a/x-pack/plugins/osquery/public/actions/use_all_actions.ts +++ b/x-pack/plugins/osquery/public/actions/use_all_actions.ts @@ -18,7 +18,6 @@ import { import { useKibana } from '../common/lib/kibana'; import type { ActionEdges, - PageInfoPaginated, ActionsRequestOptions, ActionsStrategyResponse, Direction, @@ -33,8 +32,6 @@ export interface ActionsArgs { id: string; inspect: InspectResponse; isInspected: boolean; - pageInfo: PageInfoPaginated; - totalCount: number; } interface UseAllActions { diff --git a/x-pack/plugins/osquery/public/actions/use_live_query_details.ts b/x-pack/plugins/osquery/public/actions/use_live_query_details.ts new file mode 100644 index 0000000000000..a31c493487057 --- /dev/null +++ b/x-pack/plugins/osquery/public/actions/use_live_query_details.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; + +import { i18n } from '@kbn/i18n'; +import { useKibana } from '../common/lib/kibana'; +import type { ESTermQuery } from '../../common/typed_json'; +import { useErrorToast } from '../common/hooks/use_error_toast'; + +export interface LiveQueryDetailsArgs { + actionDetails: Record; + id: string; +} + +interface UseLiveQueryDetails { + actionId?: string; + isLive?: boolean; + filterQuery?: ESTermQuery | string; + skip?: boolean; +} + +export interface LiveQueryDetailsItem { + action_id: string; + expiration: string; + '@timestamp': string; + agent_all: boolean; + agent_ids: string[]; + agent_platforoms: string[]; + agent_policy_ids: string[]; + agents: string[]; + user_id?: string; + pack_id?: string; + pack_name?: string; + pack_prebuilt?: boolean; + status?: string; + queries?: Array<{ + action_id: string; + id: string; + query: string; + agents: string[]; + ecs_mapping?: unknown; + version?: string; + platform?: string; + saved_query_id?: string; + expiration?: string; + }>; +} + +export const useLiveQueryDetails = ({ + actionId, + filterQuery, + isLive = false, + skip = false, +}: UseLiveQueryDetails) => { + const { http } = useKibana().services; + const setErrorToast = useErrorToast(); + + return useQuery<{ data: LiveQueryDetailsItem }, Error, LiveQueryDetailsItem>( + ['liveQueries', { actionId, filterQuery }], + () => http.get(`/api/osquery/live_queries/${actionId}`), + { + enabled: !skip && !!actionId, + refetchInterval: isLive ? 5000 : false, + onSuccess: () => setErrorToast(), + onError: (error) => + setErrorToast(error, { + title: i18n.translate('xpack.osquery.action_details.fetchError', { + defaultMessage: 'Error while fetching action details', + }), + }), + select: (response) => response.data, + refetchOnWindowFocus: false, + retryDelay: 5000, + } + ); +}; diff --git a/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts b/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts index 608357bd72912..f629a138f70f6 100644 --- a/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts +++ b/x-pack/plugins/osquery/public/agent_policies/use_agent_policy.ts @@ -8,6 +8,7 @@ import { useQuery } from 'react-query'; import { i18n } from '@kbn/i18n'; +import type { AgentPolicy } from '@kbn/fleet-plugin/common'; import { useKibana } from '../common/lib/kibana'; import { useErrorToast } from '../common/hooks/use_error_toast'; @@ -21,8 +22,7 @@ export const useAgentPolicy = ({ policyId, skip, silent }: UseAgentPolicy) => { const { http } = useKibana().services; const setErrorToast = useErrorToast(); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return useQuery( + return useQuery<{ item: AgentPolicy }, Error, AgentPolicy>( ['agentPolicy', { policyId }], () => http.get(`/internal/osquery/fleet_wrapper/agent_policies/${policyId}`), { diff --git a/x-pack/plugins/osquery/public/agents/agents_table.tsx b/x-pack/plugins/osquery/public/agents/agents_table.tsx index e892a7f7a4840..e11cb9b8277d9 100644 --- a/x-pack/plugins/osquery/public/agents/agents_table.tsx +++ b/x-pack/plugins/osquery/public/agents/agents_table.tsx @@ -88,7 +88,7 @@ const AgentsTableComponent: React.FC = ({ agentSelection, onCh selectedGroups: SelectedGroups; } = generateAgentSelection(selection); if (newAgentSelection.allAgentsSelected) { - setNumAgentsSelected(agentGroupsData?.totalCount ?? 0); + setNumAgentsSelected(agentGroupsData?.total ?? 0); } else { const checkAgent = generateAgentCheck(selectedGroups); setNumAgentsSelected( @@ -135,11 +135,11 @@ const AgentsTableComponent: React.FC = ({ agentSelection, onCh } } - if (agentSelection.policiesSelected.length) { + if (agentSelection.policiesSelected?.length) { handleSelectedOptions(agentSelection.policiesSelected, AGENT_POLICY_LABEL); } - if (agentSelection.agents.length) { + if (agentSelection.agents?.length) { handleSelectedOptions(agentSelection.agents, AGENT_SELECTION_LABEL); } } @@ -149,7 +149,7 @@ const AgentsTableComponent: React.FC = ({ agentSelection, onCh if (agentsFetched && groupsFetched && agentGroupsData) { const grouper = new AgentGrouper(); // update the groups when groups or agents have changed - grouper.setTotalAgents(agentGroupsData?.totalCount); + grouper.setTotalAgents(agentGroupsData?.total); grouper.updateGroup(AGENT_GROUP_KEY.Platform, agentGroupsData?.groups.platforms); grouper.updateGroup(AGENT_GROUP_KEY.Policy, agentGroupsData?.groups.policies); // @ts-expect-error update types diff --git a/x-pack/plugins/osquery/public/agents/use_agent_groups.ts b/x-pack/plugins/osquery/public/agents/use_agent_groups.ts index 5076082563ba3..497819a15031d 100644 --- a/x-pack/plugins/osquery/public/agents/use_agent_groups.ts +++ b/x-pack/plugins/osquery/public/agents/use_agent_groups.ts @@ -29,7 +29,7 @@ export const useAgentGroups = () => { AgentsStrategyResponse, unknown, { - totalCount: number; + total: number; groups: ReturnType; } >( @@ -80,7 +80,7 @@ export const useAgentGroups = () => { ); return { - totalCount: response.totalCount, + total: response.total ?? 0, groups: { platforms, overlap, @@ -96,13 +96,8 @@ export const useAgentGroups = () => { }; }, placeholderData: { - totalCount: 0, + total: 0, edges: [], - pageInfo: { - activePage: 1, - fakeTotalCount: 100, - showMorePagesIndicator: true, - }, rawResponse: { took: 0, timed_out: false, diff --git a/x-pack/plugins/osquery/public/agents/use_all_agents.ts b/x-pack/plugins/osquery/public/agents/use_all_agents.ts index 39a77fa72fa4e..c5e7c2d703bcf 100644 --- a/x-pack/plugins/osquery/public/agents/use_all_agents.ts +++ b/x-pack/plugins/osquery/public/agents/use_all_agents.ts @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; import { useQuery } from 'react-query'; -import type { GetAgentsResponse } from '@kbn/fleet-plugin/common'; +import type { ListResult, Agent } from '@kbn/fleet-plugin/common'; import { useErrorToast } from '../common/hooks/use_error_toast'; import { useKibana } from '../common/lib/kibana'; import { useOsqueryPolicies } from './use_osquery_policies'; @@ -26,7 +26,7 @@ export const useAllAgents = (searchValue = '', opts: RequestOptions = { perPage: const { data: osqueryPolicies, isFetched } = useOsqueryPolicies(); - return useQuery( + return useQuery, 'items'> & { agents: Agent[] }, unknown, Agent[]>( ['agents', osqueryPolicies, searchValue, perPage], () => { let kuery = ''; @@ -47,7 +47,6 @@ export const useAllAgents = (searchValue = '', opts: RequestOptions = { perPage: }); }, { - // @ts-expect-error update types select: (data) => data?.agents || [], enabled: isFetched && !!osqueryPolicies?.length, onSuccess: () => setErrorToast(), diff --git a/x-pack/plugins/osquery/public/assets/use_import_assets.ts b/x-pack/plugins/osquery/public/assets/use_import_assets.ts index f63f3e7096f03..feb2c48041567 100644 --- a/x-pack/plugins/osquery/public/assets/use_import_assets.ts +++ b/x-pack/plugins/osquery/public/assets/use_import_assets.ts @@ -23,20 +23,15 @@ export const useImportAssets = ({ successToastText }: UseImportAssetsProps) => { } = useKibana().services; const setErrorToast = useErrorToast(); - return useMutation( - () => - // eslint-disable-next-line @typescript-eslint/no-explicit-any - http.post('/internal/osquery/assets/update'), - { - onSuccess: () => { - setErrorToast(); - queryClient.invalidateQueries(PACKS_ID); - queryClient.invalidateQueries(INTEGRATION_ASSETS_STATUS_ID); - toasts.addSuccess(successToastText); - }, - onError: (error) => { - setErrorToast(error); - }, - } - ); + return useMutation(() => http.post('/internal/osquery/assets/update'), { + onSuccess: () => { + setErrorToast(); + queryClient.invalidateQueries(PACKS_ID); + queryClient.invalidateQueries(INTEGRATION_ASSETS_STATUS_ID); + toasts.addSuccess(successToastText); + }, + onError: (error) => { + setErrorToast(error); + }, + }); }; diff --git a/x-pack/plugins/osquery/public/common/helpers.ts b/x-pack/plugins/osquery/public/common/helpers.ts index 42860bfb80edc..6b0a5f2a51c39 100644 --- a/x-pack/plugins/osquery/public/common/helpers.ts +++ b/x-pack/plugins/osquery/public/common/helpers.ts @@ -31,7 +31,6 @@ export const generateTablePaginationOptions = ( return { activePage, cursorStart, - fakePossibleCount: 4 <= activePage && activePage > 0 ? limit * (activePage + 2) : limit * 5, querySize: limit, }; }; diff --git a/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx b/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx new file mode 100644 index 0000000000000..8da13f72a077d --- /dev/null +++ b/x-pack/plugins/osquery/public/common/hooks/use_logs_data_view.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useQuery } from 'react-query'; +import type { DataView } from '@kbn/data-plugin/common'; + +import { useKibana } from '../lib/kibana'; + +export interface LogsDataView extends DataView { + id: string; +} + +export const useLogsDataView = () => { + const dataViews = useKibana().services.data.dataViews; + + return useQuery(['logsDataView'], async () => { + let dataView = (await dataViews.find('logs-osquery_manager.result*', 1))[0]; + if (!dataView && dataViews.getCanSaveSync()) { + dataView = await dataViews.createAndSave({ + title: 'logs-osquery_manager.result*', + timeFieldName: '@timestamp', + }); + } + + return dataView as LogsDataView; + }); +}; diff --git a/x-pack/plugins/osquery/public/common/validations.ts b/x-pack/plugins/osquery/public/common/validations.ts index 1dc2ddbf139b8..4a29d274fcc0c 100644 --- a/x-pack/plugins/osquery/public/common/validations.ts +++ b/x-pack/plugins/osquery/public/common/validations.ts @@ -7,12 +7,12 @@ import { i18n } from '@kbn/i18n'; -import type { ValidationFunc } from '../shared_imports'; +import type { FormData, ValidationFunc } from '../shared_imports'; import { fieldValidators } from '../shared_imports'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const queryFieldValidation: ValidationFunc = fieldValidators.emptyField( - i18n.translate('xpack.osquery.pack.queryFlyoutForm.emptyQueryError', { - defaultMessage: 'Query is a required field', - }) -); +export const queryFieldValidation: ValidationFunc = + fieldValidators.emptyField( + i18n.translate('xpack.osquery.pack.queryFlyoutForm.emptyQueryError', { + defaultMessage: 'Query is a required field', + }) + ); diff --git a/x-pack/plugins/osquery/public/components/main_navigation.tsx b/x-pack/plugins/osquery/public/components/main_navigation.tsx index 8757ee0ea576c..8e0c3d7a8d55c 100644 --- a/x-pack/plugins/osquery/public/components/main_navigation.tsx +++ b/x-pack/plugins/osquery/public/components/main_navigation.tsx @@ -27,7 +27,7 @@ export const MainNavigation = () => {