From dc1f7d51d42cd198b50b68dce1cb8a4f349fd2e7 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Tue, 23 Mar 2021 13:14:05 -0500 Subject: [PATCH 01/35] [Metrics UI] Add anomalies table to flyout (#90305) * Add anomalies table to flyout * Fix type * Update i18n * use anomalyThreshold from configuration * use EuiBasicTable and format date * add actions menu * update text * change host/k8s toggle to EuiComboBox * add open in inventory to actions * add search functionality back * debounce api call * loading messaging * change types, cleanup * query with partition field instead of influencers to prevent long query ES server errors * show text when no jobs enabled * adjust date * close flyout after clicking show in inventory * fix callout Co-authored-by: neptunian Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../results/metrics_hosts_anomalies.ts | 29 +- .../infra_ml/results/metrics_k8s_anomalies.ts | 31 +- .../infra/public/hooks/use_sorting.tsx | 18 + .../anomalies_table/annomaly_summary.tsx | 55 ++ .../anomalies_table/anomalies_table.tsx | 483 ++++++++++++++++++ .../anomalies_table/pagination.tsx | 57 +++ .../anomaly_detection_flyout.tsx | 1 + .../ml/anomaly_detection/flyout_home.tsx | 128 ++--- .../hooks/use_metrics_hosts_anomalies.ts | 21 +- .../hooks/use_metrics_k8s_anomalies.ts | 13 +- .../metric_anomaly/evaluate_condition.ts | 16 +- .../infra/server/lib/infra_ml/common.ts | 2 + .../lib/infra_ml/metrics_hosts_anomalies.ts | 82 +-- .../lib/infra_ml/metrics_k8s_anomalies.ts | 59 ++- .../server/lib/infra_ml/queries/common.ts | 8 + .../queries/metrics_host_anomalies.test.ts | 1 + .../queries/metrics_hosts_anomalies.ts | 12 +- .../queries/metrics_k8s_anomalies.test.ts | 1 + .../infra_ml/queries/metrics_k8s_anomalies.ts | 12 +- .../results/metrics_hosts_anomalies.ts | 10 +- .../infra_ml/results/metrics_k8s_anomalies.ts | 10 +- .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - 23 files changed, 888 insertions(+), 165 deletions(-) create mode 100644 x-pack/plugins/infra/public/hooks/use_sorting.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/annomaly_summary.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx create mode 100644 x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/pagination.tsx diff --git a/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_hosts_anomalies.ts b/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_hosts_anomalies.ts index 0b70b65b7069e..7c6a0f6d2ada7 100644 --- a/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_hosts_anomalies.ts +++ b/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_hosts_anomalies.ts @@ -13,17 +13,23 @@ import { anomalyTypeRT, paginationCursorRT, sortRT, paginationRT, metricRT } fro export const INFA_ML_GET_METRICS_HOSTS_ANOMALIES_PATH = '/api/infra/infra_ml/results/metrics_hosts_anomalies'; -const metricsHostAnomalyCommonFieldsRT = rt.type({ - id: rt.string, - anomalyScore: rt.number, - typical: rt.number, - actual: rt.number, - type: anomalyTypeRT, - influencers: rt.array(rt.string), - duration: rt.number, - startTime: rt.number, - jobId: rt.string, -}); +const metricsHostAnomalyCommonFieldsRT = rt.intersection([ + rt.type({ + id: rt.string, + anomalyScore: rt.number, + typical: rt.number, + actual: rt.number, + type: anomalyTypeRT, + influencers: rt.array(rt.string), + duration: rt.number, + startTime: rt.number, + jobId: rt.string, + }), + rt.partial({ + partitionFieldName: rt.string, + partitionFieldValue: rt.string, + }), +]); const metricsHostsAnomalyRT = metricsHostAnomalyCommonFieldsRT; export type MetricsHostsAnomaly = rt.TypeOf; @@ -67,6 +73,7 @@ export const getMetricsHostsAnomaliesRequestPayloadRT = rt.type({ timeRange: timeRangeRT, }), rt.partial({ + query: rt.string, metric: metricRT, // Pagination properties pagination: paginationRT, diff --git a/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_k8s_anomalies.ts b/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_k8s_anomalies.ts index 3ee6189dcbf9a..2ad57c74ca2ac 100644 --- a/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_k8s_anomalies.ts +++ b/x-pack/plugins/infra/common/http_api/infra_ml/results/metrics_k8s_anomalies.ts @@ -13,17 +13,23 @@ import { paginationCursorRT, anomalyTypeRT, sortRT, paginationRT, metricRT } fro export const INFA_ML_GET_METRICS_K8S_ANOMALIES_PATH = '/api/infra/infra_ml/results/metrics_k8s_anomalies'; -const metricsK8sAnomalyCommonFieldsRT = rt.type({ - id: rt.string, - anomalyScore: rt.number, - typical: rt.number, - actual: rt.number, - type: anomalyTypeRT, - influencers: rt.array(rt.string), - duration: rt.number, - startTime: rt.number, - jobId: rt.string, -}); +const metricsK8sAnomalyCommonFieldsRT = rt.intersection([ + rt.type({ + id: rt.string, + anomalyScore: rt.number, + typical: rt.number, + actual: rt.number, + type: anomalyTypeRT, + influencers: rt.array(rt.string), + duration: rt.number, + startTime: rt.number, + jobId: rt.string, + }), + rt.partial({ + partitionFieldName: rt.string, + partitionFieldValue: rt.string, + }), +]); const metricsK8sAnomalyRT = metricsK8sAnomalyCommonFieldsRT; export type MetricsK8sAnomaly = rt.TypeOf; @@ -67,13 +73,12 @@ export const getMetricsK8sAnomaliesRequestPayloadRT = rt.type({ timeRange: timeRangeRT, }), rt.partial({ + query: rt.string, metric: metricRT, // Pagination properties pagination: paginationRT, // Sort properties sort: sortRT, - // Dataset filters - datasets: rt.array(rt.string), }), ]), }); diff --git a/x-pack/plugins/infra/public/hooks/use_sorting.tsx b/x-pack/plugins/infra/public/hooks/use_sorting.tsx new file mode 100644 index 0000000000000..a11586766ab9e --- /dev/null +++ b/x-pack/plugins/infra/public/hooks/use_sorting.tsx @@ -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 { useState } from 'react'; +import { CriteriaWithPagination } from '@elastic/eui/src/components/basic_table/basic_table'; + +export function useSorting(defaultSorting: CriteriaWithPagination['sort']) { + const [sorting, setSorting] = useState['sort']>(defaultSorting); + + return { + sorting, + setSorting, + }; +} diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/annomaly_summary.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/annomaly_summary.tsx new file mode 100644 index 0000000000000..09c8beeb2a1be --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/annomaly_summary.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { MetricsHostsAnomaly } from '../../../../../../../../common/http_api/infra_ml/results'; +import { formatOneDecimalPlace } from '../../../../../../../../common/log_analysis'; + +export const AnomalySummary = ({ anomaly }: { anomaly: MetricsHostsAnomaly }) => { + const { actual, typical } = anomaly; + + const moreThanExpectedAnomalyMessage = i18n.translate( + 'xpack.infra.ml.anomalyFlyout.anomaliesTableMoreThanExpectedAnomalyMessage', + { + defaultMessage: 'more', + } + ); + + const fewerThanExpectedAnomalyMessage = i18n.translate( + 'xpack.infra.ml.anomalyFlyout.anomaliesTableFewerThanExpectedAnomalyMessage', + { + defaultMessage: 'fewer', + } + ); + + const isMore = actual > typical; + const message = isMore ? moreThanExpectedAnomalyMessage : fewerThanExpectedAnomalyMessage; + const ratio = isMore ? actual / typical : typical / actual; + const icon = isMore ? 'sortUp' : 'sortDown'; + // Edge case scenarios where actual and typical might sit at 0. + const useRatio = ratio !== Infinity; + const ratioMessage = useRatio ? `${formatOneDecimalPlace(ratio)}x` : ''; + + return ( + + + + + + {`${ratioMessage} ${message}`} + {/* {anomaly.categoryRegex && ( + <> + {': '} + + + )} */} + + + ); +}; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx new file mode 100644 index 0000000000000..7f0424cf48758 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx @@ -0,0 +1,483 @@ +/* + * Copyright 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 React, { ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react'; +import { EuiSuperDatePicker } from '@elastic/eui'; +import { + EuiFlexItem, + EuiSpacer, + EuiFieldSearch, + EuiBasicTable, + EuiFlexGroup, + EuiTableFieldDataColumnType, + EuiTableActionsColumnType, + Criteria, + EuiContextMenuItem, + EuiComboBox, + EuiButtonIcon, + EuiPopover, + EuiContextMenuPanel, + EuiIcon, + EuiText, + OnTimeChangeProps, +} from '@elastic/eui'; +import { FormattedDate, FormattedMessage } from 'react-intl'; +import { datemathToEpochMillis } from '../../../../../../../utils/datemath'; +import { SnapshotMetricType } from '../../../../../../../../common/inventory_models/types'; +import { withTheme } from '../../../../../../../../../../../src/plugins/kibana_react/common'; +import { PrefilledAnomalyAlertFlyout } from '../../../../../../../alerting/metric_anomaly/components/alert_flyout'; +import { useLinkProps } from '../../../../../../../hooks/use_link_props'; +import { useSorting } from '../../../../../../../hooks/use_sorting'; +import { useMetricsK8sAnomaliesResults } from '../../../../hooks/use_metrics_k8s_anomalies'; +import { useMetricsHostsAnomaliesResults } from '../../../../hooks/use_metrics_hosts_anomalies'; +import { + Metric, + MetricsHostsAnomaly, + Sort, +} from '../../../../../../../../common/http_api/infra_ml/results'; +import { PaginationControls } from './pagination'; +import { AnomalySummary } from './annomaly_summary'; +import { AnomalySeverityIndicator } from '../../../../../../../components/logging/log_analysis_results/anomaly_severity_indicator'; +import { useSourceContext } from '../../../../../../../containers/source'; +import { createResultsUrl } from '../flyout_home'; +import { useWaffleViewState, WaffleViewState } from '../../../../hooks/use_waffle_view_state'; +type JobType = 'k8s' | 'hosts'; +type SortField = 'anomalyScore' | 'startTime'; +interface JobOption { + id: JobType; + label: string; +} +const AnomalyActionMenu = ({ + jobId, + type, + startTime, + closeFlyout, + partitionFieldName, + partitionFieldValue, +}: { + jobId: string; + type: string; + startTime: number; + closeFlyout: () => void; + partitionFieldName?: string; + partitionFieldValue?: string; +}) => { + const [isOpen, setIsOpen] = useState(false); + const [isAlertOpen, setIsAlertOpen] = useState(false); + const close = useCallback(() => setIsOpen(false), [setIsOpen]); + const handleToggleMenu = useCallback(() => setIsOpen(!isOpen), [isOpen]); + const openAlert = useCallback(() => setIsAlertOpen(true), [setIsAlertOpen]); + const closeAlert = useCallback(() => setIsAlertOpen(false), [setIsAlertOpen]); + const { onViewChange } = useWaffleViewState(); + + const showInInventory = useCallback(() => { + const metricTypeMap: { [key in Metric]: SnapshotMetricType } = { + memory_usage: 'memory', + network_in: 'rx', + network_out: 'tx', + }; + // parse the anomaly job id for metric type + const jobIdParts = jobId.split('-'); + const jobIdMetric = jobIdParts[jobIdParts.length - 1]; + const metricType = metricTypeMap[jobIdMetric.replace(/hosts_|k8s_/, '') as Metric]; + const anomalyViewParams: WaffleViewState = { + metric: { type: metricType }, + sort: { by: 'name', direction: 'desc' }, + groupBy: [], + nodeType: type === 'metrics_k8s' ? 'pod' : 'host', + view: 'map', + customOptions: [], + customMetrics: [], + boundsOverride: { max: 1, min: 0 }, + autoBounds: true, + accountId: '', + region: '', + autoReload: false, + filterQuery: { + expression: + partitionFieldName && partitionFieldValue + ? `${partitionFieldName}: "${partitionFieldValue}"` + : ``, + kind: 'kuery', + }, + legend: { palette: 'cool', reverseColors: false, steps: 10 }, + time: startTime, + }; + onViewChange(anomalyViewParams); + closeFlyout(); + }, [jobId, onViewChange, startTime, type, partitionFieldName, partitionFieldValue, closeFlyout]); + + const anomaliesUrl = useLinkProps({ + app: 'ml', + pathname: `/explorer?_g=${createResultsUrl([jobId.toString()])}`, + }); + + const items = [ + + + , + + + , + + + , + ]; + + return ( + <> + + } + isOpen={isOpen && !isAlertOpen} + closePopover={close} + > + + + {isAlertOpen && } + + ); +}; +export const NoAnomaliesFound = withTheme(({ theme }) => ( + + +

+ +

+

+ +

+ + + + +
+)); +interface Props { + closeFlyout(): void; +} +export const AnomaliesTable = (props: Props) => { + const { closeFlyout } = props; + const [search, setSearch] = useState(''); + const [start, setStart] = useState('now-30d'); + const [end, setEnd] = useState('now'); + const [timeRange, setTimeRange] = useState<{ start: number; end: number }>({ + start: datemathToEpochMillis(start) || 0, + end: datemathToEpochMillis(end, 'up') || 0, + }); + const { sorting, setSorting } = useSorting({ + field: 'startTime', + direction: 'desc', + }); + const jobOptions = [ + { + id: `hosts` as JobType, + label: i18n.translate('xpack.infra.ml.anomalyFlyout.hostBtn', { + defaultMessage: 'Hosts', + }), + }, + { + id: `k8s` as JobType, + label: i18n.translate('xpack.infra.ml.anomalyFlyout.podsBtn', { + defaultMessage: 'Kubernetes Pods', + }), + }, + ]; + const [jobType, setJobType] = useState('hosts'); + const [selectedJobType, setSelectedJobType] = useState([ + jobOptions.find((item) => item.id === 'hosts') || jobOptions[0], + ]); + const { source } = useSourceContext(); + const anomalyThreshold = source?.configuration.anomalyThreshold; + + const onTimeChange = useCallback( + ({ isInvalid, start: startChange, end: endChange }: OnTimeChangeProps) => { + if (!isInvalid) { + setStart(startChange); + setEnd(endChange); + setTimeRange({ + start: datemathToEpochMillis(startChange)!, + end: datemathToEpochMillis(endChange, 'up')!, + }); + } + }, + [] + ); + + const anomalyParams = useMemo( + () => ({ + sourceId: 'default', + anomalyThreshold: anomalyThreshold || 0, + startTime: timeRange.start, + endTime: timeRange.end, + defaultSortOptions: { + direction: sorting?.direction || 'desc', + field: (sorting?.field || 'startTime') as SortField, + }, + defaultPaginationOptions: { pageSize: 10 }, + }), + [timeRange, sorting?.field, sorting?.direction, anomalyThreshold] + ); + + const { + metricsHostsAnomalies, + getMetricsHostsAnomalies, + page: hostPage, + changeSortOptions: hostChangeSort, + fetchNextPage: hostFetchNextPage, + fetchPreviousPage: hostFetchPrevPage, + isLoadingMetricsHostsAnomalies: hostLoading, + } = useMetricsHostsAnomaliesResults(anomalyParams); + const { + metricsK8sAnomalies, + getMetricsK8sAnomalies, + page: k8sPage, + changeSortOptions: k8sChangeSort, + fetchNextPage: k8sFetchNextPage, + fetchPreviousPage: k8sPreviousPage, + isLoadingMetricsK8sAnomalies: k8sLoading, + } = useMetricsK8sAnomaliesResults(anomalyParams); + const page = useMemo(() => (jobType === 'hosts' ? hostPage : k8sPage), [ + jobType, + hostPage, + k8sPage, + ]); + const isLoading = useMemo(() => (jobType === 'hosts' ? hostLoading : k8sLoading), [ + jobType, + hostLoading, + k8sLoading, + ]); + const fetchNextPage = useMemo( + () => (jobType === 'hosts' ? hostFetchNextPage : k8sFetchNextPage), + [jobType, hostFetchNextPage, k8sFetchNextPage] + ); + const fetchPreviousPage = useMemo( + () => (jobType === 'hosts' ? hostFetchPrevPage : k8sPreviousPage), + [jobType, hostFetchPrevPage, k8sPreviousPage] + ); + + const getAnomalies = useMemo(() => { + if (jobType === 'hosts') { + return getMetricsHostsAnomalies; + } else if (jobType === 'k8s') { + return getMetricsK8sAnomalies; + } + }, [jobType, getMetricsK8sAnomalies, getMetricsHostsAnomalies]); + + const results = useMemo(() => { + if (jobType === 'hosts') { + return metricsHostsAnomalies; + } else { + return metricsK8sAnomalies; + } + }, [jobType, metricsHostsAnomalies, metricsK8sAnomalies]); + + const onSearchChange = useCallback((e: ChangeEvent) => { + setSearch(e.target.value); + }, []); + + const changeJobType = useCallback((selectedOptions) => { + setSelectedJobType(selectedOptions); + setJobType(selectedOptions[0].id); + }, []); + + const changeSortOptions = useCallback( + (nextSortOptions: Sort) => { + if (jobType === 'hosts') { + hostChangeSort(nextSortOptions); + } else { + k8sChangeSort(nextSortOptions); + } + }, + [hostChangeSort, k8sChangeSort, jobType] + ); + + const onTableChange = (criteria: Criteria) => { + setSorting(criteria.sort); + changeSortOptions({ + field: (criteria?.sort?.field || 'startTime') as SortField, + direction: criteria?.sort?.direction || 'desc', + }); + }; + + const columns: Array< + | EuiTableFieldDataColumnType + | EuiTableActionsColumnType + > = [ + { + field: 'startTime', + name: i18n.translate('xpack.infra.ml.anomalyFlyout.columnTime', { + defaultMessage: 'Time', + }), + width: '15%', + sortable: true, + textOnly: true, + truncateText: true, + render: (startTime: number) => ( + + ), + }, + { + field: 'jobId', + name: i18n.translate('xpack.infra.ml.anomalyFlyout.columnJob', { + defaultMessage: 'Job', + }), + width: '25%', + render: (jobId: string) => jobId, + }, + { + field: 'anomalyScore', + name: i18n.translate('xpack.infra.ml.anomalyFlyout.columnSeverit', { + defaultMessage: 'Severity', + }), + width: '15%', + sortable: true, + render: (anomalyScore: number) => , + }, + { + field: 'typical', + name: i18n.translate('xpack.infra.ml.anomalyFlyout.columnSummary', { + defaultMessage: 'Summary', + }), + width: '15%', + textOnly: true, + render: (typical: number, item: MetricsHostsAnomaly) => , + }, + { + field: 'influencers', + name: i18n.translate('xpack.infra.ml.anomalyFlyout.columnInfluencerName', { + defaultMessage: 'Node name', + }), + width: '20%', + textOnly: true, + truncateText: true, + render: (influencers: string[]) => influencers.join(','), + }, + { + name: i18n.translate('xpack.infra.ml.anomalyFlyout.columnActionsName', { + defaultMessage: 'Actions', + }), + width: '10%', + actions: [ + { + render: (anomaly: MetricsHostsAnomaly) => { + return ( + + ); + }, + }, + ], + }, + ]; + + useEffect(() => { + if (getAnomalies) { + getAnomalies(undefined, search); + } + }, [getAnomalies, search]); + + return ( +
+ + + + + + + + + + + + + + + + + + + columns={columns} + items={results} + sorting={{ sort: sorting }} + onChange={onTableChange} + hasActions={true} + loading={isLoading} + noItemsMessage={ + isLoading ? ( + + ) : ( + + ) + } + /> + + +
+ ); +}; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/pagination.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/pagination.tsx new file mode 100644 index 0000000000000..322a29a129a12 --- /dev/null +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/pagination.tsx @@ -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 { EuiFlexGroup, EuiFlexItem, EuiButtonIcon } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; + +const previousPageLabel = i18n.translate( + 'xpack.infra.logs.analysis.anomaliesTablePreviousPageLabel', + { + defaultMessage: 'Previous page', + } +); + +const nextPageLabel = i18n.translate('xpack.infra.logs.analysis.anomaliesTableNextPageLabel', { + defaultMessage: 'Next page', +}); + +export const PaginationControls = ({ + fetchPreviousPage, + fetchNextPage, + page, + isLoading, +}: { + fetchPreviousPage?: () => void; + fetchNextPage?: () => void; + page: number; + isLoading: boolean; +}) => { + return ( + + + + + + {page} + + + + + + ); +}; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomaly_detection_flyout.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomaly_detection_flyout.tsx index ba7ea0aa8d5d0..326689e945e1d 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomaly_detection_flyout.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomaly_detection_flyout.tsx @@ -75,6 +75,7 @@ export const AnomalyDetectionFlyout = () => { )} {screenName === 'setup' && ( diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx index bc08827b27189..f7cad1b02a8dc 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx @@ -14,6 +14,8 @@ import { EuiCallOut } from '@elastic/eui'; import { EuiButton } from '@elastic/eui'; import { EuiButtonEmpty } from '@elastic/eui'; import moment from 'moment'; +import { EuiTabs } from '@elastic/eui'; +import { EuiTab } from '@elastic/eui'; import { SubscriptionSplashContent } from '../../../../../../components/subscription_splash_content'; import { useInfraMLCapabilitiesContext } from '../../../../../../containers/ml/infra_ml_capabilities'; import { @@ -24,15 +26,18 @@ import { useMetricHostsModuleContext } from '../../../../../../containers/ml/mod import { useMetricK8sModuleContext } from '../../../../../../containers/ml/modules/metrics_k8s/module'; import { LoadingPage } from '../../../../../../components/loading_page'; import { useLinkProps } from '../../../../../../hooks/use_link_props'; +import { AnomaliesTable } from './anomalies_table/anomalies_table'; interface Props { hasSetupCapabilities: boolean; goToSetup(type: 'hosts' | 'kubernetes'): void; + closeFlyout(): void; } +type Tab = 'jobs' | 'anomalies'; export const FlyoutHome = (props: Props) => { - const [tab] = useState<'jobs' | 'anomalies'>('jobs'); - const { goToSetup } = props; + const [tab, setTab] = useState('jobs'); + const { goToSetup, closeFlyout } = props; const { fetchJobStatus: fetchHostJobStatus, setupStatus: hostSetupStatus, @@ -69,6 +74,12 @@ export const FlyoutHome = (props: Props) => { } }, [fetchK8sJobStatus, fetchHostJobStatus, hasInfraMLReadCapabilities]); + const hasJobs = hostJobSummaries.length > 0 || k8sJobSummaries.length > 0; + const manageJobsLinkProps = useLinkProps({ + app: 'ml', + pathname: '/jobs', + }); + if (!hasInfraMLCapabilities) { return ; } else if (!hasInfraMLReadCapabilities) { @@ -97,38 +108,66 @@ export const FlyoutHome = (props: Props) => { - -
- -

- -

-
-
+ + setTab('jobs')}> + Jobs + + setTab('anomalies')}> + Anomalies + + - - {(hostJobSummaries.length > 0 || k8sJobSummaries.length > 0) && ( - <> + 0} hasK8sJobs={k8sJobSummaries.length > 0} jobIds={jobIds} /> + ) + } + > + {tab === 'jobs' && ( + <> + {hasJobs && ( + <> + + + + + + + + + + )} + +

Create ML Jobs

+

+ +

+
+ + 0} + hasK8sJobs={k8sJobSummaries.length > 0} + hasSetupCapabilities={props.hasSetupCapabilities} + createHosts={createHosts} + createK8s={createK8s} + /> )} - {tab === 'jobs' && ( - 0} - hasK8sJobs={k8sJobSummaries.length > 0} - hasSetupCapabilities={props.hasSetupCapabilities} - createHosts={createHosts} - createK8s={createK8s} - /> - )} + + {tab === 'anomalies' && }
); @@ -158,39 +197,8 @@ const JobsEnabledCallout = (props: CalloutProps) => { }); } - const manageJobsLinkProps = useLinkProps({ - app: 'ml', - pathname: '/jobs', - }); - - const anomaliesUrl = useLinkProps({ - app: 'ml', - pathname: `/explorer?_g=${createResultsUrl(props.jobIds)}`, - }); - return ( <> - - - - - - - - - - - - - - - { } + icon={} // title="Hosts" title={ { } + icon={} title={ { ); }; -function createResultsUrl(jobIds: string[], mode = 'absolute') { +export const createResultsUrl = (jobIds: string[], mode = 'absolute') => { const idString = jobIds.map((j) => `'${j}'`).join(','); let path = ''; @@ -318,4 +326,4 @@ function createResultsUrl(jobIds: string[], mode = 'absolute') { path += "))&_a=(query:(query_string:(analyze_wildcard:!t,query:'*')))"; return path; -} +}; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_hosts_anomalies.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_hosts_anomalies.ts index 25afd05633fa5..5ef6c9429c4b3 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_hosts_anomalies.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_hosts_anomalies.ts @@ -174,13 +174,14 @@ export const useMetricsHostsAnomaliesResults = ({ const [getMetricsHostsAnomaliesRequest, getMetricsHostsAnomalies] = useTrackedPromise( { cancelPreviousOn: 'creation', - createPromise: async (metric: Metric) => { + createPromise: async (metric?: Metric, query?: string) => { const { timeRange: { start: queryStartTime, end: queryEndTime }, sortOptions, paginationOptions, paginationCursor, } = reducerState; + return await callGetMetricHostsAnomaliesAPI( { sourceId, @@ -188,6 +189,7 @@ export const useMetricsHostsAnomaliesResults = ({ startTime: queryStartTime, endTime: queryEndTime, metric, + query, sort: sortOptions, pagination: { ...paginationOptions, @@ -205,6 +207,7 @@ export const useMetricsHostsAnomaliesResults = ({ payload: { lastReceivedCursors: requestCursors }, }); } + // Check if we have more "next" entries. "Page" covers the "previous" scenario, // since we need to know the page we're on anyway. if (!paginationCursor || (paginationCursor && 'searchAfter' in paginationCursor)) { @@ -295,6 +298,7 @@ export const useMetricsHostsAnomaliesResults = ({ fetchPreviousPage: reducerState.page > 1 ? handleFetchPreviousPage : undefined, fetchNextPage: reducerState.hasNextPage ? handleFetchNextPage : undefined, page: reducerState.page, + timeRange: reducerState.timeRange, }; }; @@ -303,7 +307,8 @@ interface RequestArgs { anomalyThreshold: number; startTime: number; endTime: number; - metric: Metric; + metric?: Metric; + query?: string; sort: Sort; pagination: Pagination; } @@ -312,7 +317,16 @@ export const callGetMetricHostsAnomaliesAPI = async ( requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { sourceId, anomalyThreshold, startTime, endTime, metric, sort, pagination } = requestArgs; + const { + sourceId, + anomalyThreshold, + startTime, + endTime, + metric, + sort, + pagination, + query, + } = requestArgs; const response = await fetch(INFA_ML_GET_METRICS_HOSTS_ANOMALIES_PATH, { method: 'POST', body: JSON.stringify( @@ -324,6 +338,7 @@ export const callGetMetricHostsAnomaliesAPI = async ( startTime, endTime, }, + query, metric, sort, pagination, diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts index c135a2c5e6661..ad26c14df32b4 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts @@ -174,13 +174,12 @@ export const useMetricsK8sAnomaliesResults = ({ const [getMetricsK8sAnomaliesRequest, getMetricsK8sAnomalies] = useTrackedPromise( { cancelPreviousOn: 'creation', - createPromise: async (metric: Metric) => { + createPromise: async (metric?: Metric, query?: string) => { const { timeRange: { start: queryStartTime, end: queryEndTime }, sortOptions, paginationOptions, paginationCursor, - filteredDatasets: queryFilteredDatasets, } = reducerState; return await callGetMetricsK8sAnomaliesAPI( { @@ -189,12 +188,12 @@ export const useMetricsK8sAnomaliesResults = ({ startTime: queryStartTime, endTime: queryEndTime, metric, + query, sort: sortOptions, pagination: { ...paginationOptions, cursor: paginationCursor, }, - datasets: queryFilteredDatasets, }, services.http.fetch ); @@ -305,10 +304,10 @@ interface RequestArgs { anomalyThreshold: number; startTime: number; endTime: number; - metric: Metric; + metric?: Metric; + query?: string; sort: Sort; pagination: Pagination; - datasets?: string[]; } export const callGetMetricsK8sAnomaliesAPI = async ( @@ -321,9 +320,9 @@ export const callGetMetricsK8sAnomaliesAPI = async ( startTime, endTime, metric, + query, sort, pagination, - datasets, } = requestArgs; const response = await fetch(INFA_ML_GET_METRICS_K8S_ANOMALIES_PATH, { method: 'POST', @@ -337,9 +336,9 @@ export const callGetMetricsK8sAnomaliesAPI = async ( endTime, }, metric, + query, sort, pagination, - datasets, }, }) ), diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/evaluate_condition.ts b/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/evaluate_condition.ts index b7ef8ec7d2312..362cf0bc5a073 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/evaluate_condition.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/evaluate_condition.ts @@ -31,21 +31,21 @@ export const evaluateCondition = async ({ }: ConditionParams) => { const getAnomalies = nodeType === 'k8s' ? getMetricK8sAnomalies : getMetricsHostsAnomalies; - const result = await getAnomalies( - { + const result = await getAnomalies({ + context: { spaceId, mlSystem, mlAnomalyDetectors, }, - sourceId ?? 'default', - threshold, + sourceId: sourceId ?? 'default', + anomalyThreshold: threshold, startTime, endTime, metric, - { field: 'anomalyScore', direction: 'desc' }, - { pageSize: 100 }, - influencerFilter - ); + sort: { field: 'anomalyScore', direction: 'desc' }, + pagination: { pageSize: 100 }, + influencerFilter, + }); return result; }; diff --git a/x-pack/plugins/infra/server/lib/infra_ml/common.ts b/x-pack/plugins/infra/server/lib/infra_ml/common.ts index 686f27d714cc1..aba38ce4165c0 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/common.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/common.ts @@ -27,6 +27,8 @@ export interface MappedAnomalyHit { duration: number; influencers: string[]; categoryId?: string; + partitionFieldName?: string; + partitionFieldValue?: string; } export interface InfluencerFilter { diff --git a/x-pack/plugins/infra/server/lib/infra_ml/metrics_hosts_anomalies.ts b/x-pack/plugins/infra/server/lib/infra_ml/metrics_hosts_anomalies.ts index f6e11f5294191..1e307dae8e5b7 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/metrics_hosts_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/metrics_hosts_anomalies.ts @@ -11,7 +11,7 @@ import { fetchMlJob, MappedAnomalyHit, InfluencerFilter } from './common'; import { getJobId, metricsHostsJobTypes, ANOMALY_THRESHOLD } from '../../../common/infra_ml'; import { Sort, Pagination } from '../../../common/http_api/infra_ml'; import type { MlSystem, MlAnomalyDetectors } from '../../types'; -import { InsufficientAnomalyMlJobsConfigured, isMlPrivilegesError } from './errors'; +import { isMlPrivilegesError } from './errors'; import { decodeOrThrow } from '../../../common/runtime_types'; import { metricsHostsAnomaliesResponseRT, @@ -60,17 +60,29 @@ async function getCompatibleAnomaliesJobIds( }; } -export async function getMetricsHostsAnomalies( - context: Required, - sourceId: string, - anomalyThreshold: ANOMALY_THRESHOLD, - startTime: number, - endTime: number, - metric: 'memory_usage' | 'network_in' | 'network_out' | undefined, - sort: Sort, - pagination: Pagination, - influencerFilter?: InfluencerFilter -) { +export async function getMetricsHostsAnomalies({ + context, + sourceId, + anomalyThreshold, + startTime, + endTime, + metric, + sort, + pagination, + influencerFilter, + query, +}: { + context: Required; + sourceId: string; + anomalyThreshold: ANOMALY_THRESHOLD; + startTime: number; + endTime: number; + metric: 'memory_usage' | 'network_in' | 'network_out' | undefined; + sort: Sort; + pagination: Pagination; + influencerFilter?: InfluencerFilter; + query?: string; +}) { const finalizeMetricsHostsAnomaliesSpan = startTracingSpan('get metrics hosts entry anomalies'); const { @@ -84,9 +96,11 @@ export async function getMetricsHostsAnomalies( ); if (jobIds.length === 0) { - throw new InsufficientAnomalyMlJobsConfigured( - 'Metrics Hosts ML jobs need to be configured to search anomalies' - ); + return { + data: [], + hasMoreEntries: false, + timimg: { spans: [] }, + }; } try { @@ -103,7 +117,8 @@ export async function getMetricsHostsAnomalies( endTime, sort, pagination, - influencerFilter + influencerFilter, + query ); const data = anomalies.map((anomaly) => { @@ -136,6 +151,8 @@ const parseAnomalyResult = (anomaly: MappedAnomalyHit, jobId: string) => { duration, influencers, startTime: anomalyStartTime, + partitionFieldName, + partitionFieldValue, } = anomaly; return { @@ -148,6 +165,8 @@ const parseAnomalyResult = (anomaly: MappedAnomalyHit, jobId: string) => { startTime: anomalyStartTime, type: 'metrics_hosts' as const, jobId, + partitionFieldName, + partitionFieldValue, }; }; @@ -159,7 +178,8 @@ async function fetchMetricsHostsAnomalies( endTime: number, sort: Sort, pagination: Pagination, - influencerFilter?: InfluencerFilter + influencerFilter?: InfluencerFilter, + query?: string ) { // We'll request 1 extra entry on top of our pageSize to determine if there are // more entries to be fetched. This avoids scenarios where the client side can't @@ -168,20 +188,18 @@ async function fetchMetricsHostsAnomalies( const expandedPagination = { ...pagination, pageSize: pagination.pageSize + 1 }; const finalizeFetchLogEntryAnomaliesSpan = startTracingSpan('fetch metrics hosts anomalies'); - + const hostQuery = createMetricsHostsAnomaliesQuery({ + jobIds, + anomalyThreshold, + startTime, + endTime, + sort, + pagination: expandedPagination, + influencerFilter, + jobQuery: query, + }); const results = decodeOrThrow(metricsHostsAnomaliesResponseRT)( - await mlSystem.mlAnomalySearch( - createMetricsHostsAnomaliesQuery({ - jobIds, - anomalyThreshold, - startTime, - endTime, - sort, - pagination: expandedPagination, - influencerFilter, - }), - jobIds - ) + await mlSystem.mlAnomalySearch(hostQuery, jobIds) ); const { @@ -219,6 +237,8 @@ async function fetchMetricsHostsAnomalies( bucket_span: duration, timestamp: anomalyStartTime, by_field_value: categoryId, + partition_field_value: partitionFieldValue, + partition_field_name: partitionFieldName, } = result._source; const hostInfluencers = influencers.filter((i) => i.influencer_field_name === 'host.name'); @@ -236,6 +256,8 @@ async function fetchMetricsHostsAnomalies( startTime: anomalyStartTime, duration: duration * 1000, categoryId, + partitionFieldName, + partitionFieldValue, }; }); diff --git a/x-pack/plugins/infra/server/lib/infra_ml/metrics_k8s_anomalies.ts b/x-pack/plugins/infra/server/lib/infra_ml/metrics_k8s_anomalies.ts index 34039e9107f00..00635caee96fc 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/metrics_k8s_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/metrics_k8s_anomalies.ts @@ -11,7 +11,7 @@ import { fetchMlJob, MappedAnomalyHit, InfluencerFilter } from './common'; import { getJobId, metricsK8SJobTypes, ANOMALY_THRESHOLD } from '../../../common/infra_ml'; import { Sort, Pagination } from '../../../common/http_api/infra_ml'; import type { MlSystem, MlAnomalyDetectors } from '../../types'; -import { InsufficientAnomalyMlJobsConfigured, isMlPrivilegesError } from './errors'; +import { isMlPrivilegesError } from './errors'; import { decodeOrThrow } from '../../../common/runtime_types'; import { metricsK8sAnomaliesResponseRT, @@ -60,17 +60,29 @@ async function getCompatibleAnomaliesJobIds( }; } -export async function getMetricK8sAnomalies( - context: Required, - sourceId: string, - anomalyThreshold: ANOMALY_THRESHOLD, - startTime: number, - endTime: number, - metric: 'memory_usage' | 'network_in' | 'network_out' | undefined, - sort: Sort, - pagination: Pagination, - influencerFilter?: InfluencerFilter -) { +export async function getMetricK8sAnomalies({ + context, + sourceId, + anomalyThreshold, + startTime, + endTime, + metric, + sort, + pagination, + influencerFilter, + query, +}: { + context: Required; + sourceId: string; + anomalyThreshold: ANOMALY_THRESHOLD; + startTime: number; + endTime: number; + metric: 'memory_usage' | 'network_in' | 'network_out' | undefined; + sort: Sort; + pagination: Pagination; + influencerFilter?: InfluencerFilter; + query?: string; +}) { const finalizeMetricsK8sAnomaliesSpan = startTracingSpan('get metrics k8s entry anomalies'); const { @@ -84,9 +96,11 @@ export async function getMetricK8sAnomalies( ); if (jobIds.length === 0) { - throw new InsufficientAnomalyMlJobsConfigured( - 'Log rate or categorisation ML jobs need to be configured to search anomalies' - ); + return { + data: [], + hasMoreEntries: false, + timimg: { spans: [] }, + }; } const { @@ -102,7 +116,8 @@ export async function getMetricK8sAnomalies( endTime, sort, pagination, - influencerFilter + influencerFilter, + query ); const data = anomalies.map((anomaly) => { @@ -132,6 +147,8 @@ const parseAnomalyResult = (anomaly: MappedAnomalyHit, jobId: string) => { duration, influencers, startTime: anomalyStartTime, + partitionFieldName, + partitionFieldValue, } = anomaly; return { @@ -144,6 +161,8 @@ const parseAnomalyResult = (anomaly: MappedAnomalyHit, jobId: string) => { influencers, type: 'metrics_k8s' as const, jobId, + partitionFieldName, + partitionFieldValue, }; }; @@ -155,7 +174,8 @@ async function fetchMetricK8sAnomalies( endTime: number, sort: Sort, pagination: Pagination, - influencerFilter?: InfluencerFilter | undefined + influencerFilter?: InfluencerFilter | undefined, + query?: string ) { // We'll request 1 extra entry on top of our pageSize to determine if there are // more entries to be fetched. This avoids scenarios where the client side can't @@ -175,6 +195,7 @@ async function fetchMetricK8sAnomalies( sort, pagination: expandedPagination, influencerFilter, + jobQuery: query, }), jobIds ) @@ -215,6 +236,8 @@ async function fetchMetricK8sAnomalies( timestamp: anomalyStartTime, by_field_value: categoryId, influencers, + partition_field_value: partitionFieldValue, + partition_field_name: partitionFieldName, } = result._source; const podInfluencers = influencers.filter( @@ -233,6 +256,8 @@ async function fetchMetricK8sAnomalies( startTime: anomalyStartTime, duration: duration * 1000, categoryId, + partitionFieldValue, + partitionFieldName, }; }); diff --git a/x-pack/plugins/infra/server/lib/infra_ml/queries/common.ts b/x-pack/plugins/infra/server/lib/infra_ml/queries/common.ts index 6f996a672a44a..f4088c56303e2 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/queries/common.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/queries/common.ts @@ -22,6 +22,14 @@ export const createJobIdFilters = (jobId: string) => [ }, ]; +export const createJobIdsQuery = (query: string) => [ + { + wildcard: { + job_id: `*${query}*`, + }, + }, +]; + export const createJobIdsFilters = (jobIds: string[]) => [ { terms: { diff --git a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_host_anomalies.test.ts b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_host_anomalies.test.ts index 4c3e0ca8bc26f..7c281963e5717 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_host_anomalies.test.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_host_anomalies.test.ts @@ -49,6 +49,7 @@ describe('createMetricsHostAnomaliesQuery', () => { 'record_score', 'typical', 'actual', + 'partition_field_name', 'partition_field_value', 'timestamp', 'bucket_span', diff --git a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_hosts_anomalies.ts b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_hosts_anomalies.ts index 7808851508a7c..ab50986c3b3d5 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_hosts_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_hosts_anomalies.ts @@ -15,6 +15,7 @@ import { defaultRequestParameters, createAnomalyScoreFilter, createInfluencerFilter, + createJobIdsQuery, } from './common'; import { InfluencerFilter } from '../common'; import { Sort, Pagination } from '../../../../common/http_api/infra_ml'; @@ -36,6 +37,7 @@ export const createMetricsHostsAnomaliesQuery = ({ sort, pagination, influencerFilter, + jobQuery, }: { jobIds: string[]; anomalyThreshold: ANOMALY_THRESHOLD; @@ -44,16 +46,19 @@ export const createMetricsHostsAnomaliesQuery = ({ sort: Sort; pagination: Pagination; influencerFilter?: InfluencerFilter; + jobQuery?: string; }) => { const { field } = sort; const { pageSize } = pagination; - - const filters = [ + let filters: any = [ ...createJobIdsFilters(jobIds), ...createAnomalyScoreFilter(anomalyThreshold), ...createTimeRangeFilters(startTime, endTime), ...createResultTypeFilters(['record']), ]; + if (jobQuery) { + filters = [...filters, ...createJobIdsQuery(jobQuery)]; + } const influencerQuery = influencerFilter ? { must: createInfluencerFilter(influencerFilter) } @@ -64,6 +69,7 @@ export const createMetricsHostsAnomaliesQuery = ({ 'record_score', 'typical', 'actual', + 'partition_field_name', 'partition_field_value', 'timestamp', 'bucket_span', @@ -118,6 +124,8 @@ export const metricsHostsAnomalyHitRT = rt.type({ timestamp: rt.number, }), rt.partial({ + partition_field_name: rt.string, + partition_field_value: rt.string, by_field_value: rt.string, }), ]), diff --git a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.test.ts b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.test.ts index 81dcb390dff56..61efb896a6c89 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.test.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.test.ts @@ -49,6 +49,7 @@ describe('createMetricsK8sAnomaliesQuery', () => { 'record_score', 'typical', 'actual', + 'partition_field_name', 'partition_field_value', 'timestamp', 'bucket_span', diff --git a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.ts b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.ts index 54eea067177ed..8fb8df5eef3d7 100644 --- a/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.ts +++ b/x-pack/plugins/infra/server/lib/infra_ml/queries/metrics_k8s_anomalies.ts @@ -15,6 +15,7 @@ import { defaultRequestParameters, createAnomalyScoreFilter, createInfluencerFilter, + createJobIdsQuery, } from './common'; import { InfluencerFilter } from '../common'; import { Sort, Pagination } from '../../../../common/http_api/infra_ml'; @@ -36,6 +37,7 @@ export const createMetricsK8sAnomaliesQuery = ({ sort, pagination, influencerFilter, + jobQuery, }: { jobIds: string[]; anomalyThreshold: ANOMALY_THRESHOLD; @@ -44,17 +46,20 @@ export const createMetricsK8sAnomaliesQuery = ({ sort: Sort; pagination: Pagination; influencerFilter?: InfluencerFilter; + jobQuery?: string; }) => { const { field } = sort; const { pageSize } = pagination; - const filters = [ + let filters: any = [ ...createJobIdsFilters(jobIds), ...createAnomalyScoreFilter(anomalyThreshold), ...createTimeRangeFilters(startTime, endTime), ...createResultTypeFilters(['record']), ]; - + if (jobQuery) { + filters = [...filters, ...createJobIdsQuery(jobQuery)]; + } const influencerQuery = influencerFilter ? { must: createInfluencerFilter(influencerFilter) } : {}; @@ -64,6 +69,7 @@ export const createMetricsK8sAnomaliesQuery = ({ 'record_score', 'typical', 'actual', + 'partition_field_name', 'partition_field_value', 'timestamp', 'bucket_span', @@ -116,6 +122,8 @@ export const metricsK8sAnomalyHitRT = rt.type({ timestamp: rt.number, }), rt.partial({ + partition_field_name: rt.string, + partition_field_value: rt.string, by_field_value: rt.string, }), ]), diff --git a/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_hosts_anomalies.ts b/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_hosts_anomalies.ts index 6e227cfc12d11..15ff6c0834a75 100644 --- a/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_hosts_anomalies.ts +++ b/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_hosts_anomalies.ts @@ -39,6 +39,7 @@ export const initGetHostsAnomaliesRoute = ({ framework }: InfraBackendLibs) => { sort: sortParam, pagination: paginationParam, metric, + query, }, } = request.body; @@ -52,16 +53,17 @@ export const initGetHostsAnomaliesRoute = ({ framework }: InfraBackendLibs) => { paginationCursors, hasMoreEntries, timing, - } = await getMetricsHostsAnomalies( - requestContext.infra, + } = await getMetricsHostsAnomalies({ + context: requestContext.infra, sourceId, anomalyThreshold, startTime, endTime, metric, + query, sort, - pagination - ); + pagination, + }); return response.ok({ body: getMetricsHostsAnomaliesSuccessReponsePayloadRT.encode({ diff --git a/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_k8s_anomalies.ts b/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_k8s_anomalies.ts index 1c2c4947a02ea..667760d1d409e 100644 --- a/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_k8s_anomalies.ts +++ b/x-pack/plugins/infra/server/routes/infra_ml/results/metrics_k8s_anomalies.ts @@ -38,6 +38,7 @@ export const initGetK8sAnomaliesRoute = ({ framework }: InfraBackendLibs) => { sort: sortParam, pagination: paginationParam, metric, + query, }, } = request.body; @@ -51,16 +52,17 @@ export const initGetK8sAnomaliesRoute = ({ framework }: InfraBackendLibs) => { paginationCursors, hasMoreEntries, timing, - } = await getMetricK8sAnomalies( - requestContext.infra, + } = await getMetricK8sAnomalies({ + context: requestContext.infra, sourceId, anomalyThreshold, startTime, endTime, metric, + query, sort, - pagination - ); + pagination, + }); return response.ok({ body: getMetricsK8sAnomaliesSuccessReponsePayloadRT.encode({ diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ad3cf86081e15..a72585185faac 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -11019,9 +11019,7 @@ "xpack.infra.metricsHeaderAddDataButtonLabel": "データの追加", "xpack.infra.missingEmebeddableFactoryCallout": "{embeddableType}埋め込み可能な項目がありません。これは、埋め込み可能プラグインが有効でない場合に、発生することがあります。", "xpack.infra.ml.anomalyDetectionButton": "異常検知", - "xpack.infra.ml.anomalyFlyout.anomaliesTabLabel": "異常を表示", "xpack.infra.ml.anomalyFlyout.create.createButton": "有効にする", - "xpack.infra.ml.anomalyFlyout.create.description": "異常検知は機械学習によって実現されています。次のリソースタイプでは、機械学習ジョブを使用できます。このようなジョブを有効にすると、インフラストラクチャメトリックで異常の検出を開始します。", "xpack.infra.ml.anomalyFlyout.create.hostDescription": "ホストのメモリー使用状況とネットワークトラフィックの異常を検出します。", "xpack.infra.ml.anomalyFlyout.create.hostSuccessTitle": "ホスト", "xpack.infra.ml.anomalyFlyout.create.hostTitle": "ホスト", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index babbccfab4dde..3d864494a7d53 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -11169,9 +11169,7 @@ "xpack.infra.metricsHeaderAddDataButtonLabel": "添加数据", "xpack.infra.missingEmebeddableFactoryCallout": "{embeddableType} 可嵌入对象不可用。如果可嵌入插件未启用,便可能会发生此问题。", "xpack.infra.ml.anomalyDetectionButton": "异常检测", - "xpack.infra.ml.anomalyFlyout.anomaliesTabLabel": "查看异常", "xpack.infra.ml.anomalyFlyout.create.createButton": "启用", - "xpack.infra.ml.anomalyFlyout.create.description": "异常检测由 Machine Learning 提供支持。Machine Learning 作业适用于以下资源类型。启用这些作业以开始检测基础架构指标中的异常。", "xpack.infra.ml.anomalyFlyout.create.hostDescription": "检测主机上的内存使用情况和网络流量异常。", "xpack.infra.ml.anomalyFlyout.create.hostSuccessTitle": "主机", "xpack.infra.ml.anomalyFlyout.create.hostTitle": "主机", From 2ed2cfe52f8322f7a3d3d5c331c934269722a6e1 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Tue, 23 Mar 2021 14:31:08 -0400 Subject: [PATCH 02/35] update api docs (#95154) --- api_docs/actions.json | 69 + api_docs/alerting.json | 84 +- api_docs/charts.json | 8 +- api_docs/core.json | 14 +- api_docs/core_application.json | 4 +- api_docs/data.json | 360 +-- api_docs/data_enhanced.json | 100 +- api_docs/data_index_patterns.json | 56 +- api_docs/data_search.json | 3443 +++++++++++++++------- api_docs/data_search.mdx | 3 - api_docs/data_ui.json | 32 +- api_docs/discover.json | 20 +- api_docs/expressions.json | 26 +- api_docs/file_upload.json | 2368 ++++++++++----- api_docs/fleet.json | 659 ++++- api_docs/global_search.json | 4 +- api_docs/kibana_react.json | 2 +- api_docs/lens.json | 2 +- api_docs/lists.json | 2 +- api_docs/management.json | 6 +- api_docs/maps.json | 1573 +++++++++- api_docs/maps.mdx | 17 + api_docs/maps_ems.json | 1157 ++++++++ api_docs/maps_ems.mdx | 46 + api_docs/maps_legacy.json | 277 -- api_docs/maps_legacy.mdx | 26 - api_docs/ml.json | 121 +- api_docs/monitoring.json | 24 +- api_docs/observability.json | 55 +- api_docs/presentation_util.json | 2 +- api_docs/reporting.json | 18 +- api_docs/saved_objects.json | 4 +- api_docs/saved_objects_management.json | 4 +- api_docs/saved_objects_tagging.json | 2 +- api_docs/security_solution.json | 501 ++-- api_docs/telemetry_collection_xpack.json | 44 +- api_docs/triggers_actions_ui.json | 12 +- api_docs/vis_type_timeseries.json | 2 +- api_docs/visualizations.json | 8 +- 39 files changed, 8188 insertions(+), 2967 deletions(-) create mode 100644 api_docs/maps_ems.json create mode 100644 api_docs/maps_ems.mdx delete mode 100644 api_docs/maps_legacy.json delete mode 100644 api_docs/maps_legacy.mdx diff --git a/api_docs/actions.json b/api_docs/actions.json index ec2bd86581f32..f3f7f284c046c 100644 --- a/api_docs/actions.json +++ b/api_docs/actions.json @@ -1646,6 +1646,21 @@ ], "enums": [], "misc": [ + { + "id": "def-common.AsApiContract", + "type": "Type", + "label": "AsApiContract", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/actions/common/rewrite_request_case.ts", + "lineNumber": 14 + }, + "signature": [ + "{ [K in keyof T as CamelToSnake>>]: T[K]; }" + ], + "initialIsOpen": false + }, { "tags": [], "id": "def-common.BASE_ACTION_API_PATH", @@ -1660,6 +1675,60 @@ "\"/api/actions\"" ], "initialIsOpen": false + }, + { + "id": "def-common.RewriteRequestCase", + "type": "Type", + "label": "RewriteRequestCase", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/actions/common/rewrite_request_case.ts", + "lineNumber": 18 + }, + "signature": [ + "(requested: ", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.AsApiContract", + "text": "AsApiContract" + }, + ") => T" + ], + "initialIsOpen": false + }, + { + "id": "def-common.RewriteResponseCase", + "type": "Type", + "label": "RewriteResponseCase", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/actions/common/rewrite_request_case.ts", + "lineNumber": 19 + }, + "signature": [ + "(responded: T) => T extends (infer Item)[] ? ", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.AsApiContract", + "text": "AsApiContract" + }, + "[] : ", + { + "pluginId": "actions", + "scope": "common", + "docId": "kibActionsPluginApi", + "section": "def-common.AsApiContract", + "text": "AsApiContract" + }, + "" + ], + "initialIsOpen": false } ], "objects": [] diff --git a/api_docs/alerting.json b/api_docs/alerting.json index 40f8e9c06ef15..5550798c4316f 100644 --- a/api_docs/alerting.json +++ b/api_docs/alerting.json @@ -222,7 +222,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 92 + "lineNumber": 85 } }, { @@ -233,7 +233,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 93 + "lineNumber": 86 }, "signature": [ "Date" @@ -247,7 +247,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 94 + "lineNumber": 87 }, "signature": [ "Date | null" @@ -261,7 +261,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 95 + "lineNumber": 88 }, "signature": [ { @@ -282,7 +282,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 96 + "lineNumber": 89 }, "signature": [ "Params" @@ -296,7 +296,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 97 + "lineNumber": 90 }, "signature": [ "State" @@ -310,7 +310,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 98 + "lineNumber": 91 } }, { @@ -321,7 +321,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 99 + "lineNumber": 92 }, "signature": [ "string | undefined" @@ -335,7 +335,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 100 + "lineNumber": 93 } }, { @@ -346,7 +346,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 101 + "lineNumber": 94 }, "signature": [ "string[]" @@ -360,7 +360,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 102 + "lineNumber": 95 }, "signature": [ "string | null" @@ -374,7 +374,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 103 + "lineNumber": 96 }, "signature": [ "string | null" @@ -383,7 +383,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 85 + "lineNumber": 78 }, "initialIsOpen": false }, @@ -404,7 +404,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 48 + "lineNumber": 46 }, "signature": [ "() => ", @@ -425,7 +425,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 49 + "lineNumber": 47 }, "signature": [ "() => Set<", @@ -447,7 +447,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 50 + "lineNumber": 48 }, "signature": [ "() => Promise<", @@ -464,7 +464,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 47 + "lineNumber": 45 }, "initialIsOpen": false }, @@ -483,7 +483,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 226 + "lineNumber": 219 }, "signature": [ { @@ -503,7 +503,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 227 + "lineNumber": 220 }, "signature": [ { @@ -518,7 +518,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 225 + "lineNumber": 218 }, "initialIsOpen": false }, @@ -548,7 +548,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 80 + "lineNumber": 73 }, "signature": [ "(id: string) => Pick<", @@ -565,7 +565,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 75 + "lineNumber": 68 }, "initialIsOpen": false }, @@ -594,7 +594,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 127 + "lineNumber": 120 } }, { @@ -605,7 +605,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 128 + "lineNumber": 121 } }, { @@ -616,7 +616,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 129 + "lineNumber": 122 }, "signature": [ "{ params?: ", @@ -638,7 +638,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 132 + "lineNumber": 125 }, "signature": [ { @@ -659,7 +659,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 133 + "lineNumber": 126 }, "signature": [ "ActionGroupIds" @@ -673,7 +673,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 134 + "lineNumber": 127 }, "signature": [ { @@ -694,7 +694,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 135 + "lineNumber": 128 }, "signature": [ { @@ -723,7 +723,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 146 + "lineNumber": 139 } }, { @@ -734,7 +734,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 147 + "lineNumber": 140 }, "signature": [ "{ context?: ", @@ -772,7 +772,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 152 + "lineNumber": 145 }, "signature": [ "\"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\"" @@ -781,7 +781,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 119 + "lineNumber": 112 }, "initialIsOpen": false }, @@ -905,7 +905,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 112 + "lineNumber": 111 } } ], @@ -913,13 +913,13 @@ "returnComment": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 104 + "lineNumber": 103 } } ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 103 + "lineNumber": 102 }, "initialIsOpen": false }, @@ -938,7 +938,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 124 + "lineNumber": 123 }, "signature": [ "() => Set<", @@ -994,7 +994,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 125 + "lineNumber": 124 } } ], @@ -1002,7 +1002,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 125 + "lineNumber": 124 } }, { @@ -1013,7 +1013,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 126 + "lineNumber": 125 }, "signature": [ "() => Promise<", @@ -1030,7 +1030,7 @@ ], "source": { "path": "x-pack/plugins/alerting/server/plugin.ts", - "lineNumber": 123 + "lineNumber": 122 }, "initialIsOpen": false } @@ -1177,7 +1177,7 @@ "description": [], "source": { "path": "x-pack/plugins/alerting/server/types.ts", - "lineNumber": 185 + "lineNumber": 178 }, "signature": [ "Pick, \"id\"> & Partial, \"enabled\" | \"name\" | \"params\" | \"actions\" | \"muteAll\" | \"apiKey\" | \"tags\" | \"alertTypeId\" | \"consumer\" | \"schedule\" | \"scheduledTaskId\" | \"createdBy\" | \"updatedBy\" | \"createdAt\" | \"updatedAt\" | \"apiKeyOwner\" | \"throttle\" | \"notifyWhen\" | \"mutedInstanceIds\" | \"executionStatus\">>" diff --git a/api_docs/charts.json b/api_docs/charts.json index f063a2271aec7..5c4008d0f25bc 100644 --- a/api_docs/charts.json +++ b/api_docs/charts.json @@ -9,7 +9,7 @@ "children": [ { "type": "Object", - "label": "{\n onChange,\n color: selectedColor,\n label,\n useLegacyColors = true,\n colorIsOverwritten = true,\n}", + "label": "{\n onChange,\n color: selectedColor,\n label,\n useLegacyColors = true,\n colorIsOverwritten = true,\n onKeyDown,\n}", "isRequired": true, "signature": [ "ColorPickerProps" @@ -17,18 +17,18 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/components/color_picker.tsx", - "lineNumber": 108 + "lineNumber": 111 } } ], "signature": [ - "({ onChange, color: selectedColor, label, useLegacyColors, colorIsOverwritten, }: ColorPickerProps) => JSX.Element" + "({ onChange, color: selectedColor, label, useLegacyColors, colorIsOverwritten, onKeyDown, }: ColorPickerProps) => JSX.Element" ], "description": [], "label": "ColorPicker", "source": { "path": "src/plugins/charts/public/static/components/color_picker.tsx", - "lineNumber": 108 + "lineNumber": 111 }, "tags": [], "returnComment": [], diff --git a/api_docs/core.json b/api_docs/core.json index 7129c2cff14de..e02bd33d6671b 100644 --- a/api_docs/core.json +++ b/api_docs/core.json @@ -1431,7 +1431,7 @@ "description": [], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 283 + "lineNumber": 300 } }, { @@ -1442,7 +1442,7 @@ "description": [], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 284 + "lineNumber": 301 } }, { @@ -1453,16 +1453,16 @@ "description": [], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 285 + "lineNumber": 302 }, "signature": [ - "{ readonly dashboard: { readonly guide: string; readonly drilldowns: string; readonly drilldownsTriggerPicker: string; readonly urlDrilldownTemplateSyntax: string; readonly urlDrilldownVariables: string; }; readonly discover: Record; readonly filebeat: { readonly base: string; readonly installation: string; readonly configuration: string; readonly elasticsearchOutput: string; readonly elasticsearchModule: string; readonly startup: string; readonly exportedFields: string; }; readonly auditbeat: { readonly base: string; }; readonly metricbeat: { readonly base: string; readonly configure: string; readonly httpEndpoint: string; readonly install: string; readonly start: string; }; readonly enterpriseSearch: { readonly base: string; readonly appSearchBase: string; readonly workplaceSearchBase: string; }; readonly heartbeat: { readonly base: string; }; readonly logstash: { readonly base: string; }; readonly functionbeat: { readonly base: string; }; readonly winlogbeat: { readonly base: string; }; readonly aggs: { readonly composite: string; readonly composite_missing_bucket: string; readonly date_histogram: string; readonly date_range: string; readonly date_format_pattern: string; readonly filter: string; readonly filters: string; readonly geohash_grid: string; readonly histogram: string; readonly ip_range: string; readonly range: string; readonly significant_terms: string; readonly terms: string; readonly avg: string; readonly avg_bucket: string; readonly max_bucket: string; readonly min_bucket: string; readonly sum_bucket: string; readonly cardinality: string; readonly count: string; readonly cumulative_sum: string; readonly derivative: string; readonly geo_bounds: string; readonly geo_centroid: string; readonly max: string; readonly median: string; readonly min: string; readonly moving_avg: string; readonly percentile_ranks: string; readonly serial_diff: string; readonly std_dev: string; readonly sum: string; readonly top_hits: string; }; readonly runtimeFields: string; readonly scriptedFields: { readonly scriptFields: string; readonly scriptAggs: string; readonly painless: string; readonly painlessApi: string; readonly painlessLangSpec: string; readonly painlessSyntax: string; readonly painlessWalkthrough: string; readonly luceneExpressions: string; }; readonly indexPatterns: { readonly loadingData: string; readonly introduction: string; }; readonly addData: string; readonly kibana: string; readonly elasticsearch: Record; readonly siem: { readonly guide: string; readonly gettingStarted: string; }; readonly query: { readonly eql: string; readonly luceneQuerySyntax: string; readonly queryDsl: string; readonly kueryQuerySyntax: string; }; readonly date: { readonly dateMath: string; readonly dateMathIndexNames: string; }; readonly management: Record; readonly ml: Record; readonly transforms: Record; readonly visualize: Record; readonly apis: Readonly<{ createIndex: string; createSnapshotLifecyclePolicy: string; createRoleMapping: string; createRoleMappingTemplates: string; createApiKey: string; createPipeline: string; createTransformRequest: string; cronExpressions: string; executeWatchActionModes: string; indexExists: string; openIndex: string; putComponentTemplate: string; painlessExecute: string; painlessExecuteAPIContexts: string; putComponentTemplateMetadata: string; putSnapshotLifecyclePolicy: string; putWatch: string; updateTransform: string; }>; readonly observability: Record; readonly alerting: Record; readonly maps: Record; readonly monitoring: Record; readonly security: Readonly<{ apiKeyServiceSettings: string; clusterPrivileges: string; elasticsearchSettings: string; elasticsearchEnableSecurity: string; indicesPrivileges: string; kibanaTLS: string; kibanaPrivileges: string; mappingRoles: string; mappingRolesFieldRules: string; runAsPrivilege: string; }>; readonly watcher: Record; readonly ccs: Record; readonly plugins: Record; readonly snapshotRestore: Record; }" + "{ readonly dashboard: { readonly guide: string; readonly drilldowns: string; readonly drilldownsTriggerPicker: string; readonly urlDrilldownTemplateSyntax: string; readonly urlDrilldownVariables: string; }; readonly discover: Record; readonly filebeat: { readonly base: string; readonly installation: string; readonly configuration: string; readonly elasticsearchOutput: string; readonly elasticsearchModule: string; readonly startup: string; readonly exportedFields: string; }; readonly auditbeat: { readonly base: string; }; readonly metricbeat: { readonly base: string; readonly configure: string; readonly httpEndpoint: string; readonly install: string; readonly start: string; }; readonly enterpriseSearch: { readonly base: string; readonly appSearchBase: string; readonly workplaceSearchBase: string; }; readonly heartbeat: { readonly base: string; }; readonly logstash: { readonly base: string; }; readonly functionbeat: { readonly base: string; }; readonly winlogbeat: { readonly base: string; }; readonly aggs: { readonly composite: string; readonly composite_missing_bucket: string; readonly date_histogram: string; readonly date_range: string; readonly date_format_pattern: string; readonly filter: string; readonly filters: string; readonly geohash_grid: string; readonly histogram: string; readonly ip_range: string; readonly range: string; readonly significant_terms: string; readonly terms: string; readonly avg: string; readonly avg_bucket: string; readonly max_bucket: string; readonly min_bucket: string; readonly sum_bucket: string; readonly cardinality: string; readonly count: string; readonly cumulative_sum: string; readonly derivative: string; readonly geo_bounds: string; readonly geo_centroid: string; readonly max: string; readonly median: string; readonly min: string; readonly moving_avg: string; readonly percentile_ranks: string; readonly serial_diff: string; readonly std_dev: string; readonly sum: string; readonly top_hits: string; }; readonly runtimeFields: string; readonly scriptedFields: { readonly scriptFields: string; readonly scriptAggs: string; readonly painless: string; readonly painlessApi: string; readonly painlessLangSpec: string; readonly painlessSyntax: string; readonly painlessWalkthrough: string; readonly luceneExpressions: string; }; readonly indexPatterns: { readonly introduction: string; readonly fieldFormattersNumber: string; readonly fieldFormattersString: string; }; readonly addData: string; readonly kibana: string; readonly elasticsearch: Record; readonly siem: { readonly guide: string; readonly gettingStarted: string; }; readonly query: { readonly eql: string; readonly luceneQuerySyntax: string; readonly queryDsl: string; readonly kueryQuerySyntax: string; }; readonly date: { readonly dateMath: string; readonly dateMathIndexNames: string; }; readonly management: Record; readonly ml: Record; readonly transforms: Record; readonly visualize: Record; readonly apis: Readonly<{ createIndex: string; createSnapshotLifecyclePolicy: string; createRoleMapping: string; createRoleMappingTemplates: string; createApiKey: string; createPipeline: string; createTransformRequest: string; cronExpressions: string; executeWatchActionModes: string; indexExists: string; openIndex: string; putComponentTemplate: string; painlessExecute: string; painlessExecuteAPIContexts: string; putComponentTemplateMetadata: string; putSnapshotLifecyclePolicy: string; putWatch: string; updateTransform: string; }>; readonly observability: Record; readonly alerting: Record; readonly maps: Record; readonly monitoring: Record; readonly security: Readonly<{ apiKeyServiceSettings: string; clusterPrivileges: string; elasticsearchSettings: string; elasticsearchEnableSecurity: string; indicesPrivileges: string; kibanaTLS: string; kibanaPrivileges: string; mappingRoles: string; mappingRolesFieldRules: string; runAsPrivilege: string; }>; readonly watcher: Record; readonly ccs: Record; readonly plugins: Record; readonly snapshotRestore: Record; readonly ingest: Record; }" ] } ], "source": { "path": "src/core/public/doc_links/doc_links_service.ts", - "lineNumber": 282 + "lineNumber": 299 }, "initialIsOpen": false }, @@ -5819,7 +5819,7 @@ "lineNumber": 33 }, "signature": [ - "Pick & { title?: string | MountPoint | undefined; text?: string | MountPoint | undefined; } & { id: string; }" + "Pick & { title?: string | MountPoint | undefined; text?: string | MountPoint | undefined; } & { id: string; }" ], "initialIsOpen": false }, @@ -5864,7 +5864,7 @@ "lineNumber": 28 }, "signature": [ - "Pick & { title?: string | MountPoint | undefined; text?: string | MountPoint | undefined; }" + "Pick & { title?: string | MountPoint | undefined; text?: string | MountPoint | undefined; }" ], "initialIsOpen": false }, diff --git a/api_docs/core_application.json b/api_docs/core_application.json index e5bbbf1ca3b58..c15b47dcb0982 100644 --- a/api_docs/core_application.json +++ b/api_docs/core_application.json @@ -1824,7 +1824,7 @@ "lineNumber": 322 }, "signature": [ - "Pick, \"status\" | \"id\" | \"title\" | \"order\" | \"category\" | \"navLinkStatus\" | \"defaultPath\" | \"tooltip\" | \"euiIconType\" | \"icon\" | \"capabilities\" | \"chromeless\" | \"appRoute\" | \"exactRoute\"> & { status: AppStatus; navLinkStatus: AppNavLinkStatus; appRoute: string; meta: PublicAppMetaInfo; }" + "Pick, \"status\" | \"title\" | \"id\" | \"order\" | \"category\" | \"navLinkStatus\" | \"defaultPath\" | \"tooltip\" | \"euiIconType\" | \"icon\" | \"capabilities\" | \"chromeless\" | \"appRoute\" | \"exactRoute\"> & { status: AppStatus; navLinkStatus: AppNavLinkStatus; appRoute: string; meta: PublicAppMetaInfo; }" ], "initialIsOpen": false }, @@ -1862,7 +1862,7 @@ "lineNumber": 277 }, "signature": [ - "Pick & { searchDeepLinks: PublicAppSearchDeepLinkInfo[]; keywords: string[]; }" + "Pick & { searchDeepLinks: PublicAppSearchDeepLinkInfo[]; keywords: string[]; }" ], "initialIsOpen": false } diff --git a/api_docs/data.json b/api_docs/data.json index 13e2b402a4afd..a78aec92b1fa5 100644 --- a/api_docs/data.json +++ b/api_docs/data.json @@ -5492,7 +5492,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 } } ], @@ -5513,7 +5513,7 @@ "label": "get", "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 }, "tags": [], "returnComment": [] @@ -5561,7 +5561,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -5574,7 +5574,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } } ], @@ -5584,7 +5584,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -5630,7 +5630,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -5645,7 +5645,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -5660,7 +5660,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } } ], @@ -5668,7 +5668,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -5714,7 +5714,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -5729,7 +5729,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } } ], @@ -5737,7 +5737,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -5775,7 +5775,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 547 + "lineNumber": 548 } }, { @@ -5788,7 +5788,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 548 + "lineNumber": 549 } }, { @@ -5801,7 +5801,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 549 + "lineNumber": 550 } } ], @@ -5809,7 +5809,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 546 + "lineNumber": 547 } }, { @@ -5835,7 +5835,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -5843,7 +5843,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -11594,7 +11594,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 23 + "lineNumber": 25 }, "signature": [ "ExpressionFunctionDefinition<\"kibana_context\", ", @@ -11866,7 +11866,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 638 + "lineNumber": 639 }, "signature": [ "{ get: (id: string) => Promise; delete: (indexPatternId: string) => Promise<{}>; create: (spec: IndexPatternSpec, skipFetchFields?: boolean) => Promise; ensureDefaultIndexPattern: EnsureDefaultIndexPattern; getIds: (refresh?: boolean) => Promise; getTitles: (refresh?: boolean) => Promise; find: (search: string, size?: number) => Promise; getIdsWithTitle: (refresh?: boolean) => Promise<{ id: string; title: string; }[]>; clearCache: (id?: string | undefined) => void; getCache: () => Promise[] | null | undefined>; getDefault: () => Promise; setDefault: (id: string, force?: boolean) => Promise; getFieldsForWildcard: (options: GetFieldsOptions) => Promise; getFieldsForIndexPattern: (indexPattern: IndexPattern | IndexPatternSpec, options?: GetFieldsOptions | undefined) => Promise; refreshFields: (indexPattern: IndexPattern) => Promise; fieldArrayToMap: (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record; savedObjectToSpec: (savedObject: SavedObject) => IndexPatternSpec; createAndSave: (spec: IndexPatternSpec, override?: boolean, skipFetchFields?: boolean) => Promise; createSavedObject: (indexPattern: IndexPattern, override?: boolean) => Promise; updateSavedObject: (indexPattern: IndexPattern, saveAttempts?: number, ignoreErrors?: boolean) => Promise; }" @@ -11946,7 +11946,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 27 + "lineNumber": 29 }, "signature": [ "{ type: \"kibana_context\"; } & ExecutionContextSearch" @@ -12150,7 +12150,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 56 + "lineNumber": 57 }, "signature": [ "(props: ", @@ -12164,6 +12164,28 @@ ") => JSX.Element" ] }, + { + "tags": [], + "id": "def-public.esFilters.FilterItem", + "type": "Function", + "label": "FilterItem", + "description": [], + "source": { + "path": "src/plugins/data/public/index.ts", + "lineNumber": 58 + }, + "signature": [ + "(props: ", + { + "pluginId": "data", + "scope": "public", + "docId": "kibDataUiPluginApi", + "section": "def-public.FilterItemProps", + "text": "FilterItemProps" + }, + ") => JSX.Element" + ] + }, { "tags": [], "id": "def-public.esFilters.FILTERS", @@ -12172,7 +12194,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 58 + "lineNumber": 60 }, "signature": [ "typeof ", @@ -12193,7 +12215,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 59 + "lineNumber": 61 }, "signature": [ "typeof ", @@ -12214,7 +12236,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 61 + "lineNumber": 63 }, "signature": [ "(isPinned: boolean, index?: string | undefined) => ", @@ -12235,7 +12257,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 62 + "lineNumber": 64 }, "signature": [ "(field: ", @@ -12272,7 +12294,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 63 + "lineNumber": 65 }, "signature": [ "(field: ", @@ -12309,7 +12331,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 64 + "lineNumber": 66 }, "signature": [ "(field: ", @@ -12346,7 +12368,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 65 + "lineNumber": 67 }, "signature": [ "(query: any, index: string, alias: string) => ", @@ -12367,7 +12389,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 66 + "lineNumber": 68 }, "signature": [ "(field: ", @@ -12412,7 +12434,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 68 + "lineNumber": 70 }, "signature": [ "(filter: any) => filter is ", @@ -12433,7 +12455,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 69 + "lineNumber": 71 }, "signature": [ "(filter: any) => filter is ", @@ -12454,7 +12476,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 70 + "lineNumber": 72 }, "signature": [ "(filter: any) => filter is ", @@ -12475,7 +12497,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 71 + "lineNumber": 73 }, "signature": [ "(filter: any) => filter is ", @@ -12496,7 +12518,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 72 + "lineNumber": 74 }, "signature": [ "(filter: any) => filter is ", @@ -12517,7 +12539,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 73 + "lineNumber": 75 }, "signature": [ "(filter: any) => filter is ", @@ -12538,7 +12560,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 74 + "lineNumber": 76 }, "signature": [ "(filter: any) => filter is ", @@ -12559,7 +12581,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 75 + "lineNumber": 77 }, "signature": [ "(filter: ", @@ -12581,7 +12603,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 77 + "lineNumber": 79 }, "signature": [ "(filter: ", @@ -12611,7 +12633,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 78 + "lineNumber": 80 }, "signature": [ "(filter: ", @@ -12640,7 +12662,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 79 + "lineNumber": 81 }, "signature": [ "(filter: ", @@ -12662,7 +12684,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 80 + "lineNumber": 82 }, "signature": [ "(filter: ", @@ -12684,7 +12706,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 81 + "lineNumber": 83 }, "signature": [ "typeof ", @@ -12705,7 +12727,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 83 + "lineNumber": 85 }, "signature": [ "(first: ", @@ -12758,7 +12780,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 84 + "lineNumber": 86 }, "signature": [ { @@ -12778,7 +12800,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 85 + "lineNumber": 87 }, "signature": [ "typeof ", @@ -12799,7 +12821,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 86 + "lineNumber": 88 }, "signature": [ "(newFilters?: ", @@ -12829,7 +12851,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 88 + "lineNumber": 90 }, "signature": [ "typeof ", @@ -12850,7 +12872,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 89 + "lineNumber": 91 }, "signature": [ "typeof ", @@ -12871,7 +12893,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 90 + "lineNumber": 92 }, "signature": [ "(filters: ", @@ -12901,7 +12923,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 91 + "lineNumber": 93 }, "signature": [ "typeof ", @@ -12922,7 +12944,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 92 + "lineNumber": 94 }, "signature": [ "typeof ", @@ -12940,7 +12962,7 @@ "label": "esFilters", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 55 + "lineNumber": 56 }, "initialIsOpen": false }, @@ -12957,7 +12979,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 122 + "lineNumber": 124 }, "signature": [ { @@ -12977,7 +12999,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 123 + "lineNumber": 125 }, "signature": [ "(expression: any, parseOptions?: Partial<", @@ -13006,7 +13028,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 124 + "lineNumber": 126 }, "signature": [ "(node: ", @@ -13040,7 +13062,7 @@ "label": "esKuery", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 121 + "lineNumber": 123 }, "initialIsOpen": false }, @@ -13057,7 +13079,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 128 + "lineNumber": 130 }, "signature": [ "typeof ", @@ -13078,7 +13100,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 129 + "lineNumber": 131 }, "signature": [ "typeof ", @@ -13099,7 +13121,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 130 + "lineNumber": 132 }, "signature": [ "(filters: ", @@ -13145,7 +13167,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 131 + "lineNumber": 133 }, "signature": [ "typeof ", @@ -13166,7 +13188,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 132 + "lineNumber": 134 }, "signature": [ "typeof ", @@ -13184,7 +13206,7 @@ "label": "esQuery", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 127 + "lineNumber": 129 }, "initialIsOpen": false }, @@ -13201,7 +13223,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 212 + "lineNumber": 214 }, "signature": [ "typeof ", @@ -13222,7 +13244,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 213 + "lineNumber": 215 } } ], @@ -13230,7 +13252,7 @@ "label": "exporters", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 211 + "lineNumber": 213 }, "initialIsOpen": false }, @@ -13247,7 +13269,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 169 + "lineNumber": 171 }, "signature": [ "typeof ", @@ -13268,7 +13290,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 170 + "lineNumber": 172 }, "signature": [ "typeof ", @@ -13289,7 +13311,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 172 + "lineNumber": 174 }, "signature": [ "{ range: string; regex: string; text: string; background: string; }" @@ -13303,7 +13325,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 173 + "lineNumber": 175 }, "signature": [ { @@ -13323,7 +13345,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 174 + "lineNumber": 176 }, "signature": [ { @@ -13343,7 +13365,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 175 + "lineNumber": 177 }, "signature": [ "typeof ", @@ -13364,7 +13386,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 177 + "lineNumber": 179 }, "signature": [ "typeof ", @@ -13385,7 +13407,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 178 + "lineNumber": 180 }, "signature": [ "typeof ", @@ -13406,7 +13428,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 179 + "lineNumber": 181 }, "signature": [ "typeof ", @@ -13427,7 +13449,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 180 + "lineNumber": 182 }, "signature": [ "typeof ", @@ -13448,7 +13470,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 181 + "lineNumber": 183 }, "signature": [ "typeof ", @@ -13469,7 +13491,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 182 + "lineNumber": 184 }, "signature": [ "typeof ", @@ -13490,7 +13512,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 183 + "lineNumber": 185 }, "signature": [ "typeof ", @@ -13511,7 +13533,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 184 + "lineNumber": 186 }, "signature": [ "typeof ", @@ -13532,7 +13554,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 185 + "lineNumber": 187 }, "signature": [ "typeof ", @@ -13553,7 +13575,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 186 + "lineNumber": 188 }, "signature": [ "typeof ", @@ -13574,7 +13596,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 187 + "lineNumber": 189 }, "signature": [ "typeof ", @@ -13595,7 +13617,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 188 + "lineNumber": 190 }, "signature": [ "typeof ", @@ -13616,7 +13638,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 189 + "lineNumber": 191 }, "signature": [ "typeof ", @@ -13637,7 +13659,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 190 + "lineNumber": 192 }, "signature": [ "typeof ", @@ -13658,7 +13680,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 191 + "lineNumber": 193 }, "signature": [ "typeof ", @@ -13679,7 +13701,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 192 + "lineNumber": 194 }, "signature": [ "typeof ", @@ -13697,7 +13719,7 @@ "label": "fieldFormats", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 168 + "lineNumber": 170 }, "initialIsOpen": false }, @@ -13714,7 +13736,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 237 + "lineNumber": 239 } }, { @@ -13725,7 +13747,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 238 + "lineNumber": 240 } }, { @@ -13736,7 +13758,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 239 + "lineNumber": 241 }, "signature": [ "string[]" @@ -13750,7 +13772,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 240 + "lineNumber": 242 }, "signature": [ "string[]" @@ -13764,7 +13786,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 241 + "lineNumber": 243 }, "signature": [ "(indexPattern: ", @@ -13786,7 +13808,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 242 + "lineNumber": 244 }, "signature": [ "typeof ", @@ -13807,7 +13829,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 243 + "lineNumber": 245 }, "signature": [ "typeof ", @@ -13828,7 +13850,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 244 + "lineNumber": 246 }, "signature": [ "typeof ", @@ -13849,7 +13871,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 245 + "lineNumber": 247 }, "signature": [ "typeof ", @@ -13870,7 +13892,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 246 + "lineNumber": 248 }, "signature": [ "typeof ", @@ -13888,7 +13910,7 @@ "label": "indexPatterns", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 236 + "lineNumber": 238 }, "initialIsOpen": false }, @@ -13910,7 +13932,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 403 + "lineNumber": 405 }, "signature": [ "typeof ", @@ -13931,7 +13953,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 404 + "lineNumber": 406 }, "signature": [ "typeof ", @@ -13952,7 +13974,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 405 + "lineNumber": 407 }, "signature": [ "({ display: string; val: string; enabled(agg: ", @@ -13974,7 +13996,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 406 + "lineNumber": 408 }, "signature": [ "typeof ", @@ -13995,7 +14017,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 407 + "lineNumber": 409 }, "signature": [ "typeof ", @@ -14016,7 +14038,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 408 + "lineNumber": 410 }, "signature": [ "typeof ", @@ -14037,7 +14059,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 409 + "lineNumber": 411 }, "signature": [ "typeof ", @@ -14058,7 +14080,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 410 + "lineNumber": 412 }, "signature": [ "(agg: ", @@ -14080,7 +14102,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 411 + "lineNumber": 413 }, "signature": [ "(agg: ", @@ -14102,7 +14124,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 412 + "lineNumber": 414 }, "signature": [ "(...types: string[]) => (agg: ", @@ -14124,7 +14146,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 413 + "lineNumber": 415 }, "signature": [ "typeof ", @@ -14145,7 +14167,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 414 + "lineNumber": 416 }, "signature": [ "typeof ", @@ -14166,7 +14188,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 415 + "lineNumber": 417 } }, { @@ -14177,7 +14199,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 416 + "lineNumber": 418 }, "signature": [ "typeof ", @@ -14198,7 +14220,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 417 + "lineNumber": 419 }, "signature": [ "typeof ", @@ -14219,7 +14241,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 418 + "lineNumber": 420 }, "signature": [ "typeof ", @@ -14240,7 +14262,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 419 + "lineNumber": 421 } }, { @@ -14251,7 +14273,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 420 + "lineNumber": 422 }, "signature": [ "string[]" @@ -14265,7 +14287,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 421 + "lineNumber": 423 }, "signature": [ "typeof ", @@ -14286,7 +14308,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 422 + "lineNumber": 424 }, "signature": [ "({ bound: number; interval: moment.Duration; boundLabel: string; intervalLabel: string; } | { bound: moment.Duration; interval: moment.Duration; boundLabel: string; intervalLabel: string; })[]" @@ -14300,7 +14322,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 423 + "lineNumber": 425 }, "signature": [ "(column: ", @@ -14319,7 +14341,7 @@ "label": "aggs", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 402 + "lineNumber": 404 } }, { @@ -14330,7 +14352,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 425 + "lineNumber": 427 }, "signature": [ "typeof ", @@ -14351,7 +14373,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 426 + "lineNumber": 428 }, "signature": [ "typeof ", @@ -14372,7 +14394,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 427 + "lineNumber": 429 }, "signature": [ "typeof ", @@ -14393,7 +14415,7 @@ "description": [], "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 428 + "lineNumber": 430 }, "signature": [ "typeof ", @@ -14411,7 +14433,7 @@ "label": "search", "source": { "path": "src/plugins/data/public/index.ts", - "lineNumber": 401 + "lineNumber": 403 }, "initialIsOpen": false }, @@ -15154,7 +15176,7 @@ "description": [], "source": { "path": "src/plugins/data/server/plugin.ts", - "lineNumber": 104 + "lineNumber": 107 } } ], @@ -15162,7 +15184,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/server/plugin.ts", - "lineNumber": 104 + "lineNumber": 107 } }, { @@ -15178,7 +15200,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/server/plugin.ts", - "lineNumber": 118 + "lineNumber": 121 } } ], @@ -17056,7 +17078,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 } } ], @@ -17077,7 +17099,7 @@ "label": "get", "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 }, "tags": [], "returnComment": [] @@ -17125,7 +17147,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -17138,7 +17160,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } } ], @@ -17148,7 +17170,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -17194,7 +17216,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -17209,7 +17231,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -17224,7 +17246,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } } ], @@ -17232,7 +17254,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -17278,7 +17300,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -17293,7 +17315,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } } ], @@ -17301,7 +17323,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -17339,7 +17361,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 547 + "lineNumber": 548 } }, { @@ -17352,7 +17374,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 548 + "lineNumber": 549 } }, { @@ -17365,7 +17387,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 549 + "lineNumber": 550 } } ], @@ -17373,7 +17395,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 546 + "lineNumber": 547 } }, { @@ -17399,7 +17421,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -17407,7 +17429,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -18117,7 +18139,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 } } ], @@ -18138,7 +18160,7 @@ "label": "get", "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 }, "tags": [], "returnComment": [] @@ -18186,7 +18208,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -18199,7 +18221,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } } ], @@ -18209,7 +18231,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -18255,7 +18277,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -18270,7 +18292,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -18285,7 +18307,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } } ], @@ -18293,7 +18315,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -18339,7 +18361,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -18354,7 +18376,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } } ], @@ -18362,7 +18384,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -18400,7 +18422,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 547 + "lineNumber": 548 } }, { @@ -18413,7 +18435,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 548 + "lineNumber": 549 } }, { @@ -18426,7 +18448,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 549 + "lineNumber": 550 } } ], @@ -18434,7 +18456,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 546 + "lineNumber": 547 } }, { @@ -18460,7 +18482,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -18468,7 +18490,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -20477,7 +20499,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 23 + "lineNumber": 25 }, "signature": [ "ExpressionFunctionDefinition<\"kibana_context\", ", @@ -20700,7 +20722,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 27 + "lineNumber": 29 }, "signature": [ "{ type: \"kibana_context\"; } & ExecutionContextSearch" @@ -27594,4 +27616,4 @@ } ] } -} +} \ No newline at end of file diff --git a/api_docs/data_enhanced.json b/api_docs/data_enhanced.json index 0505e87e796f4..5bd7a970f9b73 100644 --- a/api_docs/data_enhanced.json +++ b/api_docs/data_enhanced.json @@ -531,8 +531,8 @@ "\nID of the async search request" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 72 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 73 } }, { @@ -544,8 +544,8 @@ "\nSearch strategy used to submit the search request" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 76 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 77 } }, { @@ -557,8 +557,8 @@ "\nstatus" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 80 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 81 } }, { @@ -570,8 +570,8 @@ "\nAn optional error. Set if status is set to error." ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 84 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 85 }, "signature": [ "string | undefined" @@ -579,8 +579,8 @@ } ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 68 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 69 }, "initialIsOpen": false }, @@ -598,8 +598,8 @@ "label": "sessionId", "description": [], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 12 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 13 } }, { @@ -611,8 +611,8 @@ "\nUser-facing session name to be displayed in session management" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 16 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 17 }, "signature": [ "string | undefined" @@ -627,8 +627,8 @@ "\nApp that created the session. e.g 'discover'" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 20 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 21 }, "signature": [ "string | undefined" @@ -643,8 +643,8 @@ "\nCreation time of the session" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 24 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 25 } }, { @@ -656,8 +656,8 @@ "\nLast touch time of the session" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 28 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 29 } }, { @@ -669,8 +669,8 @@ "\nExpiration time of the session. Expiration itself is managed by Elasticsearch." ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 32 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 33 } }, { @@ -682,14 +682,14 @@ "\nstatus" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 36 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 37 }, "signature": [ { - "pluginId": "dataEnhanced", + "pluginId": "data", "scope": "common", - "docId": "kibDataEnhancedPluginApi", + "docId": "kibDataSearchPluginApi", "section": "def-common.SearchSessionStatus", "text": "SearchSessionStatus" } @@ -704,8 +704,8 @@ "\nurlGeneratorId" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 40 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 41 }, "signature": [ "string | undefined" @@ -720,8 +720,8 @@ "\nThe application state that was used to create the session.\nShould be used, for example, to re-load an expired search session." ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 45 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 46 }, "signature": [ "Record | undefined" @@ -736,8 +736,8 @@ "\nApplication state that should be used to restore the session.\nFor example, relative dates are conveted to absolute ones." ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 50 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 51 }, "signature": [ "Record | undefined" @@ -752,15 +752,15 @@ "\nMapping of search request hashes to their corresponsing info (async search id, etc.)" ], "source": { - "path": "x-pack/plugins/data_enhanced/common/search/session/types.ts", - "lineNumber": 54 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 55 }, "signature": [ "Record, { expressions }: ", + ">, { logger, expressions }: ", { "pluginId": "data", "scope": "server", @@ -413,12 +413,12 @@ "description": [], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 47 + "lineNumber": 49 } }, { "type": "Object", - "label": "{ expressions }", + "label": "{ logger, expressions }", "isRequired": true, "signature": [ { @@ -432,7 +432,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 48 + "lineNumber": 50 } } ], @@ -440,7 +440,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 46 + "lineNumber": 48 } }, { @@ -507,7 +507,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 58 + "lineNumber": 76 } }, { @@ -526,7 +526,7 @@ "description": [], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 58 + "lineNumber": 76 } } ], @@ -534,13 +534,13 @@ "returnComment": [], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 58 + "lineNumber": 76 } } ], "source": { "path": "src/plugins/data/server/index_patterns/index_patterns_service.ts", - "lineNumber": 45 + "lineNumber": 47 }, "initialIsOpen": false } @@ -3455,7 +3455,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 } } ], @@ -3476,7 +3476,7 @@ "label": "get", "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 464 + "lineNumber": 465 }, "tags": [], "returnComment": [] @@ -3524,7 +3524,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -3537,7 +3537,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } } ], @@ -3547,7 +3547,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 483 + "lineNumber": 484 } }, { @@ -3593,7 +3593,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -3608,7 +3608,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -3623,7 +3623,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } } ], @@ -3631,7 +3631,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 508 + "lineNumber": 509 } }, { @@ -3677,7 +3677,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -3692,7 +3692,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } } ], @@ -3700,7 +3700,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 521 + "lineNumber": 522 } }, { @@ -3738,7 +3738,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 547 + "lineNumber": 548 } }, { @@ -3751,7 +3751,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 548 + "lineNumber": 549 } }, { @@ -3764,7 +3764,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 549 + "lineNumber": 550 } } ], @@ -3772,7 +3772,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 546 + "lineNumber": 547 } }, { @@ -3798,7 +3798,7 @@ ], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -3806,7 +3806,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 632 + "lineNumber": 633 } } ], @@ -6710,7 +6710,7 @@ "description": [], "source": { "path": "src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts", - "lineNumber": 638 + "lineNumber": 639 }, "signature": [ "{ get: (id: string) => Promise; delete: (indexPatternId: string) => Promise<{}>; create: (spec: IndexPatternSpec, skipFetchFields?: boolean) => Promise; ensureDefaultIndexPattern: EnsureDefaultIndexPattern; getIds: (refresh?: boolean) => Promise; getTitles: (refresh?: boolean) => Promise; find: (search: string, size?: number) => Promise; getIdsWithTitle: (refresh?: boolean) => Promise<{ id: string; title: string; }[]>; clearCache: (id?: string | undefined) => void; getCache: () => Promise[] | null | undefined>; getDefault: () => Promise; setDefault: (id: string, force?: boolean) => Promise; getFieldsForWildcard: (options: GetFieldsOptions) => Promise; getFieldsForIndexPattern: (indexPattern: IndexPattern | IndexPatternSpec, options?: GetFieldsOptions | undefined) => Promise; refreshFields: (indexPattern: IndexPattern) => Promise; fieldArrayToMap: (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record; savedObjectToSpec: (savedObject: SavedObject) => IndexPatternSpec; createAndSave: (spec: IndexPatternSpec, override?: boolean, skipFetchFields?: boolean) => Promise; createSavedObject: (indexPattern: IndexPattern, override?: boolean) => Promise; updateSavedObject: (indexPattern: IndexPattern, saveAttempts?: number, ignoreErrors?: boolean) => Promise; }" diff --git a/api_docs/data_search.json b/api_docs/data_search.json index d0eb07083c2f6..68cf4a1123bdb 100644 --- a/api_docs/data_search.json +++ b/api_docs/data_search.json @@ -734,7 +734,7 @@ "section": "def-public.SessionService", "text": "SessionService" }, - ", \"start\" | \"destroy\" | \"state$\" | \"hasAccess\" | \"trackSearch\" | \"getSessionId\" | \"getSession$\" | \"isStored\" | \"isRestore\" | \"restore\" | \"clear\" | \"cancel\" | \"save\" | \"isCurrentSession\" | \"getSearchOptions\" | \"enableStorage\" | \"isSessionStorageReady\" | \"getSearchSessionIndicatorUiConfig\">" + ", \"start\" | \"destroy\" | \"state$\" | \"searchSessionName$\" | \"hasAccess\" | \"trackSearch\" | \"getSessionId\" | \"getSession$\" | \"isStored\" | \"isRestore\" | \"restore\" | \"clear\" | \"cancel\" | \"save\" | \"renameCurrentSession\" | \"isCurrentSession\" | \"getSearchOptions\" | \"enableStorage\" | \"isSessionStorageReady\" | \"getSearchSessionIndicatorUiConfig\">" ] }, { @@ -758,7 +758,7 @@ "section": "def-public.SessionsClient", "text": "SessionsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"find\" | \"update\" | \"extend\">" + ", \"get\" | \"delete\" | \"create\" | \"find\" | \"update\" | \"rename\" | \"extend\">" ] } ], @@ -898,7 +898,7 @@ "section": "def-public.SessionService", "text": "SessionService" }, - ", \"start\" | \"destroy\" | \"state$\" | \"hasAccess\" | \"trackSearch\" | \"getSessionId\" | \"getSession$\" | \"isStored\" | \"isRestore\" | \"restore\" | \"clear\" | \"cancel\" | \"save\" | \"isCurrentSession\" | \"getSearchOptions\" | \"enableStorage\" | \"isSessionStorageReady\" | \"getSearchSessionIndicatorUiConfig\">" + ", \"start\" | \"destroy\" | \"state$\" | \"searchSessionName$\" | \"hasAccess\" | \"trackSearch\" | \"getSessionId\" | \"getSession$\" | \"isStored\" | \"isRestore\" | \"restore\" | \"clear\" | \"cancel\" | \"save\" | \"renameCurrentSession\" | \"isCurrentSession\" | \"getSearchOptions\" | \"enableStorage\" | \"isSessionStorageReady\" | \"getSearchSessionIndicatorUiConfig\">" ] }, { @@ -922,7 +922,7 @@ "section": "def-public.SessionsClient", "text": "SessionsClient" }, - ", \"get\" | \"delete\" | \"create\" | \"find\" | \"update\" | \"extend\">" + ", \"get\" | \"delete\" | \"create\" | \"find\" | \"update\" | \"rename\" | \"extend\">" ] } ], @@ -1083,7 +1083,7 @@ "section": "def-public.SessionService", "text": "SessionService" }, - ", \"start\" | \"destroy\" | \"state$\" | \"hasAccess\" | \"trackSearch\" | \"getSessionId\" | \"getSession$\" | \"isStored\" | \"isRestore\" | \"restore\" | \"clear\" | \"cancel\" | \"save\" | \"isCurrentSession\" | \"getSearchOptions\" | \"enableStorage\" | \"isSessionStorageReady\" | \"getSearchSessionIndicatorUiConfig\">" + ", \"start\" | \"destroy\" | \"state$\" | \"searchSessionName$\" | \"hasAccess\" | \"trackSearch\" | \"getSessionId\" | \"getSession$\" | \"isStored\" | \"isRestore\" | \"restore\" | \"clear\" | \"cancel\" | \"save\" | \"renameCurrentSession\" | \"isCurrentSession\" | \"getSearchOptions\" | \"enableStorage\" | \"isSessionStorageReady\" | \"getSearchSessionIndicatorUiConfig\">" ] } ], @@ -1122,12 +1122,28 @@ ], "source": { "path": "src/plugins/data/public/search/session/session_service.ts", - "lineNumber": 39 + "lineNumber": 45 }, "signature": [ "() => Promise" ] }, + { + "tags": [], + "id": "def-public.SearchSessionInfoProvider.appendSessionStartTimeToName", + "type": "CompoundType", + "label": "appendSessionStartTimeToName", + "description": [ + "\nAppend session start time to a session name,\n`true` by default" + ], + "source": { + "path": "src/plugins/data/public/search/session/session_service.ts", + "lineNumber": 51 + }, + "signature": [ + "boolean | undefined" + ] + }, { "tags": [], "id": "def-public.SearchSessionInfoProvider.getUrlGeneratorData", @@ -1136,7 +1152,7 @@ "description": [], "source": { "path": "src/plugins/data/public/search/session/session_service.ts", - "lineNumber": 40 + "lineNumber": 53 }, "signature": [ "() => Promise<{ urlGeneratorId: ID; initialState: ", @@ -1161,7 +1177,7 @@ ], "source": { "path": "src/plugins/data/public/search/session/session_service.ts", - "lineNumber": 34 + "lineNumber": 40 }, "initialIsOpen": false } @@ -1179,7 +1195,7 @@ ], "source": { "path": "src/plugins/data/public/search/session/search_session_state.ts", - "lineNumber": 19 + "lineNumber": 20 }, "initialIsOpen": false }, @@ -1268,10 +1284,10 @@ "description": [], "source": { "path": "src/plugins/data/public/search/session/sessions_client.ts", - "lineNumber": 13 + "lineNumber": 18 }, "signature": [ - "{ get: (sessionId: string) => Promise>; delete: (sessionId: string) => Promise; create: ({ name, appId, urlGeneratorId, initialState, restoreState, sessionId, }: { name: string; appId: string; initialState: Record; restoreState: Record; urlGeneratorId: string; sessionId: string; }) => Promise>; find: (options: Pick) => Promise>; update: (sessionId: string, attributes: unknown) => Promise>; extend: (sessionId: string, expires: string) => Promise>; }" + "{ get: (sessionId: string) => Promise; delete: (sessionId: string) => Promise; create: ({ name, appId, urlGeneratorId, initialState, restoreState, sessionId, }: { name: string; appId: string; initialState: Record; restoreState: Record; urlGeneratorId: string; sessionId: string; }) => Promise; find: (options: Pick) => Promise>; update: (sessionId: string, attributes: unknown) => Promise>; rename: (sessionId: string, newName: string) => Promise>>; extend: (sessionId: string, expires: string) => Promise>; }" ], "initialIsOpen": false }, @@ -1283,10 +1299,10 @@ "description": [], "source": { "path": "src/plugins/data/public/search/session/session_service.ts", - "lineNumber": 25 + "lineNumber": 31 }, "signature": [ - "{ start: () => string; destroy: () => void; readonly state$: Observable; hasAccess: () => boolean; trackSearch: (searchDescriptor: TrackSearchDescriptor) => () => void; getSessionId: () => string | undefined; getSession$: () => Observable; isStored: () => boolean; isRestore: () => boolean; restore: (sessionId: string) => void; clear: () => void; cancel: () => Promise; save: () => Promise; isCurrentSession: (sessionId?: string | undefined) => boolean; getSearchOptions: (sessionId?: string | undefined) => Required> | null; enableStorage: (searchSessionInfoProvider: SearchSessionInfoProvider, searchSessionIndicatorUiConfig?: SearchSessionIndicatorUiConfig | undefined) => void; isSessionStorageReady: () => boolean; getSearchSessionIndicatorUiConfig: () => SearchSessionIndicatorUiConfig; }" + "{ start: () => string; destroy: () => void; readonly state$: Observable; readonly searchSessionName$: Observable; hasAccess: () => boolean; trackSearch: (searchDescriptor: TrackSearchDescriptor) => () => void; getSessionId: () => string | undefined; getSession$: () => Observable; isStored: () => boolean; isRestore: () => boolean; restore: (sessionId: string) => void; clear: () => void; cancel: () => Promise; save: () => Promise; renameCurrentSession: (newName: string) => Promise; isCurrentSession: (sessionId?: string | undefined) => boolean; getSearchOptions: (sessionId?: string | undefined) => Required> | null; enableStorage: (searchSessionInfoProvider: SearchSessionInfoProvider, searchSessionIndicatorUiConfig?: SearchSessionIndicatorUiConfig | undefined) => void; isSessionStorageReady: () => boolean; getSearchSessionIndicatorUiConfig: () => SearchSessionIndicatorUiConfig; }" ], "initialIsOpen": false }, @@ -1605,7 +1621,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 90 + "lineNumber": 88 }, "signature": [ "(sessionId: string, attributes: Partial) => Promise<", @@ -1627,7 +1643,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 91 + "lineNumber": 89 }, "signature": [ "(sessionId: string) => Promise<", @@ -1649,7 +1665,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 92 + "lineNumber": 90 }, "signature": [ "(options: Pick<", @@ -1679,7 +1695,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 93 + "lineNumber": 91 }, "signature": [ "(sessionId: string, attributes: Partial) => Promise<", @@ -1701,7 +1717,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 94 + "lineNumber": 92 }, "signature": [ "(sessionId: string) => Promise<{}>" @@ -1715,7 +1731,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 95 + "lineNumber": 93 }, "signature": [ "(sessionId: string) => Promise<{}>" @@ -1729,7 +1745,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 96 + "lineNumber": 94 }, "signature": [ "(sessionId: string, expires: Date) => Promise<", @@ -1746,7 +1762,7 @@ ], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 89 + "lineNumber": 87 }, "initialIsOpen": false }, @@ -1827,7 +1843,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 43 + "lineNumber": 41 }, "signature": [ { @@ -1849,7 +1865,7 @@ ], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 48 + "lineNumber": 46 }, "signature": [ " ", @@ -1993,7 +2009,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 112 + "lineNumber": 110 }, "signature": [ "(request: ", @@ -2022,7 +2038,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 113 + "lineNumber": 111 }, "signature": [ "{ asScoped: (request: ", @@ -2047,7 +2063,7 @@ ], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 99 + "lineNumber": 97 }, "initialIsOpen": false }, @@ -2078,7 +2094,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 75 + "lineNumber": 73 }, "signature": [ "(request: SearchStrategyRequest, options: ", @@ -2110,7 +2126,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 80 + "lineNumber": 78 }, "signature": [ "((id: string, options: ", @@ -2140,7 +2156,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 81 + "lineNumber": 79 }, "signature": [ "((id: string, keepAlive: string, options: ", @@ -2165,7 +2181,7 @@ ], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 71 + "lineNumber": 69 }, "initialIsOpen": false }, @@ -2184,7 +2200,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 36 + "lineNumber": 34 }, "signature": [ "Pick<", @@ -2206,7 +2222,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 37 + "lineNumber": 35 }, "signature": [ { @@ -2226,7 +2242,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 38 + "lineNumber": 36 }, "signature": [ { @@ -2246,7 +2262,7 @@ "description": [], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 39 + "lineNumber": 37 }, "signature": [ { @@ -2262,7 +2278,7 @@ ], "source": { "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 35 + "lineNumber": 33 }, "initialIsOpen": false }, @@ -2328,23 +2344,7 @@ } ], "enums": [], - "misc": [ - { - "id": "def-server.SearchRequestHandlerContext", - "type": "Type", - "label": "SearchRequestHandlerContext", - "tags": [], - "description": [], - "source": { - "path": "src/plugins/data/server/search/types.ts", - "lineNumber": 118 - }, - "signature": [ - "IScopedSearchClient" - ], - "initialIsOpen": false - } - ], + "misc": [], "objects": [] }, "common": { @@ -10920,6 +10920,58 @@ }, "initialIsOpen": false }, + { + "id": "def-common.queryToAst", + "type": "Function", + "children": [ + { + "type": "Object", + "label": "query", + "isRequired": true, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + } + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/query_to_ast.ts", + "lineNumber": 14 + } + } + ], + "signature": [ + "(query: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ") => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionAstExpressionBuilder", + "text": "ExpressionAstExpressionBuilder" + } + ], + "description": [], + "label": "queryToAst", + "source": { + "path": "src/plugins/data/common/search/expressions/query_to_ast.ts", + "lineNumber": 14 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false + }, { "id": "def-common.splitStringInterval", "type": "Function", @@ -11300,6 +11352,67 @@ }, "initialIsOpen": false }, + { + "id": "def-common.timerangeToAst", + "type": "Function", + "children": [ + { + "type": "Object", + "label": "timerange", + "isRequired": true, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + } + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange_to_ast.ts", + "lineNumber": 13 + } + } + ], + "signature": [ + "(timerange: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + ") => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionAstFunctionBuilder", + "text": "ExpressionAstFunctionBuilder" + }, + "<", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExpressionFunctionKibanaTimerange", + "text": "ExpressionFunctionKibanaTimerange" + }, + ">" + ], + "description": [], + "label": "timerangeToAst", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange_to_ast.ts", + "lineNumber": 13 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false + }, { "id": "def-common.toAbsoluteDates", "type": "Function", @@ -16306,74 +16419,49 @@ "initialIsOpen": false }, { - "id": "def-common.SearchSourceDependencies", + "id": "def-common.SearchSessionFindOptions", "type": "Interface", - "label": "SearchSourceDependencies", - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchSourceDependencies", - "text": "SearchSourceDependencies" - }, - " extends ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.FetchHandlers", - "text": "FetchHandlers" - } - ], + "label": "SearchSessionFindOptions", "description": [], "tags": [], "children": [ { "tags": [], - "id": "def-common.SearchSourceDependencies.search", - "type": "Function", - "label": "search", + "id": "def-common.SearchSessionFindOptions.page", + "type": "number", + "label": "page", "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/search_source.ts", - "lineNumber": 99 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 89 }, "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ISearchGeneric", - "text": "ISearchGeneric" - } + "number | undefined" ] - } - ], - "source": { - "path": "src/plugins/data/common/search/search_source/search_source.ts", - "lineNumber": 98 - }, - "initialIsOpen": false - }, - { - "id": "def-common.SearchSourceFields", - "type": "Interface", - "label": "SearchSourceFields", - "description": [ - "\nsearch source fields" - ], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-common.SearchSourceFields.type", + "id": "def-common.SearchSessionFindOptions.perPage", + "type": "number", + "label": "perPage", + "description": [], + "source": { + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 90 + }, + "signature": [ + "number | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SearchSessionFindOptions.sortField", "type": "string", - "label": "type", + "label": "sortField", "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 62 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 91 }, "signature": [ "string | undefined" @@ -16381,525 +16469,366 @@ }, { "tags": [], - "id": "def-common.SearchSourceFields.query", - "type": "Object", - "label": "query", - "description": [ - "\n{@link Query}" - ], + "id": "def-common.SearchSessionFindOptions.sortOrder", + "type": "string", + "label": "sortOrder", + "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 66 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 92 }, "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.Query", - "text": "Query" - }, - " | undefined" + "string | undefined" ] }, { "tags": [], - "id": "def-common.SearchSourceFields.filter", - "type": "CompoundType", + "id": "def-common.SearchSessionFindOptions.filter", + "type": "string", "label": "filter", - "description": [ - "\n{@link Filter}" - ], + "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 70 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 93 }, "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - " | ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | (() => ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - " | ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | undefined) | undefined" + "string | undefined" ] + } + ], + "source": { + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 88 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SearchSessionRequestInfo", + "type": "Interface", + "label": "SearchSessionRequestInfo", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SearchSessionRequestInfo.id", + "type": "string", + "label": "id", + "description": [ + "\nID of the async search request" + ], + "source": { + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 73 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.sort", - "type": "CompoundType", - "label": "sort", + "id": "def-common.SearchSessionRequestInfo.strategy", + "type": "string", + "label": "strategy", "description": [ - "\n{@link EsQuerySortValue}" + "\nSearch strategy used to submit the search request" ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 74 - }, - "signature": [ - "Record | Record[] | undefined" - ] + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 77 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.highlight", - "type": "Any", - "label": "highlight", - "description": [], + "id": "def-common.SearchSessionRequestInfo.status", + "type": "string", + "label": "status", + "description": [ + "\nstatus" + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 75 - }, - "signature": [ - "any" - ] + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 81 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.highlightAll", - "type": "CompoundType", - "label": "highlightAll", - "description": [], + "id": "def-common.SearchSessionRequestInfo.error", + "type": "string", + "label": "error", + "description": [ + "\nAn optional error. Set if status is set to error." + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 76 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 85 }, "signature": [ - "boolean | undefined" + "string | undefined" ] - }, + } + ], + "source": { + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 69 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SearchSessionSavedObjectAttributes", + "type": "Interface", + "label": "SearchSessionSavedObjectAttributes", + "description": [], + "tags": [], + "children": [ { "tags": [], - "id": "def-common.SearchSourceFields.trackTotalHits", - "type": "CompoundType", - "label": "trackTotalHits", + "id": "def-common.SearchSessionSavedObjectAttributes.sessionId", + "type": "string", + "label": "sessionId", "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 77 - }, - "signature": [ - "number | boolean | undefined" - ] + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 13 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.aggs", - "type": "Any", - "label": "aggs", + "id": "def-common.SearchSessionSavedObjectAttributes.name", + "type": "string", + "label": "name", "description": [ - "\n{@link AggConfigs}" + "\nUser-facing session name to be displayed in session management" ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 81 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 17 }, "signature": [ - "any" + "string | undefined" ] }, { "tags": [], - "id": "def-common.SearchSourceFields.from", - "type": "number", - "label": "from", - "description": [], + "id": "def-common.SearchSessionSavedObjectAttributes.appId", + "type": "string", + "label": "appId", + "description": [ + "\nApp that created the session. e.g 'discover'" + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 82 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 21 }, "signature": [ - "number | undefined" + "string | undefined" ] }, { "tags": [], - "id": "def-common.SearchSourceFields.size", - "type": "number", - "label": "size", - "description": [], + "id": "def-common.SearchSessionSavedObjectAttributes.created", + "type": "string", + "label": "created", + "description": [ + "\nCreation time of the session" + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 83 - }, - "signature": [ - "number | undefined" - ] + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 25 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.source", - "type": "CompoundType", - "label": "source", - "description": [], + "id": "def-common.SearchSessionSavedObjectAttributes.touched", + "type": "string", + "label": "touched", + "description": [ + "\nLast touch time of the session" + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 84 - }, - "signature": [ - "string | boolean | string[] | undefined" - ] + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 29 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.version", - "type": "CompoundType", - "label": "version", - "description": [], + "id": "def-common.SearchSessionSavedObjectAttributes.expires", + "type": "string", + "label": "expires", + "description": [ + "\nExpiration time of the session. Expiration itself is managed by Elasticsearch." + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 85 - }, - "signature": [ - "boolean | undefined" - ] + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 33 + } }, { "tags": [], - "id": "def-common.SearchSourceFields.fields", - "type": "Array", - "label": "fields", + "id": "def-common.SearchSessionSavedObjectAttributes.status", + "type": "Enum", + "label": "status", "description": [ - "\nRetrieve fields via the search Fields API" + "\nstatus" ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 89 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 37 }, "signature": [ { "pluginId": "data", "scope": "common", "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchFieldValue", - "text": "SearchFieldValue" - }, - "[] | undefined" + "section": "def-common.SearchSessionStatus", + "text": "SearchSessionStatus" + } ] }, { - "tags": [ - "deprecated" - ], - "id": "def-common.SearchSourceFields.fieldsFromSource", - "type": "CompoundType", - "label": "fieldsFromSource", + "tags": [], + "id": "def-common.SearchSessionSavedObjectAttributes.urlGeneratorId", + "type": "string", + "label": "urlGeneratorId", "description": [ - "\nRetreive fields directly from _source (legacy behavior)\n" + "\nurlGeneratorId" ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 95 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 41 }, "signature": [ - "string | boolean | string[] | undefined" + "string | undefined" ] }, { "tags": [], - "id": "def-common.SearchSourceFields.index", + "id": "def-common.SearchSessionSavedObjectAttributes.initialState", "type": "Object", - "label": "index", + "label": "initialState", "description": [ - "\n{@link IndexPatternService}" + "\nThe application state that was used to create the session.\nShould be used, for example, to re-load an expired search session." ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 99 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 46 }, "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataIndexPatternsPluginApi", - "section": "def-common.IndexPattern", - "text": "IndexPattern" - }, - " | undefined" + "Record | undefined" ] }, { "tags": [], - "id": "def-common.SearchSourceFields.searchAfter", + "id": "def-common.SearchSessionSavedObjectAttributes.restoreState", "type": "Object", - "label": "searchAfter", - "description": [], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 100 - }, - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.EsQuerySearchAfter", - "text": "EsQuerySearchAfter" - }, - " | undefined" - ] - }, - { - "tags": [], - "id": "def-common.SearchSourceFields.timeout", - "type": "string", - "label": "timeout", - "description": [], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 101 - }, - "signature": [ - "string | undefined" - ] - }, - { - "tags": [], - "id": "def-common.SearchSourceFields.terminate_after", - "type": "number", - "label": "terminate_after", - "description": [], + "label": "restoreState", + "description": [ + "\nApplication state that should be used to restore the session.\nFor example, relative dates are conveted to absolute ones." + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 102 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 51 }, "signature": [ - "number | undefined" + "Record | undefined" ] }, { "tags": [], - "id": "def-common.SearchSourceFields.parent", + "id": "def-common.SearchSessionSavedObjectAttributes.idMapping", "type": "Object", - "label": "parent", - "description": [], + "label": "idMapping", + "description": [ + "\nMapping of search request hashes to their corresponsing info (async search id, etc.)" + ], "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 104 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 55 }, "signature": [ + "Record" ] - } - ], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 107 - }, - "initialIsOpen": false - }, - { - "id": "def-common.SearchStrategyProvider", - "type": "Interface", - "label": "SearchStrategyProvider", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-common.SearchStrategyProvider.id", - "type": "string", - "label": "id", - "description": [], + "id": "def-common.SearchSessionSavedObjectAttributes.persisted", + "type": "boolean", + "label": "persisted", + "description": [ + "\nThis value is true if the session was actively stored by the user. If it is false, the session may be purged by the system." + ], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 49 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 60 } }, { "tags": [], - "id": "def-common.SearchStrategyProvider.search", - "type": "Function", - "label": "search", - "description": [], + "id": "def-common.SearchSessionSavedObjectAttributes.realmType", + "type": "string", + "label": "realmType", + "description": [ + "\nThe realm type/name & username uniquely identifies the user who created this search session" + ], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 50 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 64 }, "signature": [ - "(params: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchStrategySearchParams", - "text": "SearchStrategySearchParams" - }, - ") => ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchStrategyResponse", - "text": "SearchStrategyResponse" - }, - "" + "string | undefined" ] - } - ], - "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 48 - }, - "initialIsOpen": false - }, - { - "id": "def-common.SearchStrategyResponse", - "type": "Interface", - "label": "SearchStrategyResponse", - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchStrategyResponse", - "text": "SearchStrategyResponse" }, - "" - ], - "description": [], - "tags": [], - "children": [ { "tags": [], - "id": "def-common.SearchStrategyResponse.searching", - "type": "Object", - "label": "searching", + "id": "def-common.SearchSessionSavedObjectAttributes.realmName", + "type": "string", + "label": "realmName", "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 54 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 65 }, "signature": [ - "Promise<", - "SearchResponse", - "[]>" + "string | undefined" ] }, { "tags": [], - "id": "def-common.SearchStrategyResponse.abort", - "type": "Function", - "label": "abort", + "id": "def-common.SearchSessionSavedObjectAttributes.username", + "type": "string", + "label": "username", "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 55 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 66 }, "signature": [ - "() => void" + "string | undefined" ] } ], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 53 + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 12 }, "initialIsOpen": false }, { - "id": "def-common.SearchStrategySearchParams", + "id": "def-common.SearchSourceDependencies", "type": "Interface", - "label": "SearchStrategySearchParams", + "label": "SearchSourceDependencies", "signature": [ { "pluginId": "data", "scope": "common", "docId": "kibDataSearchPluginApi", - "section": "def-common.SearchStrategySearchParams", - "text": "SearchStrategySearchParams" + "section": "def-common.SearchSourceDependencies", + "text": "SearchSourceDependencies" }, " extends ", { @@ -16915,234 +16844,281 @@ "children": [ { "tags": [], - "id": "def-common.SearchStrategySearchParams.searchRequests", - "type": "Array", - "label": "searchRequests", + "id": "def-common.SearchSourceDependencies.search", + "type": "Function", + "label": "search", "description": [], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 44 + "path": "src/plugins/data/common/search/search_source/search_source.ts", + "lineNumber": 99 }, "signature": [ - "Record[]" + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ISearchGeneric", + "text": "ISearchGeneric" + } ] } ], "source": { - "path": "src/plugins/data/common/search/search_source/legacy/types.ts", - "lineNumber": 43 + "path": "src/plugins/data/common/search/search_source/search_source.ts", + "lineNumber": 98 }, "initialIsOpen": false }, { - "id": "def-common.ShardFailure", + "id": "def-common.SearchSourceFields", "type": "Interface", - "label": "ShardFailure", - "description": [], + "label": "SearchSourceFields", + "description": [ + "\nsearch source fields" + ], "tags": [], "children": [ { "tags": [], - "id": "def-common.ShardFailure.index", + "id": "def-common.SearchSourceFields.type", "type": "string", - "label": "index", + "label": "type", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 142 - } - }, - { - "tags": [], - "id": "def-common.ShardFailure.node", - "type": "string", - "label": "node", - "description": [], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 143 - } + "lineNumber": 62 + }, + "signature": [ + "string | undefined" + ] }, { "tags": [], - "id": "def-common.ShardFailure.reason", + "id": "def-common.SearchSourceFields.query", "type": "Object", - "label": "reason", - "description": [], + "label": "query", + "description": [ + "\n{@link Query}" + ], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 144 + "lineNumber": 66 }, "signature": [ - "{ caused_by: { reason: string; type: string; }; reason: string; lang?: string | undefined; script?: string | undefined; script_stack?: string[] | undefined; type: string; }" + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined" ] }, { "tags": [], - "id": "def-common.ShardFailure.shard", - "type": "number", - "label": "shard", - "description": [], + "id": "def-common.SearchSourceFields.filter", + "type": "CompoundType", + "label": "filter", + "description": [ + "\n{@link Filter}" + ], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 155 - } - } - ], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 141 - }, - "initialIsOpen": false - }, - { - "id": "def-common.SortDirectionNumeric", - "type": "Interface", - "label": "SortDirectionNumeric", - "description": [], - "tags": [], - "children": [ + "lineNumber": 70 + }, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + " | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | (() => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + " | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined) | undefined" + ] + }, { "tags": [], - "id": "def-common.SortDirectionNumeric.order", - "type": "Enum", - "label": "order", - "description": [], + "id": "def-common.SearchSourceFields.sort", + "type": "CompoundType", + "label": "sort", + "description": [ + "\n{@link EsQuerySortValue}" + ], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 45 + "lineNumber": 74 }, "signature": [ + "Record | Record[] | undefined" ] }, { "tags": [], - "id": "def-common.SortDirectionNumeric.numeric_type", - "type": "CompoundType", - "label": "numeric_type", + "id": "def-common.SearchSourceFields.highlight", + "type": "Any", + "label": "highlight", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 46 + "lineNumber": 75 }, "signature": [ - "\"date\" | \"long\" | \"double\" | \"date_nanos\" | undefined" + "any" ] - } - ], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 44 - }, - "initialIsOpen": false - }, - { - "id": "def-common.SortOptions", - "type": "Interface", - "label": "SortOptions", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-common.SortOptions.mode", + "id": "def-common.SearchSourceFields.highlightAll", "type": "CompoundType", - "label": "mode", + "label": "highlightAll", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 112 + "lineNumber": 76 }, "signature": [ - "\"max\" | \"min\" | \"sum\" | \"avg\" | \"median\" | undefined" + "boolean | undefined" ] }, { "tags": [], - "id": "def-common.SortOptions.type", + "id": "def-common.SearchSourceFields.trackTotalHits", "type": "CompoundType", - "label": "type", + "label": "trackTotalHits", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 113 + "lineNumber": 77 }, "signature": [ - "\"date\" | \"long\" | \"double\" | \"date_nanos\" | undefined" + "number | boolean | undefined" ] }, { "tags": [], - "id": "def-common.SortOptions.nested", - "type": "Uncategorized", - "label": "nested", - "description": [], + "id": "def-common.SearchSourceFields.aggs", + "type": "Any", + "label": "aggs", + "description": [ + "\n{@link AggConfigs}" + ], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 114 + "lineNumber": 81 }, "signature": [ - "object | undefined" + "any" ] }, { "tags": [], - "id": "def-common.SortOptions.unmapped_type", - "type": "string", - "label": "unmapped_type", + "id": "def-common.SearchSourceFields.from", + "type": "number", + "label": "from", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 115 + "lineNumber": 82 }, "signature": [ - "string | undefined" + "number | undefined" ] }, { "tags": [], - "id": "def-common.SortOptions.distance_type", - "type": "CompoundType", - "label": "distance_type", + "id": "def-common.SearchSourceFields.size", + "type": "number", + "label": "size", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 116 + "lineNumber": 83 }, "signature": [ - "\"arc\" | \"plane\" | undefined" + "number | undefined" ] }, { "tags": [], - "id": "def-common.SortOptions.unit", - "type": "string", - "label": "unit", + "id": "def-common.SearchSourceFields.source", + "type": "CompoundType", + "label": "source", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 117 + "lineNumber": 84 }, "signature": [ - "string | undefined" + "string | boolean | string[] | undefined" ] }, { "tags": [], - "id": "def-common.SortOptions.ignore_unmapped", + "id": "def-common.SearchSourceFields.version", "type": "CompoundType", - "label": "ignore_unmapped", + "label": "version", "description": [], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 118 + "lineNumber": 85 }, "signature": [ "boolean | undefined" @@ -17150,22 +17126,559 @@ }, { "tags": [], - "id": "def-common.SortOptions._script", - "type": "Uncategorized", - "label": "_script", - "description": [], + "id": "def-common.SearchSourceFields.fields", + "type": "Array", + "label": "fields", + "description": [ + "\nRetrieve fields via the search Fields API" + ], "source": { "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 119 + "lineNumber": 89 }, "signature": [ - "object | undefined" + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchFieldValue", + "text": "SearchFieldValue" + }, + "[] | undefined" ] - } - ], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 111 + }, + { + "tags": [ + "deprecated" + ], + "id": "def-common.SearchSourceFields.fieldsFromSource", + "type": "CompoundType", + "label": "fieldsFromSource", + "description": [ + "\nRetreive fields directly from _source (legacy behavior)\n" + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 95 + }, + "signature": [ + "string | boolean | string[] | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SearchSourceFields.index", + "type": "Object", + "label": "index", + "description": [ + "\n{@link IndexPatternService}" + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 99 + }, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IndexPattern", + "text": "IndexPattern" + }, + " | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SearchSourceFields.searchAfter", + "type": "Object", + "label": "searchAfter", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 100 + }, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EsQuerySearchAfter", + "text": "EsQuerySearchAfter" + }, + " | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SearchSourceFields.timeout", + "type": "string", + "label": "timeout", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 101 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SearchSourceFields.terminate_after", + "type": "number", + "label": "terminate_after", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 102 + }, + "signature": [ + "number | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SearchSourceFields.parent", + "type": "Object", + "label": "parent", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 104 + }, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchSourceFields", + "text": "SearchSourceFields" + }, + " | undefined" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 61 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SearchSourceOptions", + "type": "Interface", + "label": "SearchSourceOptions", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SearchSourceOptions.callParentStartHandlers", + "type": "CompoundType", + "label": "callParentStartHandlers", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 108 + }, + "signature": [ + "boolean | undefined" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 107 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SearchStrategyProvider", + "type": "Interface", + "label": "SearchStrategyProvider", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SearchStrategyProvider.id", + "type": "string", + "label": "id", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 49 + } + }, + { + "tags": [], + "id": "def-common.SearchStrategyProvider.search", + "type": "Function", + "label": "search", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 50 + }, + "signature": [ + "(params: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchStrategySearchParams", + "text": "SearchStrategySearchParams" + }, + ") => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchStrategyResponse", + "text": "SearchStrategyResponse" + }, + "" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 48 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SearchStrategyResponse", + "type": "Interface", + "label": "SearchStrategyResponse", + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchStrategyResponse", + "text": "SearchStrategyResponse" + }, + "" + ], + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SearchStrategyResponse.searching", + "type": "Object", + "label": "searching", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 54 + }, + "signature": [ + "Promise<", + "SearchResponse", + "[]>" + ] + }, + { + "tags": [], + "id": "def-common.SearchStrategyResponse.abort", + "type": "Function", + "label": "abort", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 55 + }, + "signature": [ + "() => void" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 53 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SearchStrategySearchParams", + "type": "Interface", + "label": "SearchStrategySearchParams", + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SearchStrategySearchParams", + "text": "SearchStrategySearchParams" + }, + " extends ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.FetchHandlers", + "text": "FetchHandlers" + } + ], + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SearchStrategySearchParams.searchRequests", + "type": "Array", + "label": "searchRequests", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 44 + }, + "signature": [ + "Record[]" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/legacy/types.ts", + "lineNumber": 43 + }, + "initialIsOpen": false + }, + { + "id": "def-common.ShardFailure", + "type": "Interface", + "label": "ShardFailure", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.ShardFailure.index", + "type": "string", + "label": "index", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 142 + } + }, + { + "tags": [], + "id": "def-common.ShardFailure.node", + "type": "string", + "label": "node", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 143 + } + }, + { + "tags": [], + "id": "def-common.ShardFailure.reason", + "type": "Object", + "label": "reason", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 144 + }, + "signature": [ + "{ caused_by: { reason: string; type: string; }; reason: string; lang?: string | undefined; script?: string | undefined; script_stack?: string[] | undefined; type: string; }" + ] + }, + { + "tags": [], + "id": "def-common.ShardFailure.shard", + "type": "number", + "label": "shard", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 155 + } + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 141 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SortDirectionNumeric", + "type": "Interface", + "label": "SortDirectionNumeric", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SortDirectionNumeric.order", + "type": "Enum", + "label": "order", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 45 + }, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SortDirection", + "text": "SortDirection" + } + ] + }, + { + "tags": [], + "id": "def-common.SortDirectionNumeric.numeric_type", + "type": "CompoundType", + "label": "numeric_type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 46 + }, + "signature": [ + "\"date\" | \"long\" | \"double\" | \"date_nanos\" | undefined" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 44 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SortOptions", + "type": "Interface", + "label": "SortOptions", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.SortOptions.mode", + "type": "CompoundType", + "label": "mode", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 112 + }, + "signature": [ + "\"max\" | \"min\" | \"sum\" | \"avg\" | \"median\" | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions.type", + "type": "CompoundType", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 113 + }, + "signature": [ + "\"date\" | \"long\" | \"double\" | \"date_nanos\" | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions.nested", + "type": "Uncategorized", + "label": "nested", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 114 + }, + "signature": [ + "object | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions.unmapped_type", + "type": "string", + "label": "unmapped_type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 115 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions.distance_type", + "type": "CompoundType", + "label": "distance_type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 116 + }, + "signature": [ + "\"arc\" | \"plane\" | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions.unit", + "type": "string", + "label": "unit", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 117 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions.ignore_unmapped", + "type": "CompoundType", + "label": "ignore_unmapped", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 118 + }, + "signature": [ + "boolean | undefined" + ] + }, + { + "tags": [], + "id": "def-common.SortOptions._script", + "type": "Uncategorized", + "label": "_script", + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 119 + }, + "signature": [ + "object | undefined" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 111 }, "initialIsOpen": false } @@ -17207,6 +17720,18 @@ }, "initialIsOpen": false }, + { + "id": "def-common.SearchSessionStatus", + "type": "Enum", + "label": "SearchSessionStatus", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/session/status.ts", + "lineNumber": 9 + }, + "initialIsOpen": false + }, { "id": "def-common.SortDirection", "type": "Enum", @@ -17981,7 +18506,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 23 + "lineNumber": 25 }, "signature": [ "ExpressionFunctionDefinition<\"kibana_context\", ", @@ -18004,6 +18529,135 @@ ], "initialIsOpen": false }, + { + "id": "def-common.ExpressionFunctionKibanaTimerange", + "type": "Type", + "label": "ExpressionFunctionKibanaTimerange", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 15 + }, + "signature": [ + "ExpressionFunctionDefinition<\"timerange\", null, TimeRange, ExpressionValueBoxed<\"timerange\", TimeRange>, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "initialIsOpen": false + }, + { + "id": "def-common.ExpressionFunctionKql", + "type": "Type", + "label": "ExpressionFunctionKql", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 17 + }, + "signature": [ + "ExpressionFunctionDefinition<\"kql\", null, Arguments, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_query\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ">, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState" + ], + "initialIsOpen": false + }, + { + "id": "def-common.ExpressionFunctionLucene", + "type": "Type", + "label": "ExpressionFunctionLucene", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 17 + }, + "signature": [ + "ExpressionFunctionDefinition<\"lucene\", null, Arguments, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_query\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ">, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState" + ], + "initialIsOpen": false + }, { "id": "def-common.ExpressionValueSearchContext", "type": "Type", @@ -18383,7 +19037,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 26 + "lineNumber": 28 }, "signature": [ "\"kibana_context\"" @@ -18391,181 +19045,521 @@ "initialIsOpen": false }, { - "id": "def-common.KibanaContext", - "type": "Type", - "label": "KibanaContext", + "id": "def-common.KibanaContext", + "type": "Type", + "label": "KibanaContext", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 29 + }, + "signature": [ + "{ type: \"kibana_context\"; } & ExecutionContextSearch" + ], + "initialIsOpen": false + }, + { + "id": "def-common.KibanaQueryOutput", + "type": "Type", + "label": "KibanaQueryOutput", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 25 + }, + "signature": [ + "{ type: \"kibana_query\"; } & Query" + ], + "initialIsOpen": false + }, + { + "id": "def-common.KibanaTimerangeOutput", + "type": "Type", + "label": "KibanaTimerangeOutput", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 13 + }, + "signature": [ + "{ type: \"timerange\"; } & TimeRange" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.parentPipelineType", + "type": "string", + "label": "parentPipelineType", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 26 + }, + "initialIsOpen": false + }, + { + "id": "def-common.ParsedInterval", + "type": "Type", + "label": "ParsedInterval", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.ts", + "lineNumber": 18 + }, + "signature": [ + "{ value: number; unit: Unit; type: \"calendar\" | \"fixed\"; }" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SEARCH_SESSION_TYPE", + "type": "string", + "label": "SEARCH_SESSION_TYPE", + "description": [], + "source": { + "path": "src/plugins/data/common/search/session/types.ts", + "lineNumber": 11 + }, + "signature": [ + "\"search-session\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SEARCH_SESSIONS_TABLE_ID", + "type": "string", + "label": "SEARCH_SESSIONS_TABLE_ID", + "description": [], + "source": { + "path": "src/plugins/data/common/search/session/index.ts", + "lineNumber": 12 + }, + "signature": [ + "\"searchSessionsMgmtUiTable\"" + ], + "initialIsOpen": false + }, + { + "id": "def-common.SearchFieldValue", + "type": "Type", + "label": "SearchFieldValue", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/search_source/types.ts", + "lineNumber": 56 + }, + "signature": [ + "string | SearchField" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.siblingPipelineType", + "type": "string", + "label": "siblingPipelineType", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", + "lineNumber": 33 + }, + "initialIsOpen": false + }, + { "tags": [], + "id": "def-common.termsAggFilter", + "type": "Array", + "label": "termsAggFilter", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 27 + "path": "src/plugins/data/common/search/aggs/buckets/terms.ts", + "lineNumber": 32 }, "signature": [ - "{ type: \"kibana_context\"; } & ExecutionContextSearch" + "string[]" ], "initialIsOpen": false - }, + } + ], + "objects": [ { + "id": "def-common.AggGroupLabels", + "type": "Object", "tags": [], - "id": "def-common.parentPipelineType", - "type": "string", - "label": "parentPipelineType", + "children": [ + { + "tags": [], + "id": "def-common.AggGroupLabels.[AggGroupNames.Buckets]", + "type": "string", + "label": "[AggGroupNames.Buckets]", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_groups.ts", + "lineNumber": 21 + } + }, + { + "tags": [], + "id": "def-common.AggGroupLabels.[AggGroupNames.Metrics]", + "type": "string", + "label": "[AggGroupNames.Metrics]", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_groups.ts", + "lineNumber": 24 + } + }, + { + "tags": [], + "id": "def-common.AggGroupLabels.[AggGroupNames.None]", + "type": "string", + "label": "[AggGroupNames.None]", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_groups.ts", + "lineNumber": 27 + } + } + ], "description": [], + "label": "AggGroupLabels", "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", - "lineNumber": 26 + "path": "src/plugins/data/common/search/aggs/agg_groups.ts", + "lineNumber": 20 }, "initialIsOpen": false }, { - "id": "def-common.ParsedInterval", - "type": "Type", - "label": "ParsedInterval", "tags": [], + "id": "def-common.AggGroupNames", + "type": "Object", + "label": "AggGroupNames", "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.ts", - "lineNumber": 18 + "path": "src/plugins/data/common/search/aggs/agg_groups.ts", + "lineNumber": 12 }, "signature": [ - "{ value: number; unit: Unit; type: \"calendar\" | \"fixed\"; }" + "Readonly<{ Buckets: \"buckets\"; Metrics: \"metrics\"; None: \"none\"; }>" ], "initialIsOpen": false }, { - "id": "def-common.SearchFieldValue", - "type": "Type", - "label": "SearchFieldValue", + "id": "def-common.kibana", + "type": "Object", "tags": [], - "description": [], - "source": { - "path": "src/plugins/data/common/search/search_source/types.ts", - "lineNumber": 56 - }, - "signature": [ - "string | SearchField" + "children": [ + { + "tags": [], + "id": "def-common.kibana.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 27 + }, + "signature": [ + "\"kibana\"" + ] + }, + { + "tags": [], + "id": "def-common.kibana.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 28 + }, + "signature": [ + "\"kibana_context\"" + ] + }, + { + "tags": [], + "id": "def-common.kibana.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 30 + }, + "signature": [ + "(\"kibana_context\" | \"null\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibana.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 32 + } + }, + { + "id": "def-common.kibana.args", + "type": "Object", + "tags": [], + "children": [], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 36 + } + }, + { + "id": "def-common.kibana.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: Input, _: object, { getSearchContext }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_context\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + } + ], + "description": [], + "children": [ + { + "type": "CompoundType", + "label": "input", + "isRequired": false, + "signature": [ + "Input" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + }, + { + "type": "Uncategorized", + "label": "_", + "isRequired": true, + "signature": [ + "object" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + }, + { + "type": "Object", + "label": "{ getSearchContext }", + "isRequired": true, + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + } ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-common.siblingPipelineType", - "type": "string", - "label": "siblingPipelineType", "description": [], + "label": "kibana", "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 33 + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 26 }, "initialIsOpen": false }, { - "tags": [], - "id": "def-common.termsAggFilter", - "type": "Array", - "label": "termsAggFilter", - "description": [], - "source": { - "path": "src/plugins/data/common/search/aggs/buckets/terms.ts", - "lineNumber": 32 - }, - "signature": [ - "string[]" - ], - "initialIsOpen": false - } - ], - "objects": [ - { - "id": "def-common.AggGroupLabels", + "id": "def-common.kibanaContext", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.AggGroupLabels.[AggGroupNames.Buckets]", + "id": "def-common.kibanaContext.name", "type": "string", - "label": "[AggGroupNames.Buckets]", + "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/agg_groups.ts", - "lineNumber": 21 + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 32 } }, { + "id": "def-common.kibanaContext.from", + "type": "Object", "tags": [], - "id": "def-common.AggGroupLabels.[AggGroupNames.Metrics]", - "type": "string", - "label": "[AggGroupNames.Metrics]", + "children": [ + { + "id": "def-common.kibanaContext.from.null", + "type": "Function", + "children": [], + "signature": [ + "() => { type: string; }" + ], + "description": [], + "label": "null", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 34 + }, + "tags": [], + "returnComment": [] + } + ], "description": [], + "label": "from", "source": { - "path": "src/plugins/data/common/search/aggs/agg_groups.ts", - "lineNumber": 24 + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 33 } }, { + "id": "def-common.kibanaContext.to", + "type": "Object", "tags": [], - "id": "def-common.AggGroupLabels.[AggGroupNames.None]", - "type": "string", - "label": "[AggGroupNames.None]", + "children": [ + { + "id": "def-common.kibanaContext.to.null", + "type": "Function", + "children": [], + "signature": [ + "() => { type: string; }" + ], + "description": [], + "label": "null", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 41 + }, + "tags": [], + "returnComment": [] + } + ], "description": [], + "label": "to", "source": { - "path": "src/plugins/data/common/search/aggs/agg_groups.ts", - "lineNumber": 27 + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 40 } } ], "description": [], - "label": "AggGroupLabels", - "source": { - "path": "src/plugins/data/common/search/aggs/agg_groups.ts", - "lineNumber": 20 - }, - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-common.AggGroupNames", - "type": "Object", - "label": "AggGroupNames", - "description": [], + "label": "kibanaContext", "source": { - "path": "src/plugins/data/common/search/aggs/agg_groups.ts", - "lineNumber": 12 + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 31 }, - "signature": [ - "Readonly<{ Buckets: \"buckets\"; Metrics: \"metrics\"; None: \"none\"; }>" - ], "initialIsOpen": false }, { - "id": "def-common.kibana", + "id": "def-common.kibanaContextFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibana.name", + "id": "def-common.kibanaContextFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 27 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 43 }, "signature": [ - "\"kibana\"" + "\"kibana_context\"" ] }, { "tags": [], - "id": "def-common.kibana.type", + "id": "def-common.kibanaContextFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 28 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 44 }, "signature": [ "\"kibana_context\"" @@ -18573,13 +19567,13 @@ }, { "tags": [], - "id": "def-common.kibana.inputTypes", + "id": "def-common.kibanaContextFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 30 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 45 }, "signature": [ "(\"kibana_context\" | \"null\")[]" @@ -18587,33 +19581,253 @@ }, { "tags": [], - "id": "def-common.kibana.help", + "id": "def-common.kibanaContextFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 32 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 46 } }, { - "id": "def-common.kibana.args", + "id": "def-common.kibanaContextFunction.args", "type": "Object", "tags": [], - "children": [], + "children": [ + { + "id": "def-common.kibanaContextFunction.args.q", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 51 + }, + "signature": [ + "(\"null\" | \"kibana_query\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.aliases", + "type": "Array", + "label": "aliases", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 52 + }, + "signature": [ + "string[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.default", + "type": "Uncategorized", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 53 + }, + "signature": [ + "null" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 54 + } + } + ], + "description": [], + "label": "q", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 50 + } + }, + { + "id": "def-common.kibanaContextFunction.args.filters", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.filters.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 59 + }, + "signature": [ + "(\"string\" | \"null\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.filters.default", + "type": "string", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 60 + } + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.filters.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 61 + } + } + ], + "description": [], + "label": "filters", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 58 + } + }, + { + "id": "def-common.kibanaContextFunction.args.timeRange", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.timeRange.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 66 + }, + "signature": [ + "(\"null\" | \"timerange\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.timeRange.default", + "type": "Uncategorized", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 67 + }, + "signature": [ + "null" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.timeRange.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 68 + } + } + ], + "description": [], + "label": "timeRange", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 65 + } + }, + { + "id": "def-common.kibanaContextFunction.args.savedSearchId", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.savedSearchId.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 73 + }, + "signature": [ + "(\"string\" | \"null\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.savedSearchId.default", + "type": "Uncategorized", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 74 + }, + "signature": [ + "null" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.savedSearchId.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 75 + } + } + ], + "description": [], + "label": "savedSearchId", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 72 + } + } + ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 36 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 49 } }, { - "id": "def-common.kibana.fn", + "id": "def-common.kibanaContextFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: Input, _: object, { getSearchContext }: ", + "(input: Input, args: Arguments, { getSavedObject }: ", { "pluginId": "expressions", "scope": "common", @@ -18637,21 +19851,21 @@ "section": "def-common.ExecutionContextSearch", "text": "ExecutionContextSearch" }, - ">) => ", + ">) => Promise<{ type: \"kibana_context\"; query: ", { - "pluginId": "expressions", + "pluginId": "data", "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionValueBoxed", - "text": "ExpressionValueBoxed" + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" }, - "<\"kibana_context\", ", + "[]; filters: ", { "pluginId": "data", "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" } ], "description": [], @@ -18665,508 +19879,715 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 - } - }, - { - "type": "Uncategorized", - "label": "_", - "isRequired": true, - "signature": [ - "object" - ], - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 81 } }, { - "type": "Object", - "label": "{ getSearchContext }", - "isRequired": true, - "signature": [ - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">" - ], - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 - } - } - ], - "tags": [], - "returnComment": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 - } - } - ], - "description": [], - "label": "kibana", - "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 26 - }, - "initialIsOpen": false - }, - { - "id": "def-common.kibanaContext", - "type": "Object", - "tags": [], - "children": [ - { - "tags": [], - "id": "def-common.kibanaContext.name", - "type": "string", - "label": "name", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 30 - } - }, - { - "id": "def-common.kibanaContext.from", - "type": "Object", - "tags": [], - "children": [ - { - "id": "def-common.kibanaContext.from.null", - "type": "Function", - "children": [], - "signature": [ - "() => { type: string; }" - ], - "description": [], - "label": "null", - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 32 - }, - "tags": [], - "returnComment": [] - } - ], - "description": [], - "label": "from", - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 31 - } - }, - { - "id": "def-common.kibanaContext.to", - "type": "Object", - "tags": [], - "children": [ + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + "Arguments" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 81 + } + }, { - "id": "def-common.kibanaContext.to.null", - "type": "Function", - "children": [], + "type": "Object", + "label": "{ getSavedObject }", + "isRequired": true, "signature": [ - "() => { type: string; }" + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">" ], "description": [], - "label": "null", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 39 - }, - "tags": [], - "returnComment": [] + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 81 + } } ], - "description": [], - "label": "to", + "tags": [], + "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 38 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 81 } } ], "description": [], - "label": "kibanaContext", + "label": "kibanaContextFunction", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 29 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 42 }, "initialIsOpen": false }, { - "id": "def-common.kibanaContextFunction", + "id": "def-common.kibanaTimerangeFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.name", + "id": "def-common.kibanaTimerangeFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 41 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 23 }, "signature": [ - "\"kibana_context\"" + "\"timerange\"" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.type", + "id": "def-common.kibanaTimerangeFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 24 }, "signature": [ - "\"kibana_context\"" + "\"timerange\"" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.inputTypes", + "id": "def-common.kibanaTimerangeFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 43 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 25 }, "signature": [ - "(\"kibana_context\" | \"null\")[]" + "\"null\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.help", + "id": "def-common.kibanaTimerangeFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 44 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 26 } }, { - "id": "def-common.kibanaContextFunction.args", + "id": "def-common.kibanaTimerangeFunction.args", "type": "Object", "tags": [], "children": [ { - "id": "def-common.kibanaContextFunction.args.q", + "id": "def-common.kibanaTimerangeFunction.args.from", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.args.q.types", + "id": "def-common.kibanaTimerangeFunction.args.from.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 49 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 31 }, "signature": [ - "(\"string\" | \"null\")[]" + "\"string\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.q.aliases", + "id": "def-common.kibanaTimerangeFunction.args.from.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 32 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.from.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 33 + } + } + ], + "description": [], + "label": "from", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 30 + } + }, + { + "id": "def-common.kibanaTimerangeFunction.args.to", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.to.types", "type": "Array", - "label": "aliases", + "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 50 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 38 }, "signature": [ - "string[]" + "\"string\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.q.default", - "type": "Uncategorized", - "label": "default", + "id": "def-common.kibanaTimerangeFunction.args.to.required", + "type": "boolean", + "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 51 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 39 }, "signature": [ - "null" + "true" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.q.help", + "id": "def-common.kibanaTimerangeFunction.args.to.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 52 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 40 } } ], "description": [], - "label": "q", + "label": "to", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 48 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 37 } }, { - "id": "def-common.kibanaContextFunction.args.filters", + "id": "def-common.kibanaTimerangeFunction.args.mode", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.args.filters.types", + "id": "def-common.kibanaTimerangeFunction.args.mode.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 57 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 45 }, "signature": [ - "(\"string\" | \"null\")[]" + "\"string\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.filters.default", - "type": "string", - "label": "default", + "id": "def-common.kibanaTimerangeFunction.args.mode.options", + "type": "Array", + "label": "options", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 58 - } + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 46 + }, + "signature": [ + "(\"absolute\" | \"relative\")[]" + ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.filters.help", + "id": "def-common.kibanaTimerangeFunction.args.mode.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 59 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 47 } } ], "description": [], - "label": "filters", + "label": "mode", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 56 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 44 + } + } + ], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 29 + } + }, + { + "id": "def-common.kibanaTimerangeFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: null, args: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + ") => { type: \"timerange\"; from: string; to: string; mode: \"absolute\" | \"relative\" | undefined; }" + ], + "description": [], + "children": [ + { + "type": "Uncategorized", + "label": "input", + "isRequired": true, + "signature": [ + "null" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 53 } }, { - "id": "def-common.kibanaContextFunction.args.timeRange", + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + } + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 53 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 53 + } + } + ], + "description": [], + "label": "kibanaTimerangeFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 22 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kqlFunction", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kqlFunction.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 25 + }, + "signature": [ + "\"kql\"" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 26 + }, + "signature": [ + "\"kibana_query\"" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 27 + }, + "signature": [ + "\"null\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 28 + } + }, + { + "id": "def-common.kqlFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.kqlFunction.args.q", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.args.timeRange.types", + "id": "def-common.kqlFunction.args.q.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 64 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 33 }, "signature": [ - "(\"string\" | \"null\")[]" + "\"string\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.timeRange.default", - "type": "Uncategorized", - "label": "default", + "id": "def-common.kqlFunction.args.q.required", + "type": "boolean", + "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 65 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 34 }, "signature": [ - "null" + "true" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.timeRange.help", + "id": "def-common.kqlFunction.args.q.aliases", + "type": "Array", + "label": "aliases", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 35 + }, + "signature": [ + "string[]" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.args.q.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 66 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 36 } } ], "description": [], - "label": "timeRange", + "label": "q", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 63 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 32 + } + } + ], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 31 + } + }, + { + "id": "def-common.kqlFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: null, args: Arguments) => { type: \"kibana_query\"; language: string; query: string; }" + ], + "description": [], + "children": [ + { + "type": "Uncategorized", + "label": "input", + "isRequired": true, + "signature": [ + "null" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 42 } }, { - "id": "def-common.kibanaContextFunction.args.savedSearchId", + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + "Arguments" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 42 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 42 + } + } + ], + "description": [], + "label": "kqlFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 24 + }, + "initialIsOpen": false + }, + { + "id": "def-common.luceneFunction", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.luceneFunction.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 25 + }, + "signature": [ + "\"lucene\"" + ] + }, + { + "tags": [], + "id": "def-common.luceneFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 26 + }, + "signature": [ + "\"kibana_query\"" + ] + }, + { + "tags": [], + "id": "def-common.luceneFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 27 + }, + "signature": [ + "\"null\"[]" + ] + }, + { + "tags": [], + "id": "def-common.luceneFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 28 + } + }, + { + "id": "def-common.luceneFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.luceneFunction.args.q", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.args.savedSearchId.types", + "id": "def-common.luceneFunction.args.q.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 71 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 33 }, "signature": [ - "(\"string\" | \"null\")[]" + "\"string\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.savedSearchId.default", - "type": "Uncategorized", - "label": "default", + "id": "def-common.luceneFunction.args.q.required", + "type": "boolean", + "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 72 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 34 }, "signature": [ - "null" + "true" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.savedSearchId.help", + "id": "def-common.luceneFunction.args.q.aliases", + "type": "Array", + "label": "aliases", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 35 + }, + "signature": [ + "string[]" + ] + }, + { + "tags": [], + "id": "def-common.luceneFunction.args.q.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 73 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 36 } } ], "description": [], - "label": "savedSearchId", + "label": "q", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 70 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 32 } } ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 47 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 31 } }, { - "id": "def-common.kibanaContextFunction.fn", + "id": "def-common.luceneFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: Input, args: Arguments, { getSavedObject }: ", - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">) => Promise<{ type: \"kibana_context\"; query: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.Query", - "text": "Query" - }, - "[]; filters: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - } + "(input: null, args: Arguments) => { type: \"kibana_query\"; language: string; query: any; }" ], "description": [], "children": [ { - "type": "CompoundType", + "type": "Uncategorized", "label": "input", - "isRequired": false, + "isRequired": true, "signature": [ - "Input" + "null" ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 79 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 42 } }, { @@ -19178,60 +20599,24 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 79 - } - }, - { - "type": "Object", - "label": "{ getSavedObject }", - "isRequired": true, - "signature": [ - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">" - ], - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 79 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 42 } } ], "tags": [], "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 79 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 42 } } ], "description": [], - "label": "kibanaContextFunction", + "label": "luceneFunction", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 40 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 24 }, "initialIsOpen": false }, @@ -19470,4 +20855,4 @@ } ] } -} +} \ No newline at end of file diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 370bd2ffd101e..70cbd23125248 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -36,9 +36,6 @@ import dataSearchObj from './data_search.json'; ### Interfaces -### Consts, variables and types - - ## Common ### Objects diff --git a/api_docs/data_ui.json b/api_docs/data_ui.json index cf0528bc7faff..52d5100237394 100644 --- a/api_docs/data_ui.json +++ b/api_docs/data_ui.json @@ -290,6 +290,20 @@ ") => void) | undefined" ] }, + { + "tags": [], + "id": "def-public.QueryStringInputProps.submitOnBlur", + "type": "CompoundType", + "label": "submitOnBlur", + "description": [], + "source": { + "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", + "lineNumber": 56 + }, + "signature": [ + "boolean | undefined" + ] + }, { "tags": [], "id": "def-public.QueryStringInputProps.dataTestSubj", @@ -298,7 +312,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 56 + "lineNumber": 57 }, "signature": [ "string | undefined" @@ -312,7 +326,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 57 + "lineNumber": 58 }, "signature": [ "\"s\" | \"l\" | undefined" @@ -326,7 +340,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 58 + "lineNumber": 59 }, "signature": [ "string | undefined" @@ -340,7 +354,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 59 + "lineNumber": 60 }, "signature": [ "boolean | undefined" @@ -354,7 +368,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 60 + "lineNumber": 61 }, "signature": [ "boolean | undefined" @@ -368,7 +382,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 61 + "lineNumber": 62 }, "signature": [ "string | React.ComponentClass<{}, any> | React.FunctionComponent<{}> | undefined" @@ -382,7 +396,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 67 + "lineNumber": 68 }, "signature": [ "\"text\" | \"lucene\" | undefined" @@ -396,7 +410,7 @@ "description": [], "source": { "path": "src/plugins/data/public/ui/query_string_input/query_string_input.tsx", - "lineNumber": 68 + "lineNumber": 69 }, "signature": [ "string | undefined" @@ -423,7 +437,7 @@ "lineNumber": 17 }, "signature": [ - "Pick, \"children\" | \"onClick\" | \"color\" | \"id\" | \"title\" | \"placeholder\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"children\" | \"onClick\" | \"color\" | \"id\" | \"title\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\"> & globalThis.Required, \"children\" | \"onClick\" | \"color\" | \"id\" | \"title\" | \"placeholder\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"placeholder\">> & { onChange: (indexPatternId?: string | undefined) => void; indexPatternId: string; fieldTypes?: string[] | undefined; onNoIndexPatterns?: (() => void) | undefined; maxIndexPatterns?: number | undefined; }" + "Pick, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\"> & globalThis.Required, \"children\" | \"onClick\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"isClearable\" | \"async\" | \"compressed\" | \"fullWidth\" | \"singleSelection\" | \"prepend\" | \"append\" | \"sortMatchesBy\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"customOptionText\" | \"onCreateOption\" | \"renderOption\" | \"inputRef\" | \"isDisabled\" | \"isInvalid\" | \"noSuggestions\" | \"rowHeight\" | \"delimiter\">, \"placeholder\">> & { onChange: (indexPatternId?: string | undefined) => void; indexPatternId: string; fieldTypes?: string[] | undefined; onNoIndexPatterns?: (() => void) | undefined; maxIndexPatterns?: number | undefined; }" ], "initialIsOpen": false }, diff --git a/api_docs/discover.json b/api_docs/discover.json index 267669692051f..a785c254efeab 100644 --- a/api_docs/discover.json +++ b/api_docs/discover.json @@ -807,8 +807,8 @@ "label": "docViews", "description": [], "source": { - "path": "src/plugins/discover/public/plugin.ts", - "lineNumber": 75 + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 76 }, "signature": [ "{ addDocView(docViewRaw: ", @@ -832,8 +832,8 @@ } ], "source": { - "path": "src/plugins/discover/public/plugin.ts", - "lineNumber": 74 + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 75 }, "lifecycle": "setup", "initialIsOpen": true @@ -852,8 +852,8 @@ "label": "savedSearchLoader", "description": [], "source": { - "path": "src/plugins/discover/public/plugin.ts", - "lineNumber": 86 + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 87 }, "signature": [ { @@ -874,8 +874,8 @@ "\n`share` plugin URL generator for Discover app. Use it to generate links into\nDiscover application, example:\n\n```ts\nconst url = await plugins.discover.urlGenerator.createUrl({\n savedSearchId: '571aaf70-4c88-11e8-b3d7-01146121b73d',\n indexPatternId: 'c367b774-a4c2-11ea-bb37-0242ac130002',\n timeRange: {\n to: 'now',\n from: 'now-15m',\n mode: 'relative',\n },\n});\n```" ], "source": { - "path": "src/plugins/discover/public/plugin.ts", - "lineNumber": 104 + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 105 }, "signature": [ { @@ -890,8 +890,8 @@ } ], "source": { - "path": "src/plugins/discover/public/plugin.ts", - "lineNumber": 85 + "path": "src/plugins/discover/public/plugin.tsx", + "lineNumber": 86 }, "lifecycle": "start", "initialIsOpen": true diff --git a/api_docs/expressions.json b/api_docs/expressions.json index ee496cc7c06a3..f80d9b6c4cdd3 100644 --- a/api_docs/expressions.json +++ b/api_docs/expressions.json @@ -5364,7 +5364,7 @@ "section": "def-common.InferFunctionDefinition", "text": "InferFunctionDefinition" }, - "[\"name\"], initialArgs: { [K in keyof FunctionArgs]: ", + "[\"name\"], initialArgs: { [K in keyof FunctionArgs]: FunctionArgs[K] | ", { "pluginId": "expressions", "scope": "common", @@ -5372,7 +5372,7 @@ "section": "def-common.ExpressionAstExpressionBuilder", "text": "ExpressionAstExpressionBuilder" }, - " | FunctionArgs[K] | ", + " | ", { "pluginId": "expressions", "scope": "common", @@ -5421,7 +5421,7 @@ "label": "initialArgs", "isRequired": true, "signature": [ - "{ [K in keyof FunctionArgs]: ", + "{ [K in keyof FunctionArgs]: FunctionArgs[K] | ", { "pluginId": "expressions", "scope": "common", @@ -5429,7 +5429,7 @@ "section": "def-common.ExpressionAstExpressionBuilder", "text": "ExpressionAstExpressionBuilder" }, - " | FunctionArgs[K] | ", + " | ", { "pluginId": "expressions", "scope": "common", @@ -13485,7 +13485,7 @@ "section": "def-common.InferFunctionDefinition", "text": "InferFunctionDefinition" }, - "[\"name\"], initialArgs: { [K in keyof FunctionArgs]: ", + "[\"name\"], initialArgs: { [K in keyof FunctionArgs]: FunctionArgs[K] | ", { "pluginId": "expressions", "scope": "common", @@ -13493,7 +13493,7 @@ "section": "def-common.ExpressionAstExpressionBuilder", "text": "ExpressionAstExpressionBuilder" }, - " | FunctionArgs[K] | ", + " | ", { "pluginId": "expressions", "scope": "common", @@ -13542,7 +13542,7 @@ "label": "initialArgs", "isRequired": true, "signature": [ - "{ [K in keyof FunctionArgs]: ", + "{ [K in keyof FunctionArgs]: FunctionArgs[K] | ", { "pluginId": "expressions", "scope": "common", @@ -13550,7 +13550,7 @@ "section": "def-common.ExpressionAstExpressionBuilder", "text": "ExpressionAstExpressionBuilder" }, - " | FunctionArgs[K] | ", + " | ", { "pluginId": "expressions", "scope": "common", @@ -21552,7 +21552,7 @@ "section": "def-common.InferFunctionDefinition", "text": "InferFunctionDefinition" }, - "[\"name\"], initialArgs: { [K in keyof FunctionArgs]: ", + "[\"name\"], initialArgs: { [K in keyof FunctionArgs]: FunctionArgs[K] | ", { "pluginId": "expressions", "scope": "common", @@ -21560,7 +21560,7 @@ "section": "def-common.ExpressionAstExpressionBuilder", "text": "ExpressionAstExpressionBuilder" }, - " | FunctionArgs[K] | ", + " | ", { "pluginId": "expressions", "scope": "common", @@ -21609,7 +21609,7 @@ "label": "initialArgs", "isRequired": true, "signature": [ - "{ [K in keyof FunctionArgs]: ", + "{ [K in keyof FunctionArgs]: FunctionArgs[K] | ", { "pluginId": "expressions", "scope": "common", @@ -21617,7 +21617,7 @@ "section": "def-common.ExpressionAstExpressionBuilder", "text": "ExpressionAstExpressionBuilder" }, - " | FunctionArgs[K] | ", + " | ", { "pluginId": "expressions", "scope": "common", @@ -33883,4 +33883,4 @@ } ] } -} +} \ No newline at end of file diff --git a/api_docs/file_upload.json b/api_docs/file_upload.json index 350bd1aa067f3..6a624f87bfcd2 100644 --- a/api_docs/file_upload.json +++ b/api_docs/file_upload.json @@ -4,6 +4,61 @@ "classes": [], "functions": [], "interfaces": [ + { + "id": "def-public.AnalysisResult", + "type": "Interface", + "label": "AnalysisResult", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.AnalysisResult.results", + "type": "Object", + "label": "results", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 21 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.FindFileStructureResponse", + "text": "FindFileStructureResponse" + } + ] + }, + { + "tags": [], + "id": "def-public.AnalysisResult.overrides", + "type": "CompoundType", + "label": "overrides", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 22 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.FormattedOverrides", + "text": "FormattedOverrides" + }, + " | undefined" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 20 + }, + "initialIsOpen": false + }, { "id": "def-public.CreateDocsResponse", "type": "Interface", @@ -90,13 +145,13 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 26 + "lineNumber": 93 } } ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 25 + "lineNumber": 92 }, "initialIsOpen": false }, @@ -212,335 +267,240 @@ "initialIsOpen": false }, { - "id": "def-public.IImporter", + "id": "def-public.FindFileStructureResponse", "type": "Interface", - "label": "IImporter", + "label": "FindFileStructureResponse", "description": [], "tags": [], "children": [ { - "id": "def-public.IImporter.read", - "type": "Function", - "label": "read", + "tags": [], + "id": "def-public.FindFileStructureResponse.charset", + "type": "string", + "label": "charset", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 26 + } + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.has_header_row", + "type": "boolean", + "label": "has_header_row", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 27 + } + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.has_byte_order_marker", + "type": "boolean", + "label": "has_byte_order_marker", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 28 + } + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.format", + "type": "string", + "label": "format", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 29 + } + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.field_stats", + "type": "Object", + "label": "field_stats", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 30 + }, "signature": [ - "(data: ArrayBuffer) => { success: boolean; }" - ], + "{ [fieldName: string]: { count: number; cardinality: number; top_hits: { count: number; value: any; }[]; mean_value?: number | undefined; median_value?: number | undefined; max_value?: number | undefined; min_value?: number | undefined; earliest?: string | undefined; latest?: string | undefined; }; }" + ] + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.sample_start", + "type": "string", + "label": "sample_start", "description": [], - "children": [ - { - "type": "Object", - "label": "data", - "isRequired": true, - "signature": [ - "ArrayBuffer" - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 44 - } - } - ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 43 + } + }, + { "tags": [], - "returnComment": [], + "id": "def-public.FindFileStructureResponse.num_messages_analyzed", + "type": "number", + "label": "num_messages_analyzed", + "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "path": "x-pack/plugins/file_upload/common/types.ts", "lineNumber": 44 } }, { - "id": "def-public.IImporter.initializeImport", - "type": "Function", - "label": "initializeImport", + "tags": [], + "id": "def-public.FindFileStructureResponse.mappings", + "type": "Object", + "label": "mappings", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 45 + }, "signature": [ - "(index: string, settings: ", + "{ properties: { [fieldName: string]: { type: ", { - "pluginId": "fileUpload", + "pluginId": "data", "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Settings", - "text": "Settings" + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" }, - ", mappings: ", + ".STRING | ", { - "pluginId": "fileUpload", + "pluginId": "data", "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Mappings", - "text": "Mappings" + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" }, - ", pipeline: ", + ".TEXT | ", { - "pluginId": "fileUpload", + "pluginId": "data", "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.IngestPipeline", - "text": "IngestPipeline" + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" }, - ") => Promise<", + ".KEYWORD | ", { - "pluginId": "fileUpload", + "pluginId": "data", "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.ImportResponse", - "text": "ImportResponse" - }, - ">" - ], - "description": [], - "children": [ - { - "type": "string", - "label": "index", - "isRequired": true, - "signature": [ - "string" - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 46 - } - }, - { - "type": "Object", - "label": "settings", - "isRequired": true, - "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Settings", - "text": "Settings" - } - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 47 - } - }, - { - "type": "Object", - "label": "mappings", - "isRequired": true, - "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Mappings", - "text": "Mappings" - } - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 48 - } + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" }, + ".BOOLEAN | ", { - "type": "Object", - "label": "pipeline", - "isRequired": true, - "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.IngestPipeline", - "text": "IngestPipeline" - } - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 49 - } + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" } - ], + ] + }, + { "tags": [], - "returnComment": [], + "id": "def-public.FindFileStructureResponse.quote", + "type": "string", + "label": "quote", + "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 45 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 58 } }, { - "id": "def-public.IImporter.import", - "type": "Function", - "label": "import", - "signature": [ - "(id: string, index: string, pipelineId: string | undefined, setImportProgress: (progress: number) => void) => Promise<", - { - "pluginId": "fileUpload", - "scope": "public", - "docId": "kibFileUploadPluginApi", - "section": "def-public.ImportResults", - "text": "ImportResults" - }, - ">" - ], - "description": [], - "children": [ - { - "type": "string", - "label": "id", - "isRequired": true, - "signature": [ - "string" - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 52 - } - }, - { - "type": "string", - "label": "index", - "isRequired": true, - "signature": [ - "string" - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 53 - } - }, - { - "type": "string", - "label": "pipelineId", - "isRequired": false, - "signature": [ - "string | undefined" - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 54 - } - }, - { - "type": "Function", - "label": "setImportProgress", - "isRequired": true, - "signature": [ - "(progress: number) => void" - ], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 55 - } - } - ], "tags": [], - "returnComment": [], + "id": "def-public.FindFileStructureResponse.delimiter", + "type": "string", + "label": "delimiter", + "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 51 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 59 } - } - ], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 43 - }, - "initialIsOpen": false - }, - { - "id": "def-public.ImportConfig", - "type": "Interface", - "label": "ImportConfig", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-public.ImportConfig.settings", - "type": "Object", - "label": "settings", + "id": "def-public.FindFileStructureResponse.need_client_timezone", + "type": "boolean", + "label": "need_client_timezone", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 18 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 60 + } + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.num_lines_analyzed", + "type": "number", + "label": "num_lines_analyzed", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 61 + } + }, + { + "tags": [], + "id": "def-public.FindFileStructureResponse.column_names", + "type": "Array", + "label": "column_names", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 62 }, "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Settings", - "text": "Settings" - } + "string[] | undefined" ] }, { "tags": [], - "id": "def-public.ImportConfig.mappings", - "type": "Object", - "label": "mappings", + "id": "def-public.FindFileStructureResponse.explanation", + "type": "Array", + "label": "explanation", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 19 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 63 }, "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Mappings", - "text": "Mappings" - } + "string[] | undefined" ] }, { "tags": [], - "id": "def-public.ImportConfig.pipeline", - "type": "Object", - "label": "pipeline", + "id": "def-public.FindFileStructureResponse.grok_pattern", + "type": "string", + "label": "grok_pattern", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 20 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 64 }, "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.IngestPipeline", - "text": "IngestPipeline" - } + "string | undefined" ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 17 - }, - "initialIsOpen": false - }, - { - "id": "def-public.ImportFactoryOptions", - "type": "Interface", - "label": "ImportFactoryOptions", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-public.ImportFactoryOptions.excludeLinesPattern", + "id": "def-public.FindFileStructureResponse.multiline_start_pattern", "type": "string", - "label": "excludeLinesPattern", + "label": "multiline_start_pattern", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 38 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 65 }, "signature": [ "string | undefined" @@ -548,13 +508,13 @@ }, { "tags": [], - "id": "def-public.ImportFactoryOptions.multilineStartPattern", + "id": "def-public.FindFileStructureResponse.exclude_lines_pattern", "type": "string", - "label": "multilineStartPattern", + "label": "exclude_lines_pattern", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 39 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 66 }, "signature": [ "string | undefined" @@ -562,427 +522,1435 @@ }, { "tags": [], - "id": "def-public.ImportFactoryOptions.importConfig", - "type": "Object", - "label": "importConfig", + "id": "def-public.FindFileStructureResponse.java_timestamp_formats", + "type": "Array", + "label": "java_timestamp_formats", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 40 + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 67 }, "signature": [ - { - "pluginId": "fileUpload", - "scope": "public", - "docId": "kibFileUploadPluginApi", - "section": "def-public.ImportConfig", - "text": "ImportConfig" - } + "string[] | undefined" ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 37 - }, - "initialIsOpen": false - }, - { - "id": "def-public.ImportFailure", - "type": "Interface", - "label": "ImportFailure", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-public.ImportFailure.item", - "type": "number", - "label": "item", + "id": "def-public.FindFileStructureResponse.joda_timestamp_formats", + "type": "Array", + "label": "joda_timestamp_formats", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 20 - } + "lineNumber": 68 + }, + "signature": [ + "string[] | undefined" + ] }, { "tags": [], - "id": "def-public.ImportFailure.reason", + "id": "def-public.FindFileStructureResponse.timestamp_field", "type": "string", - "label": "reason", + "label": "timestamp_field", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 21 - } + "lineNumber": 69 + }, + "signature": [ + "string | undefined" + ] }, { "tags": [], - "id": "def-public.ImportFailure.doc", + "id": "def-public.FindFileStructureResponse.should_trim_fields", "type": "CompoundType", - "label": "doc", + "label": "should_trim_fields", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 22 + "lineNumber": 70 }, "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.ImportDoc", - "text": "ImportDoc" - } + "boolean | undefined" ] } ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 19 + "lineNumber": 25 }, "initialIsOpen": false }, { - "id": "def-public.ImportResponse", + "id": "def-public.IImporter", "type": "Interface", - "label": "ImportResponse", + "label": "IImporter", "description": [], "tags": [], "children": [ + { + "id": "def-public.IImporter.read", + "type": "Function", + "label": "read", + "signature": [ + "(data: ArrayBuffer) => { success: boolean; }" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "data", + "isRequired": true, + "signature": [ + "ArrayBuffer" + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 44 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 44 + } + }, + { + "id": "def-public.IImporter.initializeImport", + "type": "Function", + "label": "initializeImport", + "signature": [ + "(index: string, settings: ", + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Settings", + "text": "Settings" + }, + ", mappings: ", + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Mappings", + "text": "Mappings" + }, + ", pipeline: ", + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.IngestPipeline", + "text": "IngestPipeline" + }, + ") => Promise<", + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.ImportResponse", + "text": "ImportResponse" + }, + ">" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "index", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 46 + } + }, + { + "type": "Object", + "label": "settings", + "isRequired": true, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Settings", + "text": "Settings" + } + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 47 + } + }, + { + "type": "Object", + "label": "mappings", + "isRequired": true, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Mappings", + "text": "Mappings" + } + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 48 + } + }, + { + "type": "Object", + "label": "pipeline", + "isRequired": true, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.IngestPipeline", + "text": "IngestPipeline" + } + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 49 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 45 + } + }, + { + "id": "def-public.IImporter.import", + "type": "Function", + "label": "import", + "signature": [ + "(id: string, index: string, pipelineId: string | undefined, setImportProgress: (progress: number) => void) => Promise<", + { + "pluginId": "fileUpload", + "scope": "public", + "docId": "kibFileUploadPluginApi", + "section": "def-public.ImportResults", + "text": "ImportResults" + }, + ">" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "id", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 52 + } + }, + { + "type": "string", + "label": "index", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 53 + } + }, + { + "type": "string", + "label": "pipelineId", + "isRequired": false, + "signature": [ + "string | undefined" + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 54 + } + }, + { + "type": "Function", + "label": "setImportProgress", + "isRequired": true, + "signature": [ + "(progress: number) => void" + ], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 55 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 51 + } + } + ], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 43 + }, + "initialIsOpen": false + }, + { + "id": "def-public.ImportConfig", + "type": "Interface", + "label": "ImportConfig", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.ImportConfig.settings", + "type": "Object", + "label": "settings", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 18 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Settings", + "text": "Settings" + } + ] + }, + { + "tags": [], + "id": "def-public.ImportConfig.mappings", + "type": "Object", + "label": "mappings", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 19 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Mappings", + "text": "Mappings" + } + ] + }, + { + "tags": [], + "id": "def-public.ImportConfig.pipeline", + "type": "Object", + "label": "pipeline", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 20 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.IngestPipeline", + "text": "IngestPipeline" + } + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 17 + }, + "initialIsOpen": false + }, + { + "id": "def-public.ImportFactoryOptions", + "type": "Interface", + "label": "ImportFactoryOptions", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.ImportFactoryOptions.excludeLinesPattern", + "type": "string", + "label": "excludeLinesPattern", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 38 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.ImportFactoryOptions.multilineStartPattern", + "type": "string", + "label": "multilineStartPattern", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 39 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.ImportFactoryOptions.importConfig", + "type": "Object", + "label": "importConfig", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 40 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "public", + "docId": "kibFileUploadPluginApi", + "section": "def-public.ImportConfig", + "text": "ImportConfig" + } + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 37 + }, + "initialIsOpen": false + }, + { + "id": "def-public.ImportFailure", + "type": "Interface", + "label": "ImportFailure", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.ImportFailure.item", + "type": "number", + "label": "item", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 87 + } + }, + { + "tags": [], + "id": "def-public.ImportFailure.reason", + "type": "string", + "label": "reason", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 88 + } + }, + { + "tags": [], + "id": "def-public.ImportFailure.doc", + "type": "CompoundType", + "label": "doc", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 89 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.ImportDoc", + "text": "ImportDoc" + } + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 86 + }, + "initialIsOpen": false + }, + { + "id": "def-public.ImportResponse", + "type": "Interface", + "label": "ImportResponse", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.ImportResponse.success", + "type": "boolean", + "label": "success", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 76 + } + }, + { + "tags": [], + "id": "def-public.ImportResponse.id", + "type": "string", + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 77 + } + }, + { + "tags": [], + "id": "def-public.ImportResponse.index", + "type": "string", + "label": "index", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 78 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.ImportResponse.pipelineId", + "type": "string", + "label": "pipelineId", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 79 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.ImportResponse.docCount", + "type": "number", + "label": "docCount", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 80 + } + }, + { + "tags": [], + "id": "def-public.ImportResponse.failures", + "type": "Array", + "label": "failures", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 81 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.ImportFailure", + "text": "ImportFailure" + }, + "[]" + ] + }, + { + "tags": [], + "id": "def-public.ImportResponse.error", + "type": "Any", + "label": "error", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 82 + }, + "signature": [ + "any" + ] + }, + { + "tags": [], + "id": "def-public.ImportResponse.ingestError", + "type": "CompoundType", + "label": "ingestError", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 83 + }, + "signature": [ + "boolean | undefined" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 75 + }, + "initialIsOpen": false + }, + { + "id": "def-public.ImportResults", + "type": "Interface", + "label": "ImportResults", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.ImportResults.success", + "type": "boolean", + "label": "success", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 24 + } + }, + { + "tags": [], + "id": "def-public.ImportResults.failures", + "type": "Array", + "label": "failures", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 25 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.ImportFailure", + "text": "ImportFailure" + }, + "[] | undefined" + ] + }, + { + "tags": [], + "id": "def-public.ImportResults.docCount", + "type": "number", + "label": "docCount", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 26 + }, + "signature": [ + "number | undefined" + ] + }, + { + "tags": [], + "id": "def-public.ImportResults.error", + "type": "Any", + "label": "error", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 27 + }, + "signature": [ + "any" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/public/importer/types.ts", + "lineNumber": 23 + }, + "initialIsOpen": false + }, + { + "id": "def-public.IngestPipeline", + "type": "Interface", + "label": "IngestPipeline", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.IngestPipeline.description", + "type": "string", + "label": "description", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 120 + } + }, + { + "tags": [], + "id": "def-public.IngestPipeline.processors", + "type": "Array", + "label": "processors", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 121 + }, + "signature": [ + "any[]" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 119 + }, + "initialIsOpen": false + }, + { + "id": "def-public.IngestPipelineWrapper", + "type": "Interface", + "label": "IngestPipelineWrapper", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.IngestPipelineWrapper.id", + "type": "string", + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 115 + } + }, + { + "tags": [], + "id": "def-public.IngestPipelineWrapper.pipeline", + "type": "Object", + "label": "pipeline", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 116 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.IngestPipeline", + "text": "IngestPipeline" + } + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 114 + }, + "initialIsOpen": false + }, + { + "id": "def-public.InputOverrides", + "type": "Interface", + "label": "InputOverrides", + "description": [], + "tags": [], + "children": [ + { + "id": "def-public.InputOverrides.Unnamed", + "type": "Any", + "label": "Unnamed", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 11 + }, + "signature": [ + "any" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 10 + }, + "initialIsOpen": false + }, + { + "id": "def-public.Mappings", + "type": "Interface", + "label": "Mappings", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.Mappings._meta", + "type": "Object", + "label": "_meta", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 106 + }, + "signature": [ + "{ created_by: string; } | undefined" + ] + }, + { + "tags": [], + "id": "def-public.Mappings.properties", + "type": "Object", + "label": "properties", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 109 + }, + "signature": [ + "{ [key: string]: any; }" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 105 + }, + "initialIsOpen": false + }, + { + "id": "def-public.Settings", + "type": "Interface", + "label": "Settings", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.Settings.pipeline", + "type": "string", + "label": "pipeline", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 99 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.Settings.index", + "type": "string", + "label": "index", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 100 + } + }, + { + "tags": [], + "id": "def-public.Settings.body", + "type": "Array", + "label": "body", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 101 + }, + "signature": [ + "any[]" + ] + }, + { + "id": "def-public.Settings.Unnamed", + "type": "Any", + "label": "Unnamed", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 102 + }, + "signature": [ + "any" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 98 + }, + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "tags": [], + "id": "def-public.ABSOLUTE_MAX_FILE_SIZE_BYTES", + "type": "number", + "label": "ABSOLUTE_MAX_FILE_SIZE_BYTES", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 14 + }, + "signature": [ + "1073741274" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.FILE_SIZE_DISPLAY_FORMAT", + "type": "string", + "label": "FILE_SIZE_DISPLAY_FORMAT", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 15 + }, + "signature": [ + "\"0,0.[0] b\"" + ], + "initialIsOpen": false + }, + { + "id": "def-public.FormattedOverrides", + "type": "Type", + "label": "FormattedOverrides", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 14 + }, + "signature": [ + "InputOverrides & { column_names: string[]; has_header_row: boolean; should_trim_fields: boolean; }" + ], + "initialIsOpen": false + }, + { + "id": "def-public.ImportDoc", + "type": "Type", + "label": "ImportDoc", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 96 + }, + "signature": [ + "string | object | ", + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.Doc", + "text": "Doc" + } + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.INDEX_META_DATA_CREATED_BY", + "type": "string", + "label": "INDEX_META_DATA_CREATED_BY", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 19 + }, + "signature": [ + "\"ml-file-data-visualizer\"" + ], + "initialIsOpen": false + }, + { + "id": "def-public.InputData", + "type": "Type", + "label": "InputData", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 73 + }, + "signature": [ + "any[]" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.MAX_FILE_SIZE", + "type": "string", + "label": "MAX_FILE_SIZE", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 11 + }, + "signature": [ + "\"100MB\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.MAX_FILE_SIZE_BYTES", + "type": "number", + "label": "MAX_FILE_SIZE_BYTES", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 12 + }, + "signature": [ + "104857600" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.MB", + "type": "number", + "label": "MB", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 10 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.UI_SETTING_MAX_FILE_SIZE", + "type": "string", + "label": "UI_SETTING_MAX_FILE_SIZE", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/constants.ts", + "lineNumber": 8 + }, + "signature": [ + "\"fileUpload:maxFileSize\"" + ], + "initialIsOpen": false + } + ], + "objects": [], + "start": { + "id": "def-public.FileUploadPluginStart", + "type": "Type", + "label": "FileUploadPluginStart", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/public/plugin.ts", + "lineNumber": 21 + }, + "signature": [ + "FileUploadStartApi" + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "id": "def-common.AnalysisResult", + "type": "Interface", + "label": "AnalysisResult", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.AnalysisResult.results", + "type": "Object", + "label": "results", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 21 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.FindFileStructureResponse", + "text": "FindFileStructureResponse" + } + ] + }, + { + "tags": [], + "id": "def-common.AnalysisResult.overrides", + "type": "CompoundType", + "label": "overrides", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 22 + }, + "signature": [ + { + "pluginId": "fileUpload", + "scope": "common", + "docId": "kibFileUploadPluginApi", + "section": "def-common.FormattedOverrides", + "text": "FormattedOverrides" + }, + " | undefined" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 20 + }, + "initialIsOpen": false + }, + { + "id": "def-common.Doc", + "type": "Interface", + "label": "Doc", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.Doc.message", + "type": "string", + "label": "message", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 93 + } + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 92 + }, + "initialIsOpen": false + }, + { + "id": "def-common.FindFileStructureResponse", + "type": "Interface", + "label": "FindFileStructureResponse", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.FindFileStructureResponse.charset", + "type": "string", + "label": "charset", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 26 + } + }, { "tags": [], - "id": "def-public.ImportResponse.success", + "id": "def-common.FindFileStructureResponse.has_header_row", "type": "boolean", - "label": "success", + "label": "has_header_row", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 9 + "lineNumber": 27 } }, { "tags": [], - "id": "def-public.ImportResponse.id", - "type": "string", - "label": "id", + "id": "def-common.FindFileStructureResponse.has_byte_order_marker", + "type": "boolean", + "label": "has_byte_order_marker", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 10 + "lineNumber": 28 } }, { "tags": [], - "id": "def-public.ImportResponse.index", + "id": "def-common.FindFileStructureResponse.format", "type": "string", - "label": "index", + "label": "format", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 11 + "lineNumber": 29 + } + }, + { + "tags": [], + "id": "def-common.FindFileStructureResponse.field_stats", + "type": "Object", + "label": "field_stats", + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 30 }, "signature": [ - "string | undefined" + "{ [fieldName: string]: { count: number; cardinality: number; top_hits: { count: number; value: any; }[]; mean_value?: number | undefined; median_value?: number | undefined; max_value?: number | undefined; min_value?: number | undefined; earliest?: string | undefined; latest?: string | undefined; }; }" ] }, { "tags": [], - "id": "def-public.ImportResponse.pipelineId", + "id": "def-common.FindFileStructureResponse.sample_start", "type": "string", - "label": "pipelineId", + "label": "sample_start", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 12 - }, - "signature": [ - "string | undefined" - ] + "lineNumber": 43 + } }, { "tags": [], - "id": "def-public.ImportResponse.docCount", + "id": "def-common.FindFileStructureResponse.num_messages_analyzed", "type": "number", - "label": "docCount", + "label": "num_messages_analyzed", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 13 + "lineNumber": 44 } }, { "tags": [], - "id": "def-public.ImportResponse.failures", - "type": "Array", - "label": "failures", + "id": "def-common.FindFileStructureResponse.mappings", + "type": "Object", + "label": "mappings", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 14 + "lineNumber": 45 }, "signature": [ + "{ properties: { [fieldName: string]: { type: ", { - "pluginId": "fileUpload", + "pluginId": "data", "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.ImportFailure", - "text": "ImportFailure" + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" }, - "[]" + ".STRING | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + ".TEXT | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + ".KEYWORD | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + }, + ".BOOLEAN | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.ES_FIELD_TYPES", + "text": "ES_FIELD_TYPES" + } ] }, { "tags": [], - "id": "def-public.ImportResponse.error", - "type": "Any", - "label": "error", + "id": "def-common.FindFileStructureResponse.quote", + "type": "string", + "label": "quote", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 15 - }, - "signature": [ - "any" - ] + "lineNumber": 58 + } }, { "tags": [], - "id": "def-public.ImportResponse.ingestError", - "type": "CompoundType", - "label": "ingestError", + "id": "def-common.FindFileStructureResponse.delimiter", + "type": "string", + "label": "delimiter", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 16 - }, - "signature": [ - "boolean | undefined" - ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 8 - }, - "initialIsOpen": false - }, - { - "id": "def-public.ImportResults", - "type": "Interface", - "label": "ImportResults", - "description": [], - "tags": [], - "children": [ - { - "tags": [], - "id": "def-public.ImportResults.success", - "type": "boolean", - "label": "success", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 24 + "lineNumber": 59 } }, { "tags": [], - "id": "def-public.ImportResults.failures", - "type": "Array", - "label": "failures", + "id": "def-common.FindFileStructureResponse.need_client_timezone", + "type": "boolean", + "label": "need_client_timezone", "description": [], "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 25 - }, - "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.ImportFailure", - "text": "ImportFailure" - }, - "[] | undefined" - ] + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 60 + } }, { "tags": [], - "id": "def-public.ImportResults.docCount", + "id": "def-common.FindFileStructureResponse.num_lines_analyzed", "type": "number", - "label": "docCount", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 26 - }, - "signature": [ - "number | undefined" - ] - }, - { - "tags": [], - "id": "def-public.ImportResults.error", - "type": "Any", - "label": "error", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 27 - }, - "signature": [ - "any" - ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/public/importer/types.ts", - "lineNumber": 23 - }, - "initialIsOpen": false - }, - { - "id": "def-public.IngestPipeline", - "type": "Interface", - "label": "IngestPipeline", - "description": [], - "tags": [], - "children": [ - { - "tags": [], - "id": "def-public.IngestPipeline.description", - "type": "string", - "label": "description", + "label": "num_lines_analyzed", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 53 + "lineNumber": 61 } }, { "tags": [], - "id": "def-public.IngestPipeline.processors", + "id": "def-common.FindFileStructureResponse.column_names", "type": "Array", - "label": "processors", + "label": "column_names", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 54 + "lineNumber": 62 }, "signature": [ - "any[]" + "string[] | undefined" ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 52 - }, - "initialIsOpen": false - }, - { - "id": "def-public.IngestPipelineWrapper", - "type": "Interface", - "label": "IngestPipelineWrapper", - "description": [], - "tags": [], - "children": [ - { - "tags": [], - "id": "def-public.IngestPipelineWrapper.id", - "type": "string", - "label": "id", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 48 - } }, { "tags": [], - "id": "def-public.IngestPipelineWrapper.pipeline", - "type": "Object", - "label": "pipeline", + "id": "def-common.FindFileStructureResponse.explanation", + "type": "Array", + "label": "explanation", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 49 + "lineNumber": 63 }, "signature": [ - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.IngestPipeline", - "text": "IngestPipeline" - } + "string[] | undefined" ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 47 - }, - "initialIsOpen": false - }, - { - "id": "def-public.Mappings", - "type": "Interface", - "label": "Mappings", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-public.Mappings._meta", - "type": "Object", - "label": "_meta", + "id": "def-common.FindFileStructureResponse.grok_pattern", + "type": "string", + "label": "grok_pattern", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 39 + "lineNumber": 64 }, "signature": [ - "{ created_by: string; } | undefined" + "string | undefined" ] }, { "tags": [], - "id": "def-public.Mappings.properties", - "type": "Object", - "label": "properties", + "id": "def-common.FindFileStructureResponse.multiline_start_pattern", + "type": "string", + "label": "multiline_start_pattern", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 42 + "lineNumber": 65 }, "signature": [ - "{ [key: string]: any; }" + "string | undefined" ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 38 - }, - "initialIsOpen": false - }, - { - "id": "def-public.Settings", - "type": "Interface", - "label": "Settings", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-public.Settings.pipeline", + "id": "def-common.FindFileStructureResponse.exclude_lines_pattern", "type": "string", - "label": "pipeline", + "label": "exclude_lines_pattern", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 32 + "lineNumber": 66 }, "signature": [ "string | undefined" @@ -990,225 +1958,59 @@ }, { "tags": [], - "id": "def-public.Settings.index", - "type": "string", - "label": "index", + "id": "def-common.FindFileStructureResponse.java_timestamp_formats", + "type": "Array", + "label": "java_timestamp_formats", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 33 - } + "lineNumber": 67 + }, + "signature": [ + "string[] | undefined" + ] }, { "tags": [], - "id": "def-public.Settings.body", + "id": "def-common.FindFileStructureResponse.joda_timestamp_formats", "type": "Array", - "label": "body", + "label": "joda_timestamp_formats", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 34 + "lineNumber": 68 }, "signature": [ - "any[]" + "string[] | undefined" ] }, { - "id": "def-public.Settings.Unnamed", - "type": "Any", - "label": "Unnamed", "tags": [], + "id": "def-common.FindFileStructureResponse.timestamp_field", + "type": "string", + "label": "timestamp_field", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 35 + "lineNumber": 69 }, "signature": [ - "any" + "string | undefined" ] - } - ], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 31 - }, - "initialIsOpen": false - } - ], - "enums": [], - "misc": [ - { - "tags": [], - "id": "def-public.ABSOLUTE_MAX_FILE_SIZE_BYTES", - "type": "number", - "label": "ABSOLUTE_MAX_FILE_SIZE_BYTES", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 14 - }, - "signature": [ - "1073741274" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-public.FILE_SIZE_DISPLAY_FORMAT", - "type": "string", - "label": "FILE_SIZE_DISPLAY_FORMAT", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 15 - }, - "signature": [ - "\"0,0.[0] b\"" - ], - "initialIsOpen": false - }, - { - "id": "def-public.ImportDoc", - "type": "Type", - "label": "ImportDoc", - "tags": [], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 29 - }, - "signature": [ - "string | object | ", - { - "pluginId": "fileUpload", - "scope": "common", - "docId": "kibFileUploadPluginApi", - "section": "def-common.Doc", - "text": "Doc" - } - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-public.INDEX_META_DATA_CREATED_BY", - "type": "string", - "label": "INDEX_META_DATA_CREATED_BY", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 19 - }, - "signature": [ - "\"ml-file-data-visualizer\"" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-public.MAX_FILE_SIZE", - "type": "string", - "label": "MAX_FILE_SIZE", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 11 - }, - "signature": [ - "\"100MB\"" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-public.MAX_FILE_SIZE_BYTES", - "type": "number", - "label": "MAX_FILE_SIZE_BYTES", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 12 - }, - "signature": [ - "104857600" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-public.MB", - "type": "number", - "label": "MB", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 10 - }, - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-public.UI_SETTING_MAX_FILE_SIZE", - "type": "string", - "label": "UI_SETTING_MAX_FILE_SIZE", - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/common/constants.ts", - "lineNumber": 8 - }, - "signature": [ - "\"fileUpload:maxFileSize\"" - ], - "initialIsOpen": false - } - ], - "objects": [], - "start": { - "id": "def-public.FileUploadPluginStart", - "type": "Type", - "label": "FileUploadPluginStart", - "tags": [], - "description": [], - "source": { - "path": "x-pack/plugins/file_upload/public/plugin.ts", - "lineNumber": 21 - }, - "signature": [ - "FileUploadStartApi" - ], - "lifecycle": "start", - "initialIsOpen": true - } - }, - "server": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [ - { - "id": "def-common.Doc", - "type": "Interface", - "label": "Doc", - "description": [], - "tags": [], - "children": [ + }, { "tags": [], - "id": "def-common.Doc.message", - "type": "string", - "label": "message", + "id": "def-common.FindFileStructureResponse.should_trim_fields", + "type": "CompoundType", + "label": "should_trim_fields", "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 26 - } + "lineNumber": 70 + }, + "signature": [ + "boolean | undefined" + ] } ], "source": { @@ -1232,7 +2034,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 20 + "lineNumber": 87 } }, { @@ -1243,7 +2045,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 21 + "lineNumber": 88 } }, { @@ -1254,7 +2056,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 22 + "lineNumber": 89 }, "signature": [ { @@ -1269,7 +2071,7 @@ ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 19 + "lineNumber": 86 }, "initialIsOpen": false }, @@ -1288,7 +2090,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 9 + "lineNumber": 76 } }, { @@ -1299,7 +2101,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 10 + "lineNumber": 77 } }, { @@ -1310,7 +2112,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 11 + "lineNumber": 78 }, "signature": [ "string | undefined" @@ -1324,7 +2126,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 12 + "lineNumber": 79 }, "signature": [ "string | undefined" @@ -1338,7 +2140,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 13 + "lineNumber": 80 } }, { @@ -1349,7 +2151,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 14 + "lineNumber": 81 }, "signature": [ { @@ -1370,7 +2172,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 15 + "lineNumber": 82 }, "signature": [ "any" @@ -1384,7 +2186,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 16 + "lineNumber": 83 }, "signature": [ "boolean | undefined" @@ -1393,7 +2195,7 @@ ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 8 + "lineNumber": 75 }, "initialIsOpen": false }, @@ -1412,7 +2214,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 53 + "lineNumber": 120 } }, { @@ -1423,7 +2225,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 54 + "lineNumber": 121 }, "signature": [ "any[]" @@ -1432,7 +2234,7 @@ ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 52 + "lineNumber": 119 }, "initialIsOpen": false }, @@ -1451,7 +2253,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 48 + "lineNumber": 115 } }, { @@ -1462,7 +2264,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 49 + "lineNumber": 116 }, "signature": [ { @@ -1477,7 +2279,35 @@ ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 47 + "lineNumber": 114 + }, + "initialIsOpen": false + }, + { + "id": "def-common.InputOverrides", + "type": "Interface", + "label": "InputOverrides", + "description": [], + "tags": [], + "children": [ + { + "id": "def-common.InputOverrides.Unnamed", + "type": "Any", + "label": "Unnamed", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 11 + }, + "signature": [ + "any" + ] + } + ], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 10 }, "initialIsOpen": false }, @@ -1496,7 +2326,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 39 + "lineNumber": 106 }, "signature": [ "{ created_by: string; } | undefined" @@ -1510,7 +2340,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 42 + "lineNumber": 109 }, "signature": [ "{ [key: string]: any; }" @@ -1519,7 +2349,7 @@ ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 38 + "lineNumber": 105 }, "initialIsOpen": false }, @@ -1538,7 +2368,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 32 + "lineNumber": 99 }, "signature": [ "string | undefined" @@ -1552,7 +2382,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 33 + "lineNumber": 100 } }, { @@ -1563,7 +2393,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 34 + "lineNumber": 101 }, "signature": [ "any[]" @@ -1577,7 +2407,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 35 + "lineNumber": 102 }, "signature": [ "any" @@ -1586,7 +2416,7 @@ ], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 31 + "lineNumber": 98 }, "initialIsOpen": false } @@ -1623,6 +2453,21 @@ ], "initialIsOpen": false }, + { + "id": "def-common.FormattedOverrides", + "type": "Type", + "label": "FormattedOverrides", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 14 + }, + "signature": [ + "InputOverrides & { column_names: string[]; has_header_row: boolean; should_trim_fields: boolean; }" + ], + "initialIsOpen": false + }, { "id": "def-common.ImportDoc", "type": "Type", @@ -1631,7 +2476,7 @@ "description": [], "source": { "path": "x-pack/plugins/file_upload/common/types.ts", - "lineNumber": 29 + "lineNumber": 96 }, "signature": [ "string | object | ", @@ -1660,6 +2505,21 @@ ], "initialIsOpen": false }, + { + "id": "def-common.InputData", + "type": "Type", + "label": "InputData", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/file_upload/common/types.ts", + "lineNumber": 73 + }, + "signature": [ + "any[]" + ], + "initialIsOpen": false + }, { "tags": [], "id": "def-common.MAX_FILE_SIZE", diff --git a/api_docs/fleet.json b/api_docs/fleet.json index a4c8dce90a062..d9774d14e4c96 100644 --- a/api_docs/fleet.json +++ b/api_docs/fleet.json @@ -1699,7 +1699,7 @@ "children": [], "source": { "path": "x-pack/plugins/fleet/server/errors/index.ts", - "lineNumber": 34 + "lineNumber": 37 }, "initialIsOpen": false } @@ -1721,6 +1721,45 @@ "tags": [], "returnComment": [], "initialIsOpen": false + }, + { + "id": "def-server.relativeDownloadUrlFromArtifact", + "type": "Function", + "children": [ + { + "type": "Uncategorized", + "label": "{\n identifier,\n decodedSha256,\n}", + "isRequired": true, + "signature": [ + "T" + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/mappings.ts", + "lineNumber": 66 + } + } + ], + "signature": [ + ">({ identifier, decodedSha256, }: T) => string" + ], + "description": [], + "label": "relativeDownloadUrlFromArtifact", + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/mappings.ts", + "lineNumber": 64 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [ @@ -1877,8 +1916,8 @@ "pluginId": "fleet", "scope": "server", "docId": "kibFleetPluginApi", - "section": "def-server.getAgent", - "text": "getAgent" + "section": "def-server.getAgentById", + "text": "getAgentById" } ] }, @@ -2049,8 +2088,8 @@ "pluginId": "fleet", "scope": "server", "docId": "kibFleetPluginApi", - "section": "def-server.listAgents", - "text": "listAgents" + "section": "def-server.getAgentsByKuery", + "text": "getAgentsByKuery" } ] } @@ -2061,6 +2100,318 @@ }, "initialIsOpen": false }, + { + "id": "def-server.Artifact", + "type": "Interface", + "label": "Artifact", + "signature": [ + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.Artifact", + "text": "Artifact" + }, + " extends ", + "NewArtifact" + ], + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-server.Artifact.id", + "type": "string", + "label": "id", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 34 + } + }, + { + "tags": [], + "id": "def-server.Artifact.created", + "type": "string", + "label": "created", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 35 + } + } + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 33 + }, + "initialIsOpen": false + }, + { + "id": "def-server.ArtifactsClientInterface", + "type": "Interface", + "label": "ArtifactsClientInterface", + "description": [ + "\nThe interface exposed out of Fleet's Artifact service via the client class" + ], + "tags": [], + "children": [ + { + "id": "def-server.ArtifactsClientInterface.getArtifact", + "type": "Function", + "label": "getArtifact", + "signature": [ + "(id: string) => Promise<", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.Artifact", + "text": "Artifact" + }, + " | undefined>" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "id", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 79 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 79 + } + }, + { + "id": "def-server.ArtifactsClientInterface.createArtifact", + "type": "Function", + "label": "createArtifact", + "signature": [ + "(options: ", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.ArtifactsClientCreateOptions", + "text": "ArtifactsClientCreateOptions" + }, + ") => Promise<", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.Artifact", + "text": "Artifact" + }, + ">" + ], + "description": [], + "children": [ + { + "type": "CompoundType", + "label": "options", + "isRequired": true, + "signature": [ + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.ArtifactsClientCreateOptions", + "text": "ArtifactsClientCreateOptions" + } + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 81 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 81 + } + }, + { + "id": "def-server.ArtifactsClientInterface.deleteArtifact", + "type": "Function", + "label": "deleteArtifact", + "signature": [ + "(id: string) => Promise" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "id", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 83 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 83 + } + }, + { + "id": "def-server.ArtifactsClientInterface.listArtifacts", + "type": "Function", + "label": "listArtifacts", + "signature": [ + "(options?: ", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.ListArtifactsProps", + "text": "ListArtifactsProps" + }, + " | undefined) => Promise<", + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.ListResult", + "text": "ListResult" + }, + "<", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.Artifact", + "text": "Artifact" + }, + ">>" + ], + "description": [], + "children": [ + { + "type": "CompoundType", + "label": "options", + "isRequired": false, + "signature": [ + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.ListArtifactsProps", + "text": "ListArtifactsProps" + }, + " | undefined" + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 85 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 85 + } + }, + { + "id": "def-server.ArtifactsClientInterface.encodeContent", + "type": "Function", + "label": "encodeContent", + "signature": [ + "(content: string) => Promise>" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "content", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 87 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 87 + } + }, + { + "id": "def-server.ArtifactsClientInterface.generateHash", + "type": "Function", + "label": "generateHash", + "signature": [ + "(content: string) => string" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "content", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 89 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 89 + } + } + ], + "source": { + "path": "x-pack/plugins/fleet/server/services/artifacts/types.ts", + "lineNumber": 78 + }, + "initialIsOpen": false + }, { "id": "def-server.ESIndexPatternService", "type": "Interface", @@ -2164,7 +2515,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 91 + "lineNumber": 94 }, "signature": [ { @@ -2184,7 +2535,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 92 + "lineNumber": 95 }, "signature": [ { @@ -2205,7 +2556,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 93 + "lineNumber": 96 }, "signature": [ { @@ -2226,7 +2577,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 94 + "lineNumber": 97 }, "signature": [ { @@ -2246,7 +2597,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 95 + "lineNumber": 98 }, "signature": [ { @@ -2267,7 +2618,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 96 + "lineNumber": 99 }, "signature": [ "Pick<", @@ -2284,7 +2635,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 90 + "lineNumber": 93 }, "initialIsOpen": false }, @@ -2384,7 +2735,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 134 + "lineNumber": 137 }, "signature": [ "[\"packagePolicyCreate\", (newPackagePolicy: ", @@ -2438,7 +2789,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/index.ts", - "lineNumber": 76 + "lineNumber": 78 }, "signature": [ "any" @@ -2486,7 +2837,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 119 + "lineNumber": 122 }, "signature": [ "void" @@ -2511,7 +2862,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 158 + "lineNumber": 161 }, "signature": [ { @@ -2531,7 +2882,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 159 + "lineNumber": 162 }, "signature": [ { @@ -2551,7 +2902,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 160 + "lineNumber": 163 }, "signature": [ { @@ -2573,7 +2924,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 164 + "lineNumber": 167 }, "signature": [ { @@ -2593,7 +2944,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 165 + "lineNumber": 168 }, "signature": [ { @@ -2615,7 +2966,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 170 + "lineNumber": 173 }, "signature": [ "(...args: ", @@ -2628,11 +2979,34 @@ }, ") => void" ] + }, + { + "tags": [], + "id": "def-server.FleetStartContract.createArtifactsClient", + "type": "Function", + "label": "createArtifactsClient", + "description": [ + "\nCreate a Fleet Artifact Client instance" + ], + "source": { + "path": "x-pack/plugins/fleet/server/plugin.ts", + "lineNumber": 179 + }, + "signature": [ + "(packageName: string) => ", + { + "pluginId": "fleet", + "scope": "server", + "docId": "kibFleetPluginApi", + "section": "def-server.FleetArtifactsClient", + "text": "FleetArtifactsClient" + } + ] } ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 157 + "lineNumber": 160 }, "lifecycle": "start", "initialIsOpen": true @@ -3370,7 +3744,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 148 + "lineNumber": 152 } }, { @@ -3381,7 +3755,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 149 + "lineNumber": 153 }, "signature": [ { @@ -3402,7 +3776,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 150 + "lineNumber": 154 }, "signature": [ "string | undefined" @@ -3416,7 +3790,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 151 + "lineNumber": 155 }, "signature": [ "string | undefined" @@ -3430,7 +3804,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 152 + "lineNumber": 156 }, "signature": [ "string[]" @@ -3439,7 +3813,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 147 + "lineNumber": 151 }, "initialIsOpen": false }, @@ -3475,7 +3849,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 45 + "lineNumber": 49 }, "signature": [ { @@ -3495,7 +3869,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 46 + "lineNumber": 50 }, "signature": [ "any" @@ -3509,7 +3883,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 47 + "lineNumber": 51 }, "signature": [ "string | undefined" @@ -3523,7 +3897,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 48 + "lineNumber": 52 } }, { @@ -3534,7 +3908,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 49 + "lineNumber": 53 } }, { @@ -3545,7 +3919,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 50 + "lineNumber": 54 } }, { @@ -3556,7 +3930,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 51 + "lineNumber": 55 }, "signature": [ "any" @@ -3565,7 +3939,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 44 + "lineNumber": 48 }, "initialIsOpen": false }, @@ -3601,13 +3975,13 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 120 + "lineNumber": 124 } } ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 119 + "lineNumber": 123 }, "initialIsOpen": false }, @@ -3626,7 +4000,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 126 + "lineNumber": 130 }, "signature": [ "any" @@ -3635,7 +4009,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 125 + "lineNumber": 129 }, "initialIsOpen": false }, @@ -3800,7 +4174,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 55 + "lineNumber": 59 } }, { @@ -3811,7 +4185,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 56 + "lineNumber": 60 }, "signature": [ { @@ -3831,7 +4205,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 57 + "lineNumber": 61 }, "signature": [ "{ policy: ", @@ -3853,7 +4227,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 60 + "lineNumber": 64 } }, { @@ -3864,7 +4238,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 61 + "lineNumber": 65 } }, { @@ -3875,7 +4249,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 62 + "lineNumber": 66 } }, { @@ -3886,7 +4260,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 63 + "lineNumber": 67 }, "signature": [ "any" @@ -3895,7 +4269,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 54 + "lineNumber": 58 }, "initialIsOpen": false }, @@ -3924,7 +4298,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 156 + "lineNumber": 160 }, "signature": [ "string | undefined" @@ -3938,7 +4312,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 157 + "lineNumber": 161 }, "signature": [ "string[] | undefined" @@ -3947,7 +4321,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 155 + "lineNumber": 159 }, "initialIsOpen": false }, @@ -4048,28 +4422,6 @@ "description": [], "tags": [], "children": [ - { - "tags": [], - "id": "def-common.BaseSettings.agent_auto_upgrade", - "type": "boolean", - "label": "agent_auto_upgrade", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 11 - } - }, - { - "tags": [], - "id": "def-common.BaseSettings.package_auto_upgrade", - "type": "boolean", - "label": "package_auto_upgrade", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 12 - } - }, { "tags": [], "id": "def-common.BaseSettings.kibana_urls", @@ -4078,7 +4430,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 13 + "lineNumber": 11 }, "signature": [ "string[]" @@ -4092,7 +4444,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 14 + "lineNumber": 12 }, "signature": [ "string | undefined" @@ -4106,7 +4458,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 15 + "lineNumber": 13 }, "signature": [ "boolean | undefined" @@ -5184,7 +5536,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 169 + "lineNumber": 173 }, "signature": [ "number | undefined" @@ -5200,7 +5552,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 173 + "lineNumber": 177 }, "signature": [ "string | undefined" @@ -5216,7 +5568,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 177 + "lineNumber": 181 }, "signature": [ { @@ -5238,7 +5590,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 181 + "lineNumber": 185 } }, { @@ -5251,7 +5603,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 185 + "lineNumber": 189 } }, { @@ -5264,7 +5616,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 189 + "lineNumber": 193 }, "signature": [ "string | undefined" @@ -5280,7 +5632,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 193 + "lineNumber": 197 }, "signature": [ "string | undefined" @@ -5296,7 +5648,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 197 + "lineNumber": 201 }, "signature": [ "string | null | undefined" @@ -5312,7 +5664,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 201 + "lineNumber": 205 }, "signature": [ "string | null | undefined" @@ -5328,7 +5680,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 205 + "lineNumber": 209 }, "signature": [ "string | undefined" @@ -5342,7 +5694,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 206 + "lineNumber": 210 }, "signature": [ { @@ -5365,7 +5717,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 210 + "lineNumber": 214 }, "signature": [ { @@ -5387,7 +5739,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 214 + "lineNumber": 218 }, "signature": [ { @@ -5409,7 +5761,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 218 + "lineNumber": 222 }, "signature": [ "string | undefined" @@ -5425,7 +5777,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 222 + "lineNumber": 226 }, "signature": [ "number | null | undefined" @@ -5441,7 +5793,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 226 + "lineNumber": 230 }, "signature": [ "number | undefined" @@ -5457,7 +5809,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 230 + "lineNumber": 234 }, "signature": [ "string | undefined" @@ -5473,7 +5825,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 234 + "lineNumber": 238 }, "signature": [ "string | undefined" @@ -5489,7 +5841,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 238 + "lineNumber": 242 }, "signature": [ "\"online\" | \"error\" | \"updating\" | \"degraded\" | undefined" @@ -5505,7 +5857,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 242 + "lineNumber": 246 }, "signature": [ "string | undefined" @@ -5521,7 +5873,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 246 + "lineNumber": 250 }, "signature": [ "string | undefined" @@ -5537,7 +5889,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 250 + "lineNumber": 254 }, "signature": [ "string | undefined" @@ -5553,7 +5905,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 254 + "lineNumber": 258 }, "signature": [ "string[] | undefined" @@ -5569,7 +5921,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 258 + "lineNumber": 262 }, "signature": [ "number | undefined" @@ -5578,7 +5930,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 165 + "lineNumber": 169 }, "initialIsOpen": false }, @@ -5601,7 +5953,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 282 + "lineNumber": 286 }, "signature": [ "string | undefined" @@ -5617,7 +5969,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 286 + "lineNumber": 290 }, "signature": [ "number | undefined" @@ -5633,7 +5985,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 290 + "lineNumber": 294 }, "signature": [ "string | undefined" @@ -5649,7 +6001,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 294 + "lineNumber": 298 }, "signature": [ "string | undefined" @@ -5665,7 +6017,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 298 + "lineNumber": 302 }, "signature": [ "string | undefined" @@ -5681,7 +6033,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 302 + "lineNumber": 306 }, "signature": [ "string | undefined" @@ -5697,7 +6049,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 306 + "lineNumber": 310 }, "signature": [ "string | undefined" @@ -5713,7 +6065,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 310 + "lineNumber": 314 }, "signature": [ "string[] | undefined" @@ -5729,7 +6081,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 314 + "lineNumber": 318 }, "signature": [ "{ [k: string]: unknown; } | undefined" @@ -5743,7 +6095,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 317 + "lineNumber": 321 }, "signature": [ "any" @@ -5752,7 +6104,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 278 + "lineNumber": 282 }, "initialIsOpen": false }, @@ -5775,7 +6127,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 267 + "lineNumber": 271 } }, { @@ -5788,7 +6140,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 271 + "lineNumber": 275 } }, { @@ -5799,7 +6151,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 272 + "lineNumber": 276 }, "signature": [ "any" @@ -5808,7 +6160,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 263 + "lineNumber": 267 }, "initialIsOpen": false }, @@ -8497,7 +8849,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 39 + "lineNumber": 43 }, "signature": [ { @@ -8517,7 +8869,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 40 + "lineNumber": 44 }, "signature": [ "any" @@ -8531,7 +8883,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 41 + "lineNumber": 45 }, "signature": [ "string | undefined" @@ -8540,7 +8892,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 38 + "lineNumber": 42 }, "initialIsOpen": false }, @@ -8559,7 +8911,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 94 + "lineNumber": 98 }, "signature": [ "\"STATE\" | \"ERROR\" | \"ACTION_RESULT\" | \"ACTION\"" @@ -8573,7 +8925,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 95 + "lineNumber": 99 }, "signature": [ "\"RUNNING\" | \"STARTING\" | \"IN_PROGRESS\" | \"CONFIG\" | \"FAILED\" | \"STOPPING\" | \"STOPPED\" | \"DEGRADED\" | \"UPDATING\" | \"DATA_DUMP\" | \"ACKNOWLEDGED\" | \"UNKNOWN\"" @@ -8587,7 +8939,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 110 + "lineNumber": 114 } }, { @@ -8598,7 +8950,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 111 + "lineNumber": 115 } }, { @@ -8609,7 +8961,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 112 + "lineNumber": 116 }, "signature": [ "any" @@ -8623,7 +8975,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 113 + "lineNumber": 117 } }, { @@ -8634,7 +8986,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 114 + "lineNumber": 118 }, "signature": [ "string | undefined" @@ -8648,7 +9000,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 115 + "lineNumber": 119 }, "signature": [ "string | undefined" @@ -8662,7 +9014,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 116 + "lineNumber": 120 }, "signature": [ "string | undefined" @@ -8671,7 +9023,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 93 + "lineNumber": 97 }, "initialIsOpen": false }, @@ -10803,7 +11155,7 @@ "section": "def-common.Settings", "text": "Settings" }, - ", \"agent_auto_upgrade\" | \"package_auto_upgrade\" | \"kibana_urls\" | \"kibana_ca_sha256\" | \"has_seen_add_data_notice\">>" + ", \"kibana_urls\" | \"kibana_ca_sha256\" | \"has_seen_add_data_notice\">>" ] } ], @@ -11616,13 +11968,13 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 19 + "lineNumber": 17 } } ], "source": { "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 18 + "lineNumber": 16 }, "initialIsOpen": false }, @@ -11654,7 +12006,7 @@ "children": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/settings.ts", - "lineNumber": 22 + "lineNumber": 20 }, "initialIsOpen": false }, @@ -11930,7 +12282,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 277 + "lineNumber": 278 }, "initialIsOpen": false } @@ -12211,7 +12563,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 84 + "lineNumber": 88 }, "signature": [ "CommonAgentActionSOAttributes & { agent_id: string; }" @@ -12226,7 +12578,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 30 + "lineNumber": 34 }, "signature": [ "\"POLICY_CHANGE\" | \"UNENROLL\" | \"UPGRADE\" | \"SETTINGS\" | \"INTERNAL_POLICY_REASSIGN\"" @@ -12256,7 +12608,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 123 + "lineNumber": 127 }, "signature": [ "NewAgentEvent" @@ -12271,7 +12623,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 87 + "lineNumber": 91 }, "signature": [ "CommonAgentActionSOAttributes & { policy_id: string; policy_revision: number; }" @@ -12286,7 +12638,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 68 + "lineNumber": 72 }, "signature": [ "Pick & { type: 'CONFIG_CHANGE'; data: { config: FullAgentPolicy;}; }" @@ -12346,7 +12698,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 17 + "lineNumber": 21 }, "signature": [ "\"warning\" | \"offline\" | \"online\" | \"error\" | \"inactive\" | \"enrolling\" | \"unenrolling\" | \"updating\" | \"degraded\"" @@ -12361,7 +12713,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 12 + "lineNumber": 16 }, "signature": [ "\"PERMANENT\" | \"EPHEMERAL\" | \"TEMPORARY\"" @@ -12534,7 +12886,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 91 + "lineNumber": 95 }, "signature": [ { @@ -12804,6 +13156,21 @@ ], "initialIsOpen": false }, + { + "tags": [], + "id": "def-common.FLEET_SERVER_ARTIFACTS_INDEX", + "type": "string", + "label": "FLEET_SERVER_ARTIFACTS_INDEX", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/constants/index.ts", + "lineNumber": 27 + }, + "signature": [ + "\".fleet-artifacts\"" + ], + "initialIsOpen": false + }, { "tags": [], "id": "def-common.FLEET_SERVER_INDICES", @@ -12812,7 +13179,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/index.ts", - "lineNumber": 27 + "lineNumber": 29 }, "signature": [ "string[]" @@ -13512,7 +13879,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/epm.ts", - "lineNumber": 289 + "lineNumber": 277 }, "signature": [ "\"string\" | \"text\" | \"password\" | \"integer\" | \"bool\" | \"yaml\"" @@ -13643,7 +14010,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/models/agent.ts", - "lineNumber": 28 + "lineNumber": 32 }, "signature": [ "\"offline\" | \"inactive\" | \"updating\" | \"healthy\" | \"unhealthy\"" diff --git a/api_docs/global_search.json b/api_docs/global_search.json index 1743ce6e588b1..985abf3417935 100644 --- a/api_docs/global_search.json +++ b/api_docs/global_search.json @@ -527,7 +527,7 @@ "lineNumber": 72 }, "signature": [ - "Pick & { url: string; }" + "Pick & { url: string; }" ], "initialIsOpen": false } @@ -1242,7 +1242,7 @@ "lineNumber": 72 }, "signature": [ - "Pick & { url: string; }" + "Pick & { url: string; }" ], "initialIsOpen": false } diff --git a/api_docs/kibana_react.json b/api_docs/kibana_react.json index 7541987ba4215..79ea4b3f66132 100644 --- a/api_docs/kibana_react.json +++ b/api_docs/kibana_react.json @@ -2042,7 +2042,7 @@ }, " extends Pick<", "EuiTokenProps", - ", \"children\" | \"onClick\" | \"onChange\" | \"color\" | \"id\" | \"title\" | \"size\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"fill\" | \"shape\">" + ", \"children\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"size\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"fill\" | \"shape\">" ], "description": [], "tags": [], diff --git a/api_docs/lens.json b/api_docs/lens.json index 235f2021e9823..abebd217ad7d5 100644 --- a/api_docs/lens.json +++ b/api_docs/lens.json @@ -1618,7 +1618,7 @@ "lineNumber": 38 }, "signature": [ - "Pick & { attributes: LensAttributes<'lnsXY', XYState> | LensAttributes<'lnsPie', PieVisualizationState> | LensAttributes<'lnsDatatable', DatatableVisualizationState> | LensAttributes<'lnsMetric', MetricState>; }" + "Pick & { attributes: LensAttributes<'lnsXY', XYState> | LensAttributes<'lnsPie', PieVisualizationState> | LensAttributes<'lnsDatatable', DatatableVisualizationState> | LensAttributes<'lnsMetric', MetricState>; }" ], "initialIsOpen": false }, diff --git a/api_docs/lists.json b/api_docs/lists.json index 3e6a22c538504..fe06ebe62ce23 100644 --- a/api_docs/lists.json +++ b/api_docs/lists.json @@ -2296,7 +2296,7 @@ "children": [ { "type": "Object", - "label": "{ spaceId, user, config, callCluster }", + "label": "{ spaceId, user, config, esClient }", "isRequired": true, "signature": [ { diff --git a/api_docs/management.json b/api_docs/management.json index 5441f665c7784..fb3c2ad2c33cf 100644 --- a/api_docs/management.json +++ b/api_docs/management.json @@ -175,7 +175,7 @@ "section": "def-public.CreateManagementItemArgs", "text": "CreateManagementItemArgs" }, - ", \"title\" | \"order\" | \"euiIconType\" | \"icon\" | \"tip\"> & Pick<{ id: string; }, \"id\"> & Pick<{ id: string; }, never>, \"id\" | \"title\" | \"order\" | \"euiIconType\" | \"icon\" | \"tip\">" + ", \"title\" | \"order\" | \"euiIconType\" | \"icon\" | \"tip\"> & Pick<{ id: string; }, \"id\"> & Pick<{ id: string; }, never>, \"title\" | \"id\" | \"order\" | \"euiIconType\" | \"icon\" | \"tip\">" ], "description": [], "source": { @@ -204,7 +204,7 @@ "section": "def-public.RegisterManagementAppArgs", "text": "RegisterManagementAppArgs" }, - ", \"id\" | \"title\" | \"order\" | \"meta\" | \"mount\" | \"euiIconType\" | \"icon\" | \"tip\">) => ", + ", \"title\" | \"id\" | \"order\" | \"meta\" | \"mount\" | \"euiIconType\" | \"icon\" | \"tip\">) => ", { "pluginId": "management", "scope": "public", @@ -228,7 +228,7 @@ "section": "def-public.RegisterManagementAppArgs", "text": "RegisterManagementAppArgs" }, - ", \"id\" | \"title\" | \"order\" | \"meta\" | \"mount\" | \"euiIconType\" | \"icon\" | \"tip\">" + ", \"title\" | \"id\" | \"order\" | \"meta\" | \"mount\" | \"euiIconType\" | \"icon\" | \"tip\">" ], "description": [], "source": { diff --git a/api_docs/maps.json b/api_docs/maps.json index 6c5c7110bb1e0..7d25efab1f6f5 100644 --- a/api_docs/maps.json +++ b/api_docs/maps.json @@ -16,7 +16,7 @@ "type": "Function", "label": "addFilters", "signature": [ - "(filter: object) => void" + "(filter: object, actionId: string) => void" ], "description": [], "children": [ @@ -32,6 +32,19 @@ "path": "x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts", "lineNumber": 32 } + }, + { + "type": "string", + "label": "actionId", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts", + "lineNumber": 32 + } } ], "tags": [], @@ -409,10 +422,1558 @@ }, "common": { "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] + "functions": [ + { + "id": "def-common.getEditPath", + "type": "Function", + "label": "getEditPath", + "signature": [ + "(id: string) => string" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "id", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 64 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 64 + }, + "initialIsOpen": false + }, + { + "id": "def-common.getExistingMapPath", + "type": "Function", + "label": "getExistingMapPath", + "signature": [ + "(id: string) => string" + ], + "description": [], + "children": [ + { + "type": "string", + "label": "id", + "isRequired": true, + "signature": [ + "string" + ], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 61 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 61 + }, + "initialIsOpen": false + }, + { + "id": "def-common.getNewMapPath", + "type": "Function", + "label": "getNewMapPath", + "signature": [ + "() => string" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 58 + }, + "initialIsOpen": false + } + ], + "interfaces": [ + { + "id": "def-common.BodySettings", + "type": "Interface", + "label": "BodySettings", + "description": [], + "tags": [], + "children": [ + { + "id": "def-common.BodySettings.Unnamed", + "type": "Any", + "label": "Unnamed", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 23 + }, + "signature": [ + "any" + ] + } + ], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 22 + }, + "initialIsOpen": false + }, + { + "id": "def-common.CreateDocSourceResp", + "type": "Interface", + "label": "CreateDocSourceResp", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.CreateDocSourceResp.success", + "type": "boolean", + "label": "success", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 9 + } + }, + { + "tags": [], + "id": "def-common.CreateDocSourceResp.error", + "type": "Object", + "label": "error", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 10 + }, + "signature": [ + "Error | undefined" + ] + } + ], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 8 + }, + "initialIsOpen": false + }, + { + "id": "def-common.IndexSourceMappings", + "type": "Interface", + "label": "IndexSourceMappings", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.IndexSourceMappings._meta", + "type": "Object", + "label": "_meta", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 14 + }, + "signature": [ + "{ created_by: string; } | undefined" + ] + }, + { + "tags": [], + "id": "def-common.IndexSourceMappings.properties", + "type": "Object", + "label": "properties", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 17 + }, + "signature": [ + "{ [key: string]: any; }" + ] + } + ], + "source": { + "path": "x-pack/plugins/maps/common/types.ts", + "lineNumber": 13 + }, + "initialIsOpen": false + } + ], + "enums": [ + { + "id": "def-common.AGG_TYPE", + "type": "Enum", + "label": "AGG_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 161 + }, + "initialIsOpen": false + }, + { + "id": "def-common.COLOR_MAP_TYPE", + "type": "Enum", + "label": "COLOR_MAP_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 209 + }, + "initialIsOpen": false + }, + { + "id": "def-common.DATA_MAPPING_FUNCTION", + "type": "Enum", + "label": "DATA_MAPPING_FUNCTION", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 290 + }, + "initialIsOpen": false + }, + { + "id": "def-common.DRAW_TYPE", + "type": "Enum", + "label": "DRAW_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 154 + }, + "initialIsOpen": false + }, + { + "id": "def-common.ES_GEO_FIELD_TYPE", + "type": "Enum", + "label": "ES_GEO_FIELD_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 121 + }, + "initialIsOpen": false + }, + { + "id": "def-common.ES_SPATIAL_RELATIONS", + "type": "Enum", + "label": "ES_SPATIAL_RELATIONS", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 129 + }, + "initialIsOpen": false + }, + { + "id": "def-common.FIELD_ORIGIN", + "type": "Enum", + "label": "FIELD_ORIGIN", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 94 + }, + "initialIsOpen": false + }, + { + "id": "def-common.FORMAT_TYPE", + "type": "Enum", + "label": "FORMAT_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 253 + }, + "initialIsOpen": false + }, + { + "id": "def-common.GEO_JSON_TYPE", + "type": "Enum", + "label": "GEO_JSON_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 135 + }, + "initialIsOpen": false + }, + { + "id": "def-common.GRID_RESOLUTION", + "type": "Enum", + "label": "GRID_RESOLUTION", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 178 + }, + "initialIsOpen": false + }, + { + "id": "def-common.INITIAL_LOCATION", + "type": "Enum", + "label": "INITIAL_LOCATION", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 265 + }, + "initialIsOpen": false + }, + { + "id": "def-common.LABEL_BORDER_SIZES", + "type": "Enum", + "label": "LABEL_BORDER_SIZES", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 222 + }, + "initialIsOpen": false + }, + { + "id": "def-common.LAYER_STYLE_TYPE", + "type": "Enum", + "label": "LAYER_STYLE_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 203 + }, + "initialIsOpen": false + }, + { + "id": "def-common.LAYER_TYPE", + "type": "Enum", + "label": "LAYER_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 68 + }, + "initialIsOpen": false + }, + { + "id": "def-common.LAYER_WIZARD_CATEGORY", + "type": "Enum", + "label": "LAYER_WIZARD_CATEGORY", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 272 + }, + "initialIsOpen": false + }, + { + "id": "def-common.MB_LOOKUP_FUNCTION", + "type": "Enum", + "label": "MB_LOOKUP_FUNCTION", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 285 + }, + "initialIsOpen": false + }, + { + "id": "def-common.MVT_FIELD_TYPE", + "type": "Enum", + "label": "MVT_FIELD_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 258 + }, + "initialIsOpen": false + }, + { + "id": "def-common.RENDER_AS", + "type": "Enum", + "label": "RENDER_AS", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 172 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SCALING_TYPES", + "type": "Enum", + "label": "SCALING_TYPES", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 246 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SOURCE_TYPES", + "type": "Enum", + "label": "SOURCE_TYPES", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 77 + }, + "initialIsOpen": false + }, + { + "id": "def-common.STYLE_TYPE", + "type": "Enum", + "label": "STYLE_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 198 + }, + "initialIsOpen": false + }, + { + "id": "def-common.SYMBOLIZE_AS_TYPES", + "type": "Enum", + "label": "SYMBOLIZE_AS_TYPES", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 217 + }, + "initialIsOpen": false + }, + { + "id": "def-common.VECTOR_SHAPE_TYPE", + "type": "Enum", + "label": "VECTOR_SHAPE_TYPE", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 278 + }, + "initialIsOpen": false + }, + { + "id": "def-common.VECTOR_STYLES", + "type": "Enum", + "label": "VECTOR_STYLES", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 231 + }, + "initialIsOpen": false + } + ], + "misc": [ + { + "tags": [], + "id": "def-common.AGG_DELIMITER", + "type": "string", + "label": "AGG_DELIMITER", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 160 + }, + "signature": [ + "\"_of_\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.API_ROOT_PATH", + "type": "string", + "label": "API_ROOT_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 44 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.APP_ICON", + "type": "string", + "label": "APP_ICON", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 31 + }, + "signature": [ + "\"gisApp\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.APP_ICON_SOLUTION", + "type": "string", + "label": "APP_ICON_SOLUTION", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 32 + }, + "signature": [ + "\"logoKibana\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.APP_ID", + "type": "string", + "label": "APP_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 30 + }, + "signature": [ + "\"maps\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.APP_NAME", + "type": "string", + "label": "APP_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 33 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.CATEGORICAL_DATA_TYPES", + "type": "Array", + "label": "CATEGORICAL_DATA_TYPES", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 214 + }, + "signature": [ + "string[]" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.COUNT_PROP_LABEL", + "type": "string", + "label": "COUNT_PROP_LABEL", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 192 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.COUNT_PROP_NAME", + "type": "string", + "label": "COUNT_PROP_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 196 + }, + "signature": [ + "\"doc_count\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DECIMAL_DEGREES_PRECISION", + "type": "number", + "label": "DECIMAL_DEGREES_PRECISION", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 110 + }, + "signature": [ + "5" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_ICON", + "type": "string", + "label": "DEFAULT_ICON", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 229 + }, + "signature": [ + "\"marker\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_MAX_BUCKETS_LIMIT", + "type": "number", + "label": "DEFAULT_MAX_BUCKETS_LIMIT", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 114 + }, + "signature": [ + "65535" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_MAX_INNER_RESULT_WINDOW", + "type": "number", + "label": "DEFAULT_MAX_INNER_RESULT_WINDOW", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 113 + }, + "signature": [ + "100" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_MAX_RESULT_WINDOW", + "type": "number", + "label": "DEFAULT_MAX_RESULT_WINDOW", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 112 + }, + "signature": [ + "10000" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_PERCENTILE", + "type": "number", + "label": "DEFAULT_PERCENTILE", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 190 + }, + "signature": [ + "50" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_PERCENTILES", + "type": "Array", + "label": "DEFAULT_PERCENTILES", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 294 + }, + "signature": [ + "number[]" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_APP_NAME", + "type": "string", + "label": "EMS_APP_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 11 + }, + "signature": [ + "\"kibana\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_CATALOGUE_PATH", + "type": "string", + "label": "EMS_CATALOGUE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 12 + }, + "signature": [ + "\"ems/catalogue\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_FILES_API_PATH", + "type": "string", + "label": "EMS_FILES_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 15 + }, + "signature": [ + "\"ems/files\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_FILES_CATALOGUE_PATH", + "type": "string", + "label": "EMS_FILES_CATALOGUE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 14 + }, + "signature": [ + "\"ems/files\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_FILES_DEFAULT_JSON_PATH", + "type": "string", + "label": "EMS_FILES_DEFAULT_JSON_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 16 + }, + "signature": [ + "\"file\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_GLYPHS_PATH", + "type": "string", + "label": "EMS_GLYPHS_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 17 + }, + "signature": [ + "\"fonts\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_SPRITES_PATH", + "type": "string", + "label": "EMS_SPRITES_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 18 + }, + "signature": [ + "\"sprites\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_API_PATH", + "type": "string", + "label": "EMS_TILES_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 21 + }, + "signature": [ + "\"ems/tiles\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_CATALOGUE_PATH", + "type": "string", + "label": "EMS_TILES_CATALOGUE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 20 + }, + "signature": [ + "\"ems/tiles\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_RASTER_STYLE_PATH", + "type": "string", + "label": "EMS_TILES_RASTER_STYLE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 22 + }, + "signature": [ + "\"raster/style\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_RASTER_TILE_PATH", + "type": "string", + "label": "EMS_TILES_RASTER_TILE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 23 + }, + "signature": [ + "\"raster/tile\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_VECTOR_SOURCE_PATH", + "type": "string", + "label": "EMS_TILES_VECTOR_SOURCE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 26 + }, + "signature": [ + "\"vector/source\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_VECTOR_STYLE_PATH", + "type": "string", + "label": "EMS_TILES_VECTOR_STYLE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 25 + }, + "signature": [ + "\"vector/style\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.EMS_TILES_VECTOR_TILE_PATH", + "type": "string", + "label": "EMS_TILES_VECTOR_TILE_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 27 + }, + "signature": [ + "\"vector/tile\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.ES_GEO_FIELD_TYPES", + "type": "Array", + "label": "ES_GEO_FIELD_TYPES", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 127 + }, + "signature": [ + "string[]" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.FEATURE_ID_PROPERTY_NAME", + "type": "string", + "label": "FEATURE_ID_PROPERTY_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 116 + }, + "signature": [ + "\"__kbn__feature_id__\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.FEATURE_VISIBLE_PROPERTY_NAME", + "type": "string", + "label": "FEATURE_VISIBLE_PROPERTY_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 117 + }, + "signature": [ + "\"__kbn_isvisibleduetojoin__\"" + ], + "initialIsOpen": false + }, + { + "id": "def-common.FieldFormatter", + "type": "Type", + "label": "FieldFormatter", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 298 + }, + "signature": [ + "(value: ", + { + "pluginId": "maps", + "scope": "common", + "docId": "kibMapsPluginApi", + "section": "def-common.RawValue", + "text": "RawValue" + }, + ") => React.ReactText" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.FONTS_API_PATH", + "type": "string", + "label": "FONTS_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 42 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.FORMATTERS_DATA_REQUEST_ID_SUFFIX", + "type": "string", + "label": "FORMATTERS_DATA_REQUEST_ID_SUFFIX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 101 + }, + "signature": [ + "\"formatters\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.GEOCENTROID_AGG_NAME", + "type": "string", + "label": "GEOCENTROID_AGG_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 187 + }, + "signature": [ + "\"gridCentroid\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.GEOTILE_GRID_AGG_NAME", + "type": "string", + "label": "GEOTILE_GRID_AGG_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 186 + }, + "signature": [ + "\"gridSplit\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.GIS_API_PATH", + "type": "string", + "label": "GIS_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 40 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.INDEX_META_DATA_CREATED_BY", + "type": "string", + "label": "INDEX_META_DATA_CREATED_BY", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 300 + }, + "signature": [ + "\"maps-drawing-data-ingest\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.INDEX_SETTINGS_API_PATH", + "type": "string", + "label": "INDEX_SETTINGS_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 41 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.INDEX_SOURCE_API_PATH", + "type": "string", + "label": "INDEX_SOURCE_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 43 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.INITIAL_LAYERS_KEY", + "type": "string", + "label": "INITIAL_LAYERS_KEY", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 36 + }, + "signature": [ + "\"initialLayers\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.JOIN_FIELD_NAME_PREFIX", + "type": "string", + "label": "JOIN_FIELD_NAME_PREFIX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 98 + }, + "signature": [ + "\"__kbnjoin__\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.KBN_IS_CENTROID_FEATURE", + "type": "string", + "label": "KBN_IS_CENTROID_FEATURE", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 55 + }, + "signature": [ + "\"__kbn_is_centroid_feature__\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.KBN_TOO_MANY_FEATURES_IMAGE_ID", + "type": "string", + "label": "KBN_TOO_MANY_FEATURES_IMAGE_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 52 + }, + "signature": [ + "\"__kbn_too_many_features_image_id__\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.KBN_TOO_MANY_FEATURES_PROPERTY", + "type": "string", + "label": "KBN_TOO_MANY_FEATURES_PROPERTY", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 51 + }, + "signature": [ + "\"__kbn_too_many_features__\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.LAT_INDEX", + "type": "number", + "label": "LAT_INDEX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 147 + }, + "signature": [ + "1" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.LON_INDEX", + "type": "number", + "label": "LON_INDEX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 146 + }, + "signature": [ + "0" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MAP_PATH", + "type": "string", + "label": "MAP_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 39 + }, + "signature": [ + "\"map\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MAP_SAVED_OBJECT_TYPE", + "type": "string", + "label": "MAP_SAVED_OBJECT_TYPE", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 29 + }, + "signature": [ + "\"map\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MAPS_APP_PATH", + "type": "string", + "label": "MAPS_APP_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 38 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MAX_ZOOM", + "type": "number", + "label": "MAX_ZOOM", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 108 + }, + "signature": [ + "24" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER", + "type": "string", + "label": "MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 119 + }, + "signature": [ + "\"_\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.META_DATA_REQUEST_ID_SUFFIX", + "type": "string", + "label": "META_DATA_REQUEST_ID_SUFFIX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 100 + }, + "signature": [ + "\"meta\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MIN_ZOOM", + "type": "number", + "label": "MIN_ZOOM", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 107 + }, + "signature": [ + "0" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MVT_GETGRIDTILE_API_PATH", + "type": "string", + "label": "MVT_GETGRIDTILE_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 47 + }, + "signature": [ + "\"mvt/getGridTile\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MVT_GETTILE_API_PATH", + "type": "string", + "label": "MVT_GETTILE_API_PATH", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 46 + }, + "signature": [ + "\"mvt/getTile\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.MVT_SOURCE_LAYER_NAME", + "type": "string", + "label": "MVT_SOURCE_LAYER_NAME", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 48 + }, + "signature": [ + "\"source_layer\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.ORDINAL_DATA_TYPES", + "type": "Array", + "label": "ORDINAL_DATA_TYPES", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 215 + }, + "signature": [ + "string[]" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.POLYGON_COORDINATES_EXTERIOR_INDEX", + "type": "number", + "label": "POLYGON_COORDINATES_EXTERIOR_INDEX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 145 + }, + "signature": [ + "0" + ], + "initialIsOpen": false + }, + { + "id": "def-common.RawValue", + "type": "Type", + "label": "RawValue", + "tags": [], + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 296 + }, + "signature": [ + "undefined | null | string | number | false | true" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SOURCE_BOUNDS_DATA_REQUEST_ID", + "type": "string", + "label": "SOURCE_BOUNDS_DATA_REQUEST_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 105 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SOURCE_DATA_REQUEST_ID", + "type": "string", + "label": "SOURCE_DATA_REQUEST_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 102 + }, + "signature": [ + "\"source\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SOURCE_FORMATTERS_DATA_REQUEST_ID", + "type": "string", + "label": "SOURCE_FORMATTERS_DATA_REQUEST_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 104 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SOURCE_META_DATA_REQUEST_ID", + "type": "string", + "label": "SOURCE_META_DATA_REQUEST_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 103 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SPATIAL_FILTERS_LAYER_ID", + "type": "string", + "label": "SPATIAL_FILTERS_LAYER_ID", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 263 + }, + "signature": [ + "\"SPATIAL_FILTERS_LAYER_ID\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SUPER_FINE_ZOOM_DELTA", + "type": "number", + "label": "SUPER_FINE_ZOOM_DELTA", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 185 + }, + "signature": [ + "7" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.TOP_TERM_PERCENTAGE_SUFFIX", + "type": "string", + "label": "TOP_TERM_PERCENTAGE_SUFFIX", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 189 + }, + "signature": [ + "\"__percentage\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.ZOOM_PRECISION", + "type": "number", + "label": "ZOOM_PRECISION", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 111 + }, + "signature": [ + "2" + ], + "initialIsOpen": false + } + ], + "objects": [ + { + "id": "def-common.EMPTY_FEATURE_COLLECTION", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.EMPTY_FEATURE_COLLECTION.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 150 + }, + "signature": [ + "\"FeatureCollection\"" + ] + }, + { + "tags": [], + "id": "def-common.EMPTY_FEATURE_COLLECTION.features", + "type": "Array", + "label": "features", + "description": [], + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 151 + }, + "signature": [ + "never[]" + ] + } + ], + "description": [], + "label": "EMPTY_FEATURE_COLLECTION", + "source": { + "path": "x-pack/plugins/maps/common/constants.ts", + "lineNumber": 149 + }, + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 3e95ab1f79e98..9799fa1769391 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -22,3 +22,20 @@ import mapsObj from './maps.json'; ### Consts, variables and types +## Common + +### Objects + + +### Functions + + +### Interfaces + + +### Enums + + +### Consts, variables and types + + diff --git a/api_docs/maps_ems.json b/api_docs/maps_ems.json new file mode 100644 index 0000000000000..472f697420767 --- /dev/null +++ b/api_docs/maps_ems.json @@ -0,0 +1,1157 @@ +{ + "id": "mapsEms", + "client": { + "classes": [], + "functions": [], + "interfaces": [ + { + "id": "def-public.FileLayer", + "type": "Interface", + "label": "FileLayer", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.FileLayer.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 18 + } + }, + { + "tags": [], + "id": "def-public.FileLayer.origin", + "type": "string", + "label": "origin", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 19 + } + }, + { + "tags": [], + "id": "def-public.FileLayer.id", + "type": "string", + "label": "id", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 20 + } + }, + { + "tags": [], + "id": "def-public.FileLayer.format", + "type": "CompoundType", + "label": "format", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 21 + }, + "signature": [ + "string | { type: string; }" + ] + }, + { + "tags": [], + "id": "def-public.FileLayer.fields", + "type": "Array", + "label": "fields", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 22 + }, + "signature": [ + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayerField", + "text": "FileLayerField" + }, + "[]" + ] + }, + { + "tags": [], + "id": "def-public.FileLayer.url", + "type": "string", + "label": "url", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 23 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.FileLayer.layerId", + "type": "string", + "label": "layerId", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 24 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.FileLayer.created_at", + "type": "string", + "label": "created_at", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 25 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.FileLayer.attribution", + "type": "string", + "label": "attribution", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 26 + }, + "signature": [ + "string | undefined" + ] + }, + { + "tags": [], + "id": "def-public.FileLayer.meta", + "type": "Object", + "label": "meta", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 27 + }, + "signature": [ + "{ [key: string]: string; } | undefined" + ] + } + ], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 17 + }, + "initialIsOpen": false + }, + { + "id": "def-public.FileLayerField", + "type": "Interface", + "label": "FileLayerField", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.FileLayerField.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 33 + } + }, + { + "tags": [], + "id": "def-public.FileLayerField.description", + "type": "string", + "label": "description", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 34 + } + }, + { + "tags": [], + "id": "def-public.FileLayerField.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 35 + } + } + ], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 32 + }, + "initialIsOpen": false + }, + { + "id": "def-public.IServiceSettings", + "type": "Interface", + "label": "IServiceSettings", + "description": [], + "tags": [], + "children": [ + { + "id": "def-public.IServiceSettings.getEMSHotLink", + "type": "Function", + "label": "getEMSHotLink", + "signature": [ + "(layer: ", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayer", + "text": "FileLayer" + }, + ") => Promise" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "layer", + "isRequired": true, + "signature": [ + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayer", + "text": "FileLayer" + } + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 44 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 44 + } + }, + { + "id": "def-public.IServiceSettings.getTMSServices", + "type": "Function", + "label": "getTMSServices", + "signature": [ + "() => Promise<", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.TmsLayer", + "text": "TmsLayer" + }, + "[]>" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 45 + } + }, + { + "id": "def-public.IServiceSettings.getFileLayers", + "type": "Function", + "label": "getFileLayers", + "signature": [ + "() => Promise<", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayer", + "text": "FileLayer" + }, + "[]>" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 46 + } + }, + { + "id": "def-public.IServiceSettings.getUrlForRegionLayer", + "type": "Function", + "label": "getUrlForRegionLayer", + "signature": [ + "(layer: ", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayer", + "text": "FileLayer" + }, + ") => Promise" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "layer", + "isRequired": true, + "signature": [ + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayer", + "text": "FileLayer" + } + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 47 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 47 + } + }, + { + "id": "def-public.IServiceSettings.setQueryParams", + "type": "Function", + "label": "setQueryParams", + "signature": [ + "(params: { [p: string]: string; }) => void" + ], + "description": [], + "children": [ + { + "id": "def-public.IServiceSettings.setQueryParams.params", + "type": "Object", + "label": "params", + "tags": [], + "description": [], + "children": [ + { + "id": "def-public.IServiceSettings.setQueryParams.params.Unnamed", + "type": "Any", + "label": "Unnamed", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 48 + }, + "signature": [ + "any" + ] + } + ], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 48 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 48 + } + }, + { + "id": "def-public.IServiceSettings.enableZoomMessage", + "type": "Function", + "label": "enableZoomMessage", + "signature": [ + "() => void" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 49 + } + }, + { + "id": "def-public.IServiceSettings.disableZoomMessage", + "type": "Function", + "label": "disableZoomMessage", + "signature": [ + "() => void" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 50 + } + }, + { + "id": "def-public.IServiceSettings.getAttributesForTMSLayer", + "type": "Function", + "label": "getAttributesForTMSLayer", + "signature": [ + "(tmsServiceConfig: ", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.TmsLayer", + "text": "TmsLayer" + }, + ", isDesaturated: boolean, isDarkMode: boolean) => any" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "tmsServiceConfig", + "isRequired": true, + "signature": [ + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.TmsLayer", + "text": "TmsLayer" + } + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 52 + } + }, + { + "type": "boolean", + "label": "isDesaturated", + "isRequired": true, + "signature": [ + "boolean" + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 53 + } + }, + { + "type": "boolean", + "label": "isDarkMode", + "isRequired": true, + "signature": [ + "boolean" + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 54 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 51 + } + } + ], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 43 + }, + "initialIsOpen": false + }, + { + "id": "def-public.TmsLayer", + "type": "Interface", + "label": "TmsLayer", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.TmsLayer.id", + "type": "string", + "label": "id", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 10 + } + }, + { + "tags": [], + "id": "def-public.TmsLayer.origin", + "type": "string", + "label": "origin", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 11 + } + }, + { + "tags": [], + "id": "def-public.TmsLayer.minZoom", + "type": "number", + "label": "minZoom", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 12 + } + }, + { + "tags": [], + "id": "def-public.TmsLayer.maxZoom", + "type": "number", + "label": "maxZoom", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 13 + } + }, + { + "tags": [], + "id": "def-public.TmsLayer.attribution", + "type": "string", + "label": "attribution", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 14 + } + } + ], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 9 + }, + "initialIsOpen": false + }, + { + "id": "def-public.VectorLayer", + "type": "Interface", + "label": "VectorLayer", + "signature": [ + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.VectorLayer", + "text": "VectorLayer" + }, + " extends ", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.FileLayer", + "text": "FileLayer" + } + ], + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.VectorLayer.layerId", + "type": "string", + "label": "layerId", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 39 + } + }, + { + "tags": [], + "id": "def-public.VectorLayer.isEMS", + "type": "boolean", + "label": "isEMS", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 40 + } + } + ], + "source": { + "path": "src/plugins/maps_ems/public/service_settings/service_settings_types.ts", + "lineNumber": 38 + }, + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "tags": [], + "id": "def-public.DEFAULT_EMS_FILE_API_URL", + "type": "string", + "label": "DEFAULT_EMS_FILE_API_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 10 + }, + "signature": [ + "\"https://vector.maps.elastic.co\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.DEFAULT_EMS_FONT_LIBRARY_URL", + "type": "string", + "label": "DEFAULT_EMS_FONT_LIBRARY_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 13 + }, + "signature": [ + "\"https://tiles.maps.elastic.co/fonts/{fontstack}/{range}.pbf\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.DEFAULT_EMS_LANDING_PAGE_URL", + "type": "string", + "label": "DEFAULT_EMS_LANDING_PAGE_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 12 + }, + "signature": [ + "\"https://maps.elastic.co/v7.12\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.DEFAULT_EMS_TILE_API_URL", + "type": "string", + "label": "DEFAULT_EMS_TILE_API_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 11 + }, + "signature": [ + "\"https://tiles.maps.elastic.co\"" + ], + "initialIsOpen": false + }, + { + "id": "def-public.LayerConfig", + "type": "Type", + "label": "LayerConfig", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/maps_ems/config.ts", + "lineNumber": 54 + }, + "signature": [ + "{ readonly name: string; readonly format: Readonly<{} & { type: string; }>; readonly fields: Readonly<{} & { description: string; name: string; }>[]; readonly meta: Readonly<{} & { feature_collection_path: string; }>; readonly url: string; readonly attribution: string; }" + ], + "initialIsOpen": false + }, + { + "id": "def-public.MapsEmsConfig", + "type": "Type", + "label": "MapsEmsConfig", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/maps_ems/config.ts", + "lineNumber": 86 + }, + "signature": [ + "{ readonly includeElasticMapsService: boolean; readonly proxyElasticMapsServiceInMaps: boolean; readonly regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; readonly tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; readonly manifestServiceUrl: string; readonly emsUrl: string; readonly emsFileApiUrl: string; readonly emsTileApiUrl: string; readonly emsLandingPageUrl: string; readonly emsFontLibraryUrl: string; readonly emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-public.TMS_IN_YML_ID", + "type": "string", + "label": "TMS_IN_YML_ID", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/index.ts", + "lineNumber": 9 + }, + "signature": [ + "\"TMS in config/kibana.yml\"" + ], + "initialIsOpen": false + } + ], + "objects": [ + { + "id": "def-public.ORIGIN", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.ORIGIN.EMS", + "type": "string", + "label": "EMS", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/origin.ts", + "lineNumber": 10 + } + }, + { + "tags": [], + "id": "def-public.ORIGIN.KIBANA_YML", + "type": "string", + "label": "KIBANA_YML", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/origin.ts", + "lineNumber": 11 + } + } + ], + "description": [], + "label": "ORIGIN", + "source": { + "path": "src/plugins/maps_ems/common/origin.ts", + "lineNumber": 9 + }, + "initialIsOpen": false + } + ], + "setup": { + "id": "def-public.MapsEmsPluginSetup", + "type": "Interface", + "label": "MapsEmsPluginSetup", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-public.MapsEmsPluginSetup.config", + "type": "Object", + "label": "config", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/index.ts", + "lineNumber": 32 + }, + "signature": [ + "Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>" + ] + }, + { + "tags": [], + "id": "def-public.MapsEmsPluginSetup.getServiceSettings", + "type": "Function", + "label": "getServiceSettings", + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/index.ts", + "lineNumber": 33 + }, + "signature": [ + "() => Promise<", + { + "pluginId": "mapsEms", + "scope": "public", + "docId": "kibMapsEmsPluginApi", + "section": "def-public.IServiceSettings", + "text": "IServiceSettings" + }, + ">" + ] + } + ], + "source": { + "path": "src/plugins/maps_ems/public/index.ts", + "lineNumber": 31 + }, + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "id": "def-public.MapsEmsPluginStart", + "type": "Type", + "label": "MapsEmsPluginStart", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/maps_ems/public/index.ts", + "lineNumber": 35 + }, + "signature": [ + "void" + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [ + { + "id": "def-server.MapsEmsPlugin", + "type": "Class", + "tags": [], + "label": "MapsEmsPlugin", + "description": [], + "signature": [ + { + "pluginId": "mapsEms", + "scope": "server", + "docId": "kibMapsEmsPluginApi", + "section": "def-server.MapsEmsPlugin", + "text": "MapsEmsPlugin" + }, + " implements ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.Plugin", + "text": "Plugin" + }, + "<", + { + "pluginId": "mapsEms", + "scope": "server", + "docId": "kibMapsEmsPluginApi", + "section": "def-server.MapsEmsPluginSetup", + "text": "MapsEmsPluginSetup" + }, + ", void, object, object>" + ], + "children": [ + { + "tags": [], + "id": "def-server.MapsEmsPlugin._initializerContext", + "type": "Object", + "label": "_initializerContext", + "description": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 39 + }, + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" + ] + }, + { + "id": "def-server.MapsEmsPlugin.Unnamed", + "type": "Function", + "label": "Constructor", + "signature": [ + "any" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "initializerContext", + "isRequired": true, + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.PluginInitializerContext", + "text": "PluginInitializerContext" + }, + "; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 41 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 41 + } + }, + { + "id": "def-server.MapsEmsPlugin.setup", + "type": "Function", + "label": "setup", + "signature": [ + "(core: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.CoreSetup", + "text": "CoreSetup" + }, + ") => { config: Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>; }" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "core", + "isRequired": true, + "signature": [ + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.CoreSetup", + "text": "CoreSetup" + }, + "" + ], + "description": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 45 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 45 + } + }, + { + "id": "def-server.MapsEmsPlugin.start", + "type": "Function", + "label": "start", + "signature": [ + "() => void" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 52 + } + } + ], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 38 + }, + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [ + { + "id": "def-server.MapsEmsPluginSetup", + "type": "Interface", + "label": "MapsEmsPluginSetup", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-server.MapsEmsPluginSetup.config", + "type": "Object", + "label": "config", + "description": [], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 35 + }, + "signature": [ + "Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>" + ] + } + ], + "source": { + "path": "src/plugins/maps_ems/server/index.ts", + "lineNumber": 34 + }, + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "tags": [], + "id": "def-common.DEFAULT_EMS_FILE_API_URL", + "type": "string", + "label": "DEFAULT_EMS_FILE_API_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 10 + }, + "signature": [ + "\"https://vector.maps.elastic.co\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_EMS_FONT_LIBRARY_URL", + "type": "string", + "label": "DEFAULT_EMS_FONT_LIBRARY_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 13 + }, + "signature": [ + "\"https://tiles.maps.elastic.co/fonts/{fontstack}/{range}.pbf\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_EMS_LANDING_PAGE_URL", + "type": "string", + "label": "DEFAULT_EMS_LANDING_PAGE_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 12 + }, + "signature": [ + "\"https://maps.elastic.co/v7.12\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.DEFAULT_EMS_TILE_API_URL", + "type": "string", + "label": "DEFAULT_EMS_TILE_API_URL", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/ems_defaults.ts", + "lineNumber": 11 + }, + "signature": [ + "\"https://tiles.maps.elastic.co\"" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.TMS_IN_YML_ID", + "type": "string", + "label": "TMS_IN_YML_ID", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/index.ts", + "lineNumber": 9 + }, + "signature": [ + "\"TMS in config/kibana.yml\"" + ], + "initialIsOpen": false + } + ], + "objects": [ + { + "id": "def-common.ORIGIN", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.ORIGIN.EMS", + "type": "string", + "label": "EMS", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/origin.ts", + "lineNumber": 10 + } + }, + { + "tags": [], + "id": "def-common.ORIGIN.KIBANA_YML", + "type": "string", + "label": "KIBANA_YML", + "description": [], + "source": { + "path": "src/plugins/maps_ems/common/origin.ts", + "lineNumber": 11 + } + } + ], + "description": [], + "label": "ORIGIN", + "source": { + "path": "src/plugins/maps_ems/common/origin.ts", + "lineNumber": 9 + }, + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx new file mode 100644 index 0000000000000..5907add0c5465 --- /dev/null +++ b/api_docs/maps_ems.mdx @@ -0,0 +1,46 @@ +--- +id: kibMapsEmsPluginApi +slug: /kibana-dev-docs/mapsEmsPluginApi +title: mapsEms +image: https://source.unsplash.com/400x175/?github +summary: API docs for the mapsEms plugin +date: 2020-11-16 +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. +--- + +import mapsEmsObj from './maps_ems.json'; + +## Client + +### Setup + + +### Start + + +### Objects + + +### Interfaces + + +### Consts, variables and types + + +## Server + +### Classes + + +### Interfaces + + +## Common + +### Objects + + +### Consts, variables and types + + diff --git a/api_docs/maps_legacy.json b/api_docs/maps_legacy.json deleted file mode 100644 index 09c94af4e0367..0000000000000 --- a/api_docs/maps_legacy.json +++ /dev/null @@ -1,277 +0,0 @@ -{ - "id": "mapsLegacy", - "client": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [], - "objects": [] - }, - "server": { - "classes": [ - { - "id": "def-server.MapsLegacyPlugin", - "type": "Class", - "tags": [], - "label": "MapsLegacyPlugin", - "description": [], - "signature": [ - { - "pluginId": "mapsLegacy", - "scope": "server", - "docId": "kibMapsLegacyPluginApi", - "section": "def-server.MapsLegacyPlugin", - "text": "MapsLegacyPlugin" - }, - " implements ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.Plugin", - "text": "Plugin" - }, - "<", - { - "pluginId": "mapsLegacy", - "scope": "server", - "docId": "kibMapsLegacyPluginApi", - "section": "def-server.MapsLegacyPluginSetup", - "text": "MapsLegacyPluginSetup" - }, - ", void, object, object>" - ], - "children": [ - { - "tags": [], - "id": "def-server.MapsLegacyPlugin._initializerContext", - "type": "Object", - "label": "_initializerContext", - "description": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 36 - }, - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.PluginInitializerContext", - "text": "PluginInitializerContext" - }, - "; }>; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" - ] - }, - { - "id": "def-server.MapsLegacyPlugin.Unnamed", - "type": "Function", - "label": "Constructor", - "signature": [ - "any" - ], - "description": [], - "children": [ - { - "type": "Object", - "label": "initializerContext", - "isRequired": true, - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.PluginInitializerContext", - "text": "PluginInitializerContext" - }, - "; }>; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>>" - ], - "description": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 38 - } - } - ], - "tags": [], - "returnComment": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 38 - } - }, - { - "id": "def-server.MapsLegacyPlugin.setup", - "type": "Function", - "label": "setup", - "signature": [ - "(core: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.CoreSetup", - "text": "CoreSetup" - }, - ") => { config: Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>; }" - ], - "description": [], - "children": [ - { - "type": "Object", - "label": "core", - "isRequired": true, - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCorePluginApi", - "section": "def-server.CoreSetup", - "text": "CoreSetup" - }, - "" - ], - "description": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 42 - } - } - ], - "tags": [], - "returnComment": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 42 - } - }, - { - "id": "def-server.MapsLegacyPlugin.start", - "type": "Function", - "label": "start", - "signature": [ - "() => void" - ], - "description": [], - "children": [], - "tags": [], - "returnComment": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 51 - } - } - ], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 35 - }, - "initialIsOpen": false - } - ], - "functions": [], - "interfaces": [ - { - "id": "def-server.MapsLegacyPluginSetup", - "type": "Interface", - "label": "MapsLegacyPluginSetup", - "description": [], - "tags": [], - "children": [ - { - "tags": [], - "id": "def-server.MapsLegacyPluginSetup.config", - "type": "Object", - "label": "config", - "description": [], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 32 - }, - "signature": [ - "Readonly<{} & { includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; tilemap: Readonly<{ url?: string | undefined; } & { options: Readonly<{ default?: boolean | undefined; tileSize?: number | undefined; subdomains?: string[] | undefined; errorTileUrl?: string | undefined; tms?: boolean | undefined; reuseTiles?: boolean | undefined; bounds?: number[] | undefined; } & { attribution: string; minZoom: number; maxZoom: number; }>; }>; regionmap: Readonly<{} & { includeElasticMapsService: boolean; layers: Readonly<{} & { name: string; format: Readonly<{} & { type: string; }>; fields: Readonly<{} & { description: string; name: string; }>[]; meta: Readonly<{} & { feature_collection_path: string; }>; url: string; attribution: string; }>[]; }>; manifestServiceUrl: string; emsUrl: string; emsFileApiUrl: string; emsTileApiUrl: string; emsLandingPageUrl: string; emsFontLibraryUrl: string; emsTileLayerId: Readonly<{} & { bright: string; desaturated: string; dark: string; }>; }>" - ] - } - ], - "source": { - "path": "src/plugins/maps_legacy/server/index.ts", - "lineNumber": 31 - }, - "initialIsOpen": false - } - ], - "enums": [], - "misc": [], - "objects": [] - }, - "common": { - "classes": [], - "functions": [], - "interfaces": [], - "enums": [], - "misc": [ - { - "tags": [], - "id": "def-common.DEFAULT_EMS_FILE_API_URL", - "type": "string", - "label": "DEFAULT_EMS_FILE_API_URL", - "description": [], - "source": { - "path": "src/plugins/maps_legacy/common/ems_defaults.ts", - "lineNumber": 10 - }, - "signature": [ - "\"https://vector.maps.elastic.co\"" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-common.DEFAULT_EMS_FONT_LIBRARY_URL", - "type": "string", - "label": "DEFAULT_EMS_FONT_LIBRARY_URL", - "description": [], - "source": { - "path": "src/plugins/maps_legacy/common/ems_defaults.ts", - "lineNumber": 13 - }, - "signature": [ - "\"https://tiles.maps.elastic.co/fonts/{fontstack}/{range}.pbf\"" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-common.DEFAULT_EMS_LANDING_PAGE_URL", - "type": "string", - "label": "DEFAULT_EMS_LANDING_PAGE_URL", - "description": [], - "source": { - "path": "src/plugins/maps_legacy/common/ems_defaults.ts", - "lineNumber": 12 - }, - "signature": [ - "\"https://maps.elastic.co/v7.12\"" - ], - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-common.DEFAULT_EMS_TILE_API_URL", - "type": "string", - "label": "DEFAULT_EMS_TILE_API_URL", - "description": [], - "source": { - "path": "src/plugins/maps_legacy/common/ems_defaults.ts", - "lineNumber": 11 - }, - "signature": [ - "\"https://tiles.maps.elastic.co\"" - ], - "initialIsOpen": false - } - ], - "objects": [] - } -} \ No newline at end of file diff --git a/api_docs/maps_legacy.mdx b/api_docs/maps_legacy.mdx deleted file mode 100644 index ade3ebfd39b05..0000000000000 --- a/api_docs/maps_legacy.mdx +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: kibMapsLegacyPluginApi -slug: /kibana-dev-docs/mapsLegacyPluginApi -title: mapsLegacy -image: https://source.unsplash.com/400x175/?github -summary: API docs for the mapsLegacy plugin -date: 2020-11-16 -tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsLegacy'] -warning: This document is auto-generated and is meant to be viewed inside our experimental, new docs system. Reach out in #docs-engineering for more info. ---- - -import mapsLegacyObj from './maps_legacy.json'; - -## Server - -### Classes - - -### Interfaces - - -## Common - -### Consts, variables and types - - diff --git a/api_docs/ml.json b/api_docs/ml.json index efa66ac9c9e8f..fa9bd613195a6 100644 --- a/api_docs/ml.json +++ b/api_docs/ml.json @@ -786,7 +786,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/capabilities.ts", - "lineNumber": 147 + "lineNumber": 151 }, "signature": [ { @@ -806,7 +806,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/capabilities.ts", - "lineNumber": 148 + "lineNumber": 152 } }, { @@ -817,7 +817,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/capabilities.ts", - "lineNumber": 149 + "lineNumber": 153 } }, { @@ -828,13 +828,13 @@ "description": [], "source": { "path": "x-pack/plugins/ml/common/types/capabilities.ts", - "lineNumber": 150 + "lineNumber": 154 } } ], "source": { "path": "x-pack/plugins/ml/common/types/capabilities.ts", - "lineNumber": 146 + "lineNumber": 150 }, "initialIsOpen": false }, @@ -1178,7 +1178,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/public/application/components/data_grid/types.ts", - "lineNumber": 78 + "lineNumber": 83 }, "signature": [ { @@ -1193,7 +1193,7 @@ ], "source": { "path": "x-pack/plugins/ml/public/application/components/data_grid/types.ts", - "lineNumber": 52 + "lineNumber": 57 }, "initialIsOpen": false } @@ -1266,7 +1266,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/public/application/components/data_grid/types.ts", - "lineNumber": 48 + "lineNumber": 53 }, "signature": [ "Dictionary<{ order: 'asc' | 'desc'; }>" @@ -1297,10 +1297,12 @@ "description": [], "source": { "path": "x-pack/plugins/ml/public/application/components/data_grid/types.ts", - "lineNumber": 38 + "lineNumber": 43 }, "signature": [ - "(__0: { rowIndex: number; columnId: string; setCellProps: any; }) => any" + "(__0: { rowIndex: number; columnId: string; setCellProps: (props: ", + "CommonProps", + " & React.HTMLAttributes) => void; }) => any" ], "initialIsOpen": false } @@ -3455,7 +3457,14 @@ "lineNumber": 28 }, "signature": [ - "IndicesOptions | undefined" + { + "pluginId": "ml", + "scope": "common", + "docId": "kibMlPluginApi", + "section": "def-common.IndicesOptions", + "text": "IndicesOptions" + }, + " | undefined" ] } ], @@ -3805,6 +3814,76 @@ }, "initialIsOpen": false }, + { + "id": "def-server.IndicesOptions", + "type": "Interface", + "label": "IndicesOptions", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-server.IndicesOptions.expand_wildcards", + "type": "CompoundType", + "label": "expand_wildcards", + "description": [], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/datafeed.ts", + "lineNumber": 49 + }, + "signature": [ + "\"all\" | \"none\" | \"hidden\" | \"open\" | \"closed\" | undefined" + ] + }, + { + "tags": [], + "id": "def-server.IndicesOptions.ignore_unavailable", + "type": "CompoundType", + "label": "ignore_unavailable", + "description": [], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/datafeed.ts", + "lineNumber": 50 + }, + "signature": [ + "boolean | undefined" + ] + }, + { + "tags": [], + "id": "def-server.IndicesOptions.allow_no_indices", + "type": "CompoundType", + "label": "allow_no_indices", + "description": [], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/datafeed.ts", + "lineNumber": 51 + }, + "signature": [ + "boolean | undefined" + ] + }, + { + "tags": [], + "id": "def-server.IndicesOptions.ignore_throttled", + "type": "CompoundType", + "label": "ignore_throttled", + "description": [], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/datafeed.ts", + "lineNumber": 52 + }, + "signature": [ + "boolean | undefined" + ] + } + ], + "source": { + "path": "x-pack/plugins/ml/common/types/anomaly_detection_jobs/datafeed.ts", + "lineNumber": 48 + }, + "initialIsOpen": false + }, { "id": "def-server.Influencer", "type": "Interface", @@ -5424,7 +5503,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/server/plugin.ts", - "lineNumber": 64 + "lineNumber": 63 }, "signature": [ "JobServiceProvider", @@ -5448,7 +5527,7 @@ "description": [], "source": { "path": "x-pack/plugins/ml/server/plugin.ts", - "lineNumber": 65 + "lineNumber": 64 }, "signature": [ "void" @@ -5498,11 +5577,17 @@ "type": "Function", "children": [ { - "type": "Any", + "type": "CompoundType", "label": "error", - "isRequired": true, + "isRequired": false, "signature": [ - "any" + { + "pluginId": "ml", + "scope": "common", + "docId": "kibMlPluginApi", + "section": "def-common.ErrorType", + "text": "ErrorType" + } ], "description": [], "source": { @@ -5512,7 +5597,9 @@ } ], "signature": [ - "(error: any) => string" + "(error: ", + "ErrorType", + ") => string" ], "description": [], "label": "extractErrorMessage", diff --git a/api_docs/monitoring.json b/api_docs/monitoring.json index b24cdd89e424f..d8b8b60495f8f 100644 --- a/api_docs/monitoring.json +++ b/api_docs/monitoring.json @@ -27,7 +27,7 @@ "description": [], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 93 + "lineNumber": 94 }, "signature": [ "() => any" @@ -41,7 +41,7 @@ "description": [], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 94 + "lineNumber": 95 }, "signature": [ "() => void" @@ -55,10 +55,18 @@ "description": [], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 95 + "lineNumber": 96 }, "signature": [ - "() => void" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ") => void" ] }, { @@ -69,7 +77,7 @@ "description": [], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 96 + "lineNumber": 97 }, "signature": [ "() => void" @@ -78,7 +86,7 @@ ], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 92 + "lineNumber": 93 }, "initialIsOpen": false } @@ -134,7 +142,7 @@ "description": [], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 100 + "lineNumber": 101 }, "signature": [ "() => any" @@ -143,7 +151,7 @@ ], "source": { "path": "x-pack/plugins/monitoring/server/types.ts", - "lineNumber": 99 + "lineNumber": 100 }, "lifecycle": "setup", "initialIsOpen": true diff --git a/api_docs/observability.json b/api_docs/observability.json index 81032f62ee317..a3d1bc950cb53 100644 --- a/api_docs/observability.json +++ b/api_docs/observability.json @@ -51,6 +51,45 @@ }, "initialIsOpen": false }, + { + "id": "def-public.FieldValueSuggestions", + "type": "Function", + "label": "FieldValueSuggestions", + "signature": [ + "(props: ", + "FieldValueSuggestionsProps", + ") => JSX.Element" + ], + "description": [], + "children": [ + { + "type": "Object", + "label": "props", + "isRequired": true, + "signature": [ + { + "pluginId": "observability", + "scope": "public", + "docId": "kibObservabilityPluginApi", + "section": "def-public.FieldValueSuggestionsProps", + "text": "FieldValueSuggestionsProps" + } + ], + "description": [], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "lineNumber": 34 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "lineNumber": 34 + }, + "initialIsOpen": false + }, { "id": "def-public.getApmTraceUrl", "type": "Function", @@ -142,7 +181,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 13 + "lineNumber": 14 } } ], @@ -150,7 +189,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 13 + "lineNumber": 14 }, "initialIsOpen": false }, @@ -181,7 +220,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 23 + "lineNumber": 24 } } ], @@ -189,7 +228,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "lineNumber": 23 + "lineNumber": 24 }, "initialIsOpen": false }, @@ -249,7 +288,7 @@ "signature": [ "({ children, ...props }: { children?: React.ReactNode; } & ", "CommonProps", - " & Pick, \"children\" | \"onClick\" | \"onChange\" | \"id\" | \"title\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\"> & { bordered?: boolean | undefined; flush?: boolean | undefined; gutterSize?: \"m\" | \"s\" | \"none\" | undefined; listItems?: ", + " & Pick, \"children\" | \"onClick\" | \"onChange\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\"> & { bordered?: boolean | undefined; flush?: boolean | undefined; gutterSize?: \"m\" | \"s\" | \"none\" | undefined; listItems?: ", "EuiListGroupItemProps", "[] | undefined; color?: \"text\" | \"primary\" | \"inherit\" | \"ghost\" | \"subdued\" | undefined; size?: \"m\" | \"s\" | \"l\" | \"xs\" | undefined; maxWidth?: string | number | boolean | undefined; showToolTips?: boolean | undefined; wrapText?: boolean | undefined; ariaLabelledby?: string | undefined; }) => JSX.Element" ], @@ -262,7 +301,7 @@ "signature": [ "{ children?: React.ReactNode; } & ", "CommonProps", - " & Pick, \"children\" | \"onClick\" | \"onChange\" | \"id\" | \"title\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\"> & { bordered?: boolean | undefined; flush?: boolean | undefined; gutterSize?: \"m\" | \"s\" | \"none\" | undefined; listItems?: ", + " & Pick, \"children\" | \"onClick\" | \"onChange\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\"> & { bordered?: boolean | undefined; flush?: boolean | undefined; gutterSize?: \"m\" | \"s\" | \"none\" | undefined; listItems?: ", "EuiListGroupItemProps", "[] | undefined; color?: \"text\" | \"primary\" | \"inherit\" | \"ghost\" | \"subdued\" | undefined; size?: \"m\" | \"s\" | \"l\" | \"xs\" | undefined; maxWidth?: string | number | boolean | undefined; showToolTips?: boolean | undefined; wrapText?: boolean | undefined; ariaLabelledby?: string | undefined; }" ], @@ -1864,9 +1903,9 @@ "DisambiguateSet", "<(", "DisambiguateSet", - ", Pick, \"children\" | \"type\" | \"onClick\" | \"onChange\" | \"color\" | \"id\" | \"title\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"media\" | \"target\" | \"download\" | \"ping\" | \"hrefLang\" | \"rel\" | \"referrerPolicy\">> & Pick, \"children\" | \"type\" | \"onClick\" | \"onChange\" | \"color\" | \"id\" | \"title\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"media\" | \"target\" | \"download\" | \"ping\" | \"hrefLang\" | \"rel\" | \"referrerPolicy\">) | (", + ", Pick, \"children\" | \"type\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"media\" | \"target\" | \"download\" | \"ping\" | \"hrefLang\" | \"rel\" | \"referrerPolicy\">> & Pick, \"children\" | \"type\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"media\" | \"target\" | \"download\" | \"ping\" | \"hrefLang\" | \"rel\" | \"referrerPolicy\">) | (", "DisambiguateSet", - ", \"children\" | \"type\" | \"onClick\" | \"onChange\" | \"color\" | \"id\" | \"title\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"media\" | \"target\" | \"download\" | \"ping\" | \"hrefLang\" | \"rel\" | \"referrerPolicy\">, React.ButtonHTMLAttributes> & React.ButtonHTMLAttributes), React.HTMLAttributes> & React.HTMLAttributes) | (", + ", \"children\" | \"type\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"title\" | \"id\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"media\" | \"target\" | \"download\" | \"ping\" | \"hrefLang\" | \"rel\" | \"referrerPolicy\">, React.ButtonHTMLAttributes> & React.ButtonHTMLAttributes), React.HTMLAttributes> & React.HTMLAttributes) | (", "DisambiguateSet" ], "initialIsOpen": false diff --git a/api_docs/presentation_util.json b/api_docs/presentation_util.json index c0bff9d0447ec..55204d129800e 100644 --- a/api_docs/presentation_util.json +++ b/api_docs/presentation_util.json @@ -154,7 +154,7 @@ "section": "def-public.OnSaveProps", "text": "OnSaveProps" }, - " & { dashboardId: string | null; }) => void" + " & { dashboardId: string | null; addToLibrary: boolean; }) => void" ] }, { diff --git a/api_docs/reporting.json b/api_docs/reporting.json index 44050591f71cb..29d0d485452da 100644 --- a/api_docs/reporting.json +++ b/api_docs/reporting.json @@ -1823,7 +1823,7 @@ "description": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 30 + "lineNumber": 31 } } ], @@ -1831,7 +1831,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 30 + "lineNumber": 31 } }, { @@ -1876,7 +1876,7 @@ "description": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 36 + "lineNumber": 37 } }, { @@ -1895,7 +1895,7 @@ "description": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 36 + "lineNumber": 37 } } ], @@ -1903,7 +1903,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 36 + "lineNumber": 37 } }, { @@ -1947,7 +1947,7 @@ "description": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 106 + "lineNumber": 86 } }, { @@ -1966,7 +1966,7 @@ "description": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 106 + "lineNumber": 86 } } ], @@ -1974,13 +1974,13 @@ "returnComment": [], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 106 + "lineNumber": 86 } } ], "source": { "path": "x-pack/plugins/reporting/server/plugin.ts", - "lineNumber": 24 + "lineNumber": 25 }, "initialIsOpen": false } diff --git a/api_docs/saved_objects.json b/api_docs/saved_objects.json index a3bc4b059c712..0842bd216383c 100644 --- a/api_docs/saved_objects.json +++ b/api_docs/saved_objects.json @@ -777,7 +777,7 @@ "section": "def-public.SavedObject", "text": "SavedObject" }, - ", \"id\" | \"title\" | \"getDisplayName\" | \"lastSavedTitle\" | \"copyOnSave\" | \"getEsType\">, isTitleDuplicateConfirmed: boolean, onTitleDuplicate: (() => void) | undefined, services: Pick<", + ", \"title\" | \"id\" | \"getDisplayName\" | \"lastSavedTitle\" | \"copyOnSave\" | \"getEsType\">, isTitleDuplicateConfirmed: boolean, onTitleDuplicate: (() => void) | undefined, services: Pick<", "SavedObjectKibanaServices", ", \"savedObjectsClient\" | \"overlays\">) => Promise" ], @@ -798,7 +798,7 @@ "section": "def-public.SavedObject", "text": "SavedObject" }, - ", \"id\" | \"title\" | \"getDisplayName\" | \"lastSavedTitle\" | \"copyOnSave\" | \"getEsType\">" + ", \"title\" | \"id\" | \"getDisplayName\" | \"lastSavedTitle\" | \"copyOnSave\" | \"getEsType\">" ], "description": [], "source": { diff --git a/api_docs/saved_objects_management.json b/api_docs/saved_objects_management.json index 04164f2849a4b..8cd47981d4558 100644 --- a/api_docs/saved_objects_management.json +++ b/api_docs/saved_objects_management.json @@ -332,7 +332,7 @@ "section": "def-server.SavedObjectsImportFailure", "text": "SavedObjectsImportFailure" }, - ", \"type\" | \"id\" | \"title\" | \"meta\" | \"overwrite\">" + ", \"type\" | \"title\" | \"id\" | \"meta\" | \"overwrite\">" ] }, { @@ -837,7 +837,7 @@ "section": "def-common.SavedObjectsManagementRecord", "text": "SavedObjectsManagementRecord" }, - ">, \"children\" | \"headers\" | \"onClick\" | \"onChange\" | \"color\" | \"id\" | \"description\" | \"title\" | \"name\" | \"field\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDown\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"width\" | \"render\" | \"align\" | \"abbr\" | \"footer\" | \"colSpan\" | \"rowSpan\" | \"scope\" | \"valign\" | \"dataType\" | \"isExpander\" | \"textOnly\" | \"truncateText\" | \"isMobileHeader\" | \"mobileOptions\" | \"hideForMobile\">" + ">, \"children\" | \"headers\" | \"onClick\" | \"onChange\" | \"color\" | \"onKeyDown\" | \"description\" | \"title\" | \"id\" | \"name\" | \"field\" | \"placeholder\" | \"defaultChecked\" | \"defaultValue\" | \"suppressContentEditableWarning\" | \"suppressHydrationWarning\" | \"accessKey\" | \"className\" | \"contentEditable\" | \"contextMenu\" | \"dir\" | \"draggable\" | \"hidden\" | \"lang\" | \"slot\" | \"spellCheck\" | \"style\" | \"tabIndex\" | \"translate\" | \"radioGroup\" | \"role\" | \"about\" | \"datatype\" | \"inlist\" | \"prefix\" | \"property\" | \"resource\" | \"typeof\" | \"vocab\" | \"autoCapitalize\" | \"autoCorrect\" | \"autoSave\" | \"itemProp\" | \"itemScope\" | \"itemType\" | \"itemID\" | \"itemRef\" | \"results\" | \"security\" | \"unselectable\" | \"inputMode\" | \"is\" | \"aria-activedescendant\" | \"aria-atomic\" | \"aria-autocomplete\" | \"aria-busy\" | \"aria-checked\" | \"aria-colcount\" | \"aria-colindex\" | \"aria-colspan\" | \"aria-controls\" | \"aria-current\" | \"aria-describedby\" | \"aria-details\" | \"aria-disabled\" | \"aria-dropeffect\" | \"aria-errormessage\" | \"aria-expanded\" | \"aria-flowto\" | \"aria-grabbed\" | \"aria-haspopup\" | \"aria-hidden\" | \"aria-invalid\" | \"aria-keyshortcuts\" | \"aria-label\" | \"aria-labelledby\" | \"aria-level\" | \"aria-live\" | \"aria-modal\" | \"aria-multiline\" | \"aria-multiselectable\" | \"aria-orientation\" | \"aria-owns\" | \"aria-placeholder\" | \"aria-posinset\" | \"aria-pressed\" | \"aria-readonly\" | \"aria-relevant\" | \"aria-required\" | \"aria-roledescription\" | \"aria-rowcount\" | \"aria-rowindex\" | \"aria-rowspan\" | \"aria-selected\" | \"aria-setsize\" | \"aria-sort\" | \"aria-valuemax\" | \"aria-valuemin\" | \"aria-valuenow\" | \"aria-valuetext\" | \"dangerouslySetInnerHTML\" | \"onCopy\" | \"onCopyCapture\" | \"onCut\" | \"onCutCapture\" | \"onPaste\" | \"onPasteCapture\" | \"onCompositionEnd\" | \"onCompositionEndCapture\" | \"onCompositionStart\" | \"onCompositionStartCapture\" | \"onCompositionUpdate\" | \"onCompositionUpdateCapture\" | \"onFocus\" | \"onFocusCapture\" | \"onBlur\" | \"onBlurCapture\" | \"onChangeCapture\" | \"onBeforeInput\" | \"onBeforeInputCapture\" | \"onInput\" | \"onInputCapture\" | \"onReset\" | \"onResetCapture\" | \"onSubmit\" | \"onSubmitCapture\" | \"onInvalid\" | \"onInvalidCapture\" | \"onLoad\" | \"onLoadCapture\" | \"onError\" | \"onErrorCapture\" | \"onKeyDownCapture\" | \"onKeyPress\" | \"onKeyPressCapture\" | \"onKeyUp\" | \"onKeyUpCapture\" | \"onAbort\" | \"onAbortCapture\" | \"onCanPlay\" | \"onCanPlayCapture\" | \"onCanPlayThrough\" | \"onCanPlayThroughCapture\" | \"onDurationChange\" | \"onDurationChangeCapture\" | \"onEmptied\" | \"onEmptiedCapture\" | \"onEncrypted\" | \"onEncryptedCapture\" | \"onEnded\" | \"onEndedCapture\" | \"onLoadedData\" | \"onLoadedDataCapture\" | \"onLoadedMetadata\" | \"onLoadedMetadataCapture\" | \"onLoadStart\" | \"onLoadStartCapture\" | \"onPause\" | \"onPauseCapture\" | \"onPlay\" | \"onPlayCapture\" | \"onPlaying\" | \"onPlayingCapture\" | \"onProgress\" | \"onProgressCapture\" | \"onRateChange\" | \"onRateChangeCapture\" | \"onSeeked\" | \"onSeekedCapture\" | \"onSeeking\" | \"onSeekingCapture\" | \"onStalled\" | \"onStalledCapture\" | \"onSuspend\" | \"onSuspendCapture\" | \"onTimeUpdate\" | \"onTimeUpdateCapture\" | \"onVolumeChange\" | \"onVolumeChangeCapture\" | \"onWaiting\" | \"onWaitingCapture\" | \"onAuxClick\" | \"onAuxClickCapture\" | \"onClickCapture\" | \"onContextMenu\" | \"onContextMenuCapture\" | \"onDoubleClick\" | \"onDoubleClickCapture\" | \"onDrag\" | \"onDragCapture\" | \"onDragEnd\" | \"onDragEndCapture\" | \"onDragEnter\" | \"onDragEnterCapture\" | \"onDragExit\" | \"onDragExitCapture\" | \"onDragLeave\" | \"onDragLeaveCapture\" | \"onDragOver\" | \"onDragOverCapture\" | \"onDragStart\" | \"onDragStartCapture\" | \"onDrop\" | \"onDropCapture\" | \"onMouseDown\" | \"onMouseDownCapture\" | \"onMouseEnter\" | \"onMouseLeave\" | \"onMouseMove\" | \"onMouseMoveCapture\" | \"onMouseOut\" | \"onMouseOutCapture\" | \"onMouseOver\" | \"onMouseOverCapture\" | \"onMouseUp\" | \"onMouseUpCapture\" | \"onSelect\" | \"onSelectCapture\" | \"onTouchCancel\" | \"onTouchCancelCapture\" | \"onTouchEnd\" | \"onTouchEndCapture\" | \"onTouchMove\" | \"onTouchMoveCapture\" | \"onTouchStart\" | \"onTouchStartCapture\" | \"onPointerDown\" | \"onPointerDownCapture\" | \"onPointerMove\" | \"onPointerMoveCapture\" | \"onPointerUp\" | \"onPointerUpCapture\" | \"onPointerCancel\" | \"onPointerCancelCapture\" | \"onPointerEnter\" | \"onPointerEnterCapture\" | \"onPointerLeave\" | \"onPointerLeaveCapture\" | \"onPointerOver\" | \"onPointerOverCapture\" | \"onPointerOut\" | \"onPointerOutCapture\" | \"onGotPointerCapture\" | \"onGotPointerCaptureCapture\" | \"onLostPointerCapture\" | \"onLostPointerCaptureCapture\" | \"onScroll\" | \"onScrollCapture\" | \"onWheel\" | \"onWheelCapture\" | \"onAnimationStart\" | \"onAnimationStartCapture\" | \"onAnimationEnd\" | \"onAnimationEndCapture\" | \"onAnimationIteration\" | \"onAnimationIterationCapture\" | \"onTransitionEnd\" | \"onTransitionEndCapture\" | \"css\" | \"data-test-subj\" | \"width\" | \"render\" | \"align\" | \"abbr\" | \"footer\" | \"colSpan\" | \"rowSpan\" | \"scope\" | \"valign\" | \"dataType\" | \"isExpander\" | \"textOnly\" | \"truncateText\" | \"isMobileHeader\" | \"mobileOptions\" | \"hideForMobile\">" ] } ], diff --git a/api_docs/saved_objects_tagging.json b/api_docs/saved_objects_tagging.json index 0372b39ba242d..5b09e25344537 100644 --- a/api_docs/saved_objects_tagging.json +++ b/api_docs/saved_objects_tagging.json @@ -717,7 +717,7 @@ "lineNumber": 20 }, "signature": [ - "Partial>" + "Partial>" ] } ], diff --git a/api_docs/security_solution.json b/api_docs/security_solution.json index cbcd660749f2d..ae208eb4facc7 100644 --- a/api_docs/security_solution.json +++ b/api_docs/security_solution.json @@ -362,7 +362,7 @@ "label": "config", "isRequired": true, "signature": [ - "Readonly<{} & { enabled: boolean; signalsIndex: string; maxRuleImportExportSize: number; maxRuleImportPayloadBytes: number; maxTimelineImportExportSize: number; maxTimelineImportPayloadBytes: number; endpointResultListDefaultFirstPageIndex: number; endpointResultListDefaultPageSize: number; alertResultListDefaultDateRange: Readonly<{} & { from: string; to: string; }>; packagerTaskInterval: string; validateArtifactDownloads: boolean; }>" + "Readonly<{} & { enabled: boolean; signalsIndex: string; maxRuleImportExportSize: number; maxRuleImportPayloadBytes: number; maxTimelineImportExportSize: number; maxTimelineImportPayloadBytes: number; enableExperimental: string[]; endpointResultListDefaultFirstPageIndex: number; endpointResultListDefaultPageSize: number; alertResultListDefaultDateRange: Readonly<{} & { from: string; to: string; }>; packagerTaskInterval: string; validateArtifactDownloads: boolean; }>" ], "description": [], "source": { @@ -451,7 +451,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 144 + "lineNumber": 145 } } ], @@ -459,7 +459,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 144 + "lineNumber": 145 } }, { @@ -536,7 +536,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 156 + "lineNumber": 157 } }, { @@ -555,7 +555,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 156 + "lineNumber": 157 } } ], @@ -563,7 +563,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 156 + "lineNumber": 157 } }, { @@ -607,7 +607,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 337 + "lineNumber": 338 } }, { @@ -626,7 +626,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 337 + "lineNumber": 338 } } ], @@ -634,7 +634,7 @@ "returnComment": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 337 + "lineNumber": 338 } }, { @@ -650,13 +650,13 @@ "returnComment": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 398 + "lineNumber": 404 } } ], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 128 + "lineNumber": 129 }, "initialIsOpen": false } @@ -795,18 +795,17 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<{ path: string; method: \"PUT\"; body: unknown; }, boolean>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { @@ -829,9 +828,15 @@ } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<{ path: string; method: \"PUT\"; body: unknown; }, boolean>, index: string) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", index: string) => Promise" ], "description": [], "label": "createBootstrapIndex", @@ -848,25 +853,22 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<", - "IndicesDeleteParams", - ", Promise>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_all_index.ts", - "lineNumber": 12 + "lineNumber": 11 } }, { @@ -879,7 +881,7 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_all_index.ts", - "lineNumber": 13 + "lineNumber": 12 } }, { @@ -892,22 +894,26 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_all_index.ts", - "lineNumber": 14 + "lineNumber": 13 } } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<", - "IndicesDeleteParams", - ", Promise>, pattern: string, maxAttempts?: number) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", pattern: string, maxAttempts?: number) => Promise" ], "description": [], "label": "deleteAllIndex", "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_all_index.ts", - "lineNumber": 11 + "lineNumber": 10 }, "tags": [], "returnComment": [], @@ -918,18 +924,17 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<{ path: string; method: \"DELETE\"; }, unknown>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { @@ -952,9 +957,15 @@ } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<{ path: string; method: \"DELETE\"; }, unknown>, policy: string) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", policy: string) => Promise" ], "description": [], "label": "deletePolicy", @@ -971,25 +982,22 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<", - "IndicesDeleteTemplateParams", - ", unknown>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_template.ts", - "lineNumber": 12 + "lineNumber": 10 } }, { @@ -1002,22 +1010,26 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_template.ts", - "lineNumber": 13 + "lineNumber": 11 } } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<", - "IndicesDeleteTemplateParams", - ", unknown>, name: string) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", name: string) => Promise" ], "description": [], "label": "deleteTemplate", "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/delete_template.ts", - "lineNumber": 11 + "lineNumber": 9 }, "tags": [], "returnComment": [], @@ -1028,18 +1040,17 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<{ index: string; size: number; terminate_after: number; allow_no_indices: boolean; }, { _shards: { total: number; }; }>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { @@ -1057,14 +1068,20 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/get_index_exists.ts", - "lineNumber": 15 + "lineNumber": 12 } } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<{ index: string; size: number; terminate_after: number; allow_no_indices: boolean; }, { _shards: { total: number; }; }>, index: string) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", index: string) => Promise" ], "description": [], "label": "getIndexExists", @@ -1081,18 +1098,17 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<{ path: string; method: \"GET\"; }, unknown>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { @@ -1115,9 +1131,15 @@ } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<{ path: string; method: \"GET\"; }, unknown>, policy: string) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", policy: string) => Promise" ], "description": [], "label": "getPolicyExists", @@ -1134,25 +1156,22 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<", - "IndicesExistsTemplateParams", - ", boolean>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/get_template_exists.ts", - "lineNumber": 12 + "lineNumber": 11 } }, { @@ -1165,22 +1184,26 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/get_template_exists.ts", - "lineNumber": 13 + "lineNumber": 12 } } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<", - "IndicesExistsTemplateParams", - ", boolean>, template: string) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", template: string) => Promise" ], "description": [], "label": "getTemplateExists", "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/get_template_exists.ts", - "lineNumber": 11 + "lineNumber": 10 }, "tags": [], "returnComment": [], @@ -1244,18 +1267,17 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<{ path: string; method: \"PUT\"; body: unknown; }, unknown>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { @@ -1277,11 +1299,11 @@ } }, { - "type": "Unknown", + "type": "Object", "label": "body", "isRequired": true, "signature": [ - "unknown" + "Record" ], "description": [], "source": { @@ -1291,9 +1313,15 @@ } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<{ path: string; method: \"PUT\"; body: unknown; }, unknown>, policy: string, body: unknown) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", policy: string, body: Record) => Promise" ], "description": [], "label": "setPolicy", @@ -1310,25 +1338,22 @@ "type": "Function", "children": [ { - "type": "Function", - "label": "callWithRequest", + "type": "CompoundType", + "label": "esClient", "isRequired": true, "signature": [ { - "pluginId": "security", - "scope": "common", - "docId": "kibSecurityPluginApi", - "section": "def-common.CallWithRequest", - "text": "CallWithRequest" - }, - "<", - "IndicesPutTemplateParams", - ", unknown>" + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + } ], "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/set_template.ts", - "lineNumber": 12 + "lineNumber": 11 } }, { @@ -1341,35 +1366,39 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/set_template.ts", - "lineNumber": 13 + "lineNumber": 12 } }, { - "type": "Unknown", + "type": "Object", "label": "body", "isRequired": true, "signature": [ - "unknown" + "Record" ], "description": [], "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/set_template.ts", - "lineNumber": 14 + "lineNumber": 13 } } ], "signature": [ - "(callWithRequest: ", - "CallWithRequest", - "<", - "IndicesPutTemplateParams", - ", unknown>, name: string, body: unknown) => Promise" + "(esClient: ", + { + "pluginId": "core", + "scope": "server", + "docId": "kibCorePluginApi", + "section": "def-server.ElasticsearchClient", + "text": "ElasticsearchClient" + }, + ", name: string, body: Record) => Promise" ], "description": [], "label": "setTemplate", "source": { "path": "x-pack/plugins/security_solution/server/lib/detection_engine/index/set_template.ts", - "lineNumber": 11 + "lineNumber": 10 }, "tags": [], "returnComment": [], @@ -1463,10 +1492,10 @@ "description": [], "source": { "path": "x-pack/plugins/security_solution/server/config.ts", - "lineNumber": 43 + "lineNumber": 75 }, "signature": [ - "{ readonly enabled: boolean; readonly signalsIndex: string; readonly maxRuleImportExportSize: number; readonly maxRuleImportPayloadBytes: number; readonly maxTimelineImportExportSize: number; readonly maxTimelineImportPayloadBytes: number; readonly endpointResultListDefaultFirstPageIndex: number; readonly endpointResultListDefaultPageSize: number; readonly alertResultListDefaultDateRange: Readonly<{} & { from: string; to: string; }>; readonly packagerTaskInterval: string; readonly validateArtifactDownloads: boolean; }" + "{ readonly enabled: boolean; readonly signalsIndex: string; readonly maxRuleImportExportSize: number; readonly maxRuleImportPayloadBytes: number; readonly maxTimelineImportExportSize: number; readonly maxTimelineImportPayloadBytes: number; readonly enableExperimental: string[]; readonly endpointResultListDefaultFirstPageIndex: number; readonly endpointResultListDefaultPageSize: number; readonly alertResultListDefaultDateRange: Readonly<{} & { from: string; to: string; }>; readonly packagerTaskInterval: string; readonly validateArtifactDownloads: boolean; }" ], "initialIsOpen": false } @@ -1481,7 +1510,7 @@ "children": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 105 + "lineNumber": 106 }, "lifecycle": "setup", "initialIsOpen": true @@ -1495,7 +1524,7 @@ "children": [], "source": { "path": "x-pack/plugins/security_solution/server/plugin.ts", - "lineNumber": 107 + "lineNumber": 108 }, "lifecycle": "start", "initialIsOpen": true @@ -1725,162 +1754,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "id": "def-common.migratePackagePolicyToV7110", - "type": "Function", - "children": [ - { - "type": "CompoundType", - "label": "packagePolicyDoc", - "isRequired": true, - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectUnsanitizedDoc", - "text": "SavedObjectUnsanitizedDoc" - }, - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - ">" - ], - "description": [], - "source": { - "path": "x-pack/plugins/security_solution/common/endpoint/policy/migrations/to_v7_11_0.ts", - "lineNumber": 13 - } - } - ], - "signature": [ - "(packagePolicyDoc: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectUnsanitizedDoc", - "text": "SavedObjectUnsanitizedDoc" - }, - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - ">) => ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectUnsanitizedDoc", - "text": "SavedObjectUnsanitizedDoc" - }, - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - ">" - ], - "description": [], - "label": "migratePackagePolicyToV7110", - "source": { - "path": "x-pack/plugins/security_solution/common/endpoint/policy/migrations/to_v7_11_0.ts", - "lineNumber": 12 - }, - "tags": [], - "returnComment": [], - "initialIsOpen": false - }, - { - "id": "def-common.migratePackagePolicyToV7120", - "type": "Function", - "children": [ - { - "type": "CompoundType", - "label": "packagePolicyDoc", - "isRequired": true, - "signature": [ - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectUnsanitizedDoc", - "text": "SavedObjectUnsanitizedDoc" - }, - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - ">" - ], - "description": [], - "source": { - "path": "x-pack/plugins/security_solution/common/endpoint/policy/migrations/to_v7_12_0.ts", - "lineNumber": 14 - } - } - ], - "signature": [ - "(packagePolicyDoc: ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectUnsanitizedDoc", - "text": "SavedObjectUnsanitizedDoc" - }, - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - ">) => ", - { - "pluginId": "core", - "scope": "server", - "docId": "kibCoreSavedObjectsPluginApi", - "section": "def-server.SavedObjectUnsanitizedDoc", - "text": "SavedObjectUnsanitizedDoc" - }, - "<", - { - "pluginId": "fleet", - "scope": "common", - "docId": "kibFleetPluginApi", - "section": "def-common.PackagePolicy", - "text": "PackagePolicy" - }, - ">" - ], - "description": [], - "label": "migratePackagePolicyToV7120", - "source": { - "path": "x-pack/plugins/security_solution/common/endpoint/policy/migrations/to_v7_12_0.ts", - "lineNumber": 13 - }, - "tags": [], - "returnComment": [], - "initialIsOpen": false - }, { "id": "def-common.removeExternalLinkText", "type": "Function", diff --git a/api_docs/telemetry_collection_xpack.json b/api_docs/telemetry_collection_xpack.json index 6f651ecf212f4..cf1b1a5998553 100644 --- a/api_docs/telemetry_collection_xpack.json +++ b/api_docs/telemetry_collection_xpack.json @@ -41,6 +41,17 @@ "lineNumber": 13 } }, + { + "tags": [], + "id": "def-server.ESLicense.hkey", + "type": "string", + "label": "hkey", + "description": [], + "source": { + "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", + "lineNumber": 14 + } + }, { "tags": [], "id": "def-server.ESLicense.type", @@ -49,7 +60,7 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 14 + "lineNumber": 15 } }, { @@ -60,7 +71,7 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 15 + "lineNumber": 16 } }, { @@ -71,7 +82,7 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 16 + "lineNumber": 17 } }, { @@ -82,18 +93,18 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 17 + "lineNumber": 18 } }, { "tags": [], - "id": "def-server.ESLicense.expirty_date_in_millis", + "id": "def-server.ESLicense.expiry_date_in_millis", "type": "number", - "label": "expirty_date_in_millis", + "label": "expiry_date_in_millis", "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 18 + "lineNumber": 19 } }, { @@ -104,7 +115,7 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 19 + "lineNumber": 20 } }, { @@ -115,7 +126,7 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 20 + "lineNumber": 21 } }, { @@ -126,7 +137,7 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 21 + "lineNumber": 22 } }, { @@ -137,7 +148,18 @@ "description": [], "source": { "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", - "lineNumber": 22 + "lineNumber": 23 + } + }, + { + "tags": [], + "id": "def-server.ESLicense.max_resource_units", + "type": "number", + "label": "max_resource_units", + "description": [], + "source": { + "path": "x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_license.ts", + "lineNumber": 24 } } ], diff --git a/api_docs/triggers_actions_ui.json b/api_docs/triggers_actions_ui.json index 147abd0831e9b..245ead8a4d0e4 100644 --- a/api_docs/triggers_actions_ui.json +++ b/api_docs/triggers_actions_ui.json @@ -746,8 +746,8 @@ "label": "http", "description": [], "source": { - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.ts", - "lineNumber": 13 + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api/connector_types.ts", + "lineNumber": 29 }, "signature": [ { @@ -761,16 +761,16 @@ } ], "source": { - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.ts", - "lineNumber": 13 + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api/connector_types.ts", + "lineNumber": 29 } } ], "tags": [], "returnComment": [], "source": { - "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api.ts", - "lineNumber": 13 + "path": "x-pack/plugins/triggers_actions_ui/public/application/lib/action_connector_api/connector_types.ts", + "lineNumber": 29 }, "initialIsOpen": false }, diff --git a/api_docs/vis_type_timeseries.json b/api_docs/vis_type_timeseries.json index 907ced500294a..6f349cb3dfb93 100644 --- a/api_docs/vis_type_timeseries.json +++ b/api_docs/vis_type_timeseries.json @@ -37,7 +37,7 @@ { "pluginId": "data", "scope": "server", - "docId": "kibDataSearchPluginApi", + "docId": "kibDataPluginApi", "section": "def-server.DataRequestHandlerContext", "text": "DataRequestHandlerContext" }, diff --git a/api_docs/visualizations.json b/api_docs/visualizations.json index d66aa8b8cbe67..b85d424a97bde 100644 --- a/api_docs/visualizations.json +++ b/api_docs/visualizations.json @@ -514,7 +514,7 @@ "section": "def-common.VisParams", "text": "VisParams" }, - ">, \"type\" | \"id\" | \"description\" | \"title\" | \"params\" | \"uiState\"> & Pick<{ data: Partial<", + ">, \"type\" | \"description\" | \"title\" | \"id\" | \"params\" | \"uiState\"> & Pick<{ data: Partial<", { "pluginId": "visualizations", "scope": "public", @@ -530,7 +530,7 @@ "section": "def-public.SerializedVisData", "text": "SerializedVisData" }, - ">; }, never>, \"type\" | \"id\" | \"data\" | \"description\" | \"title\" | \"params\" | \"uiState\">) => Promise" + ">; }, never>, \"type\" | \"data\" | \"description\" | \"title\" | \"id\" | \"params\" | \"uiState\">) => Promise" ], "description": [], "children": [ @@ -555,7 +555,7 @@ "section": "def-common.VisParams", "text": "VisParams" }, - ">, \"type\" | \"id\" | \"description\" | \"title\" | \"params\" | \"uiState\"> & Pick<{ data: Partial<", + ">, \"type\" | \"description\" | \"title\" | \"id\" | \"params\" | \"uiState\"> & Pick<{ data: Partial<", { "pluginId": "visualizations", "scope": "public", @@ -571,7 +571,7 @@ "section": "def-public.SerializedVisData", "text": "SerializedVisData" }, - ">; }, never>, \"type\" | \"id\" | \"data\" | \"description\" | \"title\" | \"params\" | \"uiState\">" + ">; }, never>, \"type\" | \"data\" | \"description\" | \"title\" | \"id\" | \"params\" | \"uiState\">" ], "description": [], "source": { From d886979e3b5a841f0d839a22fdf02cbc4bae9ec8 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 23 Mar 2021 11:34:20 -0700 Subject: [PATCH 03/35] [Fleet] Remove `upgradePackage` and consolidate it with `installPackage`, optimize calls to create index patterns (#94490) * Add data plugin to server app context * First attempt at switching to indexPatternService for EPM index pattern creation & deletion, instead of interacting directly with index pattern SOs * Simplify bulk install package, remove upgradePackage() method in favor of consolidating with installPackage(), use installPackage() for bulk install instead * Update tests * Change cache logging of objects to trace level * Install index patterns as a post-package installation operation, for bulk package installation, install index pattern only if one or more packages are actually new installs, add debug logging * Allow getAsSavedObjectBody to return non-scripted fields when allowNoIndex is true * Allow `getFieldsForWildcard` to return fields saved on index pattern when allowNoIndices is true * Bring back passing custom ID for index pattern SO * Fix tests * Revert "Merge branch 'index-pattern/allow-no-index' into epm/missing-index-patterns" This reverts commit 8e712e9c0087fc7f9e2b3dc0c729a23f0265f243, reversing changes made to af0fb0eaa84301ffe8514b89acc1a45ca2c5f7cb. * Allow getAsSavedObjectBody to return non-scripted fields when allowNoIndex is true (cherry picked from commit 69b93da1807cc9a613be1ad75b37df6bcee8d676) * Update API docs * Run post-install ops for install by upload too * Remove allowedInstallTypes param * Adjust force install conditions * Revert "Update API docs" This reverts commit b9770fdc5645b6d331bbbb3f0029ae039fbb1871. * Revert "Allow getAsSavedObjectBody to return non-scripted fields when allowNoIndex is true" This reverts commit afc91ce32f4d7c418be8a85d796ac5f71d6028eb. * Go back to using SO client for index patterns :( * Stringify attributes again for SO client saving * Fix condition for reinstall same pkg version * Remove unused type * Adjust comment * Update snapshot Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/fleet/common/constants/epm.ts | 1 - .../fleet/common/types/rest_spec/epm.ts | 11 +- .../plugins/fleet/server/constants/index.ts | 1 - x-pack/plugins/fleet/server/mocks/index.ts | 2 + x-pack/plugins/fleet/server/plugin.ts | 4 + .../fleet/server/routes/epm/handlers.ts | 31 +-- .../fleet/server/services/app_context.ts | 10 + .../server/services/epm/archive/cache.ts | 18 +- .../__snapshots__/install.test.ts.snap | 218 ++++++---------- .../epm/kibana/index_pattern/install.test.ts | 45 +--- .../epm/kibana/index_pattern/install.ts | 122 ++++----- .../kibana/index_pattern/tests/test_data.ts | 20 +- .../services/epm/packages/_install_package.ts | 15 +- .../epm/packages/bulk_install_packages.ts | 88 ++++--- .../ensure_installed_default_packages.test.ts | 25 +- .../server/services/epm/packages/install.ts | 239 ++++++++++-------- .../server/services/epm/packages/remove.ts | 2 +- x-pack/plugins/fleet/server/types/index.tsx | 1 + .../apis/epm/bulk_upgrade.ts | 15 +- 19 files changed, 371 insertions(+), 497 deletions(-) diff --git a/x-pack/plugins/fleet/common/constants/epm.ts b/x-pack/plugins/fleet/common/constants/epm.ts index aa17b16b3763c..faa1127cfe1da 100644 --- a/x-pack/plugins/fleet/common/constants/epm.ts +++ b/x-pack/plugins/fleet/common/constants/epm.ts @@ -7,7 +7,6 @@ export const PACKAGES_SAVED_OBJECT_TYPE = 'epm-packages'; export const ASSETS_SAVED_OBJECT_TYPE = 'epm-packages-assets'; -export const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; export const MAX_TIME_COMPLETE_INSTALL = 60000; export const FLEET_SERVER_PACKAGE = 'fleet_server'; diff --git a/x-pack/plugins/fleet/common/types/rest_spec/epm.ts b/x-pack/plugins/fleet/common/types/rest_spec/epm.ts index 3a9c9a0cfae9f..3c7a32265d20a 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/epm.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/epm.ts @@ -82,12 +82,15 @@ export interface IBulkInstallPackageHTTPError { error: string | Error; } +export interface InstallResult { + assets: AssetReference[]; + status: 'installed' | 'already_installed'; +} + export interface BulkInstallPackageInfo { name: string; - newVersion: string; - // this will be null if no package was present before the upgrade (aka it was an install) - oldVersion: string | null; - assets: AssetReference[]; + version: string; + result: InstallResult; } export interface BulkInstallPackagesResponse { diff --git a/x-pack/plugins/fleet/server/constants/index.ts b/x-pack/plugins/fleet/server/constants/index.ts index fa6051fa7d35b..23df18d5e377d 100644 --- a/x-pack/plugins/fleet/server/constants/index.ts +++ b/x-pack/plugins/fleet/server/constants/index.ts @@ -43,7 +43,6 @@ export { OUTPUT_SAVED_OBJECT_TYPE, PACKAGES_SAVED_OBJECT_TYPE, ASSETS_SAVED_OBJECT_TYPE, - INDEX_PATTERN_SAVED_OBJECT_TYPE, ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE, GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, // Defaults diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index d4b6f007feb4d..4bc2bea1e58b6 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -10,6 +10,7 @@ import { savedObjectsServiceMock, coreMock, } from '../../../../../src/core/server/mocks'; +import { dataPluginMock } from '../../../../../src/plugins/data/server/mocks'; import { licensingMock } from '../../../../plugins/licensing/server/mocks'; import { encryptedSavedObjectsMock } from '../../../encrypted_saved_objects/server/mocks'; import { securityMock } from '../../../security/server/mocks'; @@ -23,6 +24,7 @@ export * from '../services/artifacts/mocks'; export const createAppContextStartContractMock = (): FleetAppContext => { return { elasticsearch: elasticsearchServiceMock.createStart(), + data: dataPluginMock.createStartContract(), encryptedSavedObjectsStart: encryptedSavedObjectsMock.createStart(), savedObjects: savedObjectsServiceMock.createStartContract(), security: securityMock.createStart(), diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index a62da8eb41a99..477e6c3959951 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -23,6 +23,7 @@ import type { import type { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/server'; +import type { PluginStart as DataPluginStart } from '../../../../src/plugins/data/server'; import type { LicensingPluginSetup, ILicense } from '../../licensing/server'; import type { EncryptedSavedObjectsPluginStart, @@ -100,12 +101,14 @@ export interface FleetSetupDeps { } export interface FleetStartDeps { + data: DataPluginStart; encryptedSavedObjects: EncryptedSavedObjectsPluginStart; security?: SecurityPluginStart; } export interface FleetAppContext { elasticsearch: ElasticsearchServiceStart; + data: DataPluginStart; encryptedSavedObjectsStart?: EncryptedSavedObjectsPluginStart; encryptedSavedObjectsSetup?: EncryptedSavedObjectsPluginSetup; security?: SecurityPluginStart; @@ -293,6 +296,7 @@ export class FleetPlugin public async start(core: CoreStart, plugins: FleetStartDeps): Promise { await appContextService.start({ elasticsearch: core.elasticsearch, + data: plugins.data, encryptedSavedObjectsStart: plugins.encryptedSavedObjects, encryptedSavedObjectsSetup: this.encryptedSavedObjectsSetup, security: plugins.security, diff --git a/x-pack/plugins/fleet/server/routes/epm/handlers.ts b/x-pack/plugins/fleet/server/routes/epm/handlers.ts index 293a3e9e28237..3ac951f7987f8 100644 --- a/x-pack/plugins/fleet/server/routes/epm/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/epm/handlers.ts @@ -40,12 +40,10 @@ import { getPackages, getFile, getPackageInfo, - handleInstallPackageFailure, isBulkInstallError, installPackage, removeInstallation, getLimitedPackages, - getInstallationObject, getInstallation, } from '../../services/epm/packages'; import type { BulkInstallResponse } from '../../services/epm/packages'; @@ -228,15 +226,7 @@ export const installPackageFromRegistryHandler: RequestHandler< const savedObjectsClient = context.core.savedObjects.client; const esClient = context.core.elasticsearch.client.asCurrentUser; const { pkgkey } = request.params; - - let pkgName: string | undefined; - let pkgVersion: string | undefined; - try { - const parsedPkgKey = splitPkgKey(pkgkey); - pkgName = parsedPkgKey.pkgName; - pkgVersion = parsedPkgKey.pkgVersion; - const res = await installPackage({ installSource: 'registry', savedObjectsClient, @@ -245,24 +235,11 @@ export const installPackageFromRegistryHandler: RequestHandler< force: request.body?.force, }); const body: InstallPackageResponse = { - response: res, + response: res.assets, }; return response.ok({ body }); } catch (e) { - const defaultResult = await defaultIngestErrorHandler({ error: e, response }); - if (pkgName && pkgVersion) { - const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); - await handleInstallPackageFailure({ - savedObjectsClient, - error: e, - pkgName, - pkgVersion, - installedPkg, - esClient, - }); - } - - return defaultResult; + return await defaultIngestErrorHandler({ error: e, response }); } }; @@ -291,7 +268,7 @@ export const bulkInstallPackagesFromRegistryHandler: RequestHandler< const bulkInstalledResponses = await bulkInstallPackages({ savedObjectsClient, esClient, - packagesToUpgrade: request.body.packages, + packagesToInstall: request.body.packages, }); const payload = bulkInstalledResponses.map(bulkInstallServiceResponseToHttpEntry); const body: BulkInstallPackagesResponse = { @@ -324,7 +301,7 @@ export const installPackageByUploadHandler: RequestHandler< contentType, }); const body: InstallPackageResponse = { - response: res, + response: res.assets, }; return response.ok({ body }); } catch (error) { diff --git a/x-pack/plugins/fleet/server/services/app_context.ts b/x-pack/plugins/fleet/server/services/app_context.ts index 21b519565e758..954308a980861 100644 --- a/x-pack/plugins/fleet/server/services/app_context.ts +++ b/x-pack/plugins/fleet/server/services/app_context.ts @@ -17,6 +17,7 @@ import type { Logger, } from 'src/core/server'; +import type { PluginStart as DataPluginStart } from '../../../../../src/plugins/data/server'; import type { EncryptedSavedObjectsClient, EncryptedSavedObjectsPluginSetup, @@ -29,6 +30,7 @@ import type { CloudSetup } from '../../../cloud/server'; class AppContextService { private encryptedSavedObjects: EncryptedSavedObjectsClient | undefined; private encryptedSavedObjectsSetup: EncryptedSavedObjectsPluginSetup | undefined; + private data: DataPluginStart | undefined; private esClient: ElasticsearchClient | undefined; private security: SecurityPluginStart | undefined; private config$?: Observable; @@ -43,6 +45,7 @@ class AppContextService { private externalCallbacks: ExternalCallbacksStorage = new Map(); public async start(appContext: FleetAppContext) { + this.data = appContext.data; this.esClient = appContext.elasticsearch.client.asInternalUser; this.encryptedSavedObjects = appContext.encryptedSavedObjectsStart?.getClient(); this.encryptedSavedObjectsSetup = appContext.encryptedSavedObjectsSetup; @@ -67,6 +70,13 @@ class AppContextService { this.externalCallbacks.clear(); } + public getData() { + if (!this.data) { + throw new Error('Data start service not set.'); + } + return this.data; + } + public getEncryptedSavedObjects() { if (!this.encryptedSavedObjects) { throw new Error('Encrypted saved object start service not set.'); diff --git a/x-pack/plugins/fleet/server/services/epm/archive/cache.ts b/x-pack/plugins/fleet/server/services/epm/archive/cache.ts index 6958f76c17b70..7f479dc5d6b63 100644 --- a/x-pack/plugins/fleet/server/services/epm/archive/cache.ts +++ b/x-pack/plugins/fleet/server/services/epm/archive/cache.ts @@ -28,13 +28,9 @@ export const getArchiveFilelist = (keyArgs: SharedKey) => archiveFilelistCache.get(sharedKey(keyArgs)); export const setArchiveFilelist = (keyArgs: SharedKey, paths: string[]) => { - appContextService - .getLogger() - .debug( - `setting file list to the cache for ${keyArgs.name}-${keyArgs.version}:\n${JSON.stringify( - paths - )}` - ); + const logger = appContextService.getLogger(); + logger.debug(`setting file list to the cache for ${keyArgs.name}-${keyArgs.version}`); + logger.trace(JSON.stringify(paths)); return archiveFilelistCache.set(sharedKey(keyArgs), paths); }; @@ -63,12 +59,10 @@ export const setPackageInfo = ({ version, packageInfo, }: SharedKey & { packageInfo: ArchivePackage | RegistryPackage }) => { + const logger = appContextService.getLogger(); const key = sharedKey({ name, version }); - appContextService - .getLogger() - .debug( - `setting package info to the cache for ${name}-${version}:\n${JSON.stringify(packageInfo)}` - ); + logger.debug(`setting package info to the cache for ${name}-${version}`); + logger.trace(JSON.stringify(packageInfo)); return packageInfoCache.set(key, packageInfo); }; diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/__snapshots__/install.test.ts.snap b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/__snapshots__/install.test.ts.snap index 862e82589b9bc..da870290329a8 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/__snapshots__/install.test.ts.snap +++ b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/__snapshots__/install.test.ts.snap @@ -40,7 +40,7 @@ exports[`creating index patterns from yaml fields createIndexPattern function cr { "title": "logs-*", "timeFieldName": "@timestamp", - "fields": "[{\\"name\\":\\"coredns.id\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"coredns.allParams\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"number\\"},{\\"name\\":\\"coredns.query.length\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"number\\"},{\\"name\\":\\"coredns.query.size\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"number\\"},{\\"name\\":\\"coredns.query.class\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"coredns.query.name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"coredns.query.type\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"coredns.response.code\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"coredns.response.flags\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"coredns.response.size\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"number\\"},{\\"name\\":\\"coredns.dnssec_ok\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"boolean\\"},{\\"name\\":\\"@timestamp\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"date\\"},{\\"name\\":\\"labels\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"message\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":false,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"tags\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"agent.ephemeral_id\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"agent.id\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"agent.name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"agent.type\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"agent.version\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"as.number\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"number\\"},{\\"name\\":\\"as.organization.name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"nginx.access.remote_ip_list\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.body_sent.bytes\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.method\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.url\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.http_version\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.response_code\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.referrer\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.agent\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.device\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.os\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.os_name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.original\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.continent_name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":false,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"nginx.access.geoip.country_iso_code\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.location\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.region_name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.city_name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.region_iso_code\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"source.geo.continent_name\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":false,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"country\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"country.keyword\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":true,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"},{\\"name\\":\\"country.text\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"analyzed\\":false,\\"searchable\\":true,\\"aggregatable\\":false,\\"doc_values\\":true,\\"readFromDocValues\\":true,\\"type\\":\\"string\\"}]", + "fields": "[{\\"name\\":\\"coredns.id\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.allParams\\",\\"type\\":\\"number\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.query.length\\",\\"type\\":\\"number\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.query.size\\",\\"type\\":\\"number\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.query.class\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.query.name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.query.type\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.response.code\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.response.flags\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.response.size\\",\\"type\\":\\"number\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"coredns.dnssec_ok\\",\\"type\\":\\"boolean\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"@timestamp\\",\\"type\\":\\"date\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"labels\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"message\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":false,\\"readFromDocValues\\":true},{\\"name\\":\\"tags\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"agent.ephemeral_id\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"agent.id\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"agent.name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"agent.type\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"agent.version\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"as.number\\",\\"type\\":\\"number\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"as.organization.name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.remote_ip_list\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.body_sent.bytes\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.method\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.url\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.http_version\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.response_code\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.referrer\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.agent\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.device\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.os\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.os_name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.user_agent.original\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.continent_name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":false,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.country_iso_code\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.location\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.region_name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.city_name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"nginx.access.geoip.region_iso_code\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"source.geo.continent_name\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":false,\\"readFromDocValues\\":true},{\\"name\\":\\"country\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"country.keyword\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":true,\\"readFromDocValues\\":true},{\\"name\\":\\"country.text\\",\\"type\\":\\"string\\",\\"count\\":0,\\"scripted\\":false,\\"indexed\\":true,\\"searchable\\":true,\\"aggregatable\\":false,\\"readFromDocValues\\":true}]", "fieldFormatMap": "{\\"coredns.allParams\\":{\\"id\\":\\"bytes\\",\\"params\\":{\\"pattern\\":\\"patternValQueryWeight\\",\\"inputFormat\\":\\"inputFormatVal,\\",\\"outputFormat\\":\\"outputFormalVal,\\",\\"outputPrecision\\":\\"3,\\",\\"labelTemplate\\":\\"labelTemplateVal,\\",\\"urlTemplate\\":\\"urlTemplateVal,\\"}},\\"coredns.query.length\\":{\\"params\\":{\\"pattern\\":\\"patternValQueryLength\\"}},\\"coredns.query.size\\":{\\"id\\":\\"bytes\\",\\"params\\":{\\"pattern\\":\\"patternValQuerySize\\"}},\\"coredns.response.size\\":{\\"id\\":\\"bytes\\"}}", "allowNoIndex": true } @@ -51,535 +51,463 @@ exports[`creating index patterns from yaml fields createIndexPatternFields funct "indexPatternFields": [ { "name": "coredns.id", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "coredns.allParams", + "type": "number", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "number" + "readFromDocValues": true }, { "name": "coredns.query.length", + "type": "number", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "number" + "readFromDocValues": true }, { "name": "coredns.query.size", + "type": "number", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "number" + "readFromDocValues": true }, { "name": "coredns.query.class", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "coredns.query.name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "coredns.query.type", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "coredns.response.code", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "coredns.response.flags", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "coredns.response.size", + "type": "number", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "number" + "readFromDocValues": true }, { "name": "coredns.dnssec_ok", + "type": "boolean", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "boolean" + "readFromDocValues": true }, { "name": "@timestamp", + "type": "date", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "date" + "readFromDocValues": true }, { "name": "labels", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "message", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": false, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "tags", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "agent.ephemeral_id", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "agent.id", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "agent.name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "agent.type", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "agent.version", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "as.number", + "type": "number", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "number" + "readFromDocValues": true }, { "name": "as.organization.name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "nginx.access.remote_ip_list", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.body_sent.bytes", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.user_name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.method", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.url", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.http_version", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.response_code", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.referrer", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.agent", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.user_agent.device", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.user_agent.name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.user_agent.os", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.user_agent.os_name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.user_agent.original", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.geoip.continent_name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": false, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "nginx.access.geoip.country_iso_code", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.geoip.location", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.geoip.region_name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.geoip.city_name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "nginx.access.geoip.region_iso_code", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, "readFromDocValues": true }, { "name": "source.geo.continent_name", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": false, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "country", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "country.keyword", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": true, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true }, { "name": "country.text", + "type": "string", "count": 0, "scripted": false, "indexed": true, - "analyzed": false, "searchable": true, "aggregatable": false, - "doc_values": true, - "readFromDocValues": true, - "type": "string" + "readFromDocValues": true } ], "fieldFormatMap": { diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.test.ts b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.test.ts index a0eaed04d649e..dfdaa66a7b43e 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.test.ts @@ -11,6 +11,8 @@ import { readFileSync } from 'fs'; import glob from 'glob'; import { safeLoad } from 'js-yaml'; +import type { FieldSpec } from 'src/plugins/data/common'; + import type { Fields, Field } from '../../fields/field'; import { @@ -22,7 +24,6 @@ import { createIndexPatternFields, createIndexPattern, } from './install'; -import type { IndexPatternField } from './install'; import { dupeFields } from './tests/test_data'; // Add our own serialiser to just do JSON.stringify @@ -93,7 +94,6 @@ describe('creating index patterns from yaml fields', () => { const mergedField = deduped.find((field) => field.name === '1'); expect(mergedField?.searchable).toBe(true); expect(mergedField?.aggregatable).toBe(true); - expect(mergedField?.analyzed).toBe(true); expect(mergedField?.count).toBe(0); }); }); @@ -156,7 +156,7 @@ describe('creating index patterns from yaml fields', () => { { fields: [{ name: 'testField', type: 'short' }], expect: 'number' }, { fields: [{ name: 'testField', type: 'byte' }], expect: 'number' }, { fields: [{ name: 'testField', type: 'keyword' }], expect: 'string' }, - { fields: [{ name: 'testField', type: 'invalidType' }], expect: undefined }, + { fields: [{ name: 'testField', type: 'invalidType' }], expect: 'string' }, { fields: [{ name: 'testField', type: 'text' }], expect: 'string' }, { fields: [{ name: 'testField', type: 'date' }], expect: 'date' }, { fields: [{ name: 'testField', type: 'geo_point' }], expect: 'geo_point' }, @@ -171,7 +171,7 @@ describe('creating index patterns from yaml fields', () => { test('transformField changes values based on other values', () => { interface TestWithAttr extends Test { - attr: keyof IndexPatternField; + attr: keyof FieldSpec; } const tests: TestWithAttr[] = [ @@ -211,43 +211,6 @@ describe('creating index patterns from yaml fields', () => { attr: 'aggregatable', }, - // analyzed - { fields: [{ name }], expect: false, attr: 'analyzed' }, - { fields: [{ name, analyzed: true }], expect: true, attr: 'analyzed' }, - { fields: [{ name, analyzed: false }], expect: false, attr: 'analyzed' }, - { fields: [{ name, type: 'binary' }], expect: false, attr: 'analyzed' }, - { fields: [{ name, analyzed: true, type: 'binary' }], expect: false, attr: 'analyzed' }, - { - fields: [{ name, analyzed: true, type: 'object', enabled: false }], - expect: false, - attr: 'analyzed', - }, - - // doc_values always set to true except for meta fields - { fields: [{ name }], expect: true, attr: 'doc_values' }, - { fields: [{ name, doc_values: true }], expect: true, attr: 'doc_values' }, - { fields: [{ name, doc_values: false }], expect: false, attr: 'doc_values' }, - { fields: [{ name, script: 'doc[]' }], expect: false, attr: 'doc_values' }, - { fields: [{ name, doc_values: true, script: 'doc[]' }], expect: false, attr: 'doc_values' }, - { fields: [{ name, type: 'binary' }], expect: false, attr: 'doc_values' }, - { fields: [{ name, doc_values: true, type: 'binary' }], expect: true, attr: 'doc_values' }, - { - fields: [{ name, doc_values: true, type: 'object', enabled: false }], - expect: false, - attr: 'doc_values', - }, - - // enabled - only applies to objects (and only if set) - { fields: [{ name, type: 'binary', enabled: false }], expect: undefined, attr: 'enabled' }, - { fields: [{ name, type: 'binary', enabled: true }], expect: undefined, attr: 'enabled' }, - { fields: [{ name, type: 'object', enabled: true }], expect: true, attr: 'enabled' }, - { fields: [{ name, type: 'object', enabled: false }], expect: false, attr: 'enabled' }, - { - fields: [{ name, type: 'object', enabled: false }], - expect: false, - attr: 'doc_values', - }, - // indexed { fields: [{ name, type: 'binary' }], expect: false, attr: 'indexed' }, { diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts index 3ec9d2c65a6da..61d6f6ed8818a 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/install.ts @@ -5,9 +5,9 @@ * 2.0. */ -import type { SavedObjectsClientContract } from 'src/core/server'; +import type { SavedObjectsClientContract, ElasticsearchClient } from 'src/core/server'; +import type { FieldSpec } from 'src/plugins/data/common'; -import { INDEX_PATTERN_SAVED_OBJECT_TYPE } from '../../../../constants'; import { loadFieldsFromYaml } from '../../fields/field'; import type { Fields, Field } from '../../fields/field'; import { dataTypes, installationStatuses } from '../../../../../common/constants'; @@ -17,6 +17,7 @@ import type { InstallSource, ValueOf, } from '../../../../../common/types'; +import { appContextService } from '../../../../services'; import type { RegistryPackage, DataType } from '../../../../types'; import { getInstallation, getPackageFromSource, getPackageSavedObjects } from '../../packages/get'; @@ -59,29 +60,29 @@ const typeMap: TypeMap = { constant_keyword: 'string', }; -export interface IndexPatternField { - name: string; - type?: string; - count: number; - scripted: boolean; - indexed: boolean; - analyzed: boolean; - searchable: boolean; - aggregatable: boolean; - doc_values: boolean; - enabled?: boolean; - script?: string; - lang?: string; - readFromDocValues: boolean; -} +const INDEX_PATTERN_SAVED_OBJECT_TYPE = 'index-pattern'; export const indexPatternTypes = Object.values(dataTypes); -export async function installIndexPatterns( - savedObjectsClient: SavedObjectsClientContract, - pkgName?: string, - pkgVersion?: string, - installSource?: InstallSource -) { +export async function installIndexPatterns({ + savedObjectsClient, + pkgName, + pkgVersion, + installSource, +}: { + savedObjectsClient: SavedObjectsClientContract; + esClient: ElasticsearchClient; + pkgName?: string; + pkgVersion?: string; + installSource?: InstallSource; +}) { + const logger = appContextService.getLogger(); + + logger.debug( + `kicking off installation of index patterns for ${ + pkgName && pkgVersion ? `${pkgName}-${pkgVersion}` : 'no specific package' + }` + ); + // get all user installed packages const installedPackagesRes = await getPackageSavedObjects(savedObjectsClient); const installedPackagesSavedObjects = installedPackagesRes.saved_objects.filter( @@ -115,6 +116,7 @@ export async function installIndexPatterns( }); } } + // get each package's registry info const packagesToFetchPromise = packagesToFetch.map((pkg) => getPackageFromSource({ @@ -125,27 +127,33 @@ export async function installIndexPatterns( }) ); const packages = await Promise.all(packagesToFetchPromise); + // for each index pattern type, create an index pattern - indexPatternTypes.forEach(async (indexPatternType) => { - // if this is an update because a package is being uninstalled (no pkgkey argument passed) and no other packages are installed, remove the index pattern - if (!pkgName && installedPackagesSavedObjects.length === 0) { - try { - await savedObjectsClient.delete(INDEX_PATTERN_SAVED_OBJECT_TYPE, `${indexPatternType}-*`); - } catch (err) { - // index pattern was probably deleted by the user already + return Promise.all( + indexPatternTypes.map(async (indexPatternType) => { + // if this is an update because a package is being uninstalled (no pkgkey argument passed) and no other packages are installed, remove the index pattern + if (!pkgName && installedPackagesSavedObjects.length === 0) { + try { + logger.debug(`deleting index pattern ${indexPatternType}-*`); + await savedObjectsClient.delete(INDEX_PATTERN_SAVED_OBJECT_TYPE, `${indexPatternType}-*`); + } catch (err) { + // index pattern was probably deleted by the user already + } + return; } - return; - } - const packagesWithInfo = packages.map((pkg) => pkg.packageInfo); - // get all data stream fields from all installed packages - const fields = await getAllDataStreamFieldsByType(packagesWithInfo, indexPatternType); - const kibanaIndexPattern = createIndexPattern(indexPatternType, fields); - // create or overwrite the index pattern - await savedObjectsClient.create(INDEX_PATTERN_SAVED_OBJECT_TYPE, kibanaIndexPattern, { - id: `${indexPatternType}-*`, - overwrite: true, - }); - }); + const packagesWithInfo = packages.map((pkg) => pkg.packageInfo); + // get all data stream fields from all installed packages + const fields = await getAllDataStreamFieldsByType(packagesWithInfo, indexPatternType); + const kibanaIndexPattern = createIndexPattern(indexPatternType, fields); + + // create or overwrite the index pattern + await savedObjectsClient.create(INDEX_PATTERN_SAVED_OBJECT_TYPE, kibanaIndexPattern, { + id: `${indexPatternType}-*`, + overwrite: true, + }); + logger.debug(`created index pattern ${kibanaIndexPattern.title}`); + }) + ); } // loops through all given packages and returns an array @@ -189,7 +197,7 @@ export const createIndexPattern = (indexPatternType: string, fields: Fields) => // and also returns the fieldFormatMap export const createIndexPatternFields = ( fields: Fields -): { indexPatternFields: IndexPatternField[]; fieldFormatMap: FieldFormatMap } => { +): { indexPatternFields: FieldSpec[]; fieldFormatMap: FieldFormatMap } => { const flattenedFields = flattenFields(fields); const fieldFormatMap = createFieldFormatMap(flattenedFields); const transformedFields = flattenedFields.map(transformField); @@ -198,8 +206,8 @@ export const createIndexPatternFields = ( }; // merges fields that are duplicates with the existing taking precedence -export const dedupeFields = (fields: IndexPatternField[]) => { - const uniqueObj = fields.reduce<{ [name: string]: IndexPatternField }>((acc, field) => { +export const dedupeFields = (fields: FieldSpec[]) => { + const uniqueObj = fields.reduce<{ [name: string]: FieldSpec }>((acc, field) => { // if field doesn't exist yet if (!acc[field.name]) { acc[field.name] = field; @@ -251,34 +259,20 @@ const getField = (fields: Fields, pathNames: string[]): Field | undefined => { return undefined; }; -export const transformField = (field: Field, i: number, fields: Fields): IndexPatternField => { - const newField: IndexPatternField = { +export const transformField = (field: Field, i: number, fields: Fields): FieldSpec => { + const newField: FieldSpec = { name: field.name, + type: field.type && typeMap[field.type] ? typeMap[field.type] : 'string', count: field.count ?? 0, scripted: false, indexed: field.index ?? true, - analyzed: field.analyzed ?? false, searchable: field.searchable ?? true, aggregatable: field.aggregatable ?? true, - doc_values: field.doc_values ?? true, readFromDocValues: field.doc_values ?? true, }; - // if type exists, check if it exists in the map - if (field.type) { - // if no type match type is not set (undefined) - if (typeMap[field.type]) { - newField.type = typeMap[field.type]; - } - // if type isn't set, default to string - } else { - newField.type = 'string'; - } - if (newField.type === 'binary') { newField.aggregatable = false; - newField.analyzed = false; - newField.doc_values = field.doc_values ?? false; newField.readFromDocValues = field.doc_values ?? false; newField.indexed = false; newField.searchable = false; @@ -286,11 +280,8 @@ export const transformField = (field: Field, i: number, fields: Fields): IndexPa if (field.type === 'object' && field.hasOwnProperty('enabled')) { const enabled = field.enabled ?? true; - newField.enabled = enabled; if (!enabled) { newField.aggregatable = false; - newField.analyzed = false; - newField.doc_values = false; newField.readFromDocValues = false; newField.indexed = false; newField.searchable = false; @@ -305,7 +296,6 @@ export const transformField = (field: Field, i: number, fields: Fields): IndexPa newField.scripted = true; newField.script = field.script; newField.lang = 'painless'; - newField.doc_values = false; newField.readFromDocValues = false; } diff --git a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/tests/test_data.ts b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/tests/test_data.ts index 49a32de703776..d9bcf36651081 100644 --- a/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/tests/test_data.ts +++ b/x-pack/plugins/fleet/server/services/epm/kibana/index_pattern/tests/test_data.ts @@ -5,9 +5,9 @@ * 2.0. */ -import type { IndexPatternField } from '../install'; +import type { FieldSpec } from 'src/plugins/data/common'; -export const dupeFields: IndexPatternField[] = [ +export const dupeFields: FieldSpec[] = [ { name: '1', type: 'integer', @@ -15,10 +15,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: true, count: 0, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '2', @@ -27,10 +25,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: true, count: 0, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '3', @@ -39,10 +35,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: true, count: 0, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '1', @@ -51,10 +45,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: false, count: 2, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '1.1', @@ -63,10 +55,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: false, count: 0, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '4', @@ -75,10 +65,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: false, count: 0, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '2', @@ -87,10 +75,8 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: false, count: 0, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: true, }, { name: '1', @@ -99,9 +85,7 @@ export const dupeFields: IndexPatternField[] = [ aggregatable: false, count: 1, indexed: true, - doc_values: true, readFromDocValues: true, scripted: false, - analyzed: false, }, ]; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts index ca9d490609636..65d71ac5fdc17 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/_install_package.ts @@ -12,7 +12,6 @@ import type { InstallablePackage, InstallSource, PackageAssetReference } from '. import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../constants'; import { ElasticsearchAssetType } from '../../../types'; import type { AssetReference, Installation, InstallType } from '../../../types'; -import { installIndexPatterns } from '../kibana/index_pattern/install'; import { installTemplates } from '../elasticsearch/template/install'; import { installPipelines, deletePreviousPipelines } from '../elasticsearch/ingest_pipeline/'; import { installILMPolicy } from '../elasticsearch/ilm/install'; @@ -81,11 +80,11 @@ export async function _installPackage({ }); } - // kick off `installIndexPatterns` & `installKibanaAssets` as early as possible because they're the longest running operations + // kick off `installKibanaAssets` as early as possible because they're the longest running operations // we don't `await` here because we don't want to delay starting the many other `install*` functions // however, without an `await` or a `.catch` we haven't defined how to handle a promise rejection // we define it many lines and potentially seconds of wall clock time later in - // `await Promise.all([installKibanaAssetsPromise, installIndexPatternPromise]);` + // `await installKibanaAssetsPromise` // if we encounter an error before we there, we'll have an "unhandled rejection" which causes its own problems // the program will log something like this _and exit/crash_ // Unhandled Promise rejection detected: @@ -96,13 +95,6 @@ export async function _installPackage({ // add a `.catch` to prevent the "unhandled rejection" case // in that `.catch`, set something that indicates a failure // check for that failure later and act accordingly (throw, ignore, return) - let installIndexPatternError; - const installIndexPatternPromise = installIndexPatterns( - savedObjectsClient, - pkgName, - pkgVersion, - installSource - ).catch((reason) => (installIndexPatternError = reason)); const kibanaAssets = await getKibanaAssets(paths); if (installedPkg) await deleteKibanaSavedObjectsAssets( @@ -184,9 +176,8 @@ export async function _installPackage({ })); // make sure the assets are installed (or didn't error) - if (installIndexPatternError) throw installIndexPatternError; if (installKibanaAssetsError) throw installKibanaAssetsError; - await Promise.all([installKibanaAssetsPromise, installIndexPatternPromise]); + await installKibanaAssetsPromise; const packageAssetResults = await saveArchiveEntries({ savedObjectsClient, diff --git a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts index b726c60fc1e5e..7323263d4a70f 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/bulk_install_packages.ts @@ -7,58 +7,72 @@ import type { ElasticsearchClient, SavedObjectsClientContract } from 'src/core/server'; +import { appContextService } from '../../app_context'; import * as Registry from '../registry'; +import { installIndexPatterns } from '../kibana/index_pattern/install'; -import { getInstallationObject } from './index'; -import { upgradePackage } from './install'; +import { installPackage } from './install'; import type { BulkInstallResponse, IBulkInstallPackageError } from './install'; interface BulkInstallPackagesParams { savedObjectsClient: SavedObjectsClientContract; - packagesToUpgrade: string[]; + packagesToInstall: string[]; esClient: ElasticsearchClient; } export async function bulkInstallPackages({ savedObjectsClient, - packagesToUpgrade, + packagesToInstall, esClient, }: BulkInstallPackagesParams): Promise { - const installedAndLatestPromises = packagesToUpgrade.map((pkgToUpgrade) => - Promise.all([ - getInstallationObject({ savedObjectsClient, pkgName: pkgToUpgrade }), - Registry.fetchFindLatestPackage(pkgToUpgrade), - ]) + const logger = appContextService.getLogger(); + const installSource = 'registry'; + const latestPackagesResults = await Promise.allSettled( + packagesToInstall.map((packageName) => Registry.fetchFindLatestPackage(packageName)) ); - const installedAndLatestResults = await Promise.allSettled(installedAndLatestPromises); - const installResponsePromises = installedAndLatestResults.map(async (result, index) => { - const pkgToUpgrade = packagesToUpgrade[index]; - if (result.status === 'fulfilled') { - const [installedPkg, latestPkg] = result.value; - return upgradePackage({ - savedObjectsClient, - esClient, - installedPkg, - latestPkg, - pkgToUpgrade, - }); - } else { - return { name: pkgToUpgrade, error: result.reason }; - } - }); - const installResults = await Promise.allSettled(installResponsePromises); - const installResponses = installResults.map((result, index) => { - const pkgToUpgrade = packagesToUpgrade[index]; - if (result.status === 'fulfilled') { - return result.value; - } else { - return { name: pkgToUpgrade, error: result.reason }; - } - }); - return installResponses; + logger.debug(`kicking off bulk install of ${packagesToInstall.join(', ')} from registry`); + const installResults = await Promise.allSettled( + latestPackagesResults.map(async (result, index) => { + const packageName = packagesToInstall[index]; + if (result.status === 'fulfilled') { + const latestPackage = result.value; + return { + name: packageName, + version: latestPackage.version, + result: await installPackage({ + savedObjectsClient, + esClient, + pkgkey: Registry.pkgToPkgKey(latestPackage), + installSource, + skipPostInstall: true, + }), + }; + } + return { name: packageName, error: result.reason }; + }) + ); + + // only install index patterns if we completed install for any package-version for the + // first time, aka fresh installs or upgrades + if ( + installResults.find( + (result) => result.status === 'fulfilled' && result.value.result?.status === 'installed' + ) + ) { + await installIndexPatterns({ savedObjectsClient, esClient, installSource }); + } + + return installResults.map((result, index) => { + const packageName = packagesToInstall[index]; + return result.status === 'fulfilled' + ? result.value + : { name: packageName, error: result.reason }; + }); } -export function isBulkInstallError(test: any): test is IBulkInstallPackageError { - return 'error' in test && test.error instanceof Error; +export function isBulkInstallError( + installResponse: any +): installResponse is IBulkInstallPackageError { + return 'error' in installResponse && installResponse.error instanceof Error; } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts index e01af7b64c0e3..fa2ea9e2209ed 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/ensure_installed_default_packages.test.ts @@ -77,9 +77,8 @@ describe('ensureInstalledDefaultPackages', () => { return [ { name: mockInstallation.attributes.name, - assets: [], - newVersion: '', - oldVersion: '', + result: { assets: [], status: 'installed' }, + version: '', statusCode: 200, }, ]; @@ -96,16 +95,14 @@ describe('ensureInstalledDefaultPackages', () => { return [ { name: 'success one', - assets: [], - newVersion: '', - oldVersion: '', + result: { assets: [], status: 'installed' }, + version: '', statusCode: 200, }, { name: 'success two', - assets: [], - newVersion: '', - oldVersion: '', + result: { assets: [], status: 'installed' }, + version: '', statusCode: 200, }, { @@ -114,9 +111,8 @@ describe('ensureInstalledDefaultPackages', () => { }, { name: 'success three', - assets: [], - newVersion: '', - oldVersion: '', + result: { assets: [], status: 'installed' }, + version: '', statusCode: 200, }, { @@ -138,9 +134,8 @@ describe('ensureInstalledDefaultPackages', () => { return [ { name: 'undefined package', - assets: [], - newVersion: '', - oldVersion: '', + result: { assets: [], status: 'installed' }, + version: '', statusCode: 200, }, ]; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/install.ts b/x-pack/plugins/fleet/server/services/epm/packages/install.ts index 011e77fb7e89b..1a6b41976af98 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -5,10 +5,8 @@ * 2.0. */ -import semverGt from 'semver/functions/gt'; import semverLt from 'semver/functions/lt'; import type Boom from '@hapi/boom'; -import type { UnwrapPromise } from '@kbn/utility-types'; import type { ElasticsearchClient, SavedObject, SavedObjectsClientContract } from 'src/core/server'; import { generateESIndexPatterns } from '../elasticsearch/template/template'; @@ -28,12 +26,14 @@ import type { AssetType, EsAssetReference, InstallType, + InstallResult, } from '../../../types'; import { appContextService } from '../../app_context'; import * as Registry from '../registry'; import { setPackageInfo, parseAndVerifyArchiveEntries, unpackBufferToCache } from '../archive'; import { toAssetReference } from '../kibana/assets/install'; import type { ArchiveAsset } from '../kibana/assets/install'; +import { installIndexPatterns } from '../kibana/index_pattern/install'; import { isRequiredPackage, @@ -63,7 +63,7 @@ export async function installLatestPackage(options: { savedObjectsClient, pkgkey, esClient, - }); + }).then(({ assets }) => assets); } catch (err) { throw err; } @@ -76,7 +76,7 @@ export async function ensureInstalledDefaultPackages( const installations = []; const bulkResponse = await bulkInstallPackages({ savedObjectsClient, - packagesToUpgrade: Object.values(defaultPackages), + packagesToInstall: Object.values(defaultPackages), esClient, }); @@ -164,6 +164,7 @@ export async function handleInstallPackageFailure({ savedObjectsClient, pkgkey: prevVersion, esClient, + force: true, }); } } catch (e) { @@ -177,64 +178,6 @@ export interface IBulkInstallPackageError { } export type BulkInstallResponse = BulkInstallPackageInfo | IBulkInstallPackageError; -interface UpgradePackageParams { - savedObjectsClient: SavedObjectsClientContract; - esClient: ElasticsearchClient; - installedPkg: UnwrapPromise>; - latestPkg: UnwrapPromise>; - pkgToUpgrade: string; -} -export async function upgradePackage({ - savedObjectsClient, - esClient, - installedPkg, - latestPkg, - pkgToUpgrade, -}: UpgradePackageParams): Promise { - if (!installedPkg || semverGt(latestPkg.version, installedPkg.attributes.version)) { - const pkgkey = Registry.pkgToPkgKey({ - name: latestPkg.name, - version: latestPkg.version, - }); - - try { - const assets = await installPackage({ - installSource: 'registry', - savedObjectsClient, - pkgkey, - esClient, - }); - return { - name: pkgToUpgrade, - newVersion: latestPkg.version, - oldVersion: installedPkg?.attributes.version ?? null, - assets, - }; - } catch (installFailed) { - await handleInstallPackageFailure({ - savedObjectsClient, - error: installFailed, - pkgName: latestPkg.name, - pkgVersion: latestPkg.version, - installedPkg, - esClient, - }); - return { name: pkgToUpgrade, error: installFailed }; - } - } else { - // package was already at the latest version - return { - name: pkgToUpgrade, - newVersion: latestPkg.version, - oldVersion: latestPkg.version, - assets: [ - ...installedPkg.attributes.installed_es, - ...installedPkg.attributes.installed_kibana, - ], - }; - } -} - interface InstallRegistryPackageParams { savedObjectsClient: SavedObjectsClientContract; pkgkey: string; @@ -247,32 +190,81 @@ async function installPackageFromRegistry({ pkgkey, esClient, force = false, -}: InstallRegistryPackageParams): Promise { +}: InstallRegistryPackageParams): Promise { + const logger = appContextService.getLogger(); // TODO: change epm API to /packageName/version so we don't need to do this const { pkgName, pkgVersion } = Registry.splitPkgKey(pkgkey); + // get the currently installed package const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); const installType = getInstallType({ pkgVersion, installedPkg }); + + // get latest package version + const latestPackage = await Registry.fetchFindLatestPackage(pkgName); + // let the user install if using the force flag or needing to reinstall or install a previous version due to failed update const installOutOfDateVersionOk = - installType === 'reinstall' || installType === 'reupdate' || installType === 'rollback'; + force || ['reinstall', 'reupdate', 'rollback'].includes(installType); + + // if the requested version is the same as installed version, check if we allow it based on + // current installed package status and force flag, if we don't allow it, + // just return the asset references from the existing installation + if ( + installedPkg?.attributes.version === pkgVersion && + installedPkg?.attributes.install_status === 'installed' + ) { + if (!force) { + logger.debug(`${pkgkey} is already installed, skipping installation`); + return { + assets: [ + ...installedPkg.attributes.installed_es, + ...installedPkg.attributes.installed_kibana, + ], + status: 'already_installed', + }; + } + } - const latestPackage = await Registry.fetchFindLatestPackage(pkgName); - if (semverLt(pkgVersion, latestPackage.version) && !force && !installOutOfDateVersionOk) { - throw new PackageOutdatedError(`${pkgkey} is out-of-date and cannot be installed or updated`); + // if the requested version is out-of-date of the latest package version, check if we allow it + // if we don't allow it, return an error + if (semverLt(pkgVersion, latestPackage.version)) { + if (!installOutOfDateVersionOk) { + throw new PackageOutdatedError(`${pkgkey} is out-of-date and cannot be installed or updated`); + } + logger.debug( + `${pkgkey} is out-of-date, installing anyway due to ${ + force ? 'force flag' : `install type ${installType}` + }` + ); } + // get package info const { paths, packageInfo } = await Registry.getRegistryPackage(pkgName, pkgVersion); - return _installPackage({ - savedObjectsClient, - esClient, - installedPkg, - paths, - packageInfo, - installType, - installSource: 'registry', - }); + // try installing the package, if there was an error, call error handler and rethrow + try { + return _installPackage({ + savedObjectsClient, + esClient, + installedPkg, + paths, + packageInfo, + installType, + installSource: 'registry', + }).then((assets) => { + return { assets, status: 'installed' }; + }); + } catch (e) { + await handleInstallPackageFailure({ + savedObjectsClient, + error: e, + pkgName, + pkgVersion, + installedPkg, + esClient, + }); + throw e; + } } interface InstallUploadedArchiveParams { @@ -282,16 +274,12 @@ interface InstallUploadedArchiveParams { contentType: string; } -export type InstallPackageParams = - | ({ installSource: Extract } & InstallRegistryPackageParams) - | ({ installSource: Extract } & InstallUploadedArchiveParams); - async function installPackageByUpload({ savedObjectsClient, esClient, archiveBuffer, contentType, -}: InstallUploadedArchiveParams): Promise { +}: InstallUploadedArchiveParams): Promise { const { packageInfo } = await parseAndVerifyArchiveEntries(archiveBuffer, contentType); const installedPkg = await getInstallationObject({ @@ -329,32 +317,68 @@ async function installPackageByUpload({ packageInfo, installType, installSource, + }).then((assets) => { + return { assets, status: 'installed' }; }); } +export type InstallPackageParams = { + skipPostInstall?: boolean; +} & ( + | ({ installSource: Extract } & InstallRegistryPackageParams) + | ({ installSource: Extract } & InstallUploadedArchiveParams) +); + export async function installPackage(args: InstallPackageParams) { if (!('installSource' in args)) { throw new Error('installSource is required'); } + const logger = appContextService.getLogger(); + const { savedObjectsClient, esClient, skipPostInstall = false, installSource } = args; if (args.installSource === 'registry') { - const { savedObjectsClient, pkgkey, esClient, force } = args; - - return installPackageFromRegistry({ + const { pkgkey, force } = args; + const { pkgName, pkgVersion } = Registry.splitPkgKey(pkgkey); + logger.debug(`kicking off install of ${pkgkey} from registry`); + const response = installPackageFromRegistry({ savedObjectsClient, pkgkey, esClient, force, + }).then(async (installResult) => { + if (skipPostInstall) { + return installResult; + } + logger.debug(`install of ${pkgkey} finished, running post-install`); + return installIndexPatterns({ + savedObjectsClient, + esClient, + pkgName, + pkgVersion, + installSource, + }).then(() => installResult); }); + return response; } else if (args.installSource === 'upload') { - const { savedObjectsClient, esClient, archiveBuffer, contentType } = args; - - return installPackageByUpload({ + const { archiveBuffer, contentType } = args; + logger.debug(`kicking off install of uploaded package`); + const response = installPackageByUpload({ savedObjectsClient, esClient, archiveBuffer, contentType, + }).then(async (installResult) => { + if (skipPostInstall) { + return installResult; + } + logger.debug(`install of uploaded package finished, running post-install`); + return installIndexPatterns({ + savedObjectsClient, + esClient, + installSource, + }).then(() => installResult); }); + return response; } // @ts-expect-error s/b impossibe b/c `never` by this point, but just in case throw new Error(`Unknown installSource: ${args.installSource}`); @@ -451,26 +475,27 @@ export async function ensurePackagesCompletedInstall( searchFields: ['install_status'], search: 'installing', }); - const installingPromises = installingPackages.saved_objects.reduce< - Array> - >((acc, pkg) => { - const startDate = pkg.attributes.install_started_at; - const nowDate = new Date().toISOString(); - const elapsedTime = Date.parse(nowDate) - Date.parse(startDate); - const pkgkey = `${pkg.attributes.name}-${pkg.attributes.install_version}`; - // reinstall package - if (elapsedTime > MAX_TIME_COMPLETE_INSTALL) { - acc.push( - installPackage({ - installSource: 'registry', - savedObjectsClient, - pkgkey, - esClient, - }) - ); - } - return acc; - }, []); + const installingPromises = installingPackages.saved_objects.reduce>>( + (acc, pkg) => { + const startDate = pkg.attributes.install_started_at; + const nowDate = new Date().toISOString(); + const elapsedTime = Date.parse(nowDate) - Date.parse(startDate); + const pkgkey = `${pkg.attributes.name}-${pkg.attributes.install_version}`; + // reinstall package + if (elapsedTime > MAX_TIME_COMPLETE_INSTALL) { + acc.push( + installPackage({ + installSource: 'registry', + savedObjectsClient, + pkgkey, + esClient, + }) + ); + } + return acc; + }, + [] + ); await Promise.all(installingPromises); return installingPackages; } diff --git a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts index da407c1d4cfa0..21e4e31be2bd0 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/remove.ts @@ -63,7 +63,7 @@ export async function removeInstallation(options: { // recreate or delete index patterns when a package is uninstalled // this must be done after deleting the saved object for the current package otherwise it will retrieve the package // from the registry again and reinstall the index patterns - await installIndexPatterns(savedObjectsClient); + await installIndexPatterns({ savedObjectsClient, esClient }); // remove the package archive and its contents from the cache so that a reinstall fetches // a fresh copy from the registry diff --git a/x-pack/plugins/fleet/server/types/index.tsx b/x-pack/plugins/fleet/server/types/index.tsx index 885809d767323..c25b047c0e1ad 100644 --- a/x-pack/plugins/fleet/server/types/index.tsx +++ b/x-pack/plugins/fleet/server/types/index.tsx @@ -72,6 +72,7 @@ export { SettingsSOAttributes, InstallType, InstallSource, + InstallResult, // Agent Request types PostAgentEnrollRequest, PostAgentCheckinRequest, diff --git a/x-pack/test/fleet_api_integration/apis/epm/bulk_upgrade.ts b/x-pack/test/fleet_api_integration/apis/epm/bulk_upgrade.ts index 546493a4c6f39..80d0f67f9e7fb 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/bulk_upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/bulk_upgrade.ts @@ -51,8 +51,7 @@ export default function (providerContext: FtrProviderContext) { expect(body.response.length).equal(1); expect(body.response[0].name).equal('multiple_versions'); const entry = body.response[0] as BulkInstallPackageInfo; - expect(entry.oldVersion).equal('0.1.0'); - expect(entry.newVersion).equal('0.3.0'); + expect(entry.version).equal('0.3.0'); }); it('should return an error for packages that do not exist', async function () { const { body }: { body: BulkInstallPackagesResponse } = await supertest @@ -63,8 +62,7 @@ export default function (providerContext: FtrProviderContext) { expect(body.response.length).equal(2); expect(body.response[0].name).equal('multiple_versions'); const entry = body.response[0] as BulkInstallPackageInfo; - expect(entry.oldVersion).equal('0.1.0'); - expect(entry.newVersion).equal('0.3.0'); + expect(entry.version).equal('0.3.0'); const err = body.response[1] as IBulkInstallPackageHTTPError; expect(err.statusCode).equal(404); @@ -79,12 +77,10 @@ export default function (providerContext: FtrProviderContext) { expect(body.response.length).equal(2); expect(body.response[0].name).equal('multiple_versions'); let entry = body.response[0] as BulkInstallPackageInfo; - expect(entry.oldVersion).equal('0.1.0'); - expect(entry.newVersion).equal('0.3.0'); + expect(entry.version).equal('0.3.0'); entry = body.response[1] as BulkInstallPackageInfo; - expect(entry.oldVersion).equal(null); - expect(entry.newVersion).equal('0.1.0'); + expect(entry.version).equal('0.1.0'); expect(entry.name).equal('overrides'); }); }); @@ -103,8 +99,7 @@ export default function (providerContext: FtrProviderContext) { expect(body.response.length).equal(1); expect(body.response[0].name).equal('multiple_versions'); const entry = body.response[0] as BulkInstallPackageInfo; - expect(entry.oldVersion).equal(null); - expect(entry.newVersion).equal('0.3.0'); + expect(entry.version).equal('0.3.0'); }); }); }); From 685aa20ba6bd86493e2c7a53e2227a1e4aa23859 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 23 Mar 2021 20:45:26 +0200 Subject: [PATCH 04/35] Set initial palette for new series (#95177) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/application/components/lib/new_series_fn.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/new_series_fn.js b/src/plugins/vis_type_timeseries/public/application/components/lib/new_series_fn.js index 36e52fc21732f..9064cd1afc3f4 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/new_series_fn.js +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/new_series_fn.js @@ -17,6 +17,10 @@ export const newSeriesFn = (obj = {}) => { id: uuid.v1(), color: '#68BC00', split_mode: 'everything', + palette: { + type: 'palette', + name: 'default', + }, metrics: [newMetricAggFn()], separate_axis: 0, axis_position: 'right', From 29ee309dd880b273fa8810401f1f3d93699a5b55 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Tue, 23 Mar 2021 14:18:11 -0500 Subject: [PATCH 05/35] [App Search] Role mappings migration part 3 (#94763) * Remove validaition of ID property in route body The ID is inferred from the param in the URL. This was fixed in the logic file but the server route was never updated * Add RoleMappings component - ROLE_MAPPINGS_TITLE was moved to a shared constant in an earlier PR - Also removing redundant exports of interface * Add RoleMapping component - Also removing redundant export of interface from AppLogic * Add RoleMappingsRouter ROLE_MAPPINGS_TITLE was moved to a shared constant in an earlier PR # Conflicts: # x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/index.ts * Add route and update link in navigation * Remove unused translations * Change casing Co-authored-by: Constance * Change casing Co-authored-by: Constance * Change casing Co-authored-by: Constance * Add ability test * Refactor conditional constants * Refactor role type constants * Remove EuiPageContent * Refactor action mocks Co-authored-by: Constance Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../applications/app_search/app_logic.ts | 2 +- .../components/role_mappings/constants.ts | 172 +++++++++++- .../components/role_mappings/index.ts | 2 +- .../role_mappings/role_mapping.test.tsx | 106 ++++++++ .../components/role_mappings/role_mapping.tsx | 246 ++++++++++++++++++ .../role_mappings/role_mappings.test.tsx | 88 +++++++ .../role_mappings/role_mappings.tsx | 139 ++++++++++ .../role_mappings/role_mappings_logic.ts | 4 +- .../role_mappings_router.test.tsx | 26 ++ .../role_mappings/role_mappings_router.tsx | 29 +++ .../applications/app_search/index.test.tsx | 19 +- .../public/applications/app_search/index.tsx | 14 +- .../public/applications/app_search/types.ts | 2 +- .../app_search/utils/role/types.ts | 5 + .../routes/app_search/role_mappings.test.ts | 7 +- .../server/routes/app_search/role_mappings.ts | 5 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 18 files changed, 841 insertions(+), 27 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.tsx diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/app_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/app_logic.ts index 5f7dc683d93b4..44416b596e6ef 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/app_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/app_logic.ts @@ -13,7 +13,7 @@ import { ConfiguredLimits, Account, Role } from './types'; import { getRoleAbilities } from './utils/role'; -export interface AppValues { +interface AppValues { ilmEnabled: boolean; configuredLimits: ConfiguredLimits; account: Account; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/constants.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/constants.ts index 6232ba0fb4668..1fed750a86dc4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/constants.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/constants.ts @@ -7,9 +7,32 @@ import { i18n } from '@kbn/i18n'; -export const ROLE_MAPPINGS_TITLE = i18n.translate( - 'xpack.enterpriseSearch.appSearch.roleMappings.title', - { defaultMessage: 'Role Mappings' } +import { AdvanceRoleType } from '../../types'; + +export const SAVE_ROLE_MAPPING = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMapping.saveRoleMappingButtonLabel', + { defaultMessage: 'Save role mapping' } +); +export const UPDATE_ROLE_MAPPING = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMapping.updateRoleMappingButtonLabel', + { defaultMessage: 'Update role mapping' } +); + +export const ADD_ROLE_MAPPING_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMapping.newRoleMappingTitle', + { defaultMessage: 'Add role mapping' } +); +export const MANAGE_ROLE_MAPPING_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMapping.manageRoleMappingTitle', + { defaultMessage: 'Manage role mapping' } +); + +export const EMPTY_ROLE_MAPPINGS_BODY = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMapping.emptyRoleMappingsBody', + { + defaultMessage: + 'All users who successfully authenticate will be assigned the Owner role and have access to all engines. Add a new role to override the default.', + } ); export const DELETE_ROLE_MAPPING_MESSAGE = i18n.translate( @@ -40,3 +63,146 @@ export const ROLE_MAPPING_UPDATED_MESSAGE = i18n.translate( defaultMessage: 'Role mapping successfully updated.', } ); + +export const ROLE_MAPPINGS_ENGINE_ACCESS_HEADING = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMappingsEngineAccessHeading', + { + defaultMessage: 'Engine access', + } +); + +export const ROLE_MAPPINGS_RESET_BUTTON = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMappingsResetButton', + { + defaultMessage: 'Reset mappings', + } +); + +export const ROLE_MAPPINGS_RESET_CONFIRM_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMappingsResetConfirmTitle', + { + defaultMessage: 'Are you sure you want to reset role mappings?', + } +); + +export const ROLE_MAPPINGS_RESET_CONFIRM_BUTTON = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMappingsResetConfirmButton', + { + defaultMessage: 'Reset role mappings', + } +); + +export const ROLE_MAPPINGS_RESET_CANCEL_BUTTON = i18n.translate( + 'xpack.enterpriseSearch.appSearch.roleMappingsResetCancelButton', + { + defaultMessage: 'Cancel', + } +); + +export const DEV_ROLE_TYPE_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.DEV_ROLE_TYPE_DESCRIPTION', + { + defaultMessage: 'Devs can manage all aspects of an engine.', + } +); + +export const EDITOR_ROLE_TYPE_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.editorRoleTypeDescription', + { + defaultMessage: 'Editors can manage search settings.', + } +); + +export const ANALYST_ROLE_TYPE_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.analystRoleTypeDescription', + { + defaultMessage: 'Analysts can only view documents, query tester, and analytics.', + } +); + +export const OWNER_ROLE_TYPE_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.ownerRoleTypeDescription', + { + defaultMessage: + 'Owners can do anything. There can be many owners on the account, but there must be at least one owner at any time.', + } +); + +export const ADMIN_ROLE_TYPE_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.adminRoleTypeDescription', + { + defaultMessage: 'Admins can do anything, except manage account settings.', + } +); + +export const ADVANCED_ROLE_SELECTORS_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.advancedRoleSelectorsTitle', + { + defaultMessage: 'Full or limited engine access', + } +); + +export const ROLE_TITLE = i18n.translate('xpack.enterpriseSearch.appSearch.roleTitle', { + defaultMessage: 'Role', +}); + +export const FULL_ENGINE_ACCESS_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.fullEngineAccessTitle', + { + defaultMessage: 'Full engine access', + } +); + +export const FULL_ENGINE_ACCESS_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.fullEngineAccessDescription', + { + defaultMessage: 'Access to all current and future engines.', + } +); + +export const LIMITED_ENGINE_ACCESS_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.limitedEngineAccessTitle', + { + defaultMessage: 'Limited engine access', + } +); + +export const LIMITED_ENGINE_ACCESS_DESCRIPTION = i18n.translate( + 'xpack.enterpriseSearch.appSearch.limitedEngineAccessDescription', + { + defaultMessage: 'Limit user access to specific engines:', + } +); + +export const ENGINE_ACCESS_TITLE = i18n.translate( + 'xpack.enterpriseSearch.appSearch.engineAccessTitle', + { + defaultMessage: 'Engine access', + } +); + +export const ADVANCED_ROLE_TYPES = [ + { + type: 'dev', + description: DEV_ROLE_TYPE_DESCRIPTION, + }, + { + type: 'editor', + description: EDITOR_ROLE_TYPE_DESCRIPTION, + }, + { + type: 'analyst', + description: ANALYST_ROLE_TYPE_DESCRIPTION, + }, +] as AdvanceRoleType[]; + +export const STANDARD_ROLE_TYPES = [ + { + type: 'owner', + description: OWNER_ROLE_TYPE_DESCRIPTION, + }, + { + type: 'admin', + description: ADMIN_ROLE_TYPE_DESCRIPTION, + }, +] as AdvanceRoleType[]; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/index.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/index.ts index 91159ea9646ea..ce4b1de6e399d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { ROLE_MAPPINGS_TITLE } from './constants'; +export { RoleMappingsRouter } from './role_mappings_router'; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.test.tsx new file mode 100644 index 0000000000000..f50fc21d5ba58 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.test.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import '../../../__mocks__/shallow_useeffect.mock'; +import { DEFAULT_INITIAL_APP_DATA } from '../../../../../common/__mocks__'; +import { setMockActions, setMockValues } from '../../../__mocks__'; +import { engines } from '../../__mocks__/engines.mock'; + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { EuiCheckbox } from '@elastic/eui'; + +import { Loading } from '../../../shared/loading'; +import { + AttributeSelector, + DeleteMappingCallout, + RoleSelector, +} from '../../../shared/role_mapping'; +import { asRoleMapping } from '../../../shared/role_mapping/__mocks__/roles'; + +import { RoleMapping } from './role_mapping'; + +describe('RoleMapping', () => { + const mockRole = DEFAULT_INITIAL_APP_DATA.appSearch.role; + const actions = { + initializeRoleMappings: jest.fn(), + initializeRoleMapping: jest.fn(), + handleSaveMapping: jest.fn(), + handleEngineSelectionChange: jest.fn(), + handleAccessAllEnginesChange: jest.fn(), + handleAttributeValueChange: jest.fn(), + handleAttributeSelectorChange: jest.fn(), + handleDeleteMapping: jest.fn(), + handleRoleChange: jest.fn(), + handleAuthProviderChange: jest.fn(), + resetState: jest.fn(), + }; + + const mockValues = { + attributes: [], + elasticsearchRoles: [], + hasAdvancedRoles: true, + dataLoading: false, + roleType: 'admin', + roleMappings: [asRoleMapping], + attributeValue: '', + attributeName: 'username', + availableEngines: engines, + selectedEngines: new Set(), + accessAllEngines: false, + availableAuthProviders: [], + multipleAuthProvidersConfig: true, + selectedAuthProviders: [], + myRole: { + availableRoleTypes: mockRole.ability.availableRoleTypes, + }, + }; + + beforeEach(() => { + setMockActions(actions); + setMockValues(mockValues); + }); + + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(AttributeSelector)).toHaveLength(1); + expect(wrapper.find(RoleSelector)).toHaveLength(5); + }); + + it('returns Loading when loading', () => { + setMockValues({ ...mockValues, dataLoading: true }); + const wrapper = shallow(); + + expect(wrapper.find(Loading)).toHaveLength(1); + }); + + it('renders DeleteMappingCallout for existing mapping', () => { + setMockValues({ ...mockValues, roleMapping: asRoleMapping }); + const wrapper = shallow(); + + expect(wrapper.find(DeleteMappingCallout)).toHaveLength(1); + }); + + it('hides DeleteMappingCallout for new mapping', () => { + const wrapper = shallow(); + + expect(wrapper.find(DeleteMappingCallout)).toHaveLength(0); + }); + + it('handles engine checkbox click', () => { + const wrapper = shallow(); + wrapper + .find(EuiCheckbox) + .first() + .simulate('change', { target: { checked: true } }); + + expect(actions.handleEngineSelectionChange).toHaveBeenCalledWith(engines[0].name, true); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.tsx new file mode 100644 index 0000000000000..bfa3fefb2732d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mapping.tsx @@ -0,0 +1,246 @@ +/* + * Copyright 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 { useParams } from 'react-router-dom'; + +import { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiPageContentBody, + EuiPageHeader, + EuiPanel, + EuiRadio, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; + +import { FlashMessages } from '../../../shared/flash_messages'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { Loading } from '../../../shared/loading'; +import { + AttributeSelector, + DeleteMappingCallout, + RoleSelector, +} from '../../../shared/role_mapping'; +import { ROLE_MAPPINGS_TITLE } from '../../../shared/role_mapping/constants'; +import { AppLogic } from '../../app_logic'; + +import { roleHasScopedEngines } from '../../utils/role/has_scoped_engines'; +import { Engine } from '../engine/types'; + +import { + SAVE_ROLE_MAPPING, + UPDATE_ROLE_MAPPING, + ADD_ROLE_MAPPING_TITLE, + MANAGE_ROLE_MAPPING_TITLE, + ADVANCED_ROLE_TYPES, + STANDARD_ROLE_TYPES, + ADVANCED_ROLE_SELECTORS_TITLE, + ROLE_TITLE, + FULL_ENGINE_ACCESS_TITLE, + FULL_ENGINE_ACCESS_DESCRIPTION, + LIMITED_ENGINE_ACCESS_TITLE, + LIMITED_ENGINE_ACCESS_DESCRIPTION, + ENGINE_ACCESS_TITLE, +} from './constants'; +import { RoleMappingsLogic } from './role_mappings_logic'; + +interface RoleMappingProps { + isNew?: boolean; +} + +export const RoleMapping: React.FC = ({ isNew }) => { + const { roleId } = useParams() as { roleId: string }; + const { myRole } = useValues(AppLogic); + + const { + handleAccessAllEnginesChange, + handleAttributeSelectorChange, + handleAttributeValueChange, + handleAuthProviderChange, + handleDeleteMapping, + handleEngineSelectionChange, + handleRoleChange, + handleSaveMapping, + initializeRoleMapping, + resetState, + } = useActions(RoleMappingsLogic); + + const { + accessAllEngines, + attributeName, + attributeValue, + attributes, + availableAuthProviders, + availableEngines, + dataLoading, + elasticsearchRoles, + hasAdvancedRoles, + multipleAuthProvidersConfig, + roleMapping, + roleType, + selectedEngines, + selectedAuthProviders, + } = useValues(RoleMappingsLogic); + + useEffect(() => { + initializeRoleMapping(roleId); + return resetState; + }, []); + + if (dataLoading) return ; + + const SAVE_ROLE_MAPPING_LABEL = isNew ? SAVE_ROLE_MAPPING : UPDATE_ROLE_MAPPING; + const TITLE = isNew ? ADD_ROLE_MAPPING_TITLE : MANAGE_ROLE_MAPPING_TITLE; + + const saveRoleMappingButton = ( + + {SAVE_ROLE_MAPPING_LABEL} + + ); + + const engineSelector = (engine: Engine) => ( + { + handleEngineSelectionChange(engine.name, e.target.checked); + }} + label={engine.name} + /> + ); + + const advancedRoleSelectors = ( + <> + + +

{ADVANCED_ROLE_SELECTORS_TITLE}

+
+ + {ADVANCED_ROLE_TYPES.map(({ type, description }) => ( + + ))} + + ); + + return ( + <> + + + + + + + + + + + +

{ROLE_TITLE}

+
+ + +

{FULL_ENGINE_ACCESS_TITLE}

+
+ + export{' '} + {STANDARD_ROLE_TYPES.map(({ type, description }) => ( + + ))} + {hasAdvancedRoles && advancedRoleSelectors} +
+
+ {hasAdvancedRoles && ( + + + +

{ENGINE_ACCESS_TITLE}

+
+ + + + +

{FULL_ENGINE_ACCESS_TITLE}

+
+

{FULL_ENGINE_ACCESS_DESCRIPTION}

+ + } + /> +
+ + <> + + +

{LIMITED_ENGINE_ACCESS_TITLE}

+
+

{LIMITED_ENGINE_ACCESS_DESCRIPTION}

+ + } + /> + {!accessAllEngines && ( +
+ {availableEngines.map((engine) => engineSelector(engine))} +
+ )} + +
+
+
+ )} +
+ + {roleMapping && } +
+ + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.test.tsx new file mode 100644 index 0000000000000..9275ba0cd16db --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.test.tsx @@ -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 '../../../__mocks__/shallow_useeffect.mock'; +import { setMockActions, setMockValues } from '../../../__mocks__'; + +import React, { MouseEvent } from 'react'; + +import { shallow, ShallowWrapper } from 'enzyme'; + +import { EuiEmptyPrompt, EuiConfirmModal, EuiPageHeader } from '@elastic/eui'; + +import { Loading } from '../../../shared/loading'; +import { RoleMappingsTable } from '../../../shared/role_mapping'; +import { wsRoleMapping } from '../../../shared/role_mapping/__mocks__/roles'; + +import { RoleMappings } from './role_mappings'; + +describe('RoleMappings', () => { + const initializeRoleMappings = jest.fn(); + const handleResetMappings = jest.fn(); + const mockValues = { + roleMappings: [wsRoleMapping], + dataLoading: false, + multipleAuthProvidersConfig: false, + }; + + beforeEach(() => { + setMockActions({ + initializeRoleMappings, + handleResetMappings, + }); + setMockValues(mockValues); + }); + + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(RoleMappingsTable)).toHaveLength(1); + }); + + it('returns Loading when loading', () => { + setMockValues({ ...mockValues, dataLoading: true }); + const wrapper = shallow(); + + expect(wrapper.find(Loading)).toHaveLength(1); + }); + + it('renders empty state', () => { + setMockValues({ ...mockValues, roleMappings: [] }); + const wrapper = shallow(); + + expect(wrapper.find(EuiEmptyPrompt)).toHaveLength(1); + }); + + describe('resetMappingsWarningModal', () => { + let wrapper: ShallowWrapper; + + beforeEach(() => { + wrapper = shallow(); + const button = wrapper.find(EuiPageHeader).prop('rightSideItems')![0] as any; + button.props.onClick(); + }); + + it('renders reset warnings modal', () => { + expect(wrapper.find(EuiConfirmModal)).toHaveLength(1); + }); + + it('hides reset warnings modal', () => { + const modal = wrapper.find(EuiConfirmModal); + modal.prop('onCancel')(); + + expect(wrapper.find(EuiConfirmModal)).toHaveLength(0); + }); + + it('resets when confirmed', () => { + const event = {} as MouseEvent; + const modal = wrapper.find(EuiConfirmModal); + modal.prop('onConfirm')!(event); + + expect(handleResetMappings).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.tsx new file mode 100644 index 0000000000000..e31f5c04bdb45 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings.tsx @@ -0,0 +1,139 @@ +/* + * Copyright 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, useState } from 'react'; + +import { useActions, useValues } from 'kea'; + +import { + EuiButton, + EuiConfirmModal, + EuiEmptyPrompt, + EuiOverlayMask, + EuiPageContent, + EuiPageContentBody, + EuiPageHeader, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; + +import { FlashMessages } from '../../../shared/flash_messages'; +import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { Loading } from '../../../shared/loading'; +import { AddRoleMappingButton, RoleMappingsTable } from '../../../shared/role_mapping'; +import { + EMPTY_ROLE_MAPPINGS_TITLE, + ROLE_MAPPINGS_TITLE, + ROLE_MAPPINGS_DESCRIPTION, +} from '../../../shared/role_mapping/constants'; + +import { ROLE_MAPPING_NEW_PATH } from '../../routes'; + +import { + ROLE_MAPPINGS_ENGINE_ACCESS_HEADING, + EMPTY_ROLE_MAPPINGS_BODY, + ROLE_MAPPINGS_RESET_BUTTON, + ROLE_MAPPINGS_RESET_CONFIRM_TITLE, + ROLE_MAPPINGS_RESET_CONFIRM_BUTTON, + ROLE_MAPPINGS_RESET_CANCEL_BUTTON, +} from './constants'; +import { RoleMappingsLogic } from './role_mappings_logic'; +import { generateRoleMappingPath } from './utils'; + +export const RoleMappings: React.FC = () => { + const { initializeRoleMappings, handleResetMappings, resetState } = useActions(RoleMappingsLogic); + const { roleMappings, multipleAuthProvidersConfig, dataLoading } = useValues(RoleMappingsLogic); + + useEffect(() => { + initializeRoleMappings(); + return resetState; + }, []); + + const [isResetWarningVisible, setResetWarningVisibility] = useState(false); + const showWarning = () => setResetWarningVisibility(true); + const hideWarning = () => setResetWarningVisibility(false); + + if (dataLoading) return ; + + const RESET_MAPPINGS_WARNING_MODAL_BODY = ( + + {i18n.translate('xpack.enterpriseSearch.appSearch.resetMappingsWarningModalBodyBold', { + defaultMessage: 'All role mappings will be deleted', + })} + + ), + }} + /> + ); + + const addMappingButton = ; + + const roleMappingEmptyState = ( + {EMPTY_ROLE_MAPPINGS_TITLE}} + body={

{EMPTY_ROLE_MAPPINGS_BODY}

} + actions={addMappingButton} + /> + ); + + const roleMappingsTable = ( + + ); + + const resetMappings = ( + + {ROLE_MAPPINGS_RESET_BUTTON} + + ); + + const resetMappingsWarningModal = isResetWarningVisible ? ( + + handleResetMappings(hideWarning)} + title={ROLE_MAPPINGS_RESET_CONFIRM_TITLE} + cancelButtonText={ROLE_MAPPINGS_RESET_CANCEL_BUTTON} + confirmButtonText={ROLE_MAPPINGS_RESET_CONFIRM_BUTTON} + buttonColor="danger" + maxWidth={640} + > +

{RESET_MAPPINGS_WARNING_MODAL_BODY}

+
+
+ ) : null; + + return ( + <> + + + + + + {roleMappings.length === 0 ? roleMappingEmptyState : roleMappingsTable} + + + {resetMappingsWarningModal} + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts index f1b81a59779ac..d6d5677386330 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts @@ -48,7 +48,7 @@ const getFirstAttributeName = (roleMapping: ASRoleMapping) => const getFirstAttributeValue = (roleMapping: ASRoleMapping) => Object.entries(roleMapping.rules)[0][1] as AttributeName; -export interface RoleMappingsActions { +interface RoleMappingsActions { handleAccessAllEnginesChange(): void; handleAuthProviderChange(value: string[]): { value: string[] }; handleAttributeSelectorChange( @@ -74,7 +74,7 @@ export interface RoleMappingsActions { setRoleMappingsData(data: RoleMappingsServerDetails): RoleMappingsServerDetails; } -export interface RoleMappingsValues { +interface RoleMappingsValues { accessAllEngines: boolean; attributeName: AttributeName; attributeValue: string; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.test.tsx new file mode 100644 index 0000000000000..e9fc40ba1dbb4 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.test.tsx @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { Route, Switch } from 'react-router-dom'; + +import { shallow } from 'enzyme'; + +import { RoleMapping } from './role_mapping'; +import { RoleMappings } from './role_mappings'; +import { RoleMappingsRouter } from './role_mappings_router'; + +describe('RoleMappingsRouter', () => { + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(Switch)).toHaveLength(1); + expect(wrapper.find(Route)).toHaveLength(3); + expect(wrapper.find(RoleMapping)).toHaveLength(2); + expect(wrapper.find(RoleMappings)).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.tsx new file mode 100644 index 0000000000000..7aa8b4067d9e5 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_router.tsx @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { Route, Switch } from 'react-router-dom'; + +import { ROLE_MAPPING_NEW_PATH, ROLE_MAPPING_PATH, ROLE_MAPPINGS_PATH } from '../../routes'; + +import { RoleMapping } from './role_mapping'; +import { RoleMappings } from './role_mappings'; + +export const RoleMappingsRouter: React.FC = () => ( + + + + + + + + + + + +); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx index 4da71ec9a135b..62a0ccc01f29a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.test.tsx @@ -25,6 +25,7 @@ import { EngineCreation } from './components/engine_creation'; import { EnginesOverview } from './components/engines'; import { ErrorConnecting } from './components/error_connecting'; import { MetaEngineCreation } from './components/meta_engine_creation'; +import { RoleMappingsRouter } from './components/role_mappings'; import { SetupGuide } from './components/setup_guide'; import { AppSearch, AppSearchUnconfigured, AppSearchConfigured, AppSearchNav } from './'; @@ -88,6 +89,20 @@ describe('AppSearchConfigured', () => { }); describe('ability checks', () => { + describe('canViewRoleMappings', () => { + it('renders RoleMappings when canViewRoleMappings is true', () => { + setMockValues({ myRole: { canViewRoleMappings: true } }); + rerender(wrapper); + expect(wrapper.find(RoleMappingsRouter)).toHaveLength(1); + }); + + it('does not render RoleMappings when user canViewRoleMappings is false', () => { + setMockValues({ myRole: { canManageEngines: false } }); + rerender(wrapper); + expect(wrapper.find(RoleMappingsRouter)).toHaveLength(0); + }); + }); + describe('canManageEngines', () => { it('renders EngineCreation when user canManageEngines is true', () => { setMockValues({ myRole: { canManageEngines: true } }); @@ -155,8 +170,6 @@ describe('AppSearchNav', () => { setMockValues({ myRole: { canViewRoleMappings: true } }); const wrapper = shallow(); - expect(wrapper.find(SideNavLink).last().prop('to')).toEqual( - 'http://localhost:3002/as/role_mappings' - ); + expect(wrapper.find(SideNavLink).last().prop('to')).toEqual('/role_mappings'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx index 88db4004ea9e2..3a46a90d20d66 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/index.tsx @@ -12,12 +12,13 @@ import { useValues } from 'kea'; import { APP_SEARCH_PLUGIN } from '../../../common/constants'; import { InitialAppData } from '../../../common/types'; -import { getAppSearchUrl } from '../shared/enterprise_search_url'; import { HttpLogic } from '../shared/http'; import { KibanaLogic } from '../shared/kibana'; import { Layout, SideNav, SideNavLink } from '../shared/layout'; import { NotFound } from '../shared/not_found'; +import { ROLE_MAPPINGS_TITLE } from '../shared/role_mapping/constants'; + import { AppLogic } from './app_logic'; import { Credentials, CREDENTIALS_TITLE } from './components/credentials'; import { EngineNav, EngineRouter } from './components/engine'; @@ -26,7 +27,7 @@ import { EnginesOverview, ENGINES_TITLE } from './components/engines'; import { ErrorConnecting } from './components/error_connecting'; import { Library } from './components/library'; import { MetaEngineCreation } from './components/meta_engine_creation'; -import { ROLE_MAPPINGS_TITLE } from './components/role_mappings'; +import { RoleMappingsRouter } from './components/role_mappings'; import { Settings, SETTINGS_TITLE } from './components/settings'; import { SetupGuide } from './components/setup_guide'; import { @@ -64,7 +65,7 @@ export const AppSearchUnconfigured: React.FC = () => ( export const AppSearchConfigured: React.FC> = (props) => { const { - myRole: { canManageEngines, canManageMetaEngines }, + myRole: { canManageEngines, canManageMetaEngines, canViewRoleMappings }, } = useValues(AppLogic(props)); const { errorConnecting, readOnlyMode } = useValues(HttpLogic); @@ -101,6 +102,11 @@ export const AppSearchConfigured: React.FC> = (props) = + {canViewRoleMappings && ( + + + + )} {canManageEngines && ( @@ -141,7 +147,7 @@ export const AppSearchNav: React.FC = ({ subNav }) => { {CREDENTIALS_TITLE} )} {canViewRoleMappings && ( - + {ROLE_MAPPINGS_TITLE} )} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/types.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/types.ts index e763264a041de..ca3e67129846b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/types.ts @@ -6,5 +6,5 @@ */ export * from '../../../common/types/app_search'; -export { Role, RoleTypes, AbilityTypes, ASRoleMapping } from './utils/role'; +export { Role, RoleTypes, AbilityTypes, ASRoleMapping, AdvanceRoleType } from './utils/role'; export { Engine } from './components/engine/types'; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/utils/role/types.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/utils/role/types.ts index 0fa94b493ed31..0c3abd6909390 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/utils/role/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/utils/role/types.ts @@ -53,3 +53,8 @@ export interface ASRoleMapping extends RoleMapping { content: string; }; } + +export interface AdvanceRoleType { + type: RoleTypes; + description: string; +} diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.test.ts index 53368035af225..856004add0f73 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.test.ts @@ -128,12 +128,7 @@ describe('role mappings routes', () => { describe('validates', () => { it('correctly', () => { - const request = { - body: { - ...roleMappingBaseSchema, - id: '123', - }, - }; + const request = { body: roleMappingBaseSchema }; mockRouter.shouldValidate(request); }); diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.ts index 4b77c8614a52c..3bd3b3d904280 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/role_mappings.ts @@ -66,10 +66,7 @@ export function registerRoleMappingRoute({ { path: '/api/app_search/role_mappings/{id}', validate: { - body: schema.object({ - ...roleMappingBaseSchema, - id: schema.string(), - }), + body: schema.object(roleMappingBaseSchema), params: schema.object({ id: schema.string(), }), diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a72585185faac..346dbe55e0f22 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -7609,7 +7609,6 @@ "xpack.enterpriseSearch.appSearch.result.documentDetailLink": "ドキュメントの詳細を表示", "xpack.enterpriseSearch.appSearch.result.hideAdditionalFields": "追加フィールドを非表示", "xpack.enterpriseSearch.appSearch.result.title": "ドキュメント{id}", - "xpack.enterpriseSearch.appSearch.roleMappings.title": "ロールマッピング", "xpack.enterpriseSearch.appSearch.settings.logRetention.analytics.label": "分析ログ", "xpack.enterpriseSearch.appSearch.settings.logRetention.api.label": "API ログ", "xpack.enterpriseSearch.appSearch.settings.logRetention.description": "API ログと分析のデフォルト書き込み設定を管理します。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 3d864494a7d53..cfd00024cd76a 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -7676,7 +7676,6 @@ "xpack.enterpriseSearch.appSearch.result.hideAdditionalFields": "隐藏其他字段", "xpack.enterpriseSearch.appSearch.result.showAdditionalFields": "显示其他 {numberOfAdditionalFields, number} 个{numberOfAdditionalFields, plural, other {字段}}", "xpack.enterpriseSearch.appSearch.result.title": "文档 {id}", - "xpack.enterpriseSearch.appSearch.roleMappings.title": "角色映射", "xpack.enterpriseSearch.appSearch.settings.logRetention.analytics.label": "分析日志", "xpack.enterpriseSearch.appSearch.settings.logRetention.api.label": "API 日志", "xpack.enterpriseSearch.appSearch.settings.logRetention.description": "管理 API 日志和分析的默认写入设置。", From 55e513364a7a096be106c4b700d60c14fb92244d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Tue, 23 Mar 2021 20:23:23 +0100 Subject: [PATCH 06/35] isClusterOptedIn should fallback to true when not found (#94980) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../server/encryption/encrypt.test.ts | 11 ++ .../server/plugin.test.ts | 140 ++++++++++++++---- .../server/plugin.ts | 3 +- .../server/util.ts | 11 -- .../apis/telemetry/telemetry_local.ts | 54 +++---- .../get_stats_with_xpack.ts | 7 +- .../is_cluster_opted_in.test.ts | 15 +- .../is_cluster_opted_in.ts | 14 ++ 8 files changed, 174 insertions(+), 81 deletions(-) delete mode 100644 src/plugins/telemetry_collection_manager/server/util.ts rename src/plugins/telemetry_collection_manager/server/util.test.ts => x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.test.ts (69%) create mode 100644 x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.ts diff --git a/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts b/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts index c1a1a32e3c7f0..be990f4b89e04 100644 --- a/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts +++ b/src/plugins/telemetry_collection_manager/server/encryption/encrypt.test.ts @@ -22,6 +22,11 @@ describe('getKID', () => { const kid = getKID(useProdKey); expect(kid).toBe('kibana1'); }); + + it(`should fallback to development`, async () => { + const kid = getKID(); + expect(kid).toBe('kibana_dev1'); + }); }); describe('encryptTelemetry', () => { @@ -46,4 +51,10 @@ describe('encryptTelemetry', () => { await encryptTelemetry(payload, { useProdKey: false }); expect(mockEncrypt).toBeCalledWith('kibana_dev1', payload); }); + + it('should fallback to { useProdKey: false }', async () => { + const payload = { some: 'value' }; + await encryptTelemetry(payload); + expect(mockEncrypt).toBeCalledWith('kibana_dev1', payload); + }); }); diff --git a/src/plugins/telemetry_collection_manager/server/plugin.test.ts b/src/plugins/telemetry_collection_manager/server/plugin.test.ts index ac3904ca58b0f..d05799f82c354 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.test.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.test.ts @@ -9,7 +9,7 @@ import { coreMock, httpServerMock } from '../../../core/server/mocks'; import { usageCollectionPluginMock } from '../../usage_collection/server/mocks'; import { TelemetryCollectionManagerPlugin } from './plugin'; -import { CollectionStrategyConfig, StatsGetterConfig } from './types'; +import type { BasicStatsPayload, CollectionStrategyConfig, StatsGetterConfig } from './types'; import { TelemetrySavedObjectsClient } from './telemetry_saved_objects_client'; function createCollectionStrategy(priority: number): jest.Mocked { @@ -87,6 +87,15 @@ describe('Telemetry Collection Manager', () => { }); describe(`after start`, () => { + const basicStats: BasicStatsPayload = { + cluster_uuid: 'clusterUuid', + cluster_name: 'clusterName', + timestamp: new Date().toISOString(), + cluster_stats: {}, + stack_stats: {}, + version: 'version', + }; + beforeAll(() => { telemetryCollectionManager.start(coreMock.createStart()); }); @@ -97,19 +106,59 @@ describe('Telemetry Collection Manager', () => { describe('unencrypted: false', () => { const config: StatsGetterConfig = { unencrypted: false }; - test('getStats returns empty because clusterDetails returns empty, and the soClient is an instance of the TelemetrySavedObjectsClient', async () => { - collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); - await expect(setupApi.getStats(config)).resolves.toStrictEqual([]); - expect(collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient).toBeInstanceOf( - TelemetrySavedObjectsClient - ); + describe('getStats', () => { + test('returns empty because clusterDetails returns empty, and the soClient is an instance of the TelemetrySavedObjectsClient', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); + await expect(setupApi.getStats(config)).resolves.toStrictEqual([]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).toBeInstanceOf(TelemetrySavedObjectsClient); + }); + + test('returns encrypted payload', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + collectionStrategy.statsGetter.mockResolvedValue([basicStats]); + await expect(setupApi.getStats(config)).resolves.toStrictEqual([expect.any(String)]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).toBeInstanceOf(TelemetrySavedObjectsClient); + }); }); - test('getOptInStats returns empty', async () => { - collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); - await expect(setupApi.getOptInStats(true, config)).resolves.toStrictEqual([]); - expect(collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient).toBeInstanceOf( - TelemetrySavedObjectsClient - ); + + describe('getOptInStats', () => { + test('returns empty', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); + await expect(setupApi.getOptInStats(true, config)).resolves.toStrictEqual([]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).toBeInstanceOf(TelemetrySavedObjectsClient); + }); + + test('returns encrypted results for opt-in true', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + await expect(setupApi.getOptInStats(true, config)).resolves.toStrictEqual([ + expect.any(String), + ]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).toBeInstanceOf(TelemetrySavedObjectsClient); + }); + + test('returns encrypted results for opt-in false', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + await expect(setupApi.getOptInStats(false, config)).resolves.toStrictEqual([ + expect.any(String), + ]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).toBeInstanceOf(TelemetrySavedObjectsClient); + }); }); }); describe('unencrypted: true', () => { @@ -118,19 +167,60 @@ describe('Telemetry Collection Manager', () => { request: httpServerMock.createKibanaRequest(), }; - test('getStats returns empty because clusterDetails returns empty, and the soClient is not an instance of the TelemetrySavedObjectsClient', async () => { - collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); - await expect(setupApi.getStats(config)).resolves.toStrictEqual([]); - expect( - collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient - ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + describe('getStats', () => { + test('getStats returns empty because clusterDetails returns empty, and the soClient is not an instance of the TelemetrySavedObjectsClient', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); + await expect(setupApi.getStats(config)).resolves.toStrictEqual([]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + }); + test('returns encrypted payload (assumes opted-in when no explicitly opted-out)', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + collectionStrategy.statsGetter.mockResolvedValue([basicStats]); + await expect(setupApi.getStats(config)).resolves.toStrictEqual([ + { ...basicStats, collectionSource: 'test_collection' }, + ]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + }); }); - test('getOptInStats returns empty', async () => { - collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); - await expect(setupApi.getOptInStats(true, config)).resolves.toStrictEqual([]); - expect( - collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient - ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + + describe('getOptInStats', () => { + test('returns empty', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([]); + await expect(setupApi.getOptInStats(true, config)).resolves.toStrictEqual([]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + }); + + test('returns results for opt-in true', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + await expect(setupApi.getOptInStats(true, config)).resolves.toStrictEqual([ + { cluster_uuid: 'clusterUuid', opt_in_status: true }, + ]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + }); + + test('returns results for opt-in false', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + await expect(setupApi.getOptInStats(false, config)).resolves.toStrictEqual([ + { cluster_uuid: 'clusterUuid', opt_in_status: false }, + ]); + expect( + collectionStrategy.clusterDetailsGetter.mock.calls[0][0].soClient + ).not.toBeInstanceOf(TelemetrySavedObjectsClient); + }); }); }); }); diff --git a/src/plugins/telemetry_collection_manager/server/plugin.ts b/src/plugins/telemetry_collection_manager/server/plugin.ts index 0fec225d5c424..692d91b963d9d 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.ts @@ -30,7 +30,6 @@ import { UsageStatsPayload, StatsCollectionContext, } from './types'; -import { isClusterOptedIn } from './util'; import { encryptTelemetry } from './encryption'; import { TelemetrySavedObjectsClient } from './telemetry_saved_objects_client'; @@ -233,7 +232,7 @@ export class TelemetryCollectionManagerPlugin return usageData; } - return encryptTelemetry(usageData.filter(isClusterOptedIn), { + return await encryptTelemetry(usageData, { useProdKey: this.isDistributable, }); } diff --git a/src/plugins/telemetry_collection_manager/server/util.ts b/src/plugins/telemetry_collection_manager/server/util.ts deleted file mode 100644 index 226d788e09e48..0000000000000 --- a/src/plugins/telemetry_collection_manager/server/util.ts +++ /dev/null @@ -1,11 +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. - */ - -export const isClusterOptedIn = (clusterUsage: any): boolean => { - return clusterUsage?.stack_stats?.kibana?.plugins?.telemetry?.opt_in_status === true; -}; diff --git a/test/api_integration/apis/telemetry/telemetry_local.ts b/test/api_integration/apis/telemetry/telemetry_local.ts index 211f2eb85e4e3..a7b4da566b143 100644 --- a/test/api_integration/apis/telemetry/telemetry_local.ts +++ b/test/api_integration/apis/telemetry/telemetry_local.ts @@ -7,13 +7,27 @@ */ import expect from '@kbn/expect'; +import supertestAsPromised from 'supertest-as-promised'; import { basicUiCounters } from './__fixtures__/ui_counters'; -import { FtrProviderContext } from '../../ftr_provider_context'; -import { SavedObject } from '../../../../src/core/server'; +import type { FtrProviderContext } from '../../ftr_provider_context'; +import type { SavedObject } from '../../../../src/core/server'; import ossRootTelemetrySchema from '../../../../src/plugins/telemetry/schema/oss_root.json'; import ossPluginsTelemetrySchema from '../../../../src/plugins/telemetry/schema/oss_plugins.json'; import { assertTelemetryPayload, flatKeys } from './utils'; +async function retrieveTelemetry( + supertest: supertestAsPromised.SuperTest +) { + const { body } = await supertest + .post('/api/telemetry/v2/clusters/_stats') + .set('kbn-xsrf', 'xxx') + .send({ unencrypted: true }) + .expect(200); + + expect(body.length).to.be(1); + return body[0]; +} + export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); const es = getService('es'); @@ -35,14 +49,7 @@ export default function ({ getService }: FtrProviderContext) { let stats: Record; before('pull local stats', async () => { - const { body } = await supertest - .post('/api/telemetry/v2/clusters/_stats') - .set('kbn-xsrf', 'xxx') - .send({ unencrypted: true }) - .expect(200); - - expect(body.length).to.be(1); - stats = body[0]; + stats = await retrieveTelemetry(supertest); }); it('should pass the schema validation', () => { @@ -141,14 +148,7 @@ export default function ({ getService }: FtrProviderContext) { before('Add UI Counters saved objects', () => esArchiver.load('saved_objects/ui_counters')); after('cleanup saved objects changes', () => esArchiver.unload('saved_objects/ui_counters')); it('returns ui counters aggregated by day', async () => { - const { body } = await supertest - .post('/api/telemetry/v2/clusters/_stats') - .set('kbn-xsrf', 'xxx') - .send({ unencrypted: true }) - .expect(200); - - expect(body.length).to.be(1); - const stats = body[0]; + const stats = await retrieveTelemetry(supertest); expect(stats.stack_stats.kibana.plugins.ui_counters).to.eql(basicUiCounters); }); }); @@ -191,14 +191,7 @@ export default function ({ getService }: FtrProviderContext) { }); it('should return application_usage data', async () => { - const { body } = await supertest - .post('/api/telemetry/v2/clusters/_stats') - .set('kbn-xsrf', 'xxx') - .send({ unencrypted: true }) - .expect(200); - - expect(body.length).to.be(1); - const stats = body[0]; + const stats = await retrieveTelemetry(supertest); expect(stats.stack_stats.kibana.plugins.application_usage).to.eql({ 'test-app': { appId: 'test-app', @@ -262,14 +255,7 @@ export default function ({ getService }: FtrProviderContext) { // flaky https://github.com/elastic/kibana/issues/94513 it.skip("should only use the first 10k docs for the application_usage data (they'll be rolled up in a later process)", async () => { - const { body } = await supertest - .post('/api/telemetry/v2/clusters/_stats') - .set('kbn-xsrf', 'xxx') - .send({ unencrypted: true }) - .expect(200); - - expect(body.length).to.be(1); - const stats = body[0]; + const stats = await retrieveTelemetry(supertest); expect(stats.stack_stats.kibana.plugins.application_usage).to.eql({ 'test-app': { appId: 'test-app', diff --git a/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.ts b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.ts index 32e59e01b123d..30bcd19007c0d 100644 --- a/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.ts +++ b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/get_stats_with_xpack.ts @@ -9,6 +9,7 @@ import { StatsGetter } from 'src/plugins/telemetry_collection_manager/server'; import { TelemetryLocalStats, getLocalStats } from '../../../../../src/plugins/telemetry/server'; import { getXPackUsage } from './get_xpack'; import { ESLicense, getLicenseFromLocalOrMaster } from './get_license'; +import { isClusterOptedIn } from './is_cluster_opted_in'; export type TelemetryAggregatedStats = TelemetryLocalStats & { stack_stats: { xpack?: object }; @@ -48,6 +49,10 @@ export const getStatsWithXpack: StatsGetter = async fu if (monitoringTelemetry) { delete stats.stack_stats.kibana!.plugins.monitoringTelemetry; } - return [...acc, stats, ...(monitoringTelemetry || [])]; + + // From the monitoring-sourced telemetry, we need to filter out the clusters that are opted-out. + const onlyOptedInMonitoringClusters = (monitoringTelemetry || []).filter(isClusterOptedIn); + + return [...acc, stats, ...onlyOptedInMonitoringClusters]; }, [] as TelemetryAggregatedStats[]); }; diff --git a/src/plugins/telemetry_collection_manager/server/util.test.ts b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.test.ts similarity index 69% rename from src/plugins/telemetry_collection_manager/server/util.test.ts rename to x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.test.ts index 12e67c466d4d5..5fa7584879f07 100644 --- a/src/plugins/telemetry_collection_manager/server/util.test.ts +++ b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.test.ts @@ -1,12 +1,11 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. */ -import { isClusterOptedIn } from './util'; +import { isClusterOptedIn } from './is_cluster_opted_in'; const createMockClusterUsage = (plugins: any) => { return { @@ -32,9 +31,9 @@ describe('isClusterOptedIn', () => { const result = isClusterOptedIn(mockClusterUsage); expect(result).toBe(false); }); - it('returns false if cluster stats is malformed', () => { - expect(isClusterOptedIn(createMockClusterUsage({}))).toBe(false); - expect(isClusterOptedIn({})).toBe(false); - expect(isClusterOptedIn(undefined)).toBe(false); + it('returns true if kibana.plugins.telemetry does not exist', () => { + expect(isClusterOptedIn(createMockClusterUsage({}))).toBe(true); + expect(isClusterOptedIn({})).toBe(true); + expect(isClusterOptedIn(undefined)).toBe(true); }); }); diff --git a/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.ts b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.ts new file mode 100644 index 0000000000000..4bc35a238152b --- /dev/null +++ b/x-pack/plugins/telemetry_collection_xpack/server/telemetry_collection/is_cluster_opted_in.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const isClusterOptedIn = (clusterUsage: any): boolean => { + return ( + clusterUsage?.stack_stats?.kibana?.plugins?.telemetry?.opt_in_status === true || + // If stack_stats.kibana.plugins.telemetry does not exist, assume opted-in for BWC + !clusterUsage?.stack_stats?.kibana?.plugins?.telemetry + ); +}; From 3998a83871202d5559683abdf9e4c36ea6e87ea7 Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Tue, 23 Mar 2021 15:23:58 -0400 Subject: [PATCH 07/35] [Security Solution][Endpoint][Admin] Refactor policy details protections (#94970) --- .../public/management/pages/policy/types.ts | 6 + .../components/protection_radio.tsx | 91 +++++ .../components/protection_switch.tsx | 100 ++++++ .../policy_forms/components/radio_buttons.tsx | 96 +++++ .../supported_version.tsx | 2 +- .../components/user_notification.tsx | 170 +++++++++ .../view/policy_forms/protections/malware.tsx | 327 +----------------- .../policy_forms/protections/ransomware.tsx | 308 +---------------- .../translations/translations/ja-JP.json | 10 - .../translations/translations/zh-CN.json | 10 - 10 files changed, 488 insertions(+), 632 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_radio.tsx create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_switch.tsx create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/radio_buttons.tsx rename x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/{protections => components}/supported_version.tsx (91%) create mode 100644 x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/user_notification.tsx diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts index f7e054729c7b9..b2b95e2765bd8 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/types.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/types.ts @@ -120,6 +120,12 @@ export type RansomwareProtectionOSes = KeysByValueCriteria< { ransomware: ProtectionFields } >; +export type PolicyProtection = + | keyof Pick + | keyof Pick; + +export type MacPolicyProtection = keyof Pick; + export interface GetPolicyListResponse extends GetPackagePoliciesResponse { items: PolicyData[]; } diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_radio.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_radio.tsx new file mode 100644 index 0000000000000..8394b557207af --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_radio.tsx @@ -0,0 +1,91 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useMemo } from 'react'; +import { useDispatch } from 'react-redux'; +import { cloneDeep } from 'lodash'; +import { htmlIdGenerator, EuiRadio } from '@elastic/eui'; +import { + ImmutableArray, + ProtectionModes, + UIPolicyConfig, +} from '../../../../../../../common/endpoint/types'; +import { MacPolicyProtection, PolicyProtection } from '../../../types'; +import { usePolicyDetailsSelector } from '../../policy_hooks'; +import { policyConfig } from '../../../store/policy_details/selectors'; +import { AppAction } from '../../../../../../common/store/actions'; +import { useLicense } from '../../../../../../common/hooks/use_license'; + +export const ProtectionRadio = React.memo( + ({ + protection, + protectionMode, + osList, + label, + }: { + protection: PolicyProtection; + protectionMode: ProtectionModes; + osList: ImmutableArray>; + label: string; + }) => { + const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); + const dispatch = useDispatch<(action: AppAction) => void>(); + const radioButtonId = useMemo(() => htmlIdGenerator()(), []); + const selected = policyDetailsConfig && policyDetailsConfig.windows[protection].mode; + const isPlatinumPlus = useLicense().isPlatinumPlus(); + + const handleRadioChange = useCallback(() => { + if (policyDetailsConfig) { + const newPayload = cloneDeep(policyDetailsConfig); + for (const os of osList) { + if (os === 'windows') { + newPayload[os][protection].mode = protectionMode; + } else if (os === 'mac') { + newPayload[os][protection as MacPolicyProtection].mode = protectionMode; + } + if (isPlatinumPlus) { + if (os === 'windows') { + if (protectionMode === ProtectionModes.prevent) { + newPayload[os].popup[protection].enabled = true; + } else { + newPayload[os].popup[protection].enabled = false; + } + } else if (os === 'mac') { + if (protectionMode === ProtectionModes.prevent) { + newPayload[os].popup[protection as MacPolicyProtection].enabled = true; + } else { + newPayload[os].popup[protection as MacPolicyProtection].enabled = false; + } + } + } + } + dispatch({ + type: 'userChangedPolicyConfig', + payload: { policyConfig: newPayload }, + }); + } + }, [dispatch, protectionMode, policyDetailsConfig, isPlatinumPlus, osList, protection]); + + /** + * Passing an arbitrary id because EuiRadio + * requires an id if label is passed + */ + + return ( + + ); + } +); + +ProtectionRadio.displayName = 'ProtectionRadio'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_switch.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_switch.tsx new file mode 100644 index 0000000000000..cbe118e8dfa36 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/protection_switch.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 React, { useCallback } from 'react'; +import { useDispatch } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { EuiSwitch } from '@elastic/eui'; +import { cloneDeep } from 'lodash'; +import { useLicense } from '../../../../../../common/hooks/use_license'; +import { policyConfig } from '../../../store/policy_details/selectors'; +import { usePolicyDetailsSelector } from '../../policy_hooks'; +import { AppAction } from '../../../../../../common/store/actions'; +import { + ImmutableArray, + ProtectionModes, + UIPolicyConfig, +} from '../../../../../../../common/endpoint/types'; +import { PolicyProtection, MacPolicyProtection } from '../../../types'; + +export const ProtectionSwitch = React.memo( + ({ + protection, + osList, + }: { + protection: PolicyProtection; + osList: ImmutableArray>; + }) => { + const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); + const isPlatinumPlus = useLicense().isPlatinumPlus(); + const dispatch = useDispatch<(action: AppAction) => void>(); + const selected = policyDetailsConfig && policyDetailsConfig.windows[protection].mode; + + const handleSwitchChange = useCallback( + (event) => { + if (policyDetailsConfig) { + const newPayload = cloneDeep(policyDetailsConfig); + if (event.target.checked === false) { + for (const os of osList) { + if (os === 'windows') { + newPayload[os][protection].mode = ProtectionModes.off; + } else if (os === 'mac') { + newPayload[os][protection as MacPolicyProtection].mode = ProtectionModes.off; + } + if (isPlatinumPlus) { + if (os === 'windows') { + newPayload[os].popup[protection].enabled = event.target.checked; + } else if (os === 'mac') { + newPayload[os].popup[protection as MacPolicyProtection].enabled = + event.target.checked; + } + } + } + } else { + for (const os of osList) { + if (os === 'windows') { + newPayload[os][protection].mode = ProtectionModes.prevent; + } else if (os === 'mac') { + newPayload[os][protection as MacPolicyProtection].mode = ProtectionModes.prevent; + } + if (isPlatinumPlus) { + if (os === 'windows') { + newPayload[os].popup[protection].enabled = event.target.checked; + } else if (os === 'mac') { + newPayload[os].popup[protection as MacPolicyProtection].enabled = + event.target.checked; + } + } + } + } + dispatch({ + type: 'userChangedPolicyConfig', + payload: { policyConfig: newPayload }, + }); + } + }, + [dispatch, policyDetailsConfig, isPlatinumPlus, protection, osList] + ); + + return ( + + ); + } +); + +ProtectionSwitch.displayName = 'ProtectionSwitch'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/radio_buttons.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/radio_buttons.tsx new file mode 100644 index 0000000000000..793c24a0c4d0c --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/radio_buttons.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import styled from 'styled-components'; +import { EuiSpacer, EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; +import { + Immutable, + ImmutableArray, + ProtectionModes, + UIPolicyConfig, +} from '../../../../../../../common/endpoint/types'; +import { PolicyProtection } from '../../../types'; +import { ConfigFormHeading } from '../../components/config_form'; +import { ProtectionRadio } from './protection_radio'; + +export const RadioFlexGroup = styled(EuiFlexGroup)` + .no-right-margin-radio { + margin-right: 0; + } + .no-horizontal-margin-radio { + margin: ${(props) => props.theme.eui.ruleMargins.marginSmall} 0; + } +`; + +export const RadioButtons = React.memo( + ({ + protection, + osList, + }: { + protection: PolicyProtection; + osList: ImmutableArray>; + }) => { + const radios: Immutable< + Array<{ + id: ProtectionModes; + label: string; + }> + > = useMemo(() => { + return [ + { + id: ProtectionModes.detect, + label: i18n.translate('xpack.securitySolution.endpoint.policy.details.detect', { + defaultMessage: 'Detect', + }), + }, + { + id: ProtectionModes.prevent, + label: i18n.translate('xpack.securitySolution.endpoint.policy.details.prevent', { + defaultMessage: 'Prevent', + }), + }, + ]; + }, []); + + return ( + <> + + + + + + + + + + + + + + ); + } +); + +RadioButtons.displayName = 'RadioButtons'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/supported_version.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/supported_version.tsx similarity index 91% rename from x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/supported_version.tsx rename to x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/supported_version.tsx index 5985a5fe03ec3..b8418004206b9 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/supported_version.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/supported_version.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { EuiText } from '@elastic/eui'; -import { popupVersionsMap } from './popup_options_to_versions'; +import { popupVersionsMap } from '../protections/popup_options_to_versions'; export const SupportedVersionNotice = ({ optionName }: { optionName: string }) => { const version = popupVersionsMap.get(optionName); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/user_notification.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/user_notification.tsx new file mode 100644 index 0000000000000..def9e78e994b0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/components/user_notification.tsx @@ -0,0 +1,170 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { useDispatch } from 'react-redux'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { cloneDeep } from 'lodash'; +import { + EuiSpacer, + EuiFlexItem, + EuiFlexGroup, + EuiCheckbox, + EuiIconTip, + EuiText, + EuiTextArea, +} from '@elastic/eui'; +import { + ImmutableArray, + ProtectionModes, + UIPolicyConfig, +} from '../../../../../../../common/endpoint/types'; +import { PolicyProtection, MacPolicyProtection } from '../../../types'; +import { ConfigFormHeading } from '../../components/config_form'; +import { usePolicyDetailsSelector } from '../../policy_hooks'; +import { policyConfig } from '../../../store/policy_details/selectors'; +import { AppAction } from '../../../../../../common/store/actions'; +import { SupportedVersionNotice } from './supported_version'; + +export const UserNotification = React.memo( + ({ + protection, + osList, + }: { + protection: PolicyProtection; + osList: ImmutableArray>; + }) => { + const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); + const dispatch = useDispatch<(action: AppAction) => void>(); + const selected = policyDetailsConfig && policyDetailsConfig.windows[protection].mode; + const userNotificationSelected = + policyDetailsConfig && policyDetailsConfig.windows.popup[protection].enabled; + const userNotificationMessage = + policyDetailsConfig && policyDetailsConfig.windows.popup[protection].message; + + const handleUserNotificationCheckbox = useCallback( + (event) => { + if (policyDetailsConfig) { + const newPayload = cloneDeep(policyDetailsConfig); + for (const os of osList) { + if (os === 'windows') { + newPayload[os].popup[protection].enabled = event.target.checked; + } else if (os === 'mac') { + newPayload[os].popup[protection as MacPolicyProtection].enabled = + event.target.checked; + } + } + dispatch({ + type: 'userChangedPolicyConfig', + payload: { policyConfig: newPayload }, + }); + } + }, + [policyDetailsConfig, dispatch, protection, osList] + ); + + const handleCustomUserNotification = useCallback( + (event) => { + if (policyDetailsConfig) { + const newPayload = cloneDeep(policyDetailsConfig); + for (const os of osList) { + if (os === 'windows') { + newPayload[os].popup[protection].message = event.target.value; + } else if (os === 'mac') { + newPayload[os].popup[protection as MacPolicyProtection].message = event.target.value; + } + } + dispatch({ + type: 'userChangedPolicyConfig', + payload: { policyConfig: newPayload }, + }); + } + }, + [policyDetailsConfig, dispatch, protection, osList] + ); + + return ( + <> + + + + + + + + {userNotificationSelected && ( + <> + + + + +

+ +

+
+
+ + + + + + + } + /> + +
+ + + + )} + + ); + } +); + +UserNotification.displayName = 'UserNotification'; diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx index a5be095abfc59..03cd587ca7e5c 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_forms/protections/malware.tsx @@ -5,333 +5,29 @@ * 2.0. */ -import React, { useCallback, useMemo } from 'react'; -import { useDispatch } from 'react-redux'; +import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { - EuiCallOut, - EuiCheckbox, - EuiRadio, - EuiSpacer, - EuiSwitch, - EuiText, - EuiTextArea, - htmlIdGenerator, - EuiFlexGroup, - EuiFlexItem, - EuiIconTip, -} from '@elastic/eui'; -import { cloneDeep } from 'lodash'; -import styled from 'styled-components'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { APP_ID } from '../../../../../../../common/constants'; import { SecurityPageName } from '../../../../../../app/types'; -import { - Immutable, - OperatingSystem, - ProtectionModes, -} from '../../../../../../../common/endpoint/types'; +import { Immutable, OperatingSystem } from '../../../../../../../common/endpoint/types'; import { MalwareProtectionOSes, OS } from '../../../types'; -import { ConfigForm, ConfigFormHeading } from '../../components/config_form'; -import { policyConfig } from '../../../store/policy_details/selectors'; -import { usePolicyDetailsSelector } from '../../policy_hooks'; +import { ConfigForm } from '../../components/config_form'; import { LinkToApp } from '../../../../../../common/components/endpoint/link_to_app'; import { useLicense } from '../../../../../../common/hooks/use_license'; -import { AppAction } from '../../../../../../common/store/actions'; -import { SupportedVersionNotice } from './supported_version'; - -export const RadioFlexGroup = styled(EuiFlexGroup)` - .no-right-margin-radio { - margin-right: 0; - } - .no-horizontal-margin-radio { - margin: ${(props) => props.theme.eui.ruleMargins.marginSmall} 0; - } -`; - -const OSes: Immutable = [OS.windows, OS.mac]; -const protection = 'malware'; - -const ProtectionRadio = React.memo( - ({ protectionMode, label }: { protectionMode: ProtectionModes; label: string }) => { - const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); - const dispatch = useDispatch<(action: AppAction) => void>(); - const radioButtonId = useMemo(() => htmlIdGenerator()(), []); - // currently just taking windows.malware, but both windows.malware and mac.malware should be the same value - const selected = policyDetailsConfig && policyDetailsConfig.windows.malware.mode; - const isPlatinumPlus = useLicense().isPlatinumPlus(); - - const handleRadioChange = useCallback(() => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - for (const os of OSes) { - newPayload[os][protection].mode = protectionMode; - if (isPlatinumPlus) { - if (protectionMode === ProtectionModes.prevent) { - newPayload[os].popup[protection].enabled = true; - } else { - newPayload[os].popup[protection].enabled = false; - } - } - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, [dispatch, protectionMode, policyDetailsConfig, isPlatinumPlus]); - - /** - * Passing an arbitrary id because EuiRadio - * requires an id if label is passed - */ - - return ( - - ); - } -); - -ProtectionRadio.displayName = 'ProtectionRadio'; +import { RadioButtons } from '../components/radio_buttons'; +import { UserNotification } from '../components/user_notification'; +import { ProtectionSwitch } from '../components/protection_switch'; /** The Malware Protections form for policy details * which will configure for all relevant OSes. */ export const MalwareProtections = React.memo(() => { - const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); - const dispatch = useDispatch<(action: AppAction) => void>(); - // currently just taking windows.malware, but both windows.malware and mac.malware should be the same value - const selected = policyDetailsConfig && policyDetailsConfig.windows.malware.mode; - const userNotificationSelected = - policyDetailsConfig && policyDetailsConfig.windows.popup.malware.enabled; - const userNotificationMessage = - policyDetailsConfig && policyDetailsConfig.windows.popup.malware.message; + const OSes: Immutable = [OS.windows, OS.mac]; + const protection = 'malware'; const isPlatinumPlus = useLicense().isPlatinumPlus(); - const radios: Immutable< - Array<{ - id: ProtectionModes; - label: string; - protection: 'malware'; - }> - > = useMemo(() => { - return [ - { - id: ProtectionModes.detect, - label: i18n.translate('xpack.securitySolution.endpoint.policy.details.detect', { - defaultMessage: 'Detect', - }), - protection: 'malware', - }, - { - id: ProtectionModes.prevent, - label: i18n.translate('xpack.securitySolution.endpoint.policy.details.prevent', { - defaultMessage: 'Prevent', - }), - protection: 'malware', - }, - ]; - }, []); - - const handleSwitchChange = useCallback( - (event) => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - if (event.target.checked === false) { - for (const os of OSes) { - newPayload[os][protection].mode = ProtectionModes.off; - if (isPlatinumPlus) { - newPayload[os].popup[protection].enabled = event.target.checked; - } - } - } else { - for (const os of OSes) { - newPayload[os][protection].mode = ProtectionModes.prevent; - if (isPlatinumPlus) { - newPayload[os].popup[protection].enabled = event.target.checked; - } - } - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, - [dispatch, policyDetailsConfig, isPlatinumPlus] - ); - - const handleUserNotificationCheckbox = useCallback( - (event) => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - for (const os of OSes) { - newPayload[os].popup[protection].enabled = event.target.checked; - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, - [policyDetailsConfig, dispatch] - ); - - const handleCustomUserNotification = useCallback( - (event) => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - for (const os of OSes) { - newPayload[os].popup[protection].message = event.target.value; - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, - [policyDetailsConfig, dispatch] - ); - - const radioButtons = useMemo(() => { - return ( - <> - - - - - - - - - - - - - {isPlatinumPlus && ( - <> - - - - - - - - - )} - {isPlatinumPlus && userNotificationSelected && ( - <> - - - - -

- -

-
-
- - - - - - - } - /> - -
- - - - )} - - ); - }, [ - radios, - selected, - isPlatinumPlus, - handleUserNotificationCheckbox, - userNotificationSelected, - userNotificationMessage, - handleCustomUserNotification, - ]); - - const protectionSwitch = useMemo(() => { - return ( - - ); - }, [handleSwitchChange, selected]); - return ( { })} supportedOss={[OperatingSystem.WINDOWS, OperatingSystem.MAC]} dataTestSubj="malwareProtectionsForm" - rightCorner={protectionSwitch} + rightCorner={} > - {radioButtons} + + {isPlatinumPlus && } = [OS.windows]; -const protection = 'ransomware'; - -const ProtectionRadio = React.memo( - ({ protectionMode, label }: { protectionMode: ProtectionModes; label: string }) => { - const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); - const dispatch = useDispatch<(action: AppAction) => void>(); - const radioButtonId = useMemo(() => htmlIdGenerator()(), []); - const selected = policyDetailsConfig && policyDetailsConfig.windows.ransomware.mode; - - const handleRadioChange: EuiRadioProps['onChange'] = useCallback(() => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - for (const os of OSes) { - newPayload[os][protection].mode = protectionMode; - if (protectionMode === ProtectionModes.prevent) { - newPayload[os].popup[protection].enabled = true; - } else { - newPayload[os].popup[protection].enabled = false; - } - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, [dispatch, protectionMode, policyDetailsConfig]); - - /** - * Passing an arbitrary id because EuiRadio - * requires an id if label is passed - */ - - return ( - - ); - } -); - -ProtectionRadio.displayName = 'ProtectionRadio'; +import { RadioButtons } from '../components/radio_buttons'; +import { UserNotification } from '../components/user_notification'; +import { ProtectionSwitch } from '../components/protection_switch'; /** The Ransomware Protections form for policy details * which will configure for all relevant OSes. */ export const Ransomware = React.memo(() => { - const policyDetailsConfig = usePolicyDetailsSelector(policyConfig); - const dispatch = useDispatch<(action: AppAction) => void>(); - const selected = policyDetailsConfig && policyDetailsConfig.windows.ransomware.mode; - const userNotificationSelected = - policyDetailsConfig && policyDetailsConfig.windows.popup.ransomware.enabled; - const userNotificationMessage = - policyDetailsConfig && policyDetailsConfig.windows.popup.ransomware.message; - - const radios: Immutable< - Array<{ - id: ProtectionModes; - label: string; - protection: 'ransomware'; - }> - > = useMemo(() => { - return [ - { - id: ProtectionModes.detect, - label: i18n.translate('xpack.securitySolution.endpoint.policy.details.detect', { - defaultMessage: 'Detect', - }), - protection: 'ransomware', - }, - { - id: ProtectionModes.prevent, - label: i18n.translate('xpack.securitySolution.endpoint.policy.details.prevent', { - defaultMessage: 'Prevent', - }), - protection: 'ransomware', - }, - ]; - }, []); - - const handleSwitchChange: EuiSwitchProps['onChange'] = useCallback( - (event) => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - if (event.target.checked === false) { - for (const os of OSes) { - newPayload[os][protection].mode = ProtectionModes.off; - newPayload[os].popup[protection].enabled = event.target.checked; - } - } else { - for (const os of OSes) { - newPayload[os][protection].mode = ProtectionModes.prevent; - newPayload[os].popup[protection].enabled = event.target.checked; - } - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, - [dispatch, policyDetailsConfig] - ); - - const handleUserNotificationCheckbox: EuiCheckboxProps['onChange'] = useCallback( - (event) => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - for (const os of OSes) { - newPayload[os].popup[protection].enabled = event.target.checked; - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, - [policyDetailsConfig, dispatch] - ); - - const handleCustomUserNotification = useCallback( - (event) => { - if (policyDetailsConfig) { - const newPayload = cloneDeep(policyDetailsConfig); - for (const os of OSes) { - newPayload[os].popup[protection].message = event.target.value; - } - dispatch({ - type: 'userChangedPolicyConfig', - payload: { policyConfig: newPayload }, - }); - } - }, - [policyDetailsConfig, dispatch] - ); - - const radioButtons = useMemo(() => { - return ( - <> - - - - - - - - - - - - - - - - - - - - {userNotificationSelected && ( - <> - - - - -

- -

-
-
- - - - - - - } - /> - -
- - - - )} - - ); - }, [ - radios, - selected, - handleUserNotificationCheckbox, - userNotificationSelected, - userNotificationMessage, - handleCustomUserNotification, - ]); - - const protectionSwitch = useMemo(() => { - return ( - - ); - }, [handleSwitchChange, selected]); + const OSes: Immutable = [OS.windows]; + const protection = 'ransomware'; return ( { })} supportedOss={[OperatingSystem.WINDOWS]} dataTestSubj="ransomwareProtectionsForm" - rightCorner={protectionSwitch} + rightCorner={} > - {radioButtons} + + Date: Tue, 23 Mar 2021 15:24:24 -0400 Subject: [PATCH 08/35] [Fleet] Add `fleetServerEnabled` config setting and use it in SO migration for Endpoint Policies (#95204) * Add `agents.fleetServerEnabled` to plugin configuration * Use feature flag in Endpoint package policy SO migration --- x-pack/plugins/fleet/common/types/index.ts | 1 + .../fleet/mock/plugin_configuration.ts | 1 + x-pack/plugins/fleet/server/index.ts | 2 +- x-pack/plugins/fleet/server/plugin.ts | 6 +++-- .../security_solution/to_v7_13_0.test.ts | 23 +++++++++++++++++++ .../security_solution/to_v7_13_0.ts | 22 ++++++++++-------- .../saved_objects/migrations/to_v7_13_0.ts | 12 ++++++---- .../fleet/server/services/app_context.ts | 5 ++++ 8 files changed, 56 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/fleet/common/types/index.ts b/x-pack/plugins/fleet/common/types/index.ts index 4223697703a8d..5c385f938a69e 100644 --- a/x-pack/plugins/fleet/common/types/index.ts +++ b/x-pack/plugins/fleet/common/types/index.ts @@ -14,6 +14,7 @@ export interface FleetConfigType { registryProxyUrl?: string; agents: { enabled: boolean; + fleetServerEnabled: boolean; tlsCheckDisabled: boolean; pollingRequestTimeout: number; maxConcurrentConnections: number; diff --git a/x-pack/plugins/fleet/public/applications/fleet/mock/plugin_configuration.ts b/x-pack/plugins/fleet/public/applications/fleet/mock/plugin_configuration.ts index 5d53425607361..81ef6a6703c34 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/mock/plugin_configuration.ts +++ b/x-pack/plugins/fleet/public/applications/fleet/mock/plugin_configuration.ts @@ -14,6 +14,7 @@ export const createConfigurationMock = (): FleetConfigType => { registryProxyUrl: '', agents: { enabled: true, + fleetServerEnabled: false, tlsCheckDisabled: true, pollingRequestTimeout: 1000, maxConcurrentConnections: 100, diff --git a/x-pack/plugins/fleet/server/index.ts b/x-pack/plugins/fleet/server/index.ts index 73a8b419a869d..8bad868b813ac 100644 --- a/x-pack/plugins/fleet/server/index.ts +++ b/x-pack/plugins/fleet/server/index.ts @@ -38,7 +38,6 @@ export const config: PluginConfigDescriptor = { deprecations: ({ renameFromRoot, unused }) => [ renameFromRoot('xpack.ingestManager', 'xpack.fleet'), renameFromRoot('xpack.fleet.fleet', 'xpack.fleet.agents'), - unused('agents.fleetServerEnabled'), ], schema: schema.object({ enabled: schema.boolean({ defaultValue: true }), @@ -46,6 +45,7 @@ export const config: PluginConfigDescriptor = { registryProxyUrl: schema.maybe(schema.uri({ scheme: ['http', 'https'] })), agents: schema.object({ enabled: schema.boolean({ defaultValue: true }), + fleetServerEnabled: schema.boolean({ defaultValue: false }), tlsCheckDisabled: schema.boolean({ defaultValue: false }), pollingRequestTimeout: schema.number({ defaultValue: AGENT_POLLING_REQUEST_TIMEOUT_MS, diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 477e6c3959951..5d7b05c5eddcb 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -209,6 +209,10 @@ export class FleetPlugin this.encryptedSavedObjectsSetup = deps.encryptedSavedObjects; this.cloud = deps.cloud; + const config = await this.config$.pipe(first()).toPromise(); + + appContextService.fleetServerEnabled = config.agents.fleetServerEnabled; + registerSavedObjects(core.savedObjects, deps.encryptedSavedObjects); registerEncryptedSavedObjects(deps.encryptedSavedObjects); @@ -248,8 +252,6 @@ export class FleetPlugin const router = core.http.createRouter(); - const config = await this.config$.pipe(first()).toPromise(); - // Register usage collection registerFleetUsageCollector(core, config, deps.usageCollection); diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.test.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.test.ts index 75e2922bd5149..6897efbe94110 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.test.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.test.ts @@ -12,6 +12,8 @@ import type { PackagePolicy } from '../../../../common'; import { migrationMocks } from '../../../../../../../src/core/server/mocks'; +import { appContextService } from '../../../services'; + import { migrateEndpointPackagePolicyToV7130 } from './to_v7_13_0'; describe('7.13.0 Endpoint Package Policy migration', () => { @@ -126,6 +128,16 @@ describe('7.13.0 Endpoint Package Policy migration', () => { const migrationContext = migrationMocks.createContext(); + beforeEach(() => { + // set `fleetServerEnabled` flag to true + appContextService.fleetServerEnabled = true; + }); + + afterEach(() => { + // set `fleetServerEnabled` flag back to false + appContextService.fleetServerEnabled = false; + }); + it('should adjust the relative url for all artifact manifests', () => { expect( migrateEndpointPackagePolicyToV7130(createOldPackagePolicySO(), migrationContext) @@ -142,4 +154,15 @@ describe('7.13.0 Endpoint Package Policy migration', () => { unchangedPackagePolicySo ); }); + + it('should NOT migrate artifact relative_url if fleetServerEnabled is false', () => { + const packagePolicySo = createOldPackagePolicySO(); + const unchangedPackagePolicySo = cloneDeep(packagePolicySo); + + appContextService.fleetServerEnabled = false; + + expect(migrateEndpointPackagePolicyToV7130(packagePolicySo, migrationContext)).toEqual( + unchangedPackagePolicySo + ); + }); }); diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.ts index 655ce37b4faaf..5eb0c7a6e3141 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_13_0.ts @@ -10,6 +10,7 @@ import type { SavedObjectMigrationFn } from 'kibana/server'; import type { PackagePolicy } from '../../../../common'; import { relativeDownloadUrlFromArtifact } from '../../../services/artifacts/mappings'; import type { ArtifactElasticsearchProperties } from '../../../services'; +import { appContextService } from '../../../services'; type ArtifactManifestList = Record< string, @@ -21,16 +22,19 @@ export const migrateEndpointPackagePolicyToV7130: SavedObjectMigrationFn< PackagePolicy > = (packagePolicyDoc) => { if (packagePolicyDoc.attributes.package?.name === 'endpoint') { - // Adjust all artifact URLs so that they point at fleet-server - const artifactList: ArtifactManifestList = - packagePolicyDoc.attributes?.inputs[0]?.config?.artifact_manifest.value.artifacts; + // Feature condition check here is temporary until v7.13 ships + if (appContextService.fleetServerEnabled) { + // Adjust all artifact URLs so that they point at fleet-server + const artifactList: ArtifactManifestList = + packagePolicyDoc.attributes?.inputs[0]?.config?.artifact_manifest.value.artifacts; - if (artifactList) { - for (const [identifier, artifactManifest] of Object.entries(artifactList)) { - artifactManifest.relative_url = relativeDownloadUrlFromArtifact({ - identifier, - decodedSha256: artifactManifest.decoded_sha256, - }); + if (artifactList) { + for (const [identifier, artifactManifest] of Object.entries(artifactList)) { + artifactManifest.relative_url = relativeDownloadUrlFromArtifact({ + identifier, + decodedSha256: artifactManifest.decoded_sha256, + }); + } } } } diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_13_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_13_0.ts index 1cc2394a8e5fe..e4ba7ce56e847 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_13_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/to_v7_13_0.ts @@ -32,11 +32,15 @@ export const migratePackagePolicyToV7130: SavedObjectMigrationFn { + let updatedPackagePolicyDoc = packagePolicyDoc; + // Endpoint specific migrations - // FIXME:PT remove `-OFF` from below once ready to be released - if (packagePolicyDoc.attributes.package?.name === 'endpoint-OFF') { - return migrateEndpointPackagePolicyToV7130(packagePolicyDoc, migrationContext); + if (packagePolicyDoc.attributes.package?.name === 'endpoint') { + updatedPackagePolicyDoc = migrateEndpointPackagePolicyToV7130( + packagePolicyDoc, + migrationContext + ); } - return packagePolicyDoc; + return updatedPackagePolicyDoc; }; diff --git a/x-pack/plugins/fleet/server/services/app_context.ts b/x-pack/plugins/fleet/server/services/app_context.ts index 954308a980861..c49e536435027 100644 --- a/x-pack/plugins/fleet/server/services/app_context.ts +++ b/x-pack/plugins/fleet/server/services/app_context.ts @@ -44,6 +44,11 @@ class AppContextService { private httpSetup?: HttpServiceSetup; private externalCallbacks: ExternalCallbacksStorage = new Map(); + /** + * Temporary flag until v7.13 ships + */ + public fleetServerEnabled: boolean = false; + public async start(appContext: FleetAppContext) { this.data = appContext.data; this.esClient = appContext.elasticsearch.client.asInternalUser; From ba21c315c9e7292273a5bb5a4af6a6768a17a2f8 Mon Sep 17 00:00:00 2001 From: Larry Gregory Date: Tue, 23 Mar 2021 15:47:14 -0400 Subject: [PATCH 09/35] Document spaces telemetry fields (#95087) --- .../spaces_usage_collector.ts | 294 +++++++++++++++--- .../schema/xpack_plugins.json | 200 +++++++++--- 2 files changed, 413 insertions(+), 81 deletions(-) diff --git a/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts b/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts index 60a2acc5319df..c0cf71fab0558 100644 --- a/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts +++ b/x-pack/plugins/spaces/server/usage_collection/spaces_usage_collector.ts @@ -179,50 +179,262 @@ export function getSpacesUsageCollector( type: 'spaces', isReady: () => true, schema: { - usesFeatureControls: { type: 'boolean' }, + usesFeatureControls: { + type: 'boolean', + _meta: { + description: + 'Indicates if at least one feature is disabled in at least one space. This is a signal that space-level feature controls are in use. This does not account for role-based (security) feature controls.', + }, + }, disabledFeatures: { // "feature": number; - DYNAMIC_KEY: { type: 'long' }, + DYNAMIC_KEY: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, // Known registered features - stackAlerts: { type: 'long' }, - actions: { type: 'long' }, - enterpriseSearch: { type: 'long' }, - fleet: { type: 'long' }, - savedObjectsTagging: { type: 'long' }, - indexPatterns: { type: 'long' }, - discover: { type: 'long' }, - canvas: { type: 'long' }, - maps: { type: 'long' }, - siem: { type: 'long' }, - monitoring: { type: 'long' }, - graph: { type: 'long' }, - uptime: { type: 'long' }, - savedObjectsManagement: { type: 'long' }, - timelion: { type: 'long' }, - dev_tools: { type: 'long' }, - advancedSettings: { type: 'long' }, - infrastructure: { type: 'long' }, - visualize: { type: 'long' }, - logs: { type: 'long' }, - dashboard: { type: 'long' }, - ml: { type: 'long' }, - apm: { type: 'long' }, - }, - available: { type: 'boolean' }, - enabled: { type: 'boolean' }, - count: { type: 'long' }, - 'apiCalls.copySavedObjects.total': { type: 'long' }, - 'apiCalls.copySavedObjects.kibanaRequest.yes': { type: 'long' }, - 'apiCalls.copySavedObjects.kibanaRequest.no': { type: 'long' }, - 'apiCalls.copySavedObjects.createNewCopiesEnabled.yes': { type: 'long' }, - 'apiCalls.copySavedObjects.createNewCopiesEnabled.no': { type: 'long' }, - 'apiCalls.copySavedObjects.overwriteEnabled.yes': { type: 'long' }, - 'apiCalls.copySavedObjects.overwriteEnabled.no': { type: 'long' }, - 'apiCalls.resolveCopySavedObjectsErrors.total': { type: 'long' }, - 'apiCalls.resolveCopySavedObjectsErrors.kibanaRequest.yes': { type: 'long' }, - 'apiCalls.resolveCopySavedObjectsErrors.kibanaRequest.no': { type: 'long' }, - 'apiCalls.resolveCopySavedObjectsErrors.createNewCopiesEnabled.yes': { type: 'long' }, - 'apiCalls.resolveCopySavedObjectsErrors.createNewCopiesEnabled.no': { type: 'long' }, + stackAlerts: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + actions: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + enterpriseSearch: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + fleet: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + savedObjectsTagging: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + indexPatterns: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + discover: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + canvas: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + maps: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + siem: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + monitoring: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + graph: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + uptime: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + savedObjectsManagement: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + timelion: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + dev_tools: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + advancedSettings: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + infrastructure: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + visualize: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + logs: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + dashboard: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + ml: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + apm: { + type: 'long', + _meta: { + description: 'The number of spaces which have this feature disabled.', + }, + }, + }, + available: { + type: 'boolean', + _meta: { + description: 'Indicates if the spaces feature is available in this installation.', + }, + }, + enabled: { + type: 'boolean', + _meta: { + description: 'Indicates if the spaces feature is enabled in this installation.', + }, + }, + count: { + type: 'long', + _meta: { + description: 'The number of spaces in this installation.', + }, + }, + 'apiCalls.copySavedObjects.total': { + type: 'long', + _meta: { + description: 'The number of times the "Copy Saved Objects" API has been called.', + }, + }, + 'apiCalls.copySavedObjects.kibanaRequest.yes': { + type: 'long', + _meta: { + description: + 'The number of times the "Copy Saved Objects" API has been called via the Kibana client.', + }, + }, + 'apiCalls.copySavedObjects.kibanaRequest.no': { + type: 'long', + _meta: { + description: + 'The number of times the "Copy Saved Objects" API has been called via an API consumer (e.g. curl).', + }, + }, + 'apiCalls.copySavedObjects.createNewCopiesEnabled.yes': { + type: 'long', + _meta: { + description: + 'The number of times the "Copy Saved Objects" API has been called with "createNewCopies" set to true.', + }, + }, + 'apiCalls.copySavedObjects.createNewCopiesEnabled.no': { + type: 'long', + _meta: { + description: + 'The number of times the "Copy Saved Objects" API has been called with "createNewCopies" set to false.', + }, + }, + 'apiCalls.copySavedObjects.overwriteEnabled.yes': { + type: 'long', + _meta: { + description: + 'The number of times the "Copy Saved Objects" API has been called with "overwrite" set to true.', + }, + }, + 'apiCalls.copySavedObjects.overwriteEnabled.no': { + type: 'long', + _meta: { + description: + 'The number of times the "Copy Saved Objects" API has been called with "overwrite" set to false.', + }, + }, + 'apiCalls.resolveCopySavedObjectsErrors.total': { + type: 'long', + _meta: { + description: + 'The number of times the "Resolve Copy Saved Objects Errors" API has been called.', + }, + }, + 'apiCalls.resolveCopySavedObjectsErrors.kibanaRequest.yes': { + type: 'long', + _meta: { + description: + 'The number of times the "Resolve Copy Saved Objects Errors" API has been called via the Kibana client.', + }, + }, + 'apiCalls.resolveCopySavedObjectsErrors.kibanaRequest.no': { + type: 'long', + _meta: { + description: + 'The number of times the "Resolve Copy Saved Objects Errors" API has been called via an API consumer (e.g. curl).', + }, + }, + 'apiCalls.resolveCopySavedObjectsErrors.createNewCopiesEnabled.yes': { + type: 'long', + _meta: { + description: + 'The number of times the "Resolve Copy Saved Objects Errors" API has been called with "createNewCopies" set to true.', + }, + }, + 'apiCalls.resolveCopySavedObjectsErrors.createNewCopiesEnabled.no': { + type: 'long', + _meta: { + description: + 'The number of times the "Resolve Copy Saved Objects Errors" API has been called with "createNewCopies" set to false.', + }, + }, }, fetch: async ({ esClient }: CollectorFetchContext) => { const { licensing, kibanaIndexConfig$, features, usageStatsServicePromise } = deps; diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 81a7030fe0edd..ed8e44072b914 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -3766,128 +3766,248 @@ "spaces": { "properties": { "usesFeatureControls": { - "type": "boolean" + "type": "boolean", + "_meta": { + "description": "Indicates if at least one feature is disabled in at least one space. This is a signal that space-level feature controls are in use. This does not account for role-based (security) feature controls." + } }, "disabledFeatures": { "properties": { "DYNAMIC_KEY": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "stackAlerts": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "actions": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "enterpriseSearch": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "fleet": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "savedObjectsTagging": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "indexPatterns": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "discover": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "canvas": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "maps": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "siem": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "monitoring": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "graph": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "uptime": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "savedObjectsManagement": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "timelion": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "dev_tools": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "advancedSettings": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "infrastructure": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "visualize": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "logs": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "dashboard": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "ml": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } }, "apm": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces which have this feature disabled." + } } } }, "available": { - "type": "boolean" + "type": "boolean", + "_meta": { + "description": "Indicates if the spaces feature is available in this installation." + } }, "enabled": { - "type": "boolean" + "type": "boolean", + "_meta": { + "description": "Indicates if the spaces feature is enabled in this installation." + } }, "count": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of spaces in this installation." + } }, "apiCalls.copySavedObjects.total": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called." + } }, "apiCalls.copySavedObjects.kibanaRequest.yes": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called via the Kibana client." + } }, "apiCalls.copySavedObjects.kibanaRequest.no": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called via an API consumer (e.g. curl)." + } }, "apiCalls.copySavedObjects.createNewCopiesEnabled.yes": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called with \"createNewCopies\" set to true." + } }, "apiCalls.copySavedObjects.createNewCopiesEnabled.no": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called with \"createNewCopies\" set to false." + } }, "apiCalls.copySavedObjects.overwriteEnabled.yes": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called with \"overwrite\" set to true." + } }, "apiCalls.copySavedObjects.overwriteEnabled.no": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Copy Saved Objects\" API has been called with \"overwrite\" set to false." + } }, "apiCalls.resolveCopySavedObjectsErrors.total": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Resolve Copy Saved Objects Errors\" API has been called." + } }, "apiCalls.resolveCopySavedObjectsErrors.kibanaRequest.yes": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Resolve Copy Saved Objects Errors\" API has been called via the Kibana client." + } }, "apiCalls.resolveCopySavedObjectsErrors.kibanaRequest.no": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Resolve Copy Saved Objects Errors\" API has been called via an API consumer (e.g. curl)." + } }, "apiCalls.resolveCopySavedObjectsErrors.createNewCopiesEnabled.yes": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Resolve Copy Saved Objects Errors\" API has been called with \"createNewCopies\" set to true." + } }, "apiCalls.resolveCopySavedObjectsErrors.createNewCopiesEnabled.no": { - "type": "long" + "type": "long", + "_meta": { + "description": "The number of times the \"Resolve Copy Saved Objects Errors\" API has been called with \"createNewCopies\" set to false." + } } } }, From 3cfb4f061ee6fda6f8e5e601dafccd99120db4b9 Mon Sep 17 00:00:00 2001 From: "Christiane (Tina) Heiligers" Date: Tue, 23 Mar 2021 13:44:51 -0700 Subject: [PATCH 10/35] Warns usage collection is internal only (#95121) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/usage_collection/README.mdx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/usage_collection/README.mdx b/src/plugins/usage_collection/README.mdx index e6759b7dc6c7c..04e1e0fbb5006 100644 --- a/src/plugins/usage_collection/README.mdx +++ b/src/plugins/usage_collection/README.mdx @@ -7,10 +7,13 @@ date: 2021-02-24 tags: ['kibana','dev', 'contributor', 'api docs'] --- + # Kibana Usage Collection Service The Usage Collection Service defines a set of APIs for other plugins to report the usage of their features. At the same time, it provides necessary the APIs for other services (i.e.: telemetry, monitoring, ...) to consume that usage data. +IMPORTANT: Usage collection and telemetry applies to internal Elastic Kibana developers only. + ## How to report my plugin's usage? The way to report the usage of any feature depends on whether the actions to track occur in the UI, or the usage depends on any server-side data. For that reason, the set of APIs exposed in the `public` and `server` contexts are different. From 3ff76fd02217ffc3f07ca5233e48df920cbbe280 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Tue, 23 Mar 2021 17:02:36 -0500 Subject: [PATCH 11/35] [Workplace Search] Fix redirect and state for personal oAuth plugin (#95238) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Move source added route to top-level index component * Use state passed back from oAuth app to determine context The previous tests weren’t actually using this state so they have been updated with actual state data for proper testing --- .../workplace_search/index.test.tsx | 7 +++++++ .../applications/workplace_search/index.tsx | 5 +++++ .../add_source/add_source_logic.test.ts | 21 +++++++++++++------ .../components/add_source/add_source_logic.ts | 3 ++- .../components/source_added.tsx | 10 ++++++++- .../content_sources/sources_router.test.tsx | 2 +- .../views/content_sources/sources_router.tsx | 6 ------ 7 files changed, 39 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx index ceb1a82446132..48bdcd6551b65 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.test.tsx @@ -16,6 +16,7 @@ import { shallow } from 'enzyme'; import { Layout } from '../shared/layout'; import { WorkplaceSearchHeaderActions } from './components/layout'; +import { SourceAdded } from './views/content_sources/components/source_added'; import { ErrorState } from './views/error_state'; import { Overview as OverviewMVP } from './views/overview_mvp'; import { SetupGuide } from './views/setup_guide'; @@ -94,4 +95,10 @@ describe('WorkplaceSearchConfigured', () => { expect(wrapper.find(Layout).first().prop('readOnlyMode')).toEqual(true); }); + + it('renders SourceAdded', () => { + const wrapper = shallow(); + + expect(wrapper.find(SourceAdded)).toHaveLength(1); + }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx index 656c93053e22b..c269a987dc092 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/index.tsx @@ -24,12 +24,14 @@ import { GROUPS_PATH, SETUP_GUIDE_PATH, SOURCES_PATH, + SOURCE_ADDED_PATH, PERSONAL_SOURCES_PATH, ORG_SETTINGS_PATH, ROLE_MAPPINGS_PATH, SECURITY_PATH, } from './routes'; import { SourcesRouter } from './views/content_sources'; +import { SourceAdded } from './views/content_sources/components/source_added'; import { SourceSubNav } from './views/content_sources/components/source_sub_nav'; import { PrivateSourcesLayout } from './views/content_sources/private_sources_layout'; import { ErrorState } from './views/error_state'; @@ -82,6 +84,9 @@ export const WorkplaceSearchConfigured: React.FC = (props) => { + + + {errorConnecting ? : } diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts index ed67eb9994bc8..d0ab40399fa59 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts @@ -275,12 +275,12 @@ describe('AddSourceLogic', () => { describe('saveSourceParams', () => { const params = { code: 'code123', - state: '"{"state": "foo"}"', - session_state: 'session123', + state: + '{"action":"create","context":"organization","service_type":"gmail","csrf_token":"token==","index_permissions":false}', }; const queryString = - 'code=code123&state=%22%7B%22state%22%3A%20%22foo%22%7D%22&session_state=session123'; + '?state=%7B%22action%22:%22create%22,%22context%22:%22organization%22,%22service_type%22:%22gmail%22,%22csrf_token%22:%22token%3D%3D%22,%22index_permissions%22:false%7D&code=code123'; const response = { serviceName: 'name', indexPermissions: false, serviceType: 'zendesk' }; @@ -303,9 +303,18 @@ describe('AddSourceLogic', () => { await nextTick(); expect(setAddedSourceSpy).toHaveBeenCalledWith(serviceName, indexPermissions, serviceType); - expect(navigateToUrl).toHaveBeenCalledWith( - getSourcesPath(SOURCES_PATH, AppLogic.values.isOrganization) - ); + expect(navigateToUrl).toHaveBeenCalledWith(getSourcesPath(SOURCES_PATH, true)); + }); + + it('redirects to private dashboard when account context', async () => { + const accountQueryString = + '?state=%7B%22action%22:%22create%22,%22context%22:%22account%22,%22service_type%22:%22gmail%22,%22csrf_token%22:%22token%3D%3D%22,%22index_permissions%22:false%7D&code=code'; + + AddSourceLogic.actions.saveSourceParams(accountQueryString); + + await nextTick(); + + expect(navigateToUrl).toHaveBeenCalledWith(getSourcesPath(SOURCES_PATH, false)); }); it('handles error', async () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts index 4e996aff6f5b0..e1f554d87551d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts @@ -470,12 +470,13 @@ export const AddSourceLogic = kea { const { http } = HttpLogic.values; - const { isOrganization } = AppLogic.values; const { navigateToUrl } = KibanaLogic.values; const { setAddedSource } = SourcesLogic.actions; const params = (parseQueryParams(search) as unknown) as OauthParams; const query = { ...params, kibana_host: kibanaHost }; const route = '/api/workplace_search/sources/create'; + const state = JSON.parse(params.state); + const isOrganization = state.context !== 'account'; try { const response = await http.get(route, { query }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx index 5f1d2ed0c81c3..7c4e81d8e0755 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx @@ -11,6 +11,8 @@ import { useLocation } from 'react-router-dom'; import { Location } from 'history'; import { useActions } from 'kea'; +import { EuiPage, EuiPageBody } from '@elastic/eui'; + import { Loading } from '../../../../shared/loading'; import { AddSourceLogic } from './add_source/add_source_logic'; @@ -28,5 +30,11 @@ export const SourceAdded: React.FC = () => { saveSourceParams(search); }, []); - return ; + return ( + + + + + + ); }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx index 2438061c67759..eac1bd7d3ea27 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.test.tsx @@ -34,7 +34,7 @@ describe('SourcesRouter', () => { }); it('renders sources routes', () => { - const TOTAL_ROUTES = 62; + const TOTAL_ROUTES = 61; const wrapper = shallow(); expect(wrapper.find(Switch)).toHaveLength(1); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx index b7857cf4612a2..f4a56c8a0beaa 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/sources_router.tsx @@ -19,7 +19,6 @@ import { AppLogic } from '../../app_logic'; import { NAV } from '../../constants'; import { ADD_SOURCE_PATH, - SOURCE_ADDED_PATH, SOURCE_DETAILS_PATH, PERSONAL_SOURCES_PATH, SOURCES_PATH, @@ -27,7 +26,6 @@ import { } from '../../routes'; import { AddSource, AddSourceList } from './components/add_source'; -import { SourceAdded } from './components/source_added'; import { OrganizationSources } from './organization_sources'; import { PrivateSources } from './private_sources'; import { staticSourceData } from './source_data'; @@ -115,10 +113,6 @@ export const SourcesRouter: React.FC = () => {
- - - - From 80b05b914ac7e521155feb2a6f0bb124337ae76a Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Tue, 23 Mar 2021 17:39:57 -0500 Subject: [PATCH 12/35] [Workplace Search] Add missing tests to get 100% coverage (#95240) --- .../workplace_search/app_logic.test.ts | 13 +++- .../workplace_search/routes.test.tsx | 60 ++++++++++++++++++- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/app_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/app_logic.test.ts index 8ba94e83d26cf..82fc00923202f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/app_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/app_logic.test.ts @@ -48,7 +48,7 @@ describe('AppLogic', () => { expect(AppLogic.values).toEqual(DEFAULT_VALUES); }); - describe('initializeAppData()', () => { + describe('initializeAppData', () => { it('sets values based on passed props', () => { AppLogic.actions.initializeAppData(DEFAULT_INITIAL_APP_DATA); @@ -66,11 +66,20 @@ describe('AppLogic', () => { }); }); - describe('setContext()', () => { + describe('setContext', () => { it('sets context', () => { AppLogic.actions.setContext(true); expect(AppLogic.values.isOrganization).toEqual(true); }); }); + + describe('setSourceRestriction', () => { + it('sets property', () => { + mount(DEFAULT_INITIAL_APP_DATA); + AppLogic.actions.setSourceRestriction(true); + + expect(AppLogic.values.account.canCreatePersonalSources).toEqual(true); + }); + }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.test.tsx index 68bec94270a01..7d3e19dfe626a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.test.tsx @@ -13,8 +13,15 @@ import { EuiLink } from '@elastic/eui'; import { getContentSourcePath, + getGroupPath, + getGroupSourcePrioritizationPath, + getReindexJobRoute, + getRoleMappingPath, + getSourcesPath, + GROUPS_PATH, SOURCES_PATH, PERSONAL_SOURCES_PATH, + ROLE_MAPPINGS_PATH, SOURCE_DETAILS_PATH, } from './routes'; @@ -24,17 +31,66 @@ const TestComponent = ({ id, isOrg }: { id: string; isOrg?: boolean }) => { }; describe('getContentSourcePath', () => { - it('should format org route', () => { + it('should format org path', () => { const wrapper = shallow(); const path = wrapper.find(EuiLink).prop('href'); expect(path).toEqual(`${SOURCES_PATH}/123`); }); - it('should format user route', () => { + it('should format user path', () => { const wrapper = shallow(); const path = wrapper.find(EuiLink).prop('href'); expect(path).toEqual(`${PERSONAL_SOURCES_PATH}/123`); }); }); + +describe('getGroupPath', () => { + it('should format path', () => { + expect(getGroupPath('123')).toEqual(`${GROUPS_PATH}/123`); + }); +}); + +describe('getRoleMappingPath', () => { + it('should format path', () => { + expect(getRoleMappingPath('123')).toEqual(`${ROLE_MAPPINGS_PATH}/123`); + }); +}); + +describe('getGroupSourcePrioritizationPath', () => { + it('should format path', () => { + expect(getGroupSourcePrioritizationPath('123')).toEqual( + `${GROUPS_PATH}/123/source_prioritization` + ); + }); +}); + +describe('getSourcesPath', () => { + const PATH = '/foo/123'; + + it('should format org path', () => { + expect(getSourcesPath(PATH, true)).toEqual(PATH); + }); + + it('should format user path', () => { + expect(getSourcesPath(PATH, false)).toEqual(`/p${PATH}`); + }); +}); + +describe('getReindexJobRoute', () => { + const SOURCE_ID = '234'; + const REINDEX_ID = '345'; + + it('should format org path', () => { + expect(getReindexJobRoute(SOURCE_ID, REINDEX_ID, true)).toEqual( + `/sources/${SOURCE_ID}/schema_errors/${REINDEX_ID}` + ); + }); + + it('should format user path', () => { + expect(getReindexJobRoute(SOURCE_ID, REINDEX_ID, false)).toEqual( + `/p/sources/${SOURCE_ID}/schema_errors/${REINDEX_ID}` + ); + }); +}); From 1fc50005ccc14ee94d88c7becb939402eced43b6 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Tue, 23 Mar 2021 18:54:03 -0400 Subject: [PATCH 13/35] Create best practices doc in developer guide (#94981) * Create best_practies.mdx * Update best_practices.mdx Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- dev_docs/assets/product_stages.png | Bin 0 -> 205603 bytes dev_docs/best_practices.mdx | 148 +++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 dev_docs/assets/product_stages.png create mode 100644 dev_docs/best_practices.mdx diff --git a/dev_docs/assets/product_stages.png b/dev_docs/assets/product_stages.png new file mode 100644 index 0000000000000000000000000000000000000000..d62c5570d0dde067b14422a38827a35fa65a7f79 GIT binary patch literal 205603 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

5mor-GOe{}m>D7|UhI-hkAe$}b1qNo zVBg-RKT=#QR#=JbWOFMjZYi|5X9dA&+FWY9&W*OcR& zhEpjsnbu+nBQ}APDI+9W<0+;d2#**>Y-p(x9V94AIMC^v@@~ZM`NtJbzw1Obrz?6U|rZR?@BBv~2 zScIzVt`2!?-R{*3mk-Qac($YSKyy=TM^`eJWlhsPCr-?$s;(?9nN?MV?a0kF_tBI- z9JRKzrX?-eH%h&bWM$pbrH7l&^bQWDayfYSl9Cd)+kIIfHu$LR?d`{pA7|zq@cEb2 zH_WQ7b-7d$G(%G%wkJMz){0U~ATpAwwPO@Q`fV`qGJGC!N?i7!2Nf@4YKlthfTU z-onbi^ILlm#=h)S9hV9zQcoXROhM|pKcX<>;!=qo5FTDW-O?8aHeCB*@MP$t+6Q9DUOd4_$F z@Mk6_jKMx)`gx(p$fk_(jG2k&a(X6}%2CY^Jx7WlnRJSXe`GQOAU8^#vka6)tKctj zemAWb68fDWIhv#*_3dGk^%xTI;h~|D(h{mDPl#=F1j&#r4uycTez#H*2~AAG6_NtM zuuJuj&rFA=u;dlIB6j)A>I$>402c<3-yfZvIMaFlL?)SI7tk~+Ba!m*a@cp@k?XLd zqob#%$4;-WU9wnFRU%9^wGMxAlQdsr6NG$i!`>$eWnb1s^wPdP2Tq=1P;Az$hP&>* zi%^X9O8_-AwSz;JI?*ITp+GPY3f0xsk}6dHz~RG3jvqeO+1Y7#XNV8_>C^xFvB&=E zf%mOhxQJvKWL^a;vY!B*P*BkgS2`tVhL+A6(J>*D$_z$vR-@vgDM&N~Lq-(CA(OOX zktx{1TC~(gwT0<`s>q#&guG~Ket%TxuNgUA8jMbk#nbecOrOUytFF4HvdR=CgF2H~ z^L!c=tA{n6h5cC46_eCEQ_|$PASoVEstx+8gW(k$)}JUjyYtAA4oFepnbr0ECr_+d zw5YzMM6xyih=dI%#V{RL!d$hOvFvuR?ims#3KNWiK=%&o4*`H*#q^~p+Z(=nV)Fk#gkld&O0L2^kT`c7%Xk3xuwXoXBmnU zr&3NGMh@asFJxzFjZG)Ap%nJ(5Qcxc^@ZK1kJ}qTQ8@I8`|i8@)?1O+J!#@BQ5J;! zf~3@#IC)@}2pDvhD;V%!xAD3)*R6qU|J<3gdw0G5#-XE5#r{(lE`0qz{^PrkJW?4c zK-`wsRxQDHeclQj*dDp#NSnf0cyMwiUNURuy_+_|ijAhZ!(LfgnLRr5HUMo9UhlvE z{#Rdp^~8x2_BIde=DXkem-l|)ee2h+^LV_PrbC!w11Q22`kGA}%4=kbvY=(O!-o$) z|LhB`=USY5Ib4@J0e3(6pwmI?%JD}Y&Ot4>+MS(UD_5^Hs9m647L_P&V@yuW6~=^| zkdx9VTojp%O~B2PBx&JRy6HO!>bG?;6^I~pR>nxw3K-qY3Xgy!(3usd$J z?z-BUb)`imwe_`?WtIML02UkU2!^SXVJHA;Y1)*}WN@I@KrTM1w{>Ml$Fk9} z_(Tjc<6JrmPkAm&;hLricIhxr9<~YubUYO2L7T>SLh=Lx14K_ zjg8mU)OkG~0p}#Dj7pUc=x{AYA-~T%qb{9I!&dI{_(T^n0ZfEKq9U7x5nNe{0s*6f zR?#FWt7$FGXHPaY+jhlpn;IG#Dl04BsT0$?cI~p)KviMkwe#jPd35KNXq!_BmzX@T zMP3DFfk-LSB8JN)OM_$4AOH3ld(+*xX=6=&UCt6yu#*#P4Np0lw)S^~WJ3pZ;1#NC zYpQChuD)jF-rakS96mD8)6aGYc!CZ!HGTW>UwA+4T{d?vB8Ibw&J0ryn=Bz>9E)A> z{1k<;ZmLxYL(|RJq!Am}Qdu*Z!A8!^W{{y^Hor$?7`OwArl;N%Ys#?8zbtn|NtX3w3k-ok@+c2iOuy96IO(@{!ZnKw4L@$Nd zrjSIerW-|Uk^)!yL~G0T!-pBns;n$uf5V3Qne`Y=FLtmQ2U{PH6@*NJ!3_wHHMOjo#lg}R5PsDyiv8JZR4$E(k z=)7prqR)KhGhh7T7wtru)!Tmh|&T$jFp3FI?Vb%a%R-@WWTM+1}ctprF8(J0=b8f&Q8GGf%ag_Nty~TbgN^ z!3vhTqAuavZo6&PtXYG7{VgpmH{7&&;gUs^iI!obPqvt%I8|4RYsC|zVw8ccrL)t% z*YFI?o;~}ak3PJ3(ZWzD>~gzFEsRKEnb~xf@DDQCTr!?cr{dj%(O5Lu+8*!d)JNj3 z@c|R^L0UE=d4dL8lV*>Lig|}*(-s)w4=STy`^6B(#P6dU3JfbqQ6)S|}*ME`^zpgUH;y z$H!ymTF>|Q_Bp8tix)4ht*w2hmV50=1{|e@MKdcZa?Uz|1E`^CwiXTnQ^A=&Bhi#4 zBElk~7hm7qPTlh$jLexc=eip`#> z-Lqi9f|p)=@zk+XtmMY(ZQuB}fB(l%f3l&fQp;+lfNk9bvR+tOS5+ldklZe^g;kdm zM5yJAc*abow6Rem7S(fx5l<0Vl}Vap9EGYHlIA7p$&*P1Q>Ar5k!a=ESrE-P2%F77 zLt`To$w`)A_}uQYl2Vt~s}uKAoq3C632>W=xsj;K`QkW(ta_fno?)F-%Z!PnM-uA& zg-OpyJe9}@uDF&nj~wq06spx#YI&&`@`;K<+_WebVJvQPQB8}vgsch-89pcUI{`6$ zI^*_huaWfJ9)OsXS9DpmM+XN7J32b-2)TI1jQWbQi!`e2`6?T(nbS*embFw~K#+`! z$bwtx8XDSr;zavkKMR2K7A>5&V7|vk>K#+xg3UMBO1L)EV8uJq8z6)vSt%(gDJm{n zxMcCUjq7&4vg5?j<4)*y>cWLDKlYgWqaR(naIvaLq~AzZUCX?Hw>saLGH~HsLv|UW6(oT_c1@PXQ=osxnPww1)wxh#F0}tGO$NFnl3#yV9 zg)BlES;SOu+z!S}eb+Hy&4Ykp!UYUQ!q;!Up&(N5PyhH&w*1pXd~$bF)2*vk6Ed;D zsoCT%iR`%{ISWB#oNF&I=X^emkE!54{l*Z)qG06Hciq+6-*>8`;~&5FHNc2(GtdUd zefQlLjYhxv)vp55vVS-}8hz&JXLr7~YtG!O7A{(_dd;0SM zd}89@zJte)9zS*BFw=LCX$F0w0N=2iQ6nG zY_8!0&#gb`zh>2{jGkSWSnmt?0CU@!62th?v9QNozBW%O z$7Dc}T~0&PO&tkL1k#`xBhg);B}IneAg9u-&EM{avK(5ar$%yH0Fxr0YbS(1Me&KU zo4k^!W6^^#73@}B(a{P+1|UvQSqg6ogHeN?(^&Z$x&X2n5V(>2qh#9XoQ& zIe`Jl7#9CK)dB?0w7; zxcjx;{e%4sw;gG2+I#GHbyc|l0N${)s}N?UiHt}`sv07_@x+fq6n#E3LPX3=bEc3^ z<6Jg3Jgg@YMpDybWALpuo)UD;&^5uNwn7Hi)`xE`SuAS#O)6(7rKLy5#sxwOB*Us6 zk0%fc=ok@`AS9avw~>z}a^ASY4ZjJba3e@OEDJCK=2(}RC`e0Qm%GUCH&ZE(URB+6SI+v?N8ux-EK@4o^ z>OR@l%H|~t3kzYpEG;WFOiQG~a+DG*HB75cmydWBZ-tU$NwJjdt{$&<*^1>2vu3{b z^7hwv>>3)#Yb2fR>iWhnf93W1md$RIL|Vt?E@dLylkIXfvTbJg8j~0S7Ym{#Wya{E zSiH1=7c*rSoye6+zENfyF>e>UhX(gGHD#Yb4Uw!S$mJ8=a#U)&1OzD7boa&u3HCd7);V}Hr zIj22M%|&F6DRh_O8aN20Gs(TX_Bn?kd_LcttLB(Fb1XRqI4wFjJlNFSdGyp^)0s#n z4LGR46w0uu5Oq+6*2ehDOFVUBmdK9A8f*^4o=TNum8e7!trGIR+wJyxy)Kuk&_j}3 z63-|Q?d|F`|KjtrhzYyXxhf{)otT_xZay&{P0)9elZkk5U$>~rp`rp&^1!}jNM6zF zK@}x9r{mH>1Q*li$7O{iVRfsb$>kgkOOk?mOb~y@w$`>iyY}?=_B*f1rcIj`ELb4E zQv^Py9qDx125oRT$^!wBMrb4m4#Pwt-&~&#;PU-b7BWmpGUz&hjpg+D*4C~r_6vnY zg)Un4VWT#5lS~~0@H2>|27IBBVFV59WJrdM z#ArG>U7swfg@UHb?g=@UQQ#%Uh7p#f|))XUy zGC3R@(GselkPndV8QYrA@#B&NQWz)M57ObW z#{Qb>P;H&;5SPDv+M~A9s7F;RBLyMI#Au~fu-wHgsus>qiB9#)7i=CIF9Q?AhGk-@ zITVfVK6&EMnKNuBU9w_n1C@U>b)6z9lX2y3+b1O2?w-@jcx(=mPJYl?1yT;d;c)o2 zJ8zpcd*+^PhUYsJoe-aRM3z3QJCiydVj@n& zS_2{8T4bkXSt)P`N$b5LGXvpB#u`JRhH7;Ea9wjGs;(U;PPBD*+Z@50)~_wDC`(Bw z1It*1+!t%qQp2E{w}=Ko?3g9D5u4L2#q065c3*hUd)~8e-@d*+-m>Tz9B%LIs4R#O zy#n6HW(grBN6^$>WOjKDS_W-_P-ksfVx1-;8DJRm%F4d;cYo(ww#-Rcc{`C;{C@wZ zKJ_U;0FOTUsIyOMw?78@2H?*d2M@zFXY)ZU?7?dJ1L9k7Ic~rG_RoIyvsY?t|8t-X zt}U!=_AP8VJ9g~2>6RNI5r%jwT3hBNpqrK1AWM=-aG2OR!xfjbp?^z!QzQ_@G|aPS z&ownQJH0Lfp8 zPy)hanT|0?q9TPLO9%u2qPaaDm&-?OMx~1?H<}XxU{bx%5wY=Bs4S%^Qra+)1E;?s zOHxH;{bal)t-+QCyDaL9jwk$sjdSXYYpYRJg(%6$?-l|rcfpd82gSM{roq+=~b0T zAQ19;eLgR2`H6Hom&s-`xpXF#OlM-r1a0LLGu#X|bwd9&;1BV-rH%r;ct9M{WL3Z} zS#gVEDS$8}mSV|=5nQ1Fk%v$`qTo`b+REC};xgUH#Etl5I>{KB@HqGbUO~jVnWY62 zCNTrZ48uD^Tpk)6g+&Qrxw@_v_IRou?J(OHRi>>5x5$7+EV%`w&}y8^KyFh}bGnd= zkC}2RW9ZpjI+fEV;RJK(B)p%QO(AJQGLw=TRUyxk6_3{+3ityde=txK3KRr_^Giz0 z8fMBhb+9p9hK+kjDeV?p(CzlCE;3#MOGspND3K!)5erisZZC?1c3BR#e@H4M(jbN< z)iE;MeBlC1 z03omd=FXp2T3$Y*e#Q&WK5w7S(er1|_w^MQ7SLf*UE14p86`B>aTXx+L8Su?7@ulw8yp|EuUb__HDInZLIkeSKbWWE zR3}Gd(~F3+A*?qLr;dLUKWs&Y=Oq$}Ktjk?@?sTYf^_UgZ>Yas8lw$;nrK^x*38bzAZr;97RP%pZ@fx7cN}*o$q{S z*REaJsXSljV{maf?UF}vaq;`!_rAaStG_BME4zZO{)Y~T)XSDFgQuF+kYRD3IB}x+ z^qH#4%FdoHNQxP6^pZrA{Ph0s>1d!SWqg5^C=e}o!&5&vJoLL4wvA8`KGxsy!&d_% zNB-siz&=zWC^N}30DBeudzBb0m!GnSuKY$VlXikZqB6sI_fX?EaHR zib8ru(;xtQ!(j+CErWx6tCPg~nGKL$8kCtqZv?Y~r0Ei5Tgk!Fbj7)CzH3 zcdTuZj}P-ouLL=P%bSNC@pycvl?x%NGXlTkROtP0AI;Fb?9RAO{4|FBrwL zccJOJx~NoE199X@8)>%txRtQ%4Pwb7VBM~s2||{5;+k5Tkm$x~hKzk4wICE=^+eO2 zRYYt|RT9YXTso)c4Dx7@{LM=^2WU({ zt%4R8a2)UeBu|P`To|dUt-s}tJMO>#ehBrKo8AYVGS9GYBR*e1RT1?*LUaqa#PjL) zj()%Afz`Yw;}-<6k-P%3;;g2fI(P1nWh7WpQ(0P3N-8&$`;SZ}JB#wR5*CtB;dNN4 zn9?#KQ_)S1+XQQZ$9|ru(SaC_gyt=o-_z6k`p#XfP|`m-cA~$(y0%)%<=l$mRv_b* zs5l!nF4eMdf3-|Dnact|iKkMDOeT@dq;fgPH{yi4oXfysAngK!p(_P2)*AHLX@`^_A1<2P;E^q~)Z=#D$?a9@7u*E{S0oV{q#qBq`n zg9WM1&dwkGkB#{?e;WCr^nc z4iNWGp+ZoLMY+I~3dquz6u}?~4nkBrR}2OM1qB5@pU>rT!IJQJJglvmhcZaC^H7^q zX8|>fmxh^xr^M_`dB|k~K%}#jvkaas_btkE5JZ(td}Dz)uR{h0C!&P>Qd#ND`iAXW zpKtE$7{Pju(9yKEox9wn#p{)gl~t84q&l1=s3a!S7f0Ol-DDQbq_~4ehemb~-=wXn zc;1=@PV?@&@4oG}+e%7G-oY!-xoqI8cqYTVEa}h~+)$ZxOSxUO$S{v?YB^G**C5Cy zv)N=iHJMINCez7GYBHJX9~vqyEWGcLM_M~NU)#N#Er#;)ibabTN;2{Nr{!UT71vln zgO49jOMfk!&Sr8*La@Uy!U}R$P!Jn@##E$>OT5w90x1*-5WAm?^lLEnUl$x21b@`! zqIGM)qb&FB6?BE}76Co}M(e3#Mq+7ggW{6MFe%QF{;ErK1>J&MF>}_lVQOqe<}%rd z@lkeaB0(VvsWBre?kk#krD9g^K`52e66v^!DUDQ666s{3D@i%&a7it-ApR)Ik~QC> z2mlympFmQkG69|xw=ReirkTzeqq*#OviDqfU-yLz>sGHWEiJvQK$}5^pz;}oOem{x zVd$IzP39cEc}pf93Boj!cDs9sM1$%)lL$yM6LUO~>=+yzjdOlTU44CNd6`HDppfMf zB?y*ht7TYf3PzT4j!7u91Xkch4a!qwAWsr(?uaGmfrYa2^7)JALDU_jnGEdC|NGnD z{wmE33%ro;dLw=xgt&Mz329F@L;g3J$;H#j|69YrOCAueBLQC|T#!kp-*fA&pZxeI zs_N_dqodtpBlcEOSX%5ZDoRTjJH77d^9u;_nWvxGw`Y%On89%P%H~iTH+3q0NJPS&0-o4^U__ONGnt`StS>s&HZa&TG&B?&hZu74rY4JGI2eq0 zeL=skBtquR)-=qVTVG$b`TANUc&7dG+cX3h7Z-o#GoRVAWy=dMyzty}&z(GZlJPv= z%%Q64+_`h_y6dj@z3+W>b#+$|)t}&)F=NKYjT?_1J(`!B+Pi1xM3*AVkc+`u zDu{#`{|x?SYA@Ito5wU4rB>N&q#zH}oNtOPjd=bUF!d24B56eOhwf_{SI@UqNyrPk zh>4ZV#ux-OSOn>{8VQc|cY zZVpEnzma+?OV(#Mh%$^Qi4vQzvzK}(6oM5yF)?AeQR8V3g~&(J_@sg)Nj9<4z8b7J z#{dMjx|ZAy)w*uf=uAip!Z7q|Di%U>2EKEjWFBFNCv_d{L z${;Bx%5K=EAyEkiLIsfse<%blYeO}y35vjEk0)-psdUy5rqmsgAe(?^XoLVvBZ)FS zR9kA18Cx+o;T%EQnr?~#teIGxi4+aFHEj6YA@lV^qw%z-wwe%ViVKN6iY!mJ)BTgT zN1b@ZFsaV5Nlle0L6Hq1I(qkbictV-p;D`LLXMC~Sq9ENKAC`Y(^pnLoX%W`#cWJd zQCS`ig{_$SQc- z=4A7tC5wHse~K=FB?-j%Y0=n3Y+~Gbra%A5PaaLB+RmTPz3Fn2ZknU9*r;`z;P}n% z-2hZ-pLqPA{_!7gx#bpTT}ghsLxE3z@{{j+cD4g^fKAxANRE^^ff z%YIK#Oo2BpMYl(iMWv+7Ra%5Z?5?fE*_^v^j;pvpR23;0gzd~H2zTCncW;0HkAM7Q zyXhZ`#$MX`VnH}uT3F@}1q`fHzC>OH-7eUWPO+}__Vw-DzVp>rw~voTo!4#l?AiC; zd+(}Mt6Y~KJNvCY;70rXepq!9At6GdpGsx2a34~cbl>>+$mGOmJU#%-K{LKM7QHYy z&^0s!UyM&qj3<*2M)cob0D!Rm*kg}Lj=?T~P{CkuB0fo?KdF6OIyfkTQ^N|EMOlAUZTp9qlM(`+{y6kdmhEZ8ns9d-(F)}*o_lPc!r@CA%Et36y zcU?VTI62^FB&0t*fOA6a4B%Exqb4eV+pHlXZcV{B_>}BLNQi<-?n`DY9v_K~4~|EB z$Hs=nqtRG=cp^GHK7P&GbszlLN4pY}$1RD|Idf*uy=rbC;6tpi$$jRLrFJP|u0ul% zrgXA43`LSnCd5EK0;?Yjv?R@>Y-}eQUay1O5ex>LP5eLCF*G#vh0lNfng9Gxct)J< zxT3;B7sWtKd>2^+2-T&WKHb!Dq202@76PFFJSyauELReHdl0N0YCJj?9T~G>H@wl| z!-wCJ&kv7YYfH1>Mv_*s|cga;C^#&vZCe$O+qG% z`Ud61gdB_KqS1l2u2@rR*RTlD)`Cf%A1)C4^MeNJ~n_ zf=;UuGV1_LLuss{#v?89{f>5hYUSZKy^r zpJ(O_IYdkdl)@t7we9f;jzS3hznYqw2OoTJWMt&2r=GGqDX@wD;upUhACCbVE~_ll zOkGA2wpY>X*L+UhPAb|`}gm+cVA?Q%@DF7 zoy?<+Bd$pXKWS-e+xlGI0u^9%VlsYhchAB_3$Vc%Y={?3MLMKM#SW;2yNS(QCcpgv zKm_~*cTl4Tz$^yB*vDWcD2i#w-^e&Rp>)Z-%y5D1dt!NEaz{dMcs z)z#I(*RQ_%DyENzA>c{VOhtmYt_lbJf(FlHTId}Ra|RlVVJ%YtFd-5&G|i>DFeyTs zSX3y(UFJ$T6x}A{$-#k<@v#X+dT`{43k2MS#ihYeC>#z0ASR3j0zF-nuf?o@X<3=n zdkEEmcDx9Ql&a+zm|{=@UR6LIgjxg9K#Qk@R1!XfK01b6fQ*rM#%v|z_s(vVLjeRR z5RxTDL6Y>RL2uJ8KBSxg+7Rn>6Y3WggP?9mrh#*YF_BJokB*${?tw+y+TYtVGBTb> zWHcRaR3e+z3GI)+)PeKopL&U`v_Xq=SzB9IUS2K|8zBU*PbqB}<$D{vq67S96`{D)g`+7SJrIRMyf z=FXk_$Rm%8jg7tb+G}>!2q5g&zy9@s0|)NE|Nd*PT^$MsB}LLTLeUl^Y-q;l$mqfS z2VZ&l<@UCAr{fAk8z1<<2kyT6?*B(da3EEC=%I(soH^r(O;i;YW=!+TPd*t>CHuz5 z-^_Mmx8XeWfJh42ApCvLJ@@`Ga5&Uq?CwxMvDnMI~g-G8i8aQxhf)a+=b^&L&^ALPfy=K zUmq39A~aWs81?mYuDWV=DCEUx3WVbF`H)J{1}IUWCT^;{NC~ehQ=MSAmM+1Ka9((f z_F#2*HcTX$S^_5s$zgK*1XATh(;20p2zgwtnhH-vxe^Xbp%9W~NmYga$pIaSPNcIt zC=$}Do=B%Mx-P0}I+Yxnoa`STABc^2j0~UY>24hy>>nN;i^nx8qw(0yQ@cu*3|K_<17cRif?eFdT-SaQ4TD9t~|Ml+5s!GXL zx`m9Es+Z?4pNV5{74l zkyY3lGl`x#NlOSSr7S=u3X!HqEEa>W+0WtEATYw)RaI4e=tCd6<(6BvZ{I$}_ed74 z4QR^cGBmxmq4vWcdFVG!{(5+DcutY$;#VuztX#WxO=U%eLF1!1 zHT6I?P$T_DT{KJ-i-}`VabQgBA3@o)K)s|=$>hjDKm5;Rft={JQxOnJEh{UjtDE8R z_#M;Z#FLoO)Eohna!zSojTO|oHRfYP6<>v9y5C%($>;NE~BVW#a}@r6Ano6 z1PHS!QXoeP{WGh43+Bl_pHfhORF$co3U96*1Ho(2qD5c);uqmD-nMNUge3d&Kq&mq zcfPY@#|{Wj3l`0TJQBirEEetT>OOSf;DNmdVh*YV3o8&l0OtXQZfI!ue`oovUAy*g z{`#-K_7DH?{IR1Mh>SM$c3vE0X>dpq#8y_|f#3_+2)>2*3*Q3FEh;LC&|}4l6)(U1 zvW;CJ<_`AvmsFJTX=2Mrh^|7D&7WR#%}PN3&p!QpadF|CIdgk@d&Jlv6>WM1L%bIXcQKpj;-M zOlJCfMM+MbZJG3WMUP)84!eqrTve5>(jw9A28b=Vb2&nYYl zc>@Cz6MLGQ;a!@0yPiIH@Mw3J{@^mDpsXA6jLtpereNbC1)k;ONdJ-$BXaGUB1PG7>2-(OsnSJJ7 zf7f;0Gn1JFkWCWs`)-OelUZ`#b6?l>`F^kOg8oH%=zJT9%UhgSQOOMa_^r zUs~_mL@J8YxWbq`_y?m&=JCfL*ITXV`|t5#e0pxa9%^|7$B1j!5YQhPAfV|EX`qgd zj=S%^d;IwE==AQ}w=Wg|gFY)52w+voM(d2k#or-&V|>Mg75OU%yq>I#Od6;3 zXo+F7Su>dwn^nuhNz#nZ$A-e1%jNFwZ*6KiedcseXO|Ht2`MbD{Gq1WYz2jR85x-j z*@2@HV>P2&$a?D=be6-oTn;wCI2G^K>YeZ-UBaTxDM>yMMPh^WzLshvhLBiWq}VV{ zSC>?uOAdHxx;xay`*8UmhOwmxsdht7y1|jnn9WGZF%}Ch(yNCCUbP=?`t<4O%Ixjz zy&+OI*Va#o&_ljrVIDJP%!q$ZUS1xuxb)I-I3?m-A0?{_c72od*`c#BjfTI) zW>rYLRdS6H#TH3GqgWghOCLCJ@YR=IK7RCgdX^XC2LH@`t2cf}j)y1Vh>&jHZ} zTyNcW-+lLWb#?vv*S~ISYl~0lJKAuhyX#!pgt9yCo>ew>oXKJqkRX#~hJ?s4=ej9R zi0&U?I@&2wqD2{3jaKP!(C=}3kfHB&55zi<=);+cWJ@`b6>Cq+jF^Z_Y>eqmMB?|A zR8sbV!h#G(s!=5UQ^Xy$RbE&G_uh*X+g*3v zHQIV+Unkwhvfr9FZ`Q2Yr|RmCpK578b0$3CMkiA+nT$EvshOGSSy|4aB70gIIzN|^ zoI&IEparvL%|fD$BBkwje7pmFM@1#$Vr{bNX!k}3ow3El#*l?FcDgB>L~T;|^pk===32PMmoC_17~pG8{SC zUZ2zwMOtc6k!std$7w{Y@T6Q0O+rh#NLlqro76$aI%&!(QPIl!48!ZQ zgr-NfB?(Mr;gha@g%or!zM<7kxG8i$Ln3xVZS8 zcixG;u&1{N8G9)icARV)%{13rf<$d(s&MR>??3u|RZ&i#IWuYUq);H}cDZNYJu;Kv*0sp^E;Pku9o)3|(|KkU^yjEM!_}vT9ATc>G?P zr1->kUNrrZ!I{jeM#ZYvF_Fr@*y6_((2q47`~ClWHD0mlhxx-F{t$iE*BuH8q7As- zSgqE-`@6pjg+d!QZbZ5*{<=rT(C43i)_CCX*n+(2`9;M=g_$gCkYrAhk!WLN87HQx zB$!Q7!+~JHAL#GzcMrJbNSGJS8z6PWv0-F3TO5w8lF|uiQj2YalJUnSR_hpSR1op% zX{@S=Dyer%T906pE7C}mBxs^{L$e;u@HB5QWM* zeI1LX!{J!5Vnszo1zIC_@7|48@ry@g=?=D{q9SAnE?Tr`>eQ*<@LU{2lDX{Od&4Ov?|lzxXyWD78V()#(;II*^`j+OSy}i3h_>F*SB2RA zQhe<#E$ZxLG&+)NiudjmHPR{sSq)0(xvtv3{q6Yi6S2=l%kyow-F9vL7MDe8YAU*- zKK=Aly%Rr@Znd?w9-rswB~K$ssv6aEy*`>l|HHlzvO!7Vtu#dm1cI&s7h3stefIg$ zqm7~{l3u)27o}PlZc1KW$=!ENn=;kL(uzN%c!NkZDWa%|YFu#%iPCUZLDX9>k^N|% z)F_N}OClj{0u_yPi&miK<9we|WIL6`v2m0-SW883>=doKPwL63cw8yl9G~@D_4$j=Dqo+Kb~%C8u0r=nik)r0G-2R zlUYcz2u1-(G^EVNjvYIG{CK3y^hhbauB4s|uV5Y@#R}@{`vT^1jU9h2-~j`^pPDJsY7H#Z#d9BDZuusLR1y2XU7A_J~}OQr}JFAqLn!0qabFYFSX zHw1lBwk4+&6{FEwU^bieQsR-sgY#7D(6>{NX=q?bpp!<4xWTU`(Rx4|UQrcdP$KEZ z;&Qwui!mpMPq8MIjWg!wFg6>SM{&$D8nIu0#u+*iG!G*AHDSVpKmYm9+qZ8==g{x> z4@p7NZE-Y-Adxq7=FCSPd1ThCSt%(gqpe%^NM4HQ+Q65`Re@I1yYIex_Uzdoe)ypt zth4L0T}dYM!bcZ6oKBYFR8m7evMNyLX~IUuT5v{+uWP!*iS&3>w4UzX+P~I*{NavR z4hqt0=-VtWFCW3Phc2zjlP9C=s->l+r>95v_11k>ht@M>7$8AuvX}!QKU%QS7-U%v z$C8WT0gtEg*s&9hCt6RnqVXFEoFYFVK^R+Je$V2?^XJdcvRGBWPjvg_o_;kP7W?{T zcdrr<6<>&wMODOkxwsI68mV7R& zre}02k=l_e6Dj&b0xs~^5)4WqpWG-T-N^7zeDdXi1Eyq^T zda4>LX%_3!K~strbtW@RFcjFgdmnZ|MYBhdX;EBUJS3F*MwY(FTkR$o_lw*=I{jOaJ)#>xXxK-rIiGp|EC}acZg==X?nUWJ!lr zCERgWm)RFDXT1C ziO#>iG$JG9Zy$aX2!$T`{`d0=^N_$IR~OlZih6z$-XYc$AnJIFRQkioj!MtD&JRD> z{^5Vu#;Sxc3^RTDbfnttcKgU4J34T*Ty=DGy!P5_=ScBqG&YfdtEs6$5>}7@v)ODM z?q0-8iW~|AJp&#jJ%ei7%7ZPMMxpJ6>roAPBgJ53u`h6*;$OqC}gJ! znOSU-6P`p2HNMH8I^{JPc9MbfeT+@mcZP1HT#FWN{WAz6P zAuS$z8d7W{?rB5ZdFP$zB<$F+Lw67$@w$5TYIGgmfB$`f^w5dZC(v!ZA|Sp3G&)vR zQ>7T5VZ8(1#-qpn`tJMtzuc!P>X5H&!GZ<<{LlZ4#PRiM14v(Gi#h*bCPpEtm$5=~mSM3VQTWzgxt#A_uIi4sw4Y;=E#F&H^y>yW4p zC$dC`6;~tK{%X`EhqL`;Vp6j>B2|;ZQv94(yaww`>Ho10rwQi9ILO7G=LP<)~#FDu3cMSUq9&N zC@Q>l#*Asxr;IHsHkxtyJxbN$ubTKu>ydSkinJm?a&4f0prQWgr=NUsc>kez#Ws2J zWb{E*RaG1}@>VzcYxSCKZ@lrwu3bY@l`qlne%D=hef!(ruB@yqC@8r229qL5nxbgo zu+-<$#89ZMUG@bPuP4;nLCK=zcH`+mL#ADjEN{5p8yV3GnRd{a)sraoEk0eHa1^bu z$WFwO6{HcT7Qb^C?dlXg+W5a*Bk>q$tyg1x(DejW6*r^8HGeEt+9()uvN*e)Pfsx- zF^9ghv{Y8$aVfa#_4U=&)&269zkL7w_w~DILU`c&4}I^x@1~}u$E<~@aHEHs6hr*M zk=RRI9~o<4bVKi)p{NJG-2d)h-bLajrpS>Hudc3sUb@{gI|BwIpkBb&9N=ix^J!Tj>_Wk?!fBNaCAAkHYI()a={go}D^@0@BrcJy1 z?z?BrnuU&w7+RNV2x+8%mJ$l7=qDTwwX~>VG0=Qg^18LKBoFlAA&txH>SJG}wTPV3 zjknmkOU}5iz4(}rQ|ZCzIpS`K^|Od(LXiFdMBB+UuI8eb=EhrTF^5%bzCsd>VpP^- zWz8nqXf)(I4e2R{>}(|ISfhbKMj&zWe0|>f{{H@#Uw--d=bzUzC=p0S&71%2x%Yl6 z+mX%ac?cKOY=eHdm|`Ot&8iZ~Y{rGz_V4@h-M?%*9;ev!WbJ?Zw|^@xE*=f`t_?d$jSyV2QGhLv1FM~AH9M<0Fk zr$7Cv!{NAYiVZ{?@bypVs;UHV-X)q_LuWhCK=+?$5}QuR?*4GU8{4qB<~M`?Bdcg! zp%K#8+k+;3zu&J{c#nC%qUJB7>a#7aAVbG&HYX?B(5TDF!Fk<+z{M)7k@`zK4oo3- z6N8(zr%v?$`pOMMiQ_bV@ShJN+wF}N1mK0}#uM+r5JRT3y zZD@f+@+H3HCXyqi6U)X=9A8p2){*B#OQy+W)JRwVxL{|z10{;$fXj8d`ONM;d%pO5 zcYLvR-N*LSQ%^nq_~RqKF?t>!n4)xdcON@;42d@MuU;&)udmNd+CJ(-7##vy9WydA z^vX525=u%+Qd3i}eAy#!t^|X4s&RWoms<<^#rCt3$14qlBv-#GDO!m1f5TG&X$h;! zv`Sjk4MsskKAoXCRd=G%3LS0uNgiRTxTi%Oq_Up;L`uZPJ&wD(=-;U>1UZ&fv`Ci> znh`k0U==dcIh=NCH5BIYNd_(@1;@Y{40`3(YyRytH8uVE*S~)8#TVnlBJa5Kj;e2e zdtBK#lhLR~Tbf=_y6J)XQN>1)&1URl4vU8l9^U%rEkk1Sr%ajh!V53le*5jC$J39l zPo!M`@P|Ld#Osx4CQ?)d9oN#OOBXCyfQI&UJ_-q>KT%khTBmX?;-mZ&cK?z!il#~yp^?z`_sif7awJ{o4|K-$~e&z(Eh z)6;{_06M5(Fo+}_TJ4ZfKnLP*IB;bUha)d952?><>xNO0Rz`nBD1>Z9+2<2`-D)r> zcC?E<{c1>3{Q*S`s$!VN)x{JX6rq>$$5q_4_?0=T;mB`EcM2+6A!9I7HquRaaFaU{ zLPs&tQrz0$yOBzLbfhL4sqTiOFU*Y9%2@@@ZZkR@LPiEH7 z|Mi2W#-@11hUVm7{Nfjj7cU;EI)WE*I==MMORv558Zs*M-UF8<*I1TC*DV@}|L_n0 zFlo}H5s6O#(FR=WSzDIHp5Aa*Pv~r0=u|Vq@qyEAv@9y#fE*f}8F8418fNq^Qqlgq zk&%J>qu?hXnHCQD0-+F^8qflUTMS}ws)3o5LPcu;DgQ{3WKY~_5O)qj5)jEjQgfTd zlc-F`#|`P#tkHCtX63W849;B3_;H-oVk*p6Wr;BwnP}Zq0J!1>5-kZIe)!>=Z@#&A z@7{RrrF)x@a7oKZb2@X!6c_NE0UI`AXrSNSdge^ex$eHc{`kE`Jy{sZwTB;mc-pjS zH&BEkIuCxoKM)8=dIxk825K}K(c$ygYm})Z22KryCHH`Wrjf35@_<|F?G;@?E#z1H z0S&L*tg3}baUV@lFBCFQdJso9KlKe$hA}absC`NI&PBCOq-?kr$;XTY^6E7pBhEP- zOQ(O9LNP4O8_-nA74>|3T!%}7tDIlNmM$)(hbvT1QXO(JlS!L88hnWj@8fB5m|pMO5k=ZY5+ zNU^P4x$^0!pU%q48l7_~GOM<1*-~3ud*Z~2P$+bf)}OI4i$FHUcfRwTg$ozncH3=e z^%u;a1}yLkMO1G zP;;~7a`_ui_)m3cp|CvAgXcbE;>x7xrKT5HBcUYJ@I8n~yhyZ&xg2q~MZIt5Rcy#O zrd2;~6r{15in9tB+`WLzsftAD^=~=c=@~oEEOy>1n8%N&lPt;Oi}FDSN1CaIY(Ps#OX2Rks&STZ*L6su+uZCAECnXcbvmiu9rwwTCtrH$r9b@P58d6}Lj(ZNae4XqQ)k>d zX;MXYUbZF4Di{P7cMZ@a8Fx2#y9UmjI#ai^?r8myA!WVMTw797^6azEKKkgR*P$`M zwbAipH=o2LG$YFjof)KM(P1KE2@SxEjEspBCyphgrlunGHX05JL>q8Llb$T&;z=%- z@8~gkV8D0exa{-F9=9r~*qg49hBGRzTM!jrDmBbwrf-8{l{VNSn~vWpjlF_&WTz=& z=rOnnj*N=}DYzCX?lh%Oe0V}sNts-hHgK$wH5L@Al42fHXe`R(vop+9?H?c0ae2EX4w+^?ov_IA4+EfrIzPDP4s^5n^Rd3h|jfxp(N zOi|RZDD}HENx}iRfpDM82j<)%jB+w_zv z24|YH*fWZQ`P9Uzk6~C6%TLlGaGWkjsk*<4!=Ht#y9#T3FON0|oYjh(F=wer~wofiBTI?zrQpKmF;w_ugx>*>2oRLLZf}7Otc4F9gvB zT*d^a1cR#IkFI6k@n*^G@;96ik*y|%WFM|HttpJE2&9cRGE9}hOsk=;HFSfEX|>@d zqNWYKqnE%%^DEJUELMf2l2zm>k^Fm_;&Ej)V}3qoH5;56=J6BIgQhVBye(2$4ZcKR z1o3!qlicISk2f_nojP@@rKJVk)tg`OJfD)1lAWDBX3UuU{QT0=QgkCHCr5xPGuLf? z(-YOhVI?do!9b{^R}F>3?PnFQU-o+Cevc|kl!W)VNtqT}kH^=mNUG6>PE532o{ANMRlhKh)8wDXF0|_{W=b4L!KZ>G=tccB z*toPT+m!LF(QGOy;mk(XX5&atbOx3^V3dJ`8j@?Bot;R=g~MT7-Ja835I01hgKw25^25jsiNw^x{-N_^g_Z}2s9t* zDog8qJF$Et^B%{Lsv@dhkyn#QQUa@y;=b`QBnc_4kvUZ%*#Iorjb(79aZ=@#ViekF zU<95v2)sR+NwOMJQ+S(=O}2AscHENTd@~`s6pI@-`g;y-=@jnQChml_D5>5Q~5K|dlX zP{dHfuOc#fRnoZ!nS?6wtC51YkwDvc#ipuyRc^dTpy8%cv`Y3vN!bpCbXp;@Ptg+6 z(UE0pu`(v!G=73D2r_O;%-}PsL@7kol@b_B2)EJfjpUu`dfl-2EEKJs>67cv93&FCxy7zV^CBny@Xv z&|#9u#p-Rfkk!hdNmY%s{UqJn_2+907J@uBk2#(*FqAn7CoZI5-Nu?te0myhPr(&^ z6T{$;bUS(S{QH|8Od<N9zTU_O233%T(a&nlj&G9sCbWB z!j%=R<$--=3OyLLMh!J0H9Y&^9Z*Wb6>!PcC&{kjb-x{M465gWBEyx#O#m4KFQlaz zoVh8L(-@1z;LKtT2G(rWd-H*{2LQm=g`UO`3L&#LeD0j$4Jv+5@bp>L9|{i)P?Ah* zk|vYhPO41yAJ9z5#u{P8QWG?q?2R%U@yRI~YoH?ArYw?Z5$hDGG)BPXH3l2OkR4LI z4>4HLH@1l5dcnk>N0Tj8q6k&oL6u=?qrmb;V}34nxmg5LK>-qTTng^{qI=AU@vORB zt`9!=0I9czhKBC$Zge+R5kq$dCle-4oH%FBoVj!7=H=y$hF)qQ+HOc1H!qvJax1#A z=Iukz%*cSR_EM)HHBxpqe6Cye`uztRLak@T9%M%bXquG+UL>N(Jb?^DmeS-z!9@)f zZPBtFu{_WVswlG2Nuu8*azn+RqYl0ri!(G~=`kX>z!T3J1U@s3Gn*_^rkDzxrZELf zk{SPHFlzt+aQ#73rz~rdq&$h#V)g zWCrIeuzF-1PC>=4HkQnHioTVq;Tj^bjx0#M$z)g5pf@>HBZ>K1v}U+WGE#>w>NFL? zb<2_BQjk6{5X?BL^vE3UzthTnc`uh5&rlzj0F1PIQHWcTD;u=V3Vz4Hus>G+KF}%TCGA{X+3NFRMWoDvZLAwF~07k`(s{cn- zDG9f>kOKjwt1H~yBlUY^w@*_fErbK$C`F4@HABx-MP0*@Tm+=pIDGku}<=?`F_ih=iCJqw9KzRQBa@E-IdoS&E1`h6<4;%o@#* zep$SLt5@*d0h-Iq%GZq!LMwQoUX! z6jp+vK=UctprNCVpm$2{m$qi%Kyp)F?XU{HJ4m4fGdj zkqrX$jxtUHRb_^f^t#&Uv-Bp}8ctEb69mJNw_*f7*@E8Mkey>1Hx}8fmMIm2Jy}Rk zr;SGXk}DDc004aLo{va@T)i_DXE2%Y5>!xtD~U*w($|MHoY>PN_qgO>Nb2pyeY65$ zEsV<*;Yc{_36u3s12pdJqA+BeLZd{a$uu0Ft1((o#r^2f^k~%ZE+`2&!@otJtuVM7 zGe`acMI%kMa9A7OW~E8%KhjVYzgAXBs2sAN$rcBthG|-qDOwD8TzDgeZuS_H7+x@@ zr7|hWhRifRGmYjALW+&%c^X`6Alj}Wy(b!Dx5uU@!}l65wv=#K6GbHul+N{_A?$Bz zMJg@a-Ys@_;PR3<^k2cD5O|LiSJoIZA;ppjG<|P$*am2PRzX6?JuTYjT_e?QkzAuG zl4nX%pRl2cCM*MfYc!K^EHWTD6VK=5ajB`+$>Y^Pz)(Ean3cg84D87D3;_TDxDqkP zVi<>m*ECa6kt&L4rVV%XC_ca98wjESqyB`TKRgq~afQx;Qs9{p5mnEB?A&nBy zT~#j~g0~<SnUnqZ^_gV~wIrKK6OGg*rn@1iCrGvI^+(ROus>p!WB-gYjy zYb<=Pcw~k`ve&Qpy}px8vTH!~OX03gEhvS%yU}E!iXq)GM*9Eam%ik*FIhy&MiL{E?0>2vLowJbAE{9(lP(CXh9)+Fr3{S8k;kQ^ zCY6_(CyZq{PDoAFRF$<@K&b%$a05#>I?}9DE$aEFIK5OOIjwX;HMpVmGLf*;3uTgNAL&T+f3>rN>gLhg z2b)`kWD{pk7jm+Mv{YnTGf7D-&qIkN5N(%^{r1HVP^)n2C{G)<3JQ#~Hp z?FqD;@i!b7`+CKmekJ6`5{XpY!2uKc_{9D-j#z0-ENU&*tUaRDbSGS70L$?biWGmO zW5H^~wMLr3sMxzslk9c!Dq5vTS9p>LiaYc%ii)Fb4T6cI1i|RcV=YGeU9%0jP9e>% zPh_Jww?GbggAzsYCaV!bJAlz^z9MbzV%z*{#LOaF4@tk;AmW{ zh_nzeWM%1z{EEvZ2ZQ3dbMk;s_4~v=x9ks4L8Rn-nxZm#H6$#&SQSmE3`?tFk~C_- z*{5ilRmm0#gSSUXU<;b?rIh=Y^L8`5v zX*fy?2G(RY7w7SgTpR7Wryg)QP zu^i_U=w-V#+>(z-MsyFysBy6*1`Q{H65EbpG=@XUk+)dUs24Kr#{4ltZcfUrlaYzW zSx5VK_M2rd?_52v z7|zfQha!rK+pYNhlFKEY>y-vvirb}zWjPR}WKmBY)6+ur+HY8&u@+pZmzGJtESh2s zbY$OC?@TWepB&k8#nW`?;_B@pa#KrKjAYhmvN0$7D$H;BvyK1rku{sq ztwrl<)-9@l%i!h|ZQlBgrSsNc&9>^jx0X-6X~%Fltaoacu~W?_4Y$5fbTnpSDlIDMbPXq8Xj4+pDy6WyTt)+w!L157O_9j2 z^pa|n-lPRj9;~hfd4@M2&Bt0yjM>ZzCezpg)@VwaINp$(Bc!L@2pgcG9qa#oadqwa zepUYB&Uf!ChF(L!sG#+;jSC-H(|*Cplng+iqABU6zrRj_h+K5J1y@xT8yP zk-Zd&(Sm*&=aNN2jrEdj6k{MpIE@>dMoNBgWJ^^dsi}je`<47TiRz6^`zk3T%u+_d zkdb1WIm3{h&0bLx()}BsoWCYEZw##_4-CkCebRsr*Kc&Yf-UW` z+avX~X)>*bLb|SEaFi-bMORO?3_jjJBj7BsC3)$JGyj;oa z7dyMvKtSv~r-)(I=amAYs>qbcXqreXL6szyYI#@U~;P>zv~8`41nJJpE!qZ&swFam`WS`P%2W414}+t5wW(zm3}nzU?jH)*;Hf$6j$!XKQzufXNVzZG;(GW zpOwwpt){%}q>>UfEE;m1tl7-oFj_5U@cn&Eu`OHw-g675>h|9E7k=xp>5ECO^5&O6 zTDf+f1FltI1gTF@Y|d4$|KZs=WszyUICD<<^4bP`v*}bXx(}!8hSzTl!;;qTyxneg zI#gK_U2f8n!7sY{Nfv648t|xrpzISVRlyZ~H5S|6WR1{Ni6%MwBmqrDN-o+O^+Fk- z36GN;RgN0EY@nrt(TG{ku$(4qVt1eDcH_bT>FJjq-!|0tKv(m!`Ct`;XdCT94M`wX zmc#As!S-`vTYIqOG#Y`j%P0E-*rSG%!BrX!JhH{9;kI-tgZr5ft)}N(lBl(~=rnGy zofLI}-A^=l(R0wJ&@o;8_pVaOXWAzW_V7Bl!3y|{bzeffg}#&OF`Csjw}+!rUhC=hMH z2-34-N!&VDzG~C*Ic0Ib?mp>?+^U*c1ZV4JgGCC?V9d@;F!e(rB^*`*fne)d)$b3V z>r#Tabb#s$&}tZ|IAV>fM8h!(n$_triIdUvq9H`X#m(3_qDIl<;YjA0zK+DL9fNv~ zA;m&u-0VS7r1nlt(S(dk>?awj`PJi3y-+vg(MRvS1-@huZKF}B;gAJVcTwu=!(9r{ zzsFk?pGR`Jm0(Dd(HIbM>pD&MqS1=pK8og%e!?B)G(nGLz&oO}zCB9m83#nRDY1Re zc=L!9<6&vN3^y*)fdraF>o%DdDFQ<33khVq6%9$1Y^-X?(8FEZk(I`ChBPakoNAkP z3ujL;IuQwjv-zHT+3(6WTf zs;j!>63Ak}>UErOw|laB=s_}c)ZnKgDW#k?xNb!rObl@|YLu*^Pw@KLB>yE^9B#$rH(jxbFtHF>GQdC*Ok^a~RMyo2z z;CND25BO(jA<`s@ge>4<*;EKiD(rZRhN)3BHLR;U-ulFYP{m^tTU?KZj}iW`7R zG2=<4B0e$=X*(>#6pb^mMv|SLoyMo6n@Wm|jvPKS4b2X?WjnIjZjwyzVCR|03{w8+ z%%P@Y=wxlwAiS+49WG;F1Ti|xmsL79)U{VGs{Z$1J`tZ7(-;>XRKD#0&Vww3Z<>H( zu}#j{Y^=qCCUJu!M-xS_+O)mnBwHx*$Fp)ll3Hv0f z7MImVf}^!)*FsJ2WQb$n7>Z#Tqk$HLul_5&jcXUq-Ov!Zw`6_I%3B&H&R$9GO>}0$ zMGK;B6rk5s3!XlMZh8+L6WiOR0e|@1Sxrs@{r(W=XJ` zN}@|SJ){iTH|KS2>HDpEcpT|Nr{L1q==GX{yRs{Ib5$j^7KsC#A${s(hQWi43|5YO zGH1xhU@T_N#B!NAd~%9qQWS1(FZEWK;9^bwh@QKt96A=pBnh$3v}HFPPED) zKP}6eg1eJokDA_jgqDz2!o@ond_%8gOXFw*y`qL3l}f6v?P94sdZPk;%N0vHoISwM z*sq3$no811Rot0CWAPiRWE@6ns$ms}Gfq{3QWOeVX#y=|JGfLEpPFGFTOim|S-Xu- zNv4fPKFNGjmru0*@Rj#G>;7|h-?X27CsDMy_WVmMgvhz#-ZGd}fYE?lzwNgxe^K3V z{$2YG|7UgP)60H1)d835Hyzw^isXc`7K?#|lB9(~lGm^Je4=YW?&((i0m&Vp zL`jvxM8UBPt{;LHAVrIo_l)`2C_SfvVTp%9=4=+$o+9MrT)a>~$7dU-Ke8q|moBNP zU0Xpm@VlaI#GMteISQg}q>)^%ft|a&4JX2#=j4H2RUx4S*b638IIWYxb*>rWc1DT` z$E&H>aAElPZX+rs$2v;IdPxnoY1c^VD9$H9qAiT&8TR0@nj({+H{Cp9G*u#kPofxJ zAITb};BIy_&sYUxZmw}`zL1t_bY}6Xc8cY&R^$0AtGja}VsuP>Zrv-xEyHbVe-d-E zRc~4fIS9aLz+1m*-qPxeJYnmmHRxy2y7&Hl(Nvi6fq3w&j(#i_K0RF{1>ull(*l0k z;}LsZvU@=6ajD_3>UH6U4M;FBS|n?MA-zl^9dZ~o6lQpaPq$mAP8PD#1)J@{n=ta8 zSAY6o)cSQkQ2qXfCt^`3yuqU1C@3w2YZXM>h=DHm(3!Kr*3;cvKfq>rR z1VjbPGESoO{ZQ0t;sg_$Rg!EKnLB5cZq9K)LG~&RBn1}qE zP4l+3OE*X3x|hBFLF%ZjZ?0RpIT|pWy=7D!P1pAe zAxLodAi>?;Ap`;;KyXiRcXxN!;BJGvLx2Fm-QC>=*LgeF_1yRQ@UCZ_bxwbonVRmN z>FVmLUAy-F|LWa#Jw0waXB_~3(HPp=fY`LROl`6yR&8C>1G!3K!I~}=<+H{zVH4vVJa*H~<{W*b+42rZsVTPBLv6~sju6Wj z%*m=A-r`)Bg*&q+1y6%%LeHbmF-UI-vJ+gIZzeQ5inm@v(am8}nB^_Z1RI0+X__)9 zPBO`WF3RYqG=}&Jx4A6>!OuUP#o{P*3%ND)z?e1cuyID!oL?Po0V;KGqfcHb%sXBC zoJH&QCNAjXQH>x?wYVyEdYW~r0{u=wIwDv-A_(Vg_;!xb(}a^9q<>MCNAfJO%GKnC zn3v`kExFGo%X*_{S&i(M(Xn&|wweVDIcz58bT*sGn5K%%HphV1U%^Lr-rV~H)!e>S z$~Mg`pv94&oOAJkUY7b@y||$ z+Fo7am#eOCE(lU1#d5IUrPSa`G$#jxCYRLcyF%T2gG5Y8qR6#>N?_4N&1*H5neQA& zmee1hge$A{UczC=@TkFN;Uf2!6OUzC(ht?Ce)(vCnIdXPpkRjgVWu4r{3v9jSsv3V z%iW={g{kp*>Afl&?C*3KJkznb+B|}-{PiR{htCxGLP2kbxY0SqD67{R$HG%JlHI{) zUktv6vBjy=ou zrWb{m&puPlHc_?FvG%l#Xs$v}s19?K!c0jVHH3Yp%@ni)wZzL-VWTsm*$OydWqlSqKd2&wkyT}b9NwpKvkk3Do2(ga-I7{P|HE9!p#e|B^1*H zIqB1-Sel#;HY-bcj=O%ppP$!s@cB}c#IpP#Ov}9i*PB5i=Menp|0^l)+;xf?OH#3> zV|-YfuV7>2w6(9!ME5>bz4}niVs-E6A^Y3F9Wy-I?a&cz`YtU|)O;(*H2il- zIOq?uyji*E5=qXmuA&*vJ~3HRp`>RwA(IkefCKDxyjhL1f(nakndEZ4Mf0qmu2IzQ zpriDx)>jF6{RHHCv5mU-pSNY2GZlC1JUN_j2Zuv)3LJp-5U_{^S( zFu}9HvW7Dvs$HG2q}}^38z<@%I9nfUv3yj@8ooNUg@&P^<{47$YB9E8G`rSE=3+7A z_29`iC2C-$=19@!iDvkfIxFo_Be-_6uY#jS{}IFxST?T@zr0}-hMoQi5f23VW6oQH zEu_&Wj)r%Z^VvZ0+H)!w?;RJai@6Ce4kUcb5|^24l;5iMyF7OcsT9&13-%ggjvXv* z<_dwiac$zyLk_~#mCn6+_d$xNZaOczgNaAg0qZ3A82nk;yy+jy`1IDA?%trxwri;} zub}Hdmu0nLt>FAZ*!p?%E%D4hQ4y_4Ui?_C^hsUowZdGxawOURnO~l3Gv@ z3<$G7s=$_?W^LxTKI%K(q)BCr`D=yG6*_X1ZTYQ#l0UoC-L}6N3JR5M$ z1t}+%I!J!B`>kwQne-LN$&3hX=F7~kq=t^8QPfUfGzIjc0x3f-8yw9W=3qu zRvR$sYW2B9LaAvx&F*A%*cw6-avP}p8$65fz1-DV#i%0dheDfqp22eX5sh)O5%^n9 zMN6*r@;T3Z-#MGm#hSB%v+$@!G~mqhXctP_dn-I^PDeDH8vlh# zQe2ZTC5^uX!)B=S+x+a3#j`<%z5{>e=_y{+I`@U`m@meUe(=0*u|D%=E1v3X=AGFX zNX6%|YPYXC3N6xo6u07D@y^`pDl(|gRz|cwD#Mxsznr5el_uF-pLOLJcX@268~Q|R zJ1UXd0=d^7=v>V7gUV4Pk#l@BlD}!d$X>#AXX(@0ejrFu))Yr-Cl?VZWsTW`O$$i$ zw>bO7THL=X5nj;__5*?ZH#uDpV7~ws~c4otv6mT1xGdhBq>xDV%D?G+u|| z&d(mM_ITFaO|GiBRmb3ypMhm(mJAg*SSLRs=&YuXHr$yYo>xaNi0W@a6eIIBf*>myPQGAKs@L_}DI@kwIw<154%_4r{vo)A(HP{Y6 zTF*4AhTNadXQ#$N)4ct-Tq24g$%K#T;cnD4uxzVL@+;H*bB|vEY=>!Qp&YK#q59QN z&pAVMV$_wbUzWyk3IWnwP=7ZdLj)Tn{wO2ag^>1R#uh&%mHNHg4G?Mdck?v`g1r8D z$GYVAMdF`#Q0P|wzCwj^|1SklABq0`=0AJ+<==1qv&a8cz{jZZ2W7o0=h3yjShn*usk7`j8`4al z!lvS0hRf1uWD0GUe@?GWU0-B2ucUM8=5#8rYGqzr0vHvL!xp}IaSrElA6Iv$)s2^% zHZ9z}7;YWPbM>dyJ|eEtY&2Th2FVcQ&#=z5%bn7xcCcYpc=CdeOM+*?&wX)W?=Z5;64 z<#!o4I*j0<65P?YGd*`8U?ux|qVM(gnFdS9moB>ZeamZQKC)}9JAT(Ylg;}U)l@4L zLKE!%K9R*`J_iz~nIr_k|J1gxsQ?Qz5X-&ZtI6BJzUepgZ6Bq2+$8@VrwrMp(BSq+kV@A@W+~By`Q5j5Jq>pw2{$}fvdzT_ znJXE0Z)BQHJN%&h=gx&TA~~e$vK<$kGk;!DcHA?J&hobmQo>^Yu+(MRoKrSxyz%L_ zq@&mzo=0l9IMQ!a@t?ycol!Q!=g(F;y!&9jGU{g}$$}vDj{Qa*VtHuHOU7Zw2l$TZr+zqK|2_Is7iw!3DYu~iX{~Gk!4;lx6ZDJr*>U@*!0Wz2 zL{npax{3{nyP0bLy!VDd#B|l7hu5s)FnQH5(H3w1pgEUrPh8NF{0u5+_!|x7e=gm% zRlbS(D2;P^x5IBm)2Eq(EENDgBSoC1v`eXX8Qrw+*1$nE#0Wyfj$5DfrPh?XwqJB; z=mG$dbQ|%$9sPlZO98Lr=o-8PIfN>_LB_JxA)Q&pw#JvE?3B)GF86tjhJz4*sZyh1 zgg2~{^u{Y7?R3m;vdl1eKq99z%u}u(rDQcnXAlDa$fwQOYZVqY0^@4qh40Z3TZbw zAe{TctcgWaN1{`IA7>*sy3hPn5^}3kSaQ2GI(tz3?5A@4y1N*Tl#zM+5>Qn`Mbpdr zw}yQu$DN|gwo3!+rR3FH%TwT2S1(;Gco@B&7W$sPyERpG`jqJRegs2ld(5FJTB=XX zSZNBnY$Y7KXzNEXwG?~53>nD_dmisd>4wf5m64?KIM|nNZ_awSGk3lNR!xxPN3&BQ z7fUb95BAZTl^Pv6t!K|ROVthTYdhy>2fXJ}9(O1BEAN?X|EI%4w+hqD&8_5q^`1>^ zA9fc?$>6)rjVKkK-!pPZu{OsCn?B?nWojj(->F?K!I!aIZ!I156{6Xk+{^UM)oj-c zUV(UQDk>~QARI^BFFW%BEQc3I+#}id3%03Fx%tWIkms2qa?+zOjEl?FuH9Gre1Q{( zyrZ9zk_~(QsS%*_3M%R8pjI^EkHTB#)gyTf4_Z z#I2_cR&cT?s#>wXw4CnsX^$;qh{ooiYWteSH*P~;MjwLE)F=Ns=VT_;;c+z_hNjlx zW@>Y~HrF&S$a=5-6x@)W9^!@4aVf)0?EC5R@BM(vV~YD7oU%)mvPd56~2)?SMr&Lv#b^OWZ zJcMUpV0qRuahnZ4!fRs86od633US*~ZErcRP+Q}_zD*01A_76yv$AA)kLDn2u^S(? z!QigZo)-9(NK)bV5E`ph@MNr)?)hSHvs!Wro*2nLeFxB?;Wr{5@479u5@LEFC#D#q z`UET`IoM=(_&;!AaD(1}~YW#l(_BmBZK`s;jdGpcqr#a?w{M)JMnDww_^73+GmzpVxU|GS|Ko7mis~mfK?OxZX zz{N0>YUd``uA>qv`b)!GNs+au^S?m+UfT*Ft3`$#d7 z^t#6mit!Qt@uJ+7c7`92`m>5w^|7Lr%O@ubOl7&*9gFp!(|jD{u_KAvvG-3^!fbQb zwSi9!U0(URkiGzj=KCrwpVt{3JS8KPhT?Ws#J?4|0r!1pg)u21W4>syjaV46eOsC^ z#?rLY><`rk z*Pi)3ul8c|aTXWCJ)xH)w_%g|Y+m8#8o5~uPzYTk7{^8!Fc&O%Z*$SKyIX!f-isvB z2>V+MuRdP%TX|?FcIfwKxLp}1WmZwmHxoE)jZdYRbkF`{F9Pv1Fuj-@+sY##Py<)5 zg9wb*JFe*rJXfb#(EPfW_1p~~LclIq&mjBqF}*A}Y`m3AmNet1&+$>zvZl_yya!jZ z&@~t&x%>5_+iWdf$`~Mn{XZ?v4mm8dN#~XbdrjA^g~e?BVrH7?4$XsC>;sC8kwSyv zs7G5&SFLCCC4VO2@yrm2f%hm&>&QFB{OrU}Ypx(?^;&+I(r2_kD^)wcYwsq6osxFmJTfXEv6Ev4_e>2(*5e{pU&?U|NWhi< zql%|hR_ol$^4jxo*4X#hq0+~@{j3EK&#}hQE}t70qOoP@o1i`-(nED36)XFztQcVd zN9r#Giv_$~WD6?wd`=Txy@MbhCAEC@^c|Y7-RJt3BHY z+gx4AN8?ZKYV-QsW3!|NNZYoMn8;`{?6JuH5nkZ;IjbGzI;dJ`ejEhlg*m|EEF1mO z!lKyy>ZrrZP*-`jLse{vDsnUzEWe#yz1MvxUkPZsaG>he8Sjj1)El0}Hre7DVP$8p zJYKT)1&?2z3-hB;{7-G8^z8cByugIXfEpj;9 z;9vVeF5^6-l{9Z%EBk5rzlQNC=z8bYLIoB4^i#q+tex9=U9k{3I8>Z$uSG`doNGR zNN6GS4a%LSgCM;1az4lQo78aih4hllLxg{}aHlCJbId7NBZ7a`Bm* zSfTpnPp05c#nn`uQ&P>^>mHPvt*a&ckI-E||Kc8PUuF0HFw!^1VF9=wdk{4)u9cJS|ae?1ZZzG_S0^Zw8D{Xg^R|7(K% z--7=?PKf^xUWxzyssH#b{#)>0f5CtL_WxeMOn~|oc(~PkL7-YjgW(uatO*^tX=Q(J zo>w*ClKBZA^*(S)8o%QVn6Ps(7$3MA+K|1b+a=;{`g_g|8D95mQyrc6X;KdM_Fx3# zI)YVzh;9yuW1O9RvS;Gs($78o5M2G7gux|@m!KZ^T+lc zD?c#w;-%-vClccm6BCn@jce4e!z8Mdg`8AW9>&DTA3I{rF_+UNr;80h4LI;4 zQJPTiCeWE)9ZnYqbdyQ0SemLzcF{93j*O23Af7FzrWJPM5&ZPgeyr~uq>^Q&XG6b` zs5+U#_4V{fP-}Ad}h|0^OxlfQGNT-iA zEDbNZS1wJ7@2JH*F+b;BbUgYlF+EsRN76(&Mg2+13OBdDpu|#K%vh5@-m!SR{#3yB zdggHMj9G2nR}UlL$LBZ|O9lkNY{MGfjOdXOM$WP?ncNkC02CmyCC6yG*P%Rg zh>w~~xJZxOVy)0&Y7wB)JbDzfzFpc(#A%=+4d#pTpks2E52mKw7dDPBceP{;wX_+t#+W^t7~CVn}t- z-murxb9c_7Wg5HNl#YuWR<9p`O00Kr%;H;KU7IB8c|~d0WL+>4=Wz7*-F731+Fb@P zZf)yNYk-JaYC;0c6v{-!8<`}o7J0;s-BjNJtc3@+7p-$kpDtsyuHoKlOI_8aRR@4e z$WK0MEniFN1T2s_w|EMlZ}!p%w0g)6?A_hDFSoi+9&OlpJVPrgV-wiSTM&CeLk~Ntg%LOKqS#Q|si4ePGKvUw}s>D9Q%I*`|Kw%Qg$%oh)&l&7SmBqkP| z_mMg1bx}{|SvM^M2{QYR`~X3-SS~#n`4RAXilI*+LU*QCnUSBLo=S?J0wOu3fRK$| z2<2xycktHv`qh<>duzF2MqZ7yavh1;^r%eD|x@siFN6sl;;L5Q)T z;ffCgz`9??(8#43vf^)OHKVSx*G2#|8}OXgQ`a+ic#9(!wj-*5+nSS z5AT-z>DW+84RWYtMWeMu6qCuf=Gk~^>EaVJKqCvHq~m={*NtTIRi^c3PK#9Q8d7sd z0;Q@l|9HRnl(Ag2BG7Ty!-|ZI%t6~hD+!Bnk_TrH#-^UvKVy=|wp(bvMVik-?R;X2 zuKf0GsYD0?T<~GX_=$&q-N5Edk^IAk0%w6C{;xeztc|&KzTvMmhbbO&K zfg{rT1=9TeHe_(jw+shC0$P4U-KlrD%5t&!p^m%_tG6Me{5KbmuH6k-((Pd}P7wnt zTmcFMLdPuxMMk$K`szosK6v35&{?OHl@)iDS>$y28NRPOT|b2n7C!JzvbOZfq~9mKfiiV=OA=mVBGc(uvcwDg?G^F zj=<5r*u8Z9^y!nj28td&`u96ujD>mYmOk@3zTgl5dJJU#pc3<59F$OD$LHxIW;})vuAl#I*n3neoSO8aQc-;cb?2$f_BL~ zQ^4mH7zJv-Z;H3)Y!V;A5>yV${K{=T_B%Q}uy4N{y9Ja;x+)9dZQ|9nX1L05yf(jEr{uUY?GR zjtTaRlenILM%K@y=;?}>+*$^7f1$UaSAgvk=Dm;5d)W$zN>5wzsNNq~*ywVjh+JjU z|4VrVz#Oc>5uu?7>(7v3(2squ`-@FHJoYS2i+CyfhJ_TqDQK61C=XqT=xkLpLm#+u+}nkpLhG7}n>s3vExoo&r{!)& z-)9Q(>XYP}wdYXD$;owGjR^qan9)FPGOP7dvEDuY+{}#N(@7oCy4wIByT7SiT{Er6 zS%w)0OIlh|9R25C=Qr~_OJU5si0s)wda;>Lw9GanFB z*jP+i6SBQPjy^z!yR7ZQ^SX+**dJqv36K1M;}Z0PO9ujDw@|c52DiD;*wYV-$%jrR z^8tV{sUZ?NwZMl2k7bxWUQELftuM|AYy^rn>3u)iS*cpL+m~xv!5~UUhqHn_4{u*8 ztEikVwOs9lVO20OWpbhzG^&57P@MwdUL=fRRE?kB4nk2=k z7=_5T0Q*tP5=#kd`|64#LKe)Ds-r9HCG*Wbe$a4(3jq{YKxQnFDk({il31EMTY-3a ztFY1T6o{>H+xjV!%Y=}}r`=|F?!_tUJ^skC4IvRx8$i3U@jBMRqW*%wav;Li9b9uS zaNd4(O$t%h(~=eXK+ibRY;ej2ke5EYe@grKQC<0nFwBMWx6Q{a$wY#;dt8g%eaBHg zyh+6bX? zNnXF^EAQLV(%Z5<_eN8AJWp=!S;6wMGR;r7NliXhPBNO9-Z_jE??G|z!{mZwZjq7R zsDytt<#;0sqL(JSmrg2pR>AzH?-P@Q5snT6wd3q2{8A2XlJD@$sr~d_03BmKKAE@+ zNV6q%JrLNJ!i6xrU3z?aa`ApVT(;?O`o7-j=LfB&O^n(Mn9DNZG<&K}5BoLbs% zH_4?SzZBH64Ho!nJr7riDm!`%xf$qzq-9((BwSj_cdTzj-wil#_SgG#2W@KF*qjfu zbhQJPCtz+%Dt2D{Sm@-)iA_koJ>iHMO;>?_7v$#(k09+BG@e6C&kRHs6&BZ2bQBeB zE(}hq6l*PMdAuno4;D|tk*LC9P<;l(a2OdFI0&OQckkg@+P?sn-gy_~6@Y#zC@J+C z+B?;$YbQF*CPlDlvAf9FWiFl%e;&L8`EIv+-Dg6)>wND=76 z(H=Bk^51(f$O~RQ_s0mAQ+j+1yxLC&)HNGq@y2U^GKCZ8un|Y^S8Ei{`JXY1cJ?;< zFW`a=hzA(1k>GYixyWJy4eR3PXo8-hKL2iwz3!w%Z}2-xTM`kh+sup-XwQNgUm))` zj%q%fTPE>5$OV!>FRfKN>2oSNI$kmXNuT3U9(fftsZXDhlTyZ01zd)9^8BC6@A32d z0%2OAq9<`+A*ZB-_}0ei=Ky+nw*t^mxP6^hrG+W zg2{lWsH%iS5isru-7XjaGCQaqK|VW(Z{Gm4_2c=f^-eDjQz2}b?g+fRG za7)i+*lAvu#G($?kcACG-_seb7|!Y{L1(kOJ5;*zfU zbnzf3FW0`GuD0$zokU0X&fM3MO>(2*>o-@EN$5rl(V~jMB{!2l;fAwhDEAk=ez#hP zb7Tev-|Ko6@E1ey&o?K$X80bL($jq|+q#@xkikPx;(4^p8jUA4*{_bkgRo852A zzIJAjJjEK!>^jkX%^qNQQt9&z5DuV?J&Eepr%dHO=~J4Xb^v6ehKA^kM`#%tf9C>- z*O&DU;ahmXR`UV$0RZ`Uq9ub+6c@)tBYoYkV}X%oeOS1oZM0Qn0`&AtWMau-elup% zs5RD2p449sDP@fLEDF%3~*F18-9}O(@4)#X>{JEcu z@pinKRSQWyfmG;7QczH6HCgu|xg1Q8zuaT3DkqqY^(l4QJ#h^uk2LkEf3{c3?SLhl z(Phtf5-XBV~*=7Um( zeG@k$3N2<5n)Q{{xKkn4BG5D$$76+sUo*6lI&T~vj@EtUEIR%gLOdZOR730ggWKEz3WCW39c;ZuZJ>$q5ck1h_R@?WoY$}yCL&;NEk$@v9Eya8vu9h z5^_3HrX9`gt6PG;K$UJ}`7BvjRJoADZGrq^wIKg6oegn7eu**P{CY{_2&wlbd;e~9fZ7VT9=Lkmf*%*+_N z@B&s>kk?22`WGAKkk!}zU=*K+VLi>Xw5=_y^LB$#p0jo~roK0Z@NnN9Cpa;Vd-g?W zcqn)Tgm`EuL_{o>X12_fXjBqYl)o_0WoC%vvQlu*nMZL(Eb!3!f5EIWj3>}P%R)S6 z2-j~~J|4@e;B!KJVoF%d`1#Y6JH6NB6mr;ek8F^Sr|Y`;R|}^&+k5B}PR+1sVo?h2 z>qVQ(>Qj`K@puMqHa!Tao;#OF$s&9Og?yaQbdNCdL3r)`>zr<0gl45{HDTuwHTD8rKPRy?TCm76gUZ2Sjc5izw4ce zyx`?ySrsU8C^J4DeBdMK32Ei3QN_<$b@yGAD%q9iJDF18>fZM6{LV;6@&!~{ZUk+= zj^v76I@qlGUh>QV0xe`Ngnf|{3z6t9To7AeXp zh`y@}1-Ax;c8%eLQ{RlZpy%Ic^Z@yx`jsCQq0PfRU90s$N@aGhsK_+ksy~uo+YtfW zg;md&IcAdW1_v>-w2ls|`Fp$8osW|)FX0q#6`kMmAfh8+`sM{fX!L)5HU9nSXN^lL zD|wTn%w?usvi02jOismKQK0Rc{ZR=~b00&WZPo^60)^NuBFC4xTLV zGJK28o5&zQNOD9l)|AfF5-Y%lc^fw&4a;5lvFSdv*mIfe zX(H(w-ja2#>#3+DrKhK7XOrF{=Hf-GWV!970&`ppQs|eE7CyQ=FN;x_J1?)J9eo5z zNfoF4vSaERKy+)&H$_S%$qOmYn3*8a;DHk%0H3VBnJ^sEK=SbsffgT#fxo8I(l+!m z(2{2w0SxGK5yFjC!dx|Qvp6;?^0Z6pd@c~?qEo+Ef4gUdCS2{T{{wZ4?=kl08>v&o(SC{e zY?{v=VAzjogEV^8gb}w=`Bm@Se+18(DtF+De!-YI!Fox%nTUPKRup8bswu5#Xh`=$ zKB3Um)G`^*%1le+C#e|fLaC<<2RGfVJyq>z_4?rnx8ALI&yMowB>yxF5@eh|UWr_0 zyl5ww!n~U)3Pm3{h+j0UjaP)!5YUA!@}>4kx=jzu?2V_^n7&FP;puWZ$>bu;zGivH z=>1S~LZ}!xv@|v41thX9wTW-fHmMsRmpw!;3pEBYfVkOlRo9t)%XRjEItA`X=IcaL zXXDvfy3z$fPP@~`07n!jXmrBYiFH$vVw2cfLo(Pm^w_Q)Q8jpf2r16Qe070T9=ihn zgOUUA)SKrlld;BTLE+mtL6UL6@ePQP10vtOx?(z`SYu_=t>$Lo4X2UI(17 zv^bB>hS}BBYxu%-DNJ0XPrABQMS#DjJiWE6Xt1*a^> zhNS&4%LQ%e$%b8doLpQCcy$3KX@kA$)A#3ijZLKOkg+Q7o1I*V;tP8kD$Oph^)!$3 z7CHt26g%)o1k(iAnB~>U+2zGqgT|j>{QT?R$$iwLQ;fHy$%7x@HCd_T-~+qiVE42? zO2fy$$$`hTJhtmcdC|p~Qc6HVV*ffbBLx?Gbl}g;aQoJn@;F^GiMU&NbRgK$IpDffVSmA3ytk z8bmj%QGaL0g!|+h9|nu3!`b4h-#NT}c65+(Xb2n61Ab`b=l`mz@}tbJx07{Xt82XG zy`ZZt;LrfX2$8HXM#sK*-oI8s4%+TUvNV_pP_U)R$=LHNF45ITDvd0}<5>i0rx;j# zi@M!5e%CHb-(8BH>ujewCcpXSw}{D>Urzg>N7<>?d1lm(D0+{LHXGo>s&~od7(_H$ zuRa0_WB|DG@XYykWKhKQzH&E3&)=nUs6dcb=xq)5mufYIy1;IyEr!rjT5>EU0z(v4 z3&`}8<%jbx6TbZ7{?wjs%<=iOD~7S`->|TuGfF^L?j4rrKUnn?6nxPRd6`U}hncg- zn+yh`NktwH{;>MBbC=z$*@)PVXY!Ei5q&dC9{MC`Ii(iJ0v)Hh5gU0M0~I>4?~YoM zJ>y{c1(lLAsHcvSGbIla+pb-}#V*8DTGLWdS}3I=eX+7OM@@j7AS1*20c~Glz=;*o z1W2kqu=wbxs08RZ>3fbekv1PTYE^!b`TP+v>EXwoA5%?vV}tX{X+Y-q%e)p#*Ub-i z`{zJ^OR}001=+ni?XDr$dTjIybpH*GPb)c#Ui}_#L^1H|g1N=apy_r3iGE>QkV(sb zuK!s$B%xxRqLxEwvnnK{R4m89$Vlw6e7+8|6dV$g?G7G%pY6%MWsiebBy|02iNL53 zZt|mQFs6ZeXBP8j3pd5jGPHM?8bOi@3V&b-gy8{&K62qsR*|N1OMUxxARv2KcuU_@ zOmWt)vonE4e(MiQR}R_A^mP!Pb1IL+A2W zHpp1j$M-LC6Cj^}|8@0@q!cbncsqxPvonKv%ADkMjYR&?m?K)`9S+-3n8;*O(DySr zZHkB0v#2r7?DgjE4)7X$%@!6a-v_T}PXp~k2%LG&$-}*6GirQ=!m|dfFSts7^T3{E zdMgzP)!`Pn|3{h0`3?UE8UT(On8PlF5RHe3($-7{V1I>XzZFf8iU%K>rDAJTV3d|# zGQEFqWd(EZVd;^srD<>PP&1Frz!tU6g!yUzU5*Z(QBb@x;^Rvso(A;nv#NQ8oV~nv*F_ExLloDlj*bHPmS2XCnH>h%wx} z^gbry=ifiJDIUE1`sZ!|``9!#?*oNK95w>$fr#tpB!qW+hK2VXl^yUF3#vCyo~{wh zy0wNYz<7a@gHq+V``U2~xp$OuY3lyoyiYV=p>7w(L?7<)HtSn%(N32V#U?hPwaNDh zv_O46rUEJaRw|l)`7~{Hg;=wuWi74NIJoLe3JSop4h(5>Uq8P)M)G{^IoR)pClz!& zKp(EzbTHr|s_Jka9QUz@^zAB9eHanjB9W%)&5a!*3^5BOH^q)O$QQ#L&OQ9)o2i(L z7t+ot!`113q`>$dPg_e@kcz;uZc@<6e)FQF?NK=(3(3;PhJ}G)czC!iHliRPAOPU< zx}JC3ttj6?>lG>?cHM294&#o8E0 z|00qg1RLDLl}sr`-i%_0{q;`v%NIv&ZT*|nIY4&In2nW_k)A${^@lhw!&MMorwA|j z8JKz3pVy6FWMWI!cz$}Q@_sSRn=Ss6Umur3^T(AA+cW?b9RZ^d&wodPh%A|Ke<_dMBAhNKju>4v13ZK0=$JIq9U?g|qk&M`dF%%rQ}z$cLM)mcWM;>yTAov3hD^g5Bk-o1x*` zsp1;4uge=8IIM8hv6~^;C%pWYF0t|jpk4}!6kT^SAOzvQ^%Mdg!uaOVn(lITUtQ7h z{%M=9u1LGaQ8!~W_cdIN#61$@b}N3!zoOjCzDQU z%-Ia$Ii^Ev6sQBm%Z);>3E9A+42>tYL{(f|959b*t*!m0rq7Wc*|gRO4wE`(7#UXz z{oe3vq&1K0s0SSrIlt%-2}2uW&J0RoVa)O|4ys@98?>iZwR#rh+q*62B-yqhdg;&x zuctF2yb*?Z0Ted=^=3N*dHHcQ+h1p0%%Y(3l~$*+%AE9MY=`}&G8PTq0a^lB95bWO zly414N=m}f26DZ9F3^u4?}r(vom7%yN-*m~Wzp;9M2`$X!PDq^^p7;0e-N4C%~$nh zymgOGB8m?Rf|iyviKj#2>3Y=;f-oK!s@iLvhH>F4zD-SeKfgSIzeR=ns6)lCO$C_J zWnp=1vBON(F`MCOpz+5+V?#qDI>#_J&o-A;|Hxs{(IlbNR|#$P)-J3Q{9+XNt0uvXHyt*vNh54Oirq;4I;o{l!1m*D4iVi;XCoa$K= zFa|`|o9TDVL=k3mSwnH{J7Zc(9}3e9UQF&!_>nk;38X&Pogt*nd|Z$OWckU7eynL41k4+#C z`!|pqXE`gZ>HQzjoHxrL)V@In>{-koo#wlFsT{Iw=)YsvPj3O9Zec~msXt0t|G5*u zj6&nKB0M;jpfpLgo6nrz*(-o4VAljZjI805hQGPlLlhLr6VwNOeHoFKjirPstW2;K zr@C>JPUYBf!#_+|h`wO_vzDLM7TX}WZAC};alg8*%SZh;%Ue3BiYC%7=$#vt-&3%} zG!yN9h#wQ)X*XJWC(cb_Up&cY@m}8TF?${>U(Bf#O(Jw&7(EL5$Sy5zKEUg=9TaIx>cZj*c-Sc5!}rev$20 z7%u|AT?ArORF#!~_w@zEP&q#Uy5g=%N(o~@t(!|!FO^!ipS@`p+`3=q#FG8+Yd(SMOjIi ze2U@#AcsYThqpr2u>f@CJtCX-O-KGkdFqs%wVRt`<}~4;n_ifTD)?Y&Dz93vaV*Hg z$(ffF+Iv2#H>HN(#E?G+h9uTV%qs%Fh^S+^B`NO%x$<#)Qj>o*TG*79m2H%iGW#GS ziq%gnk&B2jXxf)NBaF_PCA_M+zVPQ~BEB6ESn?I{ym_*Yw}kc&$osgL)W)y&%$5Nj zfO9!xj&A{Rn8krx>E3&m(|3^V7+~ahnid+6Cl(Gc*v-p3k(R|4r!}P>V0?$^57;s} z<=^CBF^EPuZsgD)8-q+*Xs1F7I5<{}Omv~q(NlqS>JJ|+yvTBK6osO~YFf3=5>%Wh zzJ9ABtz9loO2Wa$4uo~@S4%rB#MAqoWA*zmGMZh;_B_oeadVZ!WA;5|c%&SONjaJA*2WNW`4F~Z40=X0VQ>n~g7`f!>N zy_?2lFLH3*?c#PPQMsT*^RuL+rWOr=6DuC(+Och3)fJ1WlZdw>D|jEp{8NSs({1$2 ze%V#SmOlE)uF9!AYZTr!EB*IU5{%CuV)4eiXelV23W%Vb~kD3_J;!VTTOLMEUtHVo<(eH&8)z>3U9S#?W zNA?5g_yuEcH$0yGpeJ)Q=@O~vpEiH*HSzbi>%k-u?bm5FN zRQ=c~J4cC{M(Rk_*~QQ8uDan|3ZS>Dzxu7)NN*NVO z{0dwf{kYJEsnm4Qb8gnqc)ya$D^qk)7#G~o(lfAsG~tRrD5qzE)?OvVXP|3UtTuv&b947!)`s3bnjnoKy8)MWVgq@|E$}C#_-K>$UK&b}*UIZ`K?*VKt5E zy?EQ#(m#()bfWlnsA&Ae!ZCPe{|7li#=h;qs@_IScn*AAHRnPIs@4l9$O48MO6lb6 z%N8%x=}@Diqq}zP3LV~XAzb+W@7%ews;Wv)iOro^wrug7#Ka^;MVcN9$H=;ib&k4v z2kaiNECl(3-0DL3xjHrsv50z31|j#TyQ{OyG3>^s)#LTK=t4C}8?Up)z|7p0Z$-4!q>++dHlDIl)o!ZP$!7z~bSOe2fsa=Aa;v8TDA{qkk=N+uO(i#MhXkv&(G z#ImU+Kl;ucBlgh)M`|I(4lbv2!-fqdlP9lTyY|9V`ReKES-*ZgcKo`_zhdd^OD>sZ zv>1`XQIf8E%!H_ss{HQhmtT1CU4KB{cd#lkKK`0jOCdiOc+tD>f5;Fg zwiNsK@4w@YJ1(3GDMmIp4#rSbPhe!EC*64MveGG&SjW5&T4Sa~Z8}L5I7gg){e22i z(jvdj%gfBp%m9$kk1(1h^F~!Z4na?!(1;jYR2AQP(laKAqb_&ffSuJe@u7}Outiy; z>FJXYl7RsEI9b;HKwgvESj4Buvjrt*F~ThB^;lV!@q%JM5tdX8y-uDyx#zRb*a;|@ zka5k`iw%;&r!c_^T;T=jIMFeUS zGKtUY@9wfIbfK-$mbBCaOQc0*SzMNQr$CUfl@Sx-B@hyCj0m%(uplEYCTe7akWJe< zItB&?@cM?Ou*XYCf4Zh-XmC&wKzwXuQE`qX!mLv23J^tAmsMuo0bg)?nql5C1^K=t>^vbUZmK zA5s0bVr)c4M0fSHws-sd0SMr^$u@0L0zqsDYV-Yx$58o*alJ2C{B-xBCw}&)-~Qp{ zr=EVvK0K=DcM#KjWz8y#HH{-u$xvQV`u#`lm{^#Bv{LwBU*9v&JX2d+djXzFyoq0U z;e~?-53-I?d{6RoGw!8fC&Xg>JWd*QfhkqaMyN z3`wwkK8R<96V}vVw~zefr_XHuc+b{t2iHCLtNr_r1n82e!NG`XsO<=;tT9nP{3A&Y zc&1D)u*F2{fE#1b3o1j?+uQr$haVn0c8q;%Hb|?lTr_9q43pW+2Ysv5tEzO8tH9eo z@h?W4uE9RLtZ*w9VU0AKjfm2NsTv5SC#qZ$LRC3i1o0`q+%h^GPW#Y^cCN*Yl%zOY zG-aV6s=^pDmzG%4E9V0;+DIyu}1Zf47=GXuehzSnF z6SM)NJj()*Ccn$f7cp59oI0)K)~~I)|DLtWuUH%#7b~zFJ~u~NA0jg^j8#S2XMo9K z)XN5{AdI^v82F_EawRYf{JjPt(Az(>bLWARCmZp-%uJ8JbpDK3n^mVEV;d0g`*-a* z_#aQKU-$6OH@vgi9-1u&x;3XBTP5igvTQ0_83cpsy0m)B~>iZrI*EpchK(CHvPNza zi%an48!s=LR*LVEe)qWB4qA8A+dnX9cWXBf0D}bhKm+0P9ipM%f}pCdieI9osgpW; z&_C$dw(Ee`>k6v7u?`|g$q$exiJ%bD#XxF6M6o@_YK*iP^&V1>$Ab;c1=690|Ct!B zh4#!&FE6@$>AbA0)Zl4{G=_oNEHN4tDFL~wyT7w*fUSo?l9CdvQ4tmaaJxoRC)9$% zF{qm-XQ)9GMAX>YdaSxm55{b^=&0yu4A~Tw>AEtR9zKx_BCc<)H#G2>Rw{2P7d4%8 z2HL`HhN0Kc(9k}rQiM-pN`mduOD{4?2Ey{C^6+$xF>X^JTN@RSA_lKRX-)S)u$asu z6G;}wj=|tdh&VA$B!w!KHILG@a11+JS~}QECB({6BHe~A?bRBAw_&O(ITJrivhrp?B;8A;BnfXR9T9y=l}8wVvxG@C6E5qJxm@a9B} z;;w}ldJIApJsClOB!Xq1SKs8=K#jXOEAY$AvU!ld52-G%q8>R`yJP2Jx6hB)>f(#1 zlus`)NTM#rh8N@XnTBWn{KnfGw{6{a;Pp2)w{~=^y0E_Hu|w6=Rbk9zBl1v%NCFX6 z7a$fDMD* zK)T#vNRB1QYSUHm1<=<&WOwOF8km-nEJ;S1qao`=i)jL9C=lFDyoo}vhr%s}N(JM9 zXoRXYIx6%Zg)!&_;_vNt`>tKPs;jGcw#;H&ykO?E(n%5&WvWw-O)8}G-ykbbu*?=^ zoCE^CfEr+6H!CBlsBl7LWF!w-K`_mRRK`?+YOuYK*lUp#Slx~F9bG+x?A>kFh|J7X zYg8mtccI}j)I^-6~BTVrqvn|Wj1A{Cnv<)Amp;>f)EmEQ^_nXz@yd|A5UvUMn;OoBvA~fc6D}! zLECt_`uh3?dV3XBl^~pupJlO__y9A;MJ4tcDuOaN}o=mji+XfzE>Awud}RWfn|h#R4cX%fki2LoK`-0^bBKBZWVh&+F|O8q(XJ zEc6P4HhRbKf%f;Qz99glu8#iQyAPf@+lKE`Mr!=Rc^Bp7Wg%|)slpe8r|X+)Y8qvq zA1`2SU2{WoOTZrpA~NcxRaTT^fDnJE z*{A8fvN|{3RD=&185MQQ^(*GjDMi{QYHn=A{_lc1kTo?m8#ZiUX*PTt(o$pZzUzjR zq-0u#W^<(2I5(stHWE6?sH=BiFjy3Wwiv4z96BBPw=TL)7gG&IaiF!OJ>cVD(HddO z%}K+t6cP22B&b53@m3i|Ajx=^f@h*_G|#4wD|b<^6xVi5ktXvXv&mHx7~Wx+*zeb$BURnB%2S zJmO6xI${&3PY(qAiXcarO$@u|+9Ex=h{xChD|Rs1R;ZtM^2q{< z>hpVLKYxGx@yuqkuACgc*jkS;+9HJIQzpj6Mw6m7WOGCC!6d+(Gf61{I4;_@_U0=e zfApT*+#~^t6=g*aerwHwc{4vNOKyGf@gZJL_$hU8~ z=Nqe+Et{L1n8180h-o1x>J|EzN;Q1gH9!C(YCL-FJfU%v+<<_*l=tyxs2U%;FVQufU z`-KOD2n-F5)YWxBK0O(xq@={g#*VN1|D_N=$sG#Vk-rZ@)h`Q`hfi+(q|zG*h!D=7 zS3Y-kS#+dDl~o3{Neco7ye1Rv^d!qPI)dT0TUJ#wWhn=tn@aT@1um~l>^>FJrOU%j z1EhTnvGFmFeEW_`MR_>-Oh~XPiW+3nurcH+SLEjyf`)$q8DwW?-f{DlmHVr`vP|gJ zin4jrrd6v}B_t$V2&WMvo44M2tEZ<&%Wa@*RxX)0yTWKP1e2ODsIJa(Y-v@e!B!9!Vg++>j58HL@~%BcM)|ZQBpJ=g$q6JSK*%{VkF+Qa zLZP6Wb*_?`S1RC>=>>*GpsIK=%nLUy7pC*48%C>5~H0Hd`=f=9Ho$dTTh? zqGFbSPjW|eQY35lgD5LAdCd(gmtHc@?eWCL*pibHb-jG8R{$YRfe#_AT}(sWI3S9Q zh*-U1vDsw)LI?$Gjsv;s3ZH<~YtL%nVOHQ3>y7ro- z*Q~lk5+y$lX|${<8@&yg^fjwyK7DYPxJK zX+0E)!6`T7tO{(}od`vVbi4AbfjCVv|zhjRq4^uw#}1 zSyH0g;PWf{Dvv$){JR0aKPfrkqKnJ2v(u@LgF#^3rKCVYEjR5{AstQtZQi`|N56R5 zKIkr)nDbx%-;bx4Pob8dM&lxFQ{Zi>Ywx}z1O5H8XIA9oWRjsBbk7S~rIjiR z@#-5SPv^#}wy~wLsRL-^J|+|ug+UuN6S7zJ4IsrQ8ZDjeod@dcBM5rhG)n{ztWj;S@$Vbomhm`|?)yi-M| zsVhoWddeNQUM*r1&-#r+W@M=v!7-@xj#vvE>5!Wwl9XwUvrkYtL4V@Ho-%eZ98 zk_+KLHZ?W9_uhM&%m>OyPq=o~;@G$tg!p=KN-0k`YhME(6AZ3Im<^;2O+Yg)nv#~5 zPKL(=Ha{MPB-{AZcU_$iL3Y-}?vB2iv(2*1GAkfGB_Sg-O+uo|AU0vhhy<>Q2+CBM zo$Lf6nyoarOdprBuY=F60 zsT_5YAO>nvCqh)kS?)|xBBP@oxOWXkS`m?v`0fXAv?}ObT`HfRKyVtszPWGEfsb}# ztSurkg6#&#yGUvNOd$kBi^W0;SCrVuO*?BQW)U7>!n$mP4cm1XrOCrCFa8Ydvqe}e z;llU0xZG|xBOu~Kot2rI5TAeLoiF#w7RCFpT^s;ldrc9+E#`NwBoFWYzgCqG=5 zl#C_nsp|4j1(~0uBPp zD=Nla&ocaSK-(}tqY#RIzjCs=cHiNX?B11EluVm8$zn0Fsu<&{lB}homQS1f;QecJ zGE=b6jg7Hc%ods*4e=37Y6xkX`ADZ(a4P^b#V2ASh}RYj7Bk*JP@h3Yo7_~Ot3v7A z3&aQMQHjXZ)Wjv1mP3vI?4S&x3*$!Ti{LI%O{99-}*NC^0SwixV}P3*BVW)#QU zY*bp2t~`KDc8|CfEkI|SSITguTE2|cwAIzs9XobRml&*= zI169#6(-O($jMDvg2$qwD3uMIb_F|%kqfS{A!|q3i}kn!3+3Z+d8^WooUn)Fv-cu zDJdyouc==nBO`-Ulm}78jkx$&!Xe>8JgTNoDbQqtqV;VNh>e|WbaZ5VLaf zmLW^cWL*T_p5j-0M^2o1?B{=a{HNXq5&$4hHAo5O4R)xWT985kH~wd|C{#7L_ZJ9>dF zI}(XJ5CR6tEJ`BY1s;#Lx~Ap*4?a87*g|ZDNXH(EkX6cPpMe&%Q7!~e;RDuEMmo-r zL@AIOEd##+Qsh0mE1&q!=R3Ow6~FTOyE~2_t&zBp0rCGLLRw#g#)5`Scm$oTZ~Ew? zJ>2*KkeQo1XU?2)w*>!ujESv-92gMPfFzm*2L_KEt!ZfJ!N)n#8gX&Oi5txU5weab=(a`(et|v* z8Uzi!0Uq?z44YO(Aa+MGnitKT{-?yhb@vWS5Xg#BbLte{spox^@9}tc@7}E|4O*ik zuDNn)l-Z08y23mGtA_@OM;w5WxL$&#lP6|pq}_7EN?DOJGE&WEqk!}l1Q61EK%*xx zM(&tQnp4%dg!o4vx%>SspB_0z11dfnCFg#2qPsSIm{rmsLZS7N1=r%J1=w zx;^?kM9}L(0Br;G($Q*8PI`K30*OGh!^8(nXlZJN;w`OGDhOk6Q)nR*(Ig6!%0U=o z$%L~mGGEUM4*;Q%0rP~#Liq~<_?)yg0-;)Qtc3*ep@Ld3Fx~(|1H*0YeJW?X!HkTI zw6wIa*VHeE!(ksBWGiJdnj=hR6mrtoae(@L)_C6py>Wg}$k={`5rNpqAo@TE93!qx zn|HkO#wXYedi~10IprzIi3){oOsP@RbK_5dnusZF8>i_G^7bN^extcmQXi#TaBy&V zV8E_WVJ(Bvn4XalmfssMnYJN25$D5pBQ-fL(n8ZKe9RDmWqAF~W>ZmquFYy`@3rIY z<@3t+p<(L05f|zPK;>hKnAOI6K$=l8<;aP;&aQ#v#F+f-EH=fK>_{pKBoU}5banP@ z`e@f5o_w*pr;laJR47U4@02 z1$n7mJr4XkMNyg>8ag{WCrp@dexJsZCr^fsdzv&UudIABka*34HyngyYLGsUf`&LI zqah(NJ}v==`+@|;F&R=_5LeK7QM$ioE}poMhzRqvsig%IavcsQ4%E_;5+D=Z(N#f6 zj*a^vqF(?7sLf|kL*NGfSzmv@XEdmD9UmWmArxOQ;O^<^(Pury*ld{@nGq3DNJe@) zAg6Fbppo17kO?sqT7i&>QnXUZ)R#!{SwX$MeW%Yf;ImayoS%}GtU+PQP(YL(2gZ#0 z9W(Zqk9$V?pjmB%7V8b-2c0Sepke2z-NFAYc==LOQ~=d_YkXp(BdMYu z(vzqRg!4+cE|kFasdbrgQV^$L9B@Obb4>9=`+5hes+;k#5hY0iG?_|&&c}+flqu9k ziy~gcfV4>o1P>$P@2{#Zm&ag)27?iU{kD$&p8g?5luS%Y%FfO83;l$ywbJL2D*hn?T;B&FeX1mVD#m(} z;kxTqM8(*C^P3k+CS{jQn!teFP70P4&XHfMr32CKt{WES8o1zuiizKS6H}g*|PD-k^K@t8_9X9$Y4|zwWG7A zrM+7rj3uEMWAB^{2t-v;=u9#m^XpRz@SQXo3?O7;0sn>Oj#ZkW5xCkmO}p_@3k@FC zkoky+AvO*ZbSI&WGA z542+09Gf*lB*WcQ$eI3{d@-dovj#wtdZVOvb{9#iJeXW#v1F7m0?fZqzb?|{C$SwJRj<)y*lQm?QZry5*8gb}Cr-Q& z#!+Jz-rnA>6WTH|(`0a22FgFKL>S z1--QX&8pTuzqg^G?Q~r|25M1eDK9rYI@YQQV`>RGNXg$K&;%P7Fc6&xf zoWqWhJqJ$Cm^QIwYJnoljZJO+y>^D^^0C*=$_j(Fad8a~4?FC3Vv$8LEen~Ol+J@WHn3)dfdLc`i8^DsyA)fzWcKiKA)dKvdP7H4?lRv^s=dx%|>|9 znzJCg7>Ac6MFTmjqocj+&38W@=pUwqds2J3YSpTuqN4G*1YZJZBch$8pgl6`YHsZ4 z=_PQ-VlWourYFY5V9!h3yu!+y05Hx2O}%gx#&fK`R<~qLCv>4P@DmY+)_8*ml%x(> zH|XCPY7NF>KvieIQCEiOctsKF(`E4z8;lXrwnRNc5TMujeH0PZCD)~r@XeW4Iw{g@ zRJ3H~SQO2b5LxG%@cEfzL1{Jw`F-X=mExDlplBwW4YfJ`!I32-G#4ptop*$O{-c7i z*&FgfR60^vdvjH(Z|E4bb6%GuNmHgwxe#1}+wC407;y9UTOlDKDLF08EEzcclio~G zVC6BuVY158A*{9q`4Q3jL$%B(Ka2p?Hnr^d?9lKqxwr4V|8Z%_gzT(zlhLRpU(x4w z!kE*n>LdlEb&ZaBtkxkR3ZpLf;DFO7^WUVVrePFHXv%7K_1PWWlST zt=~Ci1Rhaq^$G3Rp%6Ps$48Pa0Tmey4LO_+AKns?5$5cC45|zYP0cdIMms?P6Xw#M zO`~TBdHhV7FGEAapY1)oYxj}H#*X@yw%`8zfs)Auqh42IbNlEh->6xcnX$347v{jg zapxwSPA85Qusx5q7~^AYl4PWtO4LT-QSvdssK{coMiOVOs`e4@|F{0NGc^rYTsFUa z#aN})#6SZ= zkrvAX_kQh?OXd>=5JjO1Q1n%pPPoDguVlO)j!6CftvmMb*?&@Fz=MLq!fUR%21B?NF&b-*@xS^ zx@Etdk(wMEA17+R=XEqD;u*s1;B~!VxXJJ#?>FR~qzdCM(tI5;S|$-$B#k2<^jqie z<#0GUIy&?zY#ABpDalF108?^5yH`AM0z;-5jtS?-CRjoyzOmt?0a>m;+fq~Cke-@a zT2g3^ihz7gw4tIbi5gV!9Rmg_GN*h6Evu#{a;Qu!6-lPT*NP(d_75uBEGDDTh$E^C zK`O#cFa299zM^c9^x7&=VzdDe42A?DL}MYOL4@~Vk13M!2dT(8;&jlG92wE;3AjCO ze4mkO(79}!u7(f-Lg;(36q^Xy@GJH2OrYhZ3xHJn&|pV*cfc>RkDQg2m7Se^A+Qqv z@e7|;mKVoHEGja}z*WJS!YK-6E(T9)=#(JF98{<|)Om{nJ4Q${NY+@Z!6do^0h7sW zi?oQ8aH2w<>qa5lML?Q>4`7}Alr#m zwYYr*aY9KdC@R8RHN2qX0X{h(dgFqAHVN8?9}fRW-Gr?X3K4 z-_eftKBUP+u^qfIDbz9+8{2y#<4~zgRFD#OQB`fj>u+pvxqOUH6BQYG z)#}v+1qI`D6~2r{1Uh{}LH&b+Z5=%_mFk}+PO^j~u0V{z5 zCh-9!U%>y`>zm$qf4k4+y?Ey2$G&?{Y(gB+In+RN6+ucg2(o5CFy1Gf>I{oOp!YaX z6$&B|CWw2?+!lUc-v1 z`VoaFl$4a@LH2lj$RDUb+t`NPFl9={#>VF7=a18z#|3y{#Ku}jqbz2V*+2x+m|i2T zrx1oD4e=w)5oyV(X0zz>(h;`?QI(adQ%z^<+xHweG=0jH@`{qFQ;Kjf78w<35+xO> zii*5GUw_|VV{6-~>bir+Pt_bd+t%5`F@Q*?jML3$G@Ea{;i{y>1fMKJy|s!(9SYzr z%YX$BLPJyAUtijI@Ms;|-q@d1%$#}cb=Qqw!pxV0MMM!Vz(BuaV8}sv$sjE;E+#RS z2pP*rAGoi3XQT<|YjhXHbduH3NS*em$X>bfSoM)3r!nf1W#8a8N8%FW&^ZN`bFGwK zBLE?V0HBM7Qqf83Mo5gPh=MZgmFk<@brTk8wT?Uez5mzCZnuYa9p)8IjERn-EMvq~ z^fg^BJz7VC)-HH%;!QXw14qZ+s9SgLKYHv8{$&G%n=`8-Cnqg*iaY}7@277` zI)Tkj5)?Ibm5~7X2H@?7O8=nUG3?gYyQHKfDk|!{PtxGUaJgKepv`1587vVrnJqJh zKUHc|8DxW6U7A)f#=3O?wAO82`J$~}!0Yu5507BK%Wh^|LQG723?L%L+DvjG*a3>P zA@qQgj)f2z-7%3BIq4zMHh$8;;K0EnRn=#jb=X}r4mB{p>??FjlX?)-QBwH|ur=Uo z0z>ed4$fGgC(@Ri4-Dn78bVk!A^STIe=Xn(Bqt^m6=f3zM4D#jMGB;)*#!OgaZ`&8 zY5%~$w(SRAdSz4P(OTY`iiEuE6l=8E?HWCFq_(}im&Iv$xw!=e1!299aThA^sZ@lG zqKYD5qm2+(<{~4Y^YSy};%zv}!;guNu@)8QwlubNbPpao-gM$b%O~3pluXJmEiFvT zNR5rQsz@0c9&rph8=6{b>sp%|+8r)8bIceV=I3V0B5F9(D${o3@~IOS%%7zqo-d{o zba{&t2@Xk14DGRju&cZ0uP?p(_B-2DS!U-YB{g;J+O>s+h2wV#q%XyN2*Bs{wRLp% zboS#LB}p(VBQ+s5hN-R#Ou0h5e?PxdISi#CN5mT#zB#T zl{Cnk2%*9=G-JqCT*n)XNeBTJq9VXo8b4iul4-~(w6(T!zyV=uYU+6}5QRaTo@Nt> zCRVB_8c8ECm1L!=T4OL-ut{x9ek^2O;TRG$ko|$)-XWP$Z~zz_9`*a&diSvYTySn> zO;-rhW{N8zn#lY;nShI?wyY|xZSCE?gZjs+sHnI=;&?p>7U=u{>7|K-WP(# zB(}%oUzkc4Yp~bbvw^lQ_&-)#^t|~qaO`{HRGsWsN+uLw*d_v|naJ<~)S6HM(5MQ! z$}2s>`qW>f^GlE#Y(XFfSdrV>dk>$eb-Q^=4?Fd#Q>S9&9d?&)|C@lz)L0Du(l2VedUbzg?Jh?zcd3gF9 zg3!{p8k}iHg6-kq(IZDszrShw$6NPx_1LvpC@3W*=8oG}+IM2p)`L!uOmgLt zv|!=FjEsyhp=})PI##uCc|AU#A452!0WkWEB5a(cQmu@A23eW27+>AN!F}m&=14ML^M--J_!-^7FIi%$Z(P zRJdu&CueJ#N!8sTUA1y?a#C^tdw+`0SS5xe?CEe)lHDQwX<&H7`R1EjUVUS$W5mn$ ztjTP??20RvE?qjV_nY*kM1TTtI7S*9+IssPG~$;MljEYIA_XC29Hf?|M|ug9hk(J@ zjTsBAoXZb1Zk z?ZbnE!%TAvujAB`39+`Ab5f(U3>vJv@MkMT%o>HRkq{y%AkwMV0_QT||9kzu)2G{< zqh2lND;5 zSu#l!=gh2_RZ*tM3PsA0R6XdFgA-Mp=B!!gy>&gGlDig*#bh!O7jJhD zVUv#Svw^myWBb5bPzZRJ@CM7yOuu+e+0I=@yaE5fz{tp`^Y&YBm~rv+!-uO6AFeul z^kiF0x7+LO>GcVMQ#1N_CyH@Vmh7z52_<=@MH5S>O)4nN-?n2{{i#M0&|fl_XhhNY{N z7%L!j_x7D>X!X;PMDcO9jP%q4jFyK2HybE^G`++ zv9?hmJv+r>8NZ?^vQS%_ zYQiUxgseDExiWzdg^eu(njpWHCG;7^-wbv z>1pxTtXg#A^_N9hliz*gq@NQ+L`2QKczSGNba&Sv4$Zc1-Mi|_%chl1o={M@Xwj^i)Ac7$ zo^Ebx@9FLHxP2;3?!?4ICnY83b$%x(*HytqN;H_5Y5lA+0#VQX4k$$Pd@!(b9=8yH#4?cbLPx>=;4R4F&Xbm@TE92 zd}2E~dfMAMnR;htT2e+@lF@9`8gYeS$_?^7m!^*zjN;Ikk|tIBLJE!)@4o#8(I`e3 z&C8e1k57mvx*v=U!>KbM=r^F|XBY=v4WbCf*#VTMp$)deKM5EtxgI|_bnu}5Z^0Y1 ztgP((K8JWMMn^|=(1v3v9K-{`g2WLuNLL4%R=RKw5seAwfiXEY-EBbj2I=W3x7@tS zWHAj4Iq``q%E>j2Y3CfPn9tsY)pr=AW|cigw$`}wRFfHstWk}S*;EC|2angCs%g|; zYQcg9nVFdvh*Shiy|AwXfq>iX_6M->G^6_D;yGR0G!tWucRYXpbONgXIeeLM5PfboU-ObmD^# zckSMFbYN%{u?i{@3?eKp$yvQ}!K&q#1FR#Fk!-ql`HYTBHR=_ zj>5wD`1rVl1W4_2eQo22(-{*JLy93Pm(A7%Sg}KyP*gCjthlFVKUCEdr<#tRJeyxQ zF(NvqAljCjTR4C2+@Ah^`_Qo8@5iRWC`ysh5eacIG1l0qXd)Mak=EJT+9#iSzWP)n zi!oMSzHsT11ti?VAdPHF7EvmE9un2<7X@_a@X2SMedBC>m&hya?`v zyT5(|_UH*oaUpuTLER8-+#Q>$$Pfh5D>tg3bLVMC9jn3-Gb9U80*1u4hW6^JD*c@c z3Jb?IY4INfZTQ&e`4vf$NIg+B0|kmgKoKNu<+S{XwnTzf+6KC$9-k1;$%0I(1;;=b z2i|e(HMiYxl}yK-kZG6(18X~?bEcsV0fTs*4-uy`Nf?chj>OT`zR3FVQ9O)Jg9Zl& z-+c3vQMZr18jj#+&6;(AD6(RE8bvRDVpJ6aaj(}8!~`ftAlao&qT;ZaX`mu@e^HRC zNE_!>5abntFFfOb_or~3Ro1FS2U`S{`j`wO8%fD>Y62fpLh316K}4IdK|Y9b>P*8& zTlYB}Tw@RW0}Q)MOH0H4^79v7>yjxY`}gg~_uMNh2M$)Pxna41RaJ;(VPk(+3ADD%6W>~EevZ8S73;E0$G&Tzhc>JZZCIzja4cK@rn%5OvBd(*z zPjBCO;FC}HpFY!}$g-}&9TgQhYgWm1tCw7|=%TdL?DlT=^UrTMQ*%b8G>mAg_3G8D zu`3NvuNq%hQc_Y*P7d}Fep&f!|H(B??WxJhlF5Pqr=~KUb=Ja$@!gHrEkl8U6xPc8e5ITesAPJ9d7PA%O%!=%L1dgK_Ug?nSm_S-tmOR%KV) zciR8V%B6Fj?Tue|YBgG>l)Z^%9X_y-o!ewAzF+T9#`{<$g>O(hydpJaFKE z$z<|>4p{Gqh=?hFD_*^uxiNAC&Iw$LxZ8s8xnp)xf9Rzeb6%`d7=GaUnfLURous-( zNX0TC8pFMVfxX>^_~ji4m_N@@6B+!{gkF}xeVNfqgZ{YW8846N>&d!e zS9r@p{eum>qYiw7sC+*Xw31j6;caRZre*nR*BGzR9_v$X<|-d>yWM^MV&j?828Qv^ zQcDBct<&j{v;0h&zOZ1yhwpvhaJt~iS5&w3^$sN`#Zt6Tr^{J7wOSq*8&X@>EhrnG zJX7Z+H;s*3mMqK*2?>Nd+^a^(X*IC4(CLd^nxNoaAn(8`OsH4EMO+wWov?QH_FpV- z*uMR6d1bTNY-4?N4faoTWZ?4U^KMvGG$$urZwMM1aeuUV&zX{QZocdUc4A>+;hGz6 z2nq^9>v(Me;;6W|IH1~;%{DMNT6wWPJ1bo;lhczTI?UV2$%;k9oZMMSGZIZ_E8*$$ z7po8MJ978E4=R)jUvW8@4xsTY!Ii>LI0^ok5wzdVpE>v3pI$n8s+1wQDyziUu*V*~ zJuWtaWoZKUcE7W{`XpD{#tZAh-+AWr`9J*Wy|S_3R-CvMgy~a*4cZqcIk-Qmu~UOtK*Zr{FS16ejO*)fBE^R3Ea;BFkha=uOD`4 z;FU;l`P`}#f-0;~eRb(roEbM;Hf}j!8a4ZA=+dQ2r&VK`TCLVyv}c{3wJgY=~M#HwWQ=^h@-4F z8%5G5PhVKQs)!4#Ah@R)@043X9*QrijEsy}y`r$9vI%^v)iUws+ka1;F?)VNfmkfz z4FDH)izK|2fc+!o*c<7x6(8RJ!V52-FRvk8oCI@BRLCK9zdWzLD9Zq}$_kc=*#RRwgGD zoCF`ic$?O||HCHe4f(OG``r|CETx$ef&0o|-{<3AuP@3%v5E&UgFKddgao62Tz?YsRpCd z)X@0GtFHwG8B%7Xi@+#ds%PYKDmX@uj|^?yy6LUAKdh~8qIpGwsEDAa|KCHa*DQs2 zfM#fZ);NO+iC@0n1OAHfG4n^CY=8fQZFTiMtS_OX(r6xi^wCwTR!y-AnQtV}Aw8tq zMG4b}M4V2e2*)qacCfxl?V>AFWS9LOlC5bpiQ7#ubIyl@vFbs=iv0B}3H>XD> zl`7Th0G%c%P_H){R0@b2xq2y*q6Ccr@7s8V+F23fQyE}|-cp)o7>P6xSpTMvKeqBy zdITz2uyA2qT-dA`t7(;Bn_#;djYfgAjg5`9w6u(mk1In1Fhb7KE@2`WmqhVJI{vho_mJAx zZSvXS7IJ(h7m1~EkxU}tPS-UuxmYHaN+dWTmWT<7nAh9EDF$q>$2>MZ zG-9(`oo+A=-ek8haS{(UYUgC9E?-`-upl=+HX6+G@bE}!dG+?4NB18%Z{c%nEH@7~ z@O$6;-c2{%bgj!SOlO3Jg%!-7-`3PLZZ;2(TQ_grmz)%nkud`pKI@xv>>vF|Q*>fN z`~%;=wX1WWr+fDTv|bkP}30ZS#A7-?44S{=q@BpRsB6`X`=v;=cRu zpL!G0zM1SabIG#P49j)(2@)TIcCMhCELeD&^$Ru#1SE$zL-rctNe zF4i17cJA2mvdXF!7rZ%tQ-_3x-g?U|_uPALR8$mF-Me-nm&=zdTXyi!AqWUz0~|S0 zs@G{AefZAInQ0P{h~|mBH$>ytoe&YLuV2#L-S^U8J{ULK>^A$ht@~^f+D&9v&OpzU$!LLnkhruN|{^xROQovR80MiK5M%KA&gAWNB^f zIeoU~z4vx!&PsUb?sYe>zfP%;G8A{DMssODR%l@3W%>Lpk`)nhijlqa(o4gGgZ?zz zf`Wp%bLUQ<;3<;NcncD{Wo2bULqj1UAq1hIaVzT=XcKhQIiJt^>)8qKq3LJ#8Ty(8 zCmn`gP3bP>*}Pg_zG60?elMpBO9}6Tvkc*#Y{_uqx^VZF*Y~JHbgRmEL{# z-3bW^(<;p-0RGh(85wnTbxtRza|RDeOG|+ODdjSPk}#}Wm`KG>Yvszxd8vHN=5X%W zcl6UOheR@bR(eWmN}NHfQ>bKOiIg9BzzFTTtWQsZnLKKqPh_(czi?5&zj}$ALJ~kEOWLSTxMvHEY}yPuAl?RJN2=e|=7%`L&k zpb5LvVlmrBY-4UWO_IWijYvY=bYszj_idPym#I{1Fp3lG6b2Z=Zjy=!up6yyox64) z|9IoV&hIS@X*4AAP#>gxlreW=^tR1y1m6eRWh;ZS*DG-O^psE!{2MA>G|A zUD6;8A}xZ1bV{dmN{6(-OE=8({btRYHEYfN`>q$g_qiwb*=O%j*?h?w4F!B^%<(qk z&-3=Ysx4+zJ;tu+{p1%$b`~=81vv(S!4GKx@q(To$t0y=zWgjIlB9G3#!5hafZO_aa;!EHQy&qbTryIM*w8k6RBvP# zm)Vydt1#oV!Bl_3yQ8h5Gz}L?Cz35P=a~D!9gZ*+_^lt``t*ZEF{xRJZ4Og7kLG>E zoa|37bn8pY%Bl?-QNrr&Y*j5REPB2W5E9&eaoDd8BNu zA{}PUwBq2a12Q0~hTC7|mJv1%QsUhV$?H;UW!4q?CKqu6NSU+OizZ1ty1y*_z4}<2 zNk#liN?YM|99`!gM&A~6ryJK7aZn4#u!|Q8yobw4SG20<*4!@Y%f#FDZn*Wjz4Gxw zm(W_>5D|1PaQ!2!!nSgBA@Jr?=9i&AV_F$o1O#zNrLv^ocq0bj%4wx1<(2YMa0*0e zMog#L^CoiI22uAblk&S@?gj&>a?5Z=cVG`ummp)a;L-g?B`5 z*Z4UEe6Jv8(X)rHt$;MJHa{EO_g&_#E~~=(PidpOc{WxZ1muA}w!Q~6N$a?H1Wyld zDH^=dVZ|z4{yFtOMEs7`?aQZ#%*)Mea~_`|(PfWINJy5qWZ4L#hs%kGsa-i?9d|09 z$e?)V-PKXG&f|PuiH2i-KB`?w4s06kFZWeDHK$#8W(P-0BMeIa;%xGqSQFL%*>e@3 z!YD>wsL4JQ2_P_7mdjJvy=@5_ zSPlHcFkoZUfy^nXre%}ewGN#WhZiR!_(PTj+k?#3)#W_!c%~=&tLFRj4hJru%lTh^ zvkojf6hEb=4@)C6oIDxNg!a_{&iqTt5h%w$Ly! z+4(;p#MoE^uZ0F}N+(wzEghXNA_06fBF1!SKdF(Y7$vS{kqjcbuv*HvvW=>f1xU$1 z75&g*xKVvTudSht9=-h>FPN7&t&S@8{d14)==(MYl84ueWjR0(@w!JyhEfkV_8DVs zj);h$T)d-8NlWv1y`}Iyk0b2OMw%hVLZ z!{a&C3%63X)VHX5BtlV2f1B4Wz!+D46Y?r*C~2tnF`avh(T{n6gn|*pXnxY>CHap=x4N$CaUSb)hp^tvwtXPd&YOAW0ZRLoFiIrK_793V z4+G0^u`(LjjEqy1X}ufrW(`AI?qp)xk549IY^;?RxXyZAGI0bVU~#2eD8=OI zB4q93<4H3nCZ@~NW_aDSdTm5dkcG>Wla02Q$8^zZ$J6gO3g_MPn-}g5!}-xaYZ(pl z70Wf{WL=^06~ay|g}bL#yXS0Ag>qCQG@dBp_re$|;J)e%&kN!QDy8HNt9S*?{z?6W zYQ?)dKmOcFFPkMjRuE0>`EZr}MhR*x!^+Z988_kh5VjiG`gHZx@8NJWIa#FLJK>VV zC2-Ct@L%A2tLKT%A)oCRnWKiel6Mkl`35+rxfm}9lbIxMeRr5_AD1RZQt#jx7H zs#)l{x=KoF`P$lse5jnUl`+R&V&G(-5;UuCY-rM5XU06796cJ$q4v28J1+<&F{VTKE+8(ErE2{HFw^Br;i%$!dTP|}+jzy|B>ib!=-^^yO}6Hjo3O1p>(0n&m3cCj@LlSOR*Z2L~}( z@-(4;-t>+r?W6GS8r9cGQ|F}RXXoT_IKsdPoB1pmVJBF0q@b( zlIV!}LdMh!4p9+$mBSn%?_IfA4amgjF)0lm_?j>%Qd=KqYei*cU-4v4Ci>LEVTm-m z$(PHTj>giuR*MT#jIX(vqIa85_m|Vi%epZCZouH6;Q618>ucB3#h5leJ_Liv7{+IP~NL+wzX;OTA-URmCT$E&C zh%E;tB_$`-R@!*3Au(}_pw6c^M0}W8%x~FvPGbeL)AHL~CA^(a9U)`P=^7C`%&o$r zY|Jde4W=KfXAiMsIa{Ua(-lhHW3}k_iJ-*JX6!t!;*J><;EcQfY^iEq^849FVq!5sD0v>f zb+5v&L!D7&;uGZZ>+tnU5aH_J6y&bv<82eC_%G8_mQz!s2#>Ve7KO5+w!L$km)n8Z zI?mvfz`-hgV8PJOLt0&=#jIOx&5Ro;=u@Z0^1GyV`neWagD^i{v~t z+U!q)#+5ekWKK{i-)E|yg6+i>V)F?@{%ImvgqO>M0ey+g<{_h&#*>Ns@mu^ATlL-UZ643Hd451z7lR$Z!dWzG^Zyx@Sw%XS(*Oc89oA z4@*+f1ZVZ|9-bExk0=X}l@(4mWh8!T+dKL`7`1m=*uxn&-lNg57=Cf1>B8}McfZD< z(;pB5+}zyk8;SFyRh;BYXFzR&NFL~FZN0ZQo|{A=A}Gw$&&ym_HGXRA=;(5CAmmrX zLdC@V_N@r(J2pWwkLX9qcf8HT(&lcG=H?P+Tc7aXUR+#+g@>1`mfT*a@##TDa`6bTV8=@a z@Mppw@+BQQuQB56gms3ZT8lVLi zgFM3{EApKC%e$fRo;6Of_ zjL?FQv5ZLAf~#UVT@`@JKcY%L(+`IOB62bd5j=(Zk|7EABOexBIeAXn!Di%(p|61& z*6tg~eJV%lg+zs7@3VLZZRff2RVuX)Qg;H6i+VJo50=q{UG#Sz z+%qI{=YF`7SsL)iRM@fbg+^x8SzlBC@pu%ZT09ex8))J%$83d5{ZF=62^#~ z(N$Dr4qT9d?EC5IQQ<0i?d|8G*;%ofS$_8mtws%I^>6q+68;t;>!x!EL~{m>vecPo zJjdQ`QPHe43)AP=V?Zp5q*+it^+xT5u>exK5Ed4G859Z)S7Zt)H{`zH=infBY}F&f zPRse6YNS7_G85l-Dypl~2xOH){AAA}4wWv9)^YebsV-XbfmZbEa0*T|$UM*Im}hN= zgS*6yQH7m5a-A9{T?&_3y0R3PR!R)$gFUTS+*4lzt`JG=i3JUW9`H3NEzNBUT*4n%EJXKBCA?L2`xwjaX3<*NNy1iR-##Fet{w==Ah&hrz z#DOPsSxk4og|G@s<=3aJT34%2l$2XpOvO29IZN>ZiSFrH4>)V#6c%U3 zLGJw)uUnhYO1n%Qv*p@%=O>ETk$|Hm#zsMZ`o7r@F|KZjPMv*0X~Wlx;?s?u6K=XT z`sppIy)O-%?#TA_kOK zZmk}in?rorkSrObywOLVku@V`fQyMLQ=#R9Ssf862OEJxt0&0>DxZ4oN0rnj{d@?~ z<#@#PF~ev{YDkbCCkG>wo(?(A*!YpVK73S*cfsp&;Of>aIy z+0Xj=p1nSuf-m;LcUH!0CKR$m08zcJsd>8gn$3bo>oB0}yzSx@d*~6FRyX4ji@f4W z9Wuv}47^*)E_l5tU4Fp0`vZHsaVMrKN`#NC$oX#>48Nz>a=%F9gIRTI%zTR(-e@YHV(^y64k@@!+6mTyKs3;O9^HF25d~U0orb zUAM~gv$(3lbrwSy!BQq*p!1*cWP|OO7*4a#usi!9mrCNBT}2+)s?aTQ>@0{rRrJ5V z6t{BjKCLmvi$QdlJ$~mGFpSp5tG*fKPsCgQw59T)^_>BAYy{0L&ml1pSH6Jp`RK9X z=yziJGkpn*XJDNW_6^nVd8Ag41*qebR~h^GG{5pK+BeEXdYt`oIm!Ds2bB;-qSHH` zL#yY4FwXz!H=){jtV8f6#wo=S`|l>4Hf$u)%ghM>Kcr&l1Pg2CjZHj0fEgXQGEwZ5 z51U4aQ6=p7qunp0Uheq%8fIb8k?;2E>T_mhfuP?{u-skVzOswy^+H!asrocTCy*?x zZY!;4prLpJ`jFPh^Ye34K717TA_pX>q@f+}cCeMKk}uF|v(dFY`rRz;@GS>=a1ia7 zV#y37CMIunH7pFqGy>2-6-(W7;-G^xOA;32mtOz9J~#c7Y@HG$A}$NM>&iWA-QTO7 zN*?J*sI*LrnapE-{q-7fZK=R2!>N?H_jJmiG^wn5gAsl``0@fH@C%2XeS=DQ%$%sO z_;aqoKtT!+O2QB>5g-tEH7G)3_|B4EyS5fI`RnOWh~##LeC9PY&F1&rW;kZ@7lzIL zSX{BEEld&;lIH*mkjE#Vwh1ryX_;u*NG~B5LRf#Xs(eBi`I)jHKN5WsS!mF>r~@rS zEZhV2BDf=h;RtH(B_Y{-gU1(s(^enSBgI0k^ppGotA148&a%q!ISI{(3CP|NCk&Xo z>FF&2AM<-)rx-pd9)Dtgb#v48@^F0C^;muAUTnu>>+);&A$QSOjOLxrBz~DvYY%)& z%+6{{rs(CRH9Ql)#CjzDLuAdSQ`gG$%6sN2hH$r;Sg!=9M~uAX#(inc0Cu?z2D+s= z`)iN@DE$7W99Oqv(L7~swAt;axHdBC> zz+~NjXB_#1Ka{y!xZ=m5wMufogT#_MB9$%@i;g{U>W}-+KYrbxR0f4-#D5+pH1YNC zd2&Qr4m9{uHCbTtu+)o;L3KwYk*LiWH+UbS_7&^tfH|W;TgLSsDh6i6f zMO%TMHQ3emAethm!FHOufeOmG`LT8XO8}UXMn$vpf`6d3=*x~=2Ae!8hL%Fd7EjLw z4rTo2oc@`m&mjLE$}L^n{R6|6Vd$K3s?Ygb1z%042o9L6t@R}HlZn`_FI~?AbcRi2 zOqKT7QJSc~P=P5)3DEF=1xCtpY30A5Hh;VVmp-TE2IQx!zlvOXZ6y&0R$~_#EW_i& z@+jyiIAh)HO1_+gXUe8I10CAsEG7?8oa+)g5$w-{`9_3b{d zh1^2k6zzIz%G19sgE7?Im6d;kaCr*)Qef3o4F9ko{4IS5kTScw#eri22PUM#!lIZ~ z!K@^$M814%*Hce~9P?!BR3gQwNVj6w-YMh*NoF$CDK`}-6SJUfIWMCYajVhCT{Szn zh{|3B4x!p&uvPl68Bk|#Zf<}pAQFv}&f8kSJM8jV`g9m3SS50N{B$l01nC{|xdsE) zf1F6jY6!Q6)J{Y-ypYxU$W@O2et^Zd|Mu ztdo-yzfN0hv{&1P8nKnu=u8f=p-XOKN_Fmx_?aXkOP&~6VNk`7Ton|#tH#I_VW%CY zkwu&M->2P>r)9M?AfrJ;2M4~~gINaR34+*vhGM|E%xR?w*}wz_jF_Ce-0mN839U3M`(ZI-7Gd3c8iXNW(4?S!Ox4qyZiezYfr%_klBFS)1du)AGQx2w#_Tg z%^l)l^UV5yqMaJqszflUpb|4}+rWj)Fec+lJ<`JNc9f6w`(be6Vnm}54nCgCm3Mj9 zJ7?%OuUEpr&_w<_!}+;|9V)wE1H2uQaWsU!R63>254rp< zoh6bJ3OC;*^_kHy@k`BQA>k^NFlQT;E>!R+!n^Y48?fnm6x(6zO5Ghn5ktXYY$Gmt z{iby-;x^|r`HP?<2NxyD@>#d&>ZDn9*;E9$D!r_peG&2776@R<4YL|o{Xz`cvq}8Tw>m8L{H!U!H+hK#vY&~_KgWi zxrhjIU}QA<_V|0H0pR`TsbI=*>rU}*g70p!3wX8H{Ce^4{E+nf+-J5N#%m|Lh5z-v zs~}~IJgqE0F-&g*r4y9tf?N`L(CO_j_IE)B-*gE4C(sba6W$W8dXJ6%%gYAf)>oS< zj*kzYk|G|tY@Rp>UZKhz{q5VgyUT*t!0rCnmzR&PMIly*6kxMhODmb5;jNdfqPf~v z^-^_QoI1F>79_%~EXsky%q?6-KKA+@x>ey{m+11QtwCIzoX$;pV{eau-mCwe^q-|H zub&Qx&DaD48Tt90W_?k)&TYs{-Y=-Gg8Aht`42;4FK(x+tzBKB(S4kLS3-O51KgEZ zw^6c65EA%!<^YsRgwsF5_I*wf8LppYZ%@|v4}zR*Zmyt^V1VqP6RpCQfEzDv_zxUB zJRXMy7Cqjt4uyqS`}}zv;9|`*PKbDu+Sl{x~R!N}UfaIKEw!=f%&G&u?R` zCmkbAZGHz!c=~nL5a)!|6nDZp(2BRp=Rsi19FDJo1*HRB1>&cjbLH7^?YQCNIhJ9O zer=o=-z9csqhBg}3Bmjb`J1L%gdJ^y=6bTZ!|${_H#1{i|A!uN*PPRA%FgC@OuMuC zN9Paz(zf3|RH}c|+FUHfsY9~m&OF(x7VJqP2`5DMa?YC)RO05*J>I-ZR;dgM?Bx>X zaIfyz?mztWX>^b?E`OH+5j8kdk7eP|Q$azYdE?_FAU9i>o2#w9o|&4P7qzwd-=3}^ zVv_$mJw-U$qoBRchC7WLNEJ(~Gz(PGs#zq&!&~(~{((xsBJPO}4Gq1uOz8x3bbM?A z?2vyLHpQQ7Ca|mXXQYqN9&($b?oYC@{8mtX&w)Vf#hgBDcsfzKsrQM&hNq8d2W3{f z<;bTxJ|F8RXN&x|GWT}lVwxT8#)RmkFJi7OC5=Hb2>ziKX-P}gR#wkPi@!d!y3;Yc zJaIvMh3V+%{xd8eNn?0?d?X7qDo<+b+0B&iCr+nk;`CSXws$nLOy*Q8*JZ+YXLS{5 zHTt13T*{>~tH)w~XIBgqSnTT)v z`VW?}Vj`A?lc%5(WJ^=u;xkuhv0%p{#me_y6a8f2AIh@s9v3pgfZXov>@Bwue03-- zy+$7w!63{O#xlFJOyEzD^;iTte+NTiD$2^z4zJp?+(JI5z&lG#TU#3>WBf>GNpsmH zC5;N{;#AxDqs`>6o0P^-YOawQ72582Nj(ZP+-4qEH<(S0p0}7u0(m9;CgCP2zj^>C z0?dTtK7CsFVVIen9ec3M53R>lId7n^@Ar2&<>=^0f}9{Ovgq4LdheA@nFR$`4M;B#VYwP`g_{9E6^ZW2{-KRCQ z<9r1fix$0z%5;=c#qVnJfEzgdZKrH%OvXJswKCC)6H}&*Q6(_gx8ITTy|MtQg#{lb z1ENe!HL)HWP8=bd0i5Sa+i|tjbJQyraIbsI%nTyDx{l7m#)cRl-;E!GLz*I*n9te! zYVBKCB5@$?npOqCuUEM|S<#A<)v}KQ5ZykdzlX2_Z zyohj_=|fK{Vbe}(8k$*OD3>(F(gSm9fb%ND&(L@8oQIrkbUG}q2R-JHkT4}7wjV*s zd@D5z%#ZA?&9CgaLomYb{fqjf_&})(7RoSkFS_8Ea59B-jLc$s4zAjwr=yD znQnhOzu{eX&({CKRT+yNuK28HK)_>9IARgsC1SE#6{sH=1Hb)7o&oCyng z%q($ZVYq^p2zCq%)X~uakYV0C4=ye)weqdz5P%Szo;vHbgGvvX;(u{}ra({xAkx?EX6R4+G%BX$7kYz~2twKIBOZLPA3H^a$WjN4%m< zd=YtE*?0kfDhoCB_N=OyOo`KI^q9-9=Nn+@ilL)ds`1})Nm;J50YK^l13RRtB^D9E zt43LJYy!GTj%#g=!11F(OY~xx2B3=&sQ>w0D8^63BqSaJq-$$yz_tO55u-_Pj58`w z^lU5VQRdLe!LAyrFqqeb7rZ|0^KS&!tCUM++A6N^kS9gcD%>f~@+6wUCC1U>)ajuq z8#AYWlBV`d#}dT^N2?(4Vgvx%X0KRq*toc985w+_qB~43lq*5s5{d?W2bHyZJJ4F~7#>T;r zM3{(#0&xMsa_!d@jJhTx&^GKjJUj%fEeJ0+H#ZLtp0QNK2q-szKG!DYCTH@?_O>~t zQ>|)mZ|{G{;SMv)m+A}#iUxB}6tEC-O1jFauKa@lT^bP0050K%7RN!n#v=kM8xW3; zO`fQg%MIK78;wdO36FAMeP_G6x^{+=qz=5cdLw&!Bz*VAI*m9OvJW=}YQl2!bqQZwX6YW(3pPz9)3 z0Vlgx?pjqzDJe}&&GJBV@;?$0XQcmqtbKh}T-nL)4o*(+ahOziKNmIeQ6j17MAvOO zLR`oNgS_uMk=aFGOy1eqQJk#k&aSO}&>_hEQig;f3m#9%&<+zjd+@_yc@k(9vPq3i zy&zuRibwAkO(-bdjF6@LM3YHnOB&j8MFWK6p0?W?Z*(-hDxF%`nvR>CAlrixhA;9H zqp6JP!+4Z&R99J#lM8Fkx6{RP`;!F}1O$AIBw64k-c6VR27x743N2Hhp}P9?;v!gq zq)S(v9?1S4vp@o4`4a=p!??;k?vs&!=ZX}LfXYY-jfjYIy*@TpOstymjt|+Uw1a~~ z@I_ido>(w>;CI>L*rXWwm>2;A13~M$yTcr)PLwf?HZ%NB=45a%jA>YfIR4T>kS{f-C9W_L6(+L4~wE4Xu zW4a=x6U2+lE_^5&lValcZ!`=Huo0tqy^$D(A904o_-VPtZ6}VsYiVI&FL>s}dvR`V z$&t@9=w%!aNg#$byNP za!yW8NONOTlgd`G&}aiyAcJu8yuFjHtuJW7fykx^U<^b;^@DQ-V71faWGvdJb8TqL z=7xqVFrNk?ac5_zd#OZ&NxDd1UtcMc4SxTj0H+_A>%8;+rzax=AJ}wp;U3%{IJ(mz z&BOVxEiVtMSfWY?o7%Ff>+&5`7}j>^)zuY%F%#1iN|(Qim+HjT#lKqLa&mVBTmJnw z5T_F@B3^?zN8(A`s72pLlu=}t@ko|8;1*RR2@8`kk-ze1#U`hgl%0Jt_Z_Zp2dC(V z?^;DtGl$3==FI6wN6Wl1N~#5-ovvHGK-nchHe8+rrgst9)EY!Rz%LpqzA`FVM@5de8#3A7O~)%&0{kBf^7CAvq2d+v546+YHf6>0Q7 zS$1jNK*{jh8B73p@(19PNN6h#cXXY!;lFZ`M{40%h4+u0*|uF4D)$6bjVsMACS8H= zgvsBKSCf#|zRS;CdlX;OYwB#?-%S#Q`;M3*B`+>+tugcO>T31ss%2O{TUt?*MP(Ch ziYw~l*nVFgVU?9!p z7m_GX(i3IqZHSr)zIz5Ea33_&`i zR(V>&xCD?P43@`bl(>qEN|{Rq*>u9-Ose7KX;VQu3-3|W)V!RM!iG>*b$VkU@=l)%IV+DE(fyoZI1>aDG#jErK!(N#2D zlUh^n59@fw3Ykd%ilcAmVBg^oXHL_vj+4(Evs01c(E+-D4^kE`c+=IqB~Ymg`q``g(tIaqaz` zP*6~Dw^-VmEx$e6*jQU5BgUboLTaBEze?AC~lu!IZwOV2wYLH#)WVl_oqBOKE?S~?|91GMx!6PkO> zC651SAMC;RN=SXC;X!*fJ?>+cT&BLYHJgRPH3r2F;`bYC76puMgL6QBm-? z-n`%8k=dR6%`#p^Cg9d9l^QJOy16D2Kso$)R{q6*JC>m=97D7h9|;}(y}W!#3tkiY zUS&F-k*tZy#;MZ^mxd;4+^4b+GU(J!NE^(c&)5h!>--PEPiy}OMI1}ZCH(Z5B+~RS zNFubn0*?4PfM`Ik82o@v{XHXtz!lkqFf?m9gz*v}!7E)BLxwJ0$Q$dePY*&hCWRWz z!YY}{<;D+?KJLE0*Q@4VK@Dye?`7cGaL}(Xuh6bc@-dLn(0&gO>oqz40pxN*Z0vKF zkIay5AT?ZP@B?slU*>B*!c$yuPq1(AwAQf1#Vj|*eEmwf#N6E{3K(9XuIS0N=g9%Q zZ!Gdn2b+tj^DcHGEQ1v@#|^L4zeRmND>z zq&5)=5aNk^6H>WtFr3y1NQjBkGWZ5qkpJfqb~BzW)%8s-bq~uT!u>5T{Sm9w;%rUN z&HlQ^3KVKi8bd>&Yp=mU1K%Np$hjA24gxa@D;t~F$2l`WsOqJ`1QL_yV-u!I?Fs(l zRw4sM_4pW9z!s`n=otQ1s;^H$A>dlw@#L`qKLotG6E8y|18)A=#m{9anaD zZCDCC>Z1%kLrk4})vPMOMNRFT#E}NE^Yg zx50h6lw`?Fq>wX!-GOnq_?)Sa1nnCF0t6w&EOBChKACeYv1V-5ao#N)os$X&+FE;h zhA5XM#`ct{J-++ziII0}173@SW6x-AI26T9MCF^mO#Ker@l19R}FSqAIKH5gK z_koy1CZ@AUrQMJcH zPN04DBpv@<+@rF6PG|c)5@f#CwmSF5JR8p<3sqbD*YcH{n>O8v5axSTRm8Zwv@}>2 zba@hC%}E+jQSx!B=kldCF9#W!0bKqyQhdBB?MnGi)^Bn$S$7l3+|Vp+-K_(A0Txvp zrdhs9n+=`G%c5Ma5rwPV7!X2hFOH3!_}Gg3+kqTeh5))K1;cnbeDmo0pGF5`X1nl-xS( zTx&N@U?zowU!H#dR)%bss}`)+S;&3(Ko0C0++D!z)CJ6Zh)9GHV0<>aL%)A#hG2um zmR@z`v#Df>is2j~AJ=}Z<+=WI;nY<_9YMgE=Hj8vvU02C(+q2-nu&t^SPxJb8EN%! zPbZ%Yf2;G?@^^&Ia(lajpx~E{r;*k@>t6?NR}+4L%}%Q2|L7gQon>WFvH($v`4vpeHP`02W3EwkeAp{tM)=i^o=uR}n&=bCZbtPM@UZ@6gO1G|_ZSFY24SzBswa08f<&5z!1_E7dQZUsJU?+AM?BkN^t{Y7d5Q zKZQoFt*y=6+?-balb=2G?_Pkbm<2u4O+cVnG(ZRbp$4(MTb<_<*9zIl`T1KE6d?qJ z_qZU8){lEvJxSigzljtSDeou26NdjB{$GmK!FEP#5%bU)>7E+6Y1#`7O+g;(s<#=V zN7fs&{F(k%_vJ5xSm;;%2^u;&_@e!k6zn@Y1%(l(<~0P27cn~IfcH>KNwd4#2+#_p zk_;Wq(*M3oAZ>CR3oGG%gdpO;jiFN07K*}xj$Ue+!4exqi?A34b zi->dcihW}*NtI!9HK>eQT6}>nM(|x91;DMQ1XUD}iqOLFuZw_DL&H zm6y*F@?rb;CV2ao$5#qM?6-t0-&|Zayq}2rR*F&|9=3nZvO3wRz(f#BP-Q1H&9 ztgVgMd9mWV_j4oEZGu~aP=1~ZZX9Q5_B~;*kOC6n`Ay>1j6Dw)%l^{R(!glp9>Hb2 zC2kb2mrp_U54)3-$hVW{-|sI&SS$!oC1z>Ilkt#O$NGenbNjYjTmP|T&O1jBS?A6R zb4~*Yl1CH+Qs2T^Jly4HkLZGCtpZ!V$9gRzlhKXsy3Lnn_57i!1^bJ6Q zpw$2{OP;Xb&$_y4M?Tb4^!0?dP<_&p@jX9FI1=#s@_2Xw<&RDyj}W~l2oGy#H^*!r zxCjG&S);=u^$cJ7)WU){WK-hnjxO2;Zdm8klv>PIr0DKKS6AV5-R|Wc>-eOQuHmc$ z3`tbz$sg}4TX#oCSG8n=3hKY^PZwLdF%49dfmG5F^umtD&dyy%`X>zqP7bh$1$g*m z#fw8iYsmcTU%zA~y-iOuNdZ-KMuv`o0gCLKe?qm*bV?bNGdJ)Y5GW1r>Lzb>ohF?h z*7splr>kjYBIGlB?&yh$p6D1&ps-1Zk6$696+U(|M2wbw-xtJkEa>(Zg+PFtjZKi} zpQntBL$Jx@6qXvN5OR$xtZulNPUZNKH*`QTdx6*uz8?K+f^45{Lw=m zh3zYp>9XJF+^b2TqgmHhR#2fsT?d(Ko0age%oH7SJ@zM{?JTOfSOB&Owy;7>Vv>>w zE!K|BB+bi^EL%4f0`GSgu;1p7!0C*Rj`s2P?rnC3Mcsvb`*(N= zWqk~gI2a3`j&1W06^A(wxWp1h;0Dbjs6W(it-Hva7$;NC==h2g{ z-5)}!@>zJ|1it7U2C;huGc&5x?OeqW5o^9&e&^M@m&Y?*U0qZ|6)X+<{%y5RQC2D{ zRyH;!K5tnKa1@l)B*Um#(2h^6_+3OEdxmU|D!&K0SlzVbDwkok8qs7zyLi-Txw)M$ zH#!)zWp>XmRiZ#)RoemNz>%AM*8XUa{meJh_P&9v0I1 zam0^)ChDcQ6gtF~p;V&L-uI!!FcjPAnYxYBvP>up}gW zE#Yq7aj8`5)0a$Nb-b1J zEmA&(UP+nT4O{|j(c>S@6Pf9Wf@HlU-Uh$9VPV2yVS1|;VtYctuY3FWBqb%G${k@< zQ|31@!8Wg;9|vsp!q=LbD)*b$iIox)6X#@SBb)Tl+>t?#aY&V=a2`jfSB@*o->qN2 z^^b~T&dufQnm&Tud;I7WiJK@W$jl(H;vn8JN3W=0&d0bxTOvK}&Zqdc=_%;Mm+Pv? zz6Bjz^A!etGp$zuJlxsT=0ndcm0P-YWB^~fySq~!g|(na9sz?@m;|Yk6I3Xjy+onY zkT?W4W~1t|GWyE-qe&^G-X{MFo~cu{85T$}Rh0dp-h~Gaev4~Z?2eJQG;J86gO+`% zGP5qDR$h0m23v|e9Z(jjN*SHA#}CwI{EN^y_*Lilvm)_Nfg1St^1&& zjQA(-=y`P!7N&iFUyq9ed+ooZ682G~#jtsdt^=*orL7ZM?f_~FgU7q93ZszOV z9*N{XGrAGcOJ7AtWo1*-T)QPpt{x0TIUyb%I1DdKvPN~r1N|2>Zm+byJ>!DVmRV!mA1%eck$9%U+FSmQEQH2(Qcper30VyddIXMO< z8bY{iacE}XqZnJs!SvHYP{p|{<6dT4!{U237buQCGV*x{UT z5(X^sWB93A9A^)^(1xPC=U%&z$+KF6$M&{)9=ah{%&5-Sm&Y(6Ok`wi9?B{DY#0FY z1Fs{n!!1dO=jc*+MzphUgNKg~R$F^7O(R3(d$_xox5{C`FcX&`YJ;Ks`vR-}5&eiR zzsu>CA4wJsrb1#b1!7e8cvj7|OblbhoB@zc$&xeuL=Xor3fm9+VuFjX2cr%PgBWb* z=;&xo zMm6TcYii^{k=coBp!tsCcardC2m9NG7qh%%64Z}+MT>EGC=>q#Nj+apPg+_dy!AK{ zdiVL8oq}RrIL-7Vo-B{wyrJQcR#JM}k7n>t|k1344s zB%6I*Ok6qwSN8SK2H_Y3H11D>A7D1s-5VP0!hJE1K=jAk1xv#VvdCX z;t@~Qj%GyO--A;|Jw=T_mdPR_rtrCJ$GFjm>2aOR zAxSMR5?lRs)_pjeIEMJ)v5DmEQvwk?JC`WOS88dZSJs{I*Q1_AfF%IJNW54L6ft5I z_BPxd2biPOK7*a~9?tQ+cbdi1fl?B9|MMwQ=Cq!+9ZwX9VRk9nGJ!dBJC@y}?kaO% zi-UvQdf?&*BatZ1Go^ozwljU)O@CuzOjci?=a%$1`0UdaSu;J-WdrS_x7V1NN~Y)u zNA6X%?w6%A__f4I1Z>c5Wax42=9XIo^i97OSFS9t#G#`txBGjmqUmCHm{}6Vt+CO> z$fx+m6s|o9)#!H$GBC*bX)BF-MyXA_CIvsiW~l*rMtm`RjQIa1%fDVf#yFL9h;B5$ zQkfM%t*rkFe$931(l;>pbjeE3kB9#Z*}Dca!m1%Dcj?#fnLRq#IOJ6j&EUO+$CMRw z>(uI!?Oq$GZReqC+t^v|E6 zXrM*M$!KO8#OET4MZyrLnm@qX>DpF}ya2XQNqy@0f`1yORx-TPV~6va zr((Hv>Fe9g8>%`37C_kHh!G2D0ZN;KZScviyO%-UGRbl802~I#q_Pdy9-y6@XNFIws z!ehbJ<2U;kx@d_KTCr(9U_L>9-ss%RL`F}Il#-P^(yv&mSAjK#Zyx@kOr!6TJU78p zfa4R+JpY%YBQ`5}Oz+tH$dGFry|l9xZktI-0o1ZL`01!%geyMx5rAB0E6tcYRyX~d z&J1;~U*{mGAnJ7=k^3JM{tx4fTJk9}9Qr9yZMYpNjiVZ3*<1Jd^_Y+av17`*9$GyB zATXZ*CQk}Q7!w=+^zwkdVbaJY&P;RvBg{lJtM4(Ym*66Q?D1oK9b7@B713Anw;3iI z8w&{WwJW+?o&)=V{}9E73%G4^Zfd%J9Gzp4V>;FQMZGV>)?BGQ^nCAip3U9;F~kvi z4e_Vf^}|EW7YM$2xoM*TJU{#Doyvag8fTA;hwkcgW~bDDaOzq+7?lAu&~$O2zdw-m zmGZ6u%&{(xdzFFOu0sz!;M(}==n(XufMQa!a{i;0D2W0F8m3{@0%bU`Y3sWGtYWm!MF-g8t}j**h~gtvSLQ&c+H2R9(w|fCxnUO;^Vm~al(&GJ21bP zhhnTV+v*c6Re4g51z3 z$q`9=z)^0loO0R5^XaS28L;^MRz2{V{b#*I`)uvVJ)KqQw3E=N7JbPS7bZg7HWYMg z!ji+NuO>M1l9HT6MzE)w>woE2Qg^8zQSPwWHOxnH?&Ppfr*az-V?Og|IV88~IP zo&=s%y!sqW6&7?p9Br2>!CG?t%Z*vvtj&NY#GLwCrctqJ@%Zo{{%~~de}~J$Mq0&y zhXM-=3&vi+ObgVRo1sP%3ovc7FGw}f*GNTIKbqHj-_%o<97P!33(;%!Ib+UtxqA5YTGSxtlhb(SPOvEb9yVe=4QM||oeGpm zerY}dJK zN2|^;vG;K@#Q)vh4OjDjf?4@5dM@;FD|8j8!BtW$&}0kX`}%dtkp>Xg#*Eo)5@sye zsp%xGpkIHw(5Be4xg1|-la<~dr~Rpt#_KeIGAQU!`baShYNRkIkOI8uh-sVMe(BdN zJZ(21f&mmU051UoK6i#n@sEFbS1Q0}FaX$A1J!JQcz*Qj=xU=Cg<2TWt)Ds z|B?S2tY{OVA@Ia$Z=mNX5QQ!6s0n%0yh>=>q|9*O6N84_s;^{&n)Cw!O@}kUU*Ed) zcc%hHa^Ks#ls!Vv7dYs`SxnoedB<*D9j{-N_D0}L!PGJ9hUX;Oo3@QVIf;Oaq3-&c zol0Ih1s+z0!c>qXjYaNOx>MG4;peetnCW6g&E3~&#ti!?Fj(d5S4e~fGEvba^1>bJ zv(Id0*m3TvJnSqJ*YsNcZ^zs6?tFw059jOf5kbH)+V*6jEI{d5t70))jvC!dkcx^5 z*z?a|9Qp^(4+7~za1M|GhicM|{ROC7V@B;=c?ER!%yEo;Zy_hy(L#tpG!ImMYAU2X ztT$JPqpbEe7JZYgvr&Bt9fa;BlO_@8uEHgD$L9`ebR8ORK)^<|LZd&I0HvDmtZJpL zp{?ypbu)l^zx}%h*3)mAb1`UQ>!24VPVIbPU(p{V3TyzwQX%NQR_>qtv(~{ZM0}3x zw`~oQ&OxUuve~?|Q&WFkNc38*R~v2E>M|sm?0B-`krEK0p(SQ#gA*{Sg@s>j9NQv@LXJ9NaN97e9Z0s6V&K(>aYMs#|AVn*xs@~o%1JK{#lYRf) z9SiAnn}~YyAV9-o)aEBZAbw3B)tt)tCcyn@FEdI_9hc6{^=@%{u=Vf|dUi%XI5<<> z;}FM3Sa%t1?O}^1Ok>#P`wU1*{)-3!{{jRMg5G!5mEQuVL;qqW6cbt8B+C__T21&` zp0(Cqf%uSS$fY%X!W9Y)bMe1n?_4P@;U<|BV)+Wnk6516ud1iVq@p;?+Fp0`N$k!9 z2By9Hhs@6wY8rGolk;&ZkYS>_xl3Nb`bIsy#M(6u?w+Z!;iHkfkb(Vu`xaXjYY7&E&=6l z>nkei=~<-DgcbEnh@CS*+O08{{1$-%N)c9=+HScT zFbBO^20~%G0ax6wsf-X%bgIBb|NodP(Jma9QH+FXJxY3V)x{1f?4fuH0j~tct0C(Iyj^n z7$_JRFm==U;xW}2b|P&;jUR#|Nbry2c6sWwGm0BcL>>Y z@OIx5CLII=4!)ET^j5@#FN`;q05VlgW54< zTQ}J;=<&4Cq~t1;{uXV|TCPqyjy^0L-jS=JCrH9BJbYJ3Bq|FzpnW}SQe5hAf9!_J zO|23oRkpsM(86~s_QEly-}&K0!*g}sZaGmuPM8ikD*o>)QC42SWtcpl#@j_6@tp1H zvh_nQ-^=RtUkwKbMK1g7b4|SNQL`bzPFo9a7g=>{nmZu^SBTBy-!e5?-9k-IVh!39 zy4+TAtF~c?RNz}kXX)vfRZV19FLbG+z**)El!n^sQrc^GJ+r>*%G&p8n6!xs5qk9Ci&p~jDpmgyOtZ4%pV$exRpB5aw!Je1AA^l z3Pm8q#Nl9zDJfcW6?y88IM)PI%YQW$*H%B6O28)MkYF}YZ2~euO$`kJAa{7WRMlUH z-9N*%(e;6 z)Qh=(=KR+bO}9*=c5KjH3Z`_K39b#14Zn3#sZwj~J*lXsjRAu&OOE&PsB zV5lIy!291n|GMW8&6M~ZIa<_oGbsUjR0NDVcP6fG>!A_Cz=P72m5~u?FJsbCa3DVi zc}F>5kr?m!tx>5AOq;y`A4|{`4x=tifPnKZOge=W$TM?Qhuv~I4jI{1yQ)^*hNJ6B z1=Ncjg9dZF=;XPViH@JBgOpt*t=XEiQa-4A-l+Ssk2wr(*n}#X-HXCQMU0P(iAszS zcg$*Aop*5MWll-!yHyfu4F}F^MM;6REH^${2XS?}=be5L~m9 zP${A4ceARcBJNalQ{ua=v!|#0DxV{*^_ES0$00S9!dYxwT%!*6b0BvUXa_QJX(OCr zN^rJR$5GuARlAI$pmfriP5*v4q=i<-Ck~JY}XoXrUhT@MMNMINGijI zNdowpnJUxcj3fV_iW#^)k9SDj}TC5`}Z?(-9*%&vc{ z-sQ_j{vBwEzNMX7Sb7q%^9M=cnH{Oqvs9D474e zs!D27A;3a3B_(0aACOsnvDxW#XnIBV#2a(`HI1 zBZ4!8z)Zw@-)q;Sq507&PJskH`-K!aNqUg%moNnm21-;x;4_+3f72;kaT2?2%DO2k z8hQ)@`k|D>rxo4Mqt$3tU&zk?rfdLRw%K5%q^PNBVL_SQ8e_6Rf%S=?qtqCa-aD~B zbACTK-?me+a5fwUeiVA&G$?Q&3q3v)RcE6%IOOY>nst8uV7Gc%__L4j87 zTe+q>k#`{Kd+4QN@nM-ezMn2B8TmhJ>gZ_sbZni?azR3b!NN*}hE0wV37NeSy zzoQ?QlWWt@6Q@E&Kry#tbMfN;MQXM;lCr>&C_aIUU>peC7tx6MwKX)ppAAHIX!>hEx?u^Bt))vyL!? z6+ExxGd0gDmUPyQ8tNWsp5Bv(=Hkb$(&w%Fcr$5g?ny{SwQW?^vOJaEs%$1GQ0 z(@d%HGY$TgvMNFzFdfpPMgF*>S|~>#^QKLf>v( ztLsdGG&B91QZAr%H)tVLoLCf9nOr9A%Ct*!Uh+i4)_b#sbTV`5FoIx6(kiv?`KpVU$HSOW2d_2lG`?U!2Ay!@E)Bk7Ha zR%(EQ9gtkiPf8+79~aRCtEzWRoXxCTHni2$)RdMYAkdPN7Xsb5z^z40XwvcW=rkl? zxuU`&pZEE1lO0KhpqaUgtg4&5ncg~qp3p2$uCO%e-VXFjs_c{7&r--8;=(%k)X?Bd z)D&rRQQ)nKlsF0nlxyWrLto3cqwwY$R!~~Ua}~d?eeYPeXkPo_p1ow+YdZIHdAr@~ z7H9yt;`vcz2@5l9X+Bn@YF`!N@%`bxv&CvU2>DQFLiIsPT-?0)_Z$@D>1G+pS@^v|ue#NBgKs;>`^+;p*Wh0*v~Vl+fQlheN;U17RO+K9)jEEG(0{ojybn zvTMNk@F_?{u_E)Q1PDz6TAq}T_8ZMCVf`IhhS^8NNBH~n(=Mj3yXsz_)Na1fW{5Pq z!cU5H(?pP{ySu))xT5Vzgpse|;?_lnQASX0>Bm)sP!B9ri(l2xivRs~JJS*pAWVt* zDuUhMz56qZ!+nN67>=qd8oJ*A?*b(Un2v%WpfJ{t=82Sn^eS@^U2$Rxu5M3~W606~ zidR~8_n!r3-yOtoFR(WqPiGdR?#FosP8z10(|(4q4lR7jrqk^E`&DrL3Eg7@yNBEk zW5k*L_erLXj*j~JguXU@egZjtkak_%Z9*W`8LK=mI4PYj;6q!h21IQ50MLYo2hVXn zI&0P%C?|ozg!)#reCmuZs+6fh@$G_ZL0-@4QZL_cX{orDmxvKb!orT;7j1B#YG~ML zy8E`vf`&66mm1Ap)n~h zi?n|Qqkl0nLURPxZNhIopIF2+ZXIwv{Hce(wuS-+eb-jA@g(30Tk<d-5uADrhK|_1Uj?=z7}{0320B<+L?9uP8|sIPe|UmU8XaSQ*L8H% z7Z&4Ghn^3Y-24s!jV>Zg1uo}V#i zG_PT%;2(P|MN+>GaGfWID0fmwP^h@49Z>%{#_ytjxJ#YbOh-LVIZDkFgvqlfg28r& zlgQ|(oBnqrfR5_SkSpxP*4`e*G33;!6$E~ZNcrEC<$`lX=5QiY4Y-X5ql&-$H|&Yz z&-rRP<5+m+;r~>34`Nl|sgQnjlr)N8pfVNwn5B$4+}lTlh2oC>uxjBTR>CHrM?rje zb_@}(tf<-y*y-8o^Z`&YzZa^j0lv#W&^gZek@m}{G8N~xUe8ran#((rxPm6vMKZu; z0_~1~r{_8&1Mdmz3hB)HzZP@&#?8f%d#80^!TbIg@PR9hu!4Jm_EcF?Vg>9tJ%p-# zijk@Kn~77j`N_Wi>h3mj;DAbRg`?IA!F{Aj4G^f^{*YmfV7J*Dkue*l``+%=VCm7= zA_E0YORTiIy&a3$vK}~8sYxwcIoAHO*NQAGVktZ7y?Qst6#5QoPECy(7kfqClG+j> z7^CmirR}N_V(RqlTtLH{lb5Dcss?`6+Ld?w#CHAWR;<4dZ^Ce7I}(*sxLu!`iYq&p zQ344{smv`^tHaiZHuxmrif#fLjUyll6LS|66Bzt+0?$Ta+t9vZTrBd=jX3|-Q7PWf zImuYKi+y_=+93Un3yj}+D-plg5fN38ZEGufXu}rG28S%IteCZHje&ay04{=-Kg``+ z^%$mpTec_$oai3cG&@$=IP}sdim5bE$$P#Xlf=p@6#sEoI?&7g@Nmh7-?Zk6Cy%Nu zMyXG$=cSy(l1C~*@+?$mNQxZ1{*?H4ex4+Ub^gE|vJUmgty9+_U1a;WX1_Dc5E_~* zTH&lYM^=?49uGB>pwFcP>M9PHPgb$hURXyW<55l&4nc0P*5w=Yl~Vqz5O>*cXEHw)}M%j$@FpaMx_&1p5Rhx8DB!KAN7Xh zlJnc{=Nqr!h<)jFnSugX!XRM=OoL9BVj!6Zv*PzW-B+gTG-JzwTT#KsDOQ0VtDyJ} zK7lvG!b0rEP)UdZg5ki<*0$*%@WrLqtVBRVd(hDCvlO?l3p2Ve1NocYgDTY)PEH^rB;(oYZ4ALwSyiP_rn;(9*i8{9LW(gUE?#71xgYmM zfR`Gc_g{aNUM>^vsO6fOz9jN&4O#ulw_`URY*`BhxtPsk6x0-{hzKnX&NNPL?uUoH zxG(+ToDdaXt!OoK?OOP%G$RI~dLn<*${aOb5VR0Vq*8#16OfTNf7^D(iLBifkEj0^ z)(3Eu4v$N?t~1pNr-X&4+AD}aAGE>YQRP?s2^d;=WWkDB>_~A;ru5z0R*J!2(kZ^d z&=c0hHW7>E5>YntJ^j*eC$vj~viLZzjpi*Z`yN{%#J8haoMT8vh$IF2iE zItST|xial54HtH6^@z}*-A!EEu2MlVY{E35=kzqBr2Ih6g^`hpmX?c-j+2Wksz_Xx z(ySp7J3Sm++zNBtMv>Io&=tcSojKs>BZhb3e!af#7s+Q*tMc?P{^w08x#$BDQ>Z}Y z^TEX49xjPL1q~_aC9$7Kmh$|21PvpjA26B$mRlyL9r>|#|9dv-W5ufq3ZOLq^D6-R zO~ASoAlk>JPYz3wJ7@~|jPwJl0Q*IvH`uB!+%kt+ajlyNY_ExrXiL5AJ7?kXQ{Nh^ zp`Lrf2!ojL4A~>1(~vZM924u=6j8BbW_|T}O3%q*wN0&Xx!=8?del4#U(OXNO`vCz z;Nzm%0pQE7Iv>f~^|=VlSkyT=QWh7#i$gR5 zLpoG(OJn1ovcoX=M0LY_t7y>%UQkB9T z$SV?ejd$)Zt$1LtbK0dVWfjdwXvO{?_>QRC7-tY{^aEuI|lMK6U2C(b)WO za$iekPBu%9jN_=?C{2|LT)?w)Nr>_BIlM3{3ZS)jL49O>A)>+OTpj9kK}P3j5u?@% zCvJfGx5~lcO}2Q}yguYljazm%%V}K}7bm3!kW%sT@?uc|cx%9&up`n?p0C7W)<<^I z1Py2~Vt&hXqqwh@m7z20WaVUxe8nTKK=|e9shE(5g28jq3wFVuz$w;UEI4wEFvP=C zcJnwTa$o92n_V~h__qw4JGG4bJ|CUuD~E+aCOFu;lrN9~mztMzK5w{%Cx7EGp$^OQ z+tXz!Son^v0SfOAe|ryl`JfO{{xRw?Ey5+e+%&%lG*)cwCaxVI zRRX4X>Rk{ee{~9T0vybUsMr82>qdsPWQhk?OY6BiS2s$!m~$&dy3`di=&_h1chFIFyK}W$ z{yi|<@Pc>NZJoa#JvdiH;jfG#4gKV6yuICZJyhcJ0Fl-k#T>QEFN>VcR<9n6IWX|{ zt3j=5UL=3p>K{kTq$L|3)5f3Kt#vUp!QPrIKC6R)sG!-|vn^gcnV`;{8N^3~jb@v9 zsvVUcwJJ?yQ~$XlnI2c+udVu2{5@0SSJafYq=R6sOnEp1Rsc-|kO0%Em-Kid#el$j zhYHQ=g)N48qjr>*(NtOOY=oI+EvDcB@5i3^d2UDJ9@O-4Bkd0N(IOcZbIa^1sbZvL z`1?D0HB+;a!#xP;HkDRNJ)SwR^~r^xk>UGuae-p0?Ms~*L_h`Z1a%l$T7>kRS}j8O zR@j#CJRu~BFw#K?>d?A9jtdX4$z&5WBEhuf%9gim7_{a5qF@;#;lxD?zmU5bJx)m} znn=SzW9=d$qH0R!#@W^Do%GaK9d&$xdVai5LB(U!Zd4Iev*W@;#-ufpRU7J^Tvmg7 zCB{f46X*#COW1nmJ_HWToZK;ggZP)q`EaXcAS))+o3pe2pv%}vbA*RR9S=a5N5D&{ zH-%P>*yoJ(r&o{1Q<`q7tP`8v85cJpI}M#W4ac_}D(;HBcLsiAz|REm4=Pku@n$b7%mWGXl>iu<{HA-(h0obK{98uP(0asnV<%nb4EchRf9r42cbd z=dkIR_F*V_Z~60eu)D59M4QCiWyyX~k`=jB%ApA*TyQ7~IO*s;8WI$TB&2ECJU8#- zxN-FaP31u5I^G7oZEj6a)z*;+`r>i5Xc>A@($Sr4sr}y*)l>!4f`r}yUwV_mz%TJ; z(%k_T@T?UgrxzE%=J4+Q?FBecn0Avh*a24oQV}yOOsa32^X-j)5pQ@+wk5OLJMVXl zJdb`M>gedF*e6RW4xpsdM@4;-kW@zK1B3`hK(-gylZBKN?4N`H3#5g-vbMCOsix-o_U}6>e@ja!`#Xj; zpgDp$TW@tP)MxrwF5mElbUa%*M)fP1LfAE3;b^0re48B$${wRgM z#Fr6rX_a|wVZu$=oV=Tt?g0-KsPSF3E}u8bGni|$y&_~w{mTQo{RVc6Iy;2_@-Ksfsu7}%K=&L2Z%m~GJT!O8G! zI%co(8`tr44kp%$Wsf+bqa**l@|>xVxxQX`9-Wwh&!MVs_I?W+358E<%TbKk41y(y zhy_};U`1mMYi4a3d2`jsOq?(*Nng#Z$fG2vel4I1FII3&qtvlzAb)?XmHIkFxF z-?G&i@;F?I2qb=(#@;v>_tJeXaxv@oNZ6v`P$tH~$jHuWrxEJ@Q+KVuIyqNP7qW?V z7$Nj_ti|Im;>I5_wwM)kSB^)^t} zg9tz83CZ8~#h%byB-+y2iHviJIX1V>I)z2Men=}=4m`jLf-uc}Bwz^=+Fp{wY{kw--=uMJC*aWF z!TC~^<{%YUj*^F2!P3<1w2h{BT2a&G?WC3eze&>~+>Osht1~I=z4sg7BL{Bb$;ruJ z;SYlre^c>(7uY?@T3rBYH8BBS{~h-6_GamSCJ6LJH7>4hZ;vB=P+PEOYRPtQF$)_0 zE6@&frf*z}1_fT@)CF-jl)0IieH;00-=y1Ozv=>5)f0XPQ9O%Da>Rc!D75cDR6{<0 zKhHYEVbsH4Un7f;4++`vvt847UvDGeKFQL<>z-$nULs-8$-*X@#6tQKZC1B7fm5++ z&Xpw(upYn`_3`ytl*GSxGT7e#su$ilPR9rJ#%sEg&}W1&dK?CdHo`H5hI`q>G}N+2`-nJVM*aZe zqObsAl5gUOA^0PLzobKN^M98VTUeR@AQs4yQUL~`2*`k^7B3K;BXLh6S<&xgfo4+J zQ?VJ9x=BhRMmpSmt}=kwtf8Tuqlf%#FD{e}_UQLK>m*|w!RNSBM%k7(wrS@Phsx`J z27SIEHdnyS66mmhR^Pv?AwE_n zD*E5+&F9oSRP_(Q9}C!kfnYDte16NAk7-i*-MgjWMb_)t?y_@zm(dZju-km?F5eMI zMK(om{l)6q#qiYnb6d>!01;!frIYj}*b#5uuXq#`!M36v{oS}$L*kM zmB~BrD*wQvhw~e{1~;)U<({{c+%qp$4#JrI0g0wb~=qsBbGdo#@r z`K9V~q?dy+>FFu@z%GEQ8DBn|%K@SBQz;&x5is)f!9<2hRr z6$(!h@Or&ip=IQ?|2c#4>e~lqDnVc(qy>K>Jp8pd8N(N_Y+zc}=V&FR+%=zz%0b7& zKK3oT_xLHJtJiW3->=*DO=x&1F0G42MUe}iip$>@N~N1tE7^}0b*tvVJIFA-A|fs- z!pi2M5J$tuDClVKgXsCb9?MfnCnxBFFY;uGQ(63(3c1mtWP+FwyLgGvIf28-39`-! z5zxgl{VvNQ^T7LP_%AFxjJEQ%%F)Es#YOqr+Sr2n6Oa=65&HDhWVe*l;aLZa+#nK9uX!! zDK-TxZ2wv3+Pa+^Z#h1J&`QJ0Y6NjKBC;74TE_-eOtDeL`I+WIQ;SwpW6x0r_|=$g zEs#T>DZ2lYYKk)1r|V}-Vj(UvegP)O=RVlOY6CkP6ZEe@5+O;N0wB+MQN~+F9DekJ z&rZs#tNiwJJx=)e{E()?)Jopo!*C0NgEvB=VhL5ljtS2B8My0KrXj~b?fO^olLo_o zpEo{Kve<(u9Onu4DY@{etxW#PdZ z{f89|+M3UESf9lTM-*X%N?D+*{SR0{t~3wYebA=Rj%Mu37$ae56|2(r36zn)dSO=R zPJ-0U5ASV9N7gxOF#12`o&8~8o6B&X&HmHx{J2%ZGeS0TLWZdRtGC1@WSM$!P~f%) z31E|Vb|sABcvn6E#S?0VZmo{r>Q~qQjWAjv#{wJS#vp%r0**hD*By8slK~IpWnmY9 zyf;n(&TLR2<;uHiMhY^C(v2?rVYfJ{qIPY;kk5jBRxRrG?a9(2+4 zp0h8GPLttbr2horUx9aztW~6IowO{H*BY2eDYQs=j#!R2n6f5iMjbuNMn?%#HU$B+ zfSUU7{a$0Akr4=#y>n#ZU^UqOyTi!*ad1Nj6|`yF)Nuradvf`jFSfgDcDj-U|XZd#8U2Zm*4PZhjR834(^S z&Wk^N6K$tr-r71i6t`ERLm3WZzXw9_^Br9(Mg0@RZlD`vb}A)BCApAgn$OYo z<#ZV-mLa|SZWy-oOQ$Q9Trs0C$vD5$7pyIKJMJiKAT`y>s-gw;mIG%^PRWlf$Gl?x zwhy*WRJLSF^`<2z)>&WgMl4l9r*tRBg4$Fw2q0bBFstxe%d-57v)$v75K(uLRiU65 zXGWoIW9Gd8`ZKCfQbIo8qyY#RMDNz?Eti*{@U7({sM1m_fNc+~V-g`C0wH9?Mbz5} z(V|eh99yCm_3L+An=2Y>D;YRxbx6&zn%k7?+kv8%IAEv*$bq(XU$F>2Ip7_gc)Jci zL=V9kq18qeN_D^QsYR)%wDPWQ%h3k1<#xpZ|vSeSgY1 zQy5Q!gNOYqZ8}%sX!`mY#6ys&^=Z%+R;u0yqz*0ge&!3B*>;cyekyZC0 z@uwqi3Af4wll`Hc!%$&$?6WhXRMyexlWJnI^%XoF8`9L@f0`)dAq~8iaAga9gphf$ zo2d=TsS1vd7Os`$>%&s$@%)hTw5u(Uz2P7@IGe}$%kyJBO(pzF14i;Y6#{O@rv~hp zq?YGCzIsed|5{I(d`)D5%XMlKt$>fWN0YvIBEE-euGs&bAHi_Jwu8~10d}hG`)QhF zA>>h1Y%HwfOSQfbgSs%zP7=@}atBC~Bnv-{*aIP0ARrwg5yO}VC_lvX)q=hisAO~4 zU>-1PI5{1kI^}GAJbzBE&NE&#Yk3a;9dFp?+u7{?e0NN5H7Oet1HDR%fQBP(Vo7FfACu{cwK|jx{Km?|ixFfN1S;01`5t zAL?n_vbSI}b8`wUCaa|68WJJr=1vEp4N|%y>3S;M>FQj3tlPVjMer=^_uO1PG-4h% zFh9z5)GmGg#b$*%9k`GwM*tZbvH=RWw06~=CFW;g^i+OCKoFabzam=tFj02u{mNW% zP3MQdna@iexm2DXnJ7c@w=YAcT+3V>ZnW4`F|ZVv3^|ZZYx^MWT*Z#b17VC1So{$@ zra?=`oq{n)GC?C^Y?v4(Adt_-zY(5P1^TvemXpJ|y2>xu-CkV{D3aUi%3gJC{N#|8 zi4d6J#j?-rXH|)7@nupBX^u;nk0&LGWKa@*B>jY^@ecgTz;XV--qVYEaJXM(*kB0= z0%vSIwD#$+0n6(~of$mJMdXThu_m$y%uk&X)mitK(#R1|7bzbN-ju-iEXb-}WnG<2 zLJ}iQ1J^TE6)h$78H5dWmWi)*JXHJ}XP~2|wL~2qezf6Z&>Eq8%%-ErH3c%4S9G~?%Jb%>ru0In+w2y&8~;(n zQp?qGYw7n!;&EbG(A>k} zBPoMaqqIpeTzL3469pGt|K-k{Yx0p4l<>F5Akqh^`&qbxiYv`%3qg_bH<%F-Qs&Fen3FDlaeB--7waLdGr`m&NIx6FF=a zDk_P;Bied3N}W$Ac=zp({pj4jkngUHum;}1+FF*yc-o=DL``+IN?8gJ`8TLFhP*?+ zz`^(c8hjvmALDmIW`URo+Z}})sT=tZm;a=$BE0~^0HhdB8w7!DIsR`X!b0(MKe7Jw#PD77z+_);$ zQhBA_z@2fBl|`CB!eic{&WU{TKIVkjXpTdB&?>B}{QYpYSV4an>3$slU%r zT|JMs9U(a__KpLO5G5HG8USFKsu9+dX#jl+kCRs*%1zD1 z`0|MWOV9H;Ntn!lGk`e1|NC5J^e32BJt{T3CJ+_OHzepoSFS-+G<6UP#P3(l8>sfm zrKExahvB$qHtL8mC_{gHv)+-!5dKnM+h(UwJ4b99h|0~H+1Kye?*dZsZgx!*L{Scq z0pF?EN5M!lvvJq+33Z=Mb)bu-P7h=b55^-8!al=MLYRC(UdQ?sqbxH0>r*<-eRjYY z%2HR9n7GQUcXJ+Om&Jp%nCU$AU|Ol^AtSOaVf2**!HyDXXO_rVg$X%-?=O_>{@+ z9)x_D=`U55xwEQnr;^TI5KuMochmMJm{3UXFwbyHPKeSK3;>sEO* zGbAag)Z zYmYS}QE4QnrenfWQ49ofaK!1H&TPGa`g?D*$_a@?__vZ0yU>IK2fFCO6hvl zCJ#4!(;to}{`UQZhxEHhZ;=$YJ6?-Wdr% zmloCnxXU3tA)B5S{I7xmPb*MSF$pjdz^Nf)+yt%Cpo0tGz%P*7@kihu#XLM7|Fh~9 zt3CrdjkiK5h|5N6&q+eS%oP~Zdo1+i`yLrNlG*lmPxaX7;k=(YBO$lRZOtuY{2tr| zEo_gC>Ehc3tVSv6>8Z)cOo!tfdN?5FeQP*~jxNztWj~)gd{R+iaR<~k%3tm-&o_~4 zn|u!{BXAhob@bK?HFFu;c`Qr~t*!B{WCNus5aL0tIYr|{#6+J7@oj-r6ccVd1!XBh z8AkedkG9&f5!i)s7EwIDk`NIr^nW=-vQLLpgo+W&YSsZxPBtnkPWf|jH*V5A`WOzA z(M)H=B?m55OouZ_o27S*zT}ZZp()rI(JYaG&iZj=2fE?k)Aiqc|9`ZVh57uC8{wbn zVQ}O$_5Y|-@cW*qYXt~pcMn;IB1cb+5%M{khOcY5ooXt$y0Rm|Bch|_W#tR`jHSG8 zT$>~&VwMeqVI9v8;f1sFle|vJiIy%SLaH_^K=Fx@C~(| zF(j{&eU56=SJYQuDB95PTvc7&SXe4%(PMyO;ua^y#{H6q{e>}I79vSsk=vcEu(sxH z=LiN9o~$;&lGB!f!^>|IPQn6BF|&7y+mkb1uKiDqh@y>jfFuhcQy(W3bwkKtB;qfnwXCj&$NaKF?#yUk2TW?_qcUIt78D{`V&K?^V4-O5z^X*0c z+iC%ZtAM8W`}gl(VkI%63#H=WtRcLij}hvhqp0(M+7D)IB-qM+k8M8>fFJ|XA|JZl z+^ti<|AUeWMuC_`F1-fwtxDNk=kK{@J8<9>bXAbLJD2NQ_{*KnXOrzd*3WaKm^$4# zO}7UMV^eK9Mjr1&u~YB_p5O{}J@6b>lbLn5^s%5j*KR4avFenLaUOoNx(=%We>O=Q#N)4UmN5--Vwg79LJ# zXD4I~P?pI_NC50POI;9;$-2t@W57GmH1zyr#-0Ch@bUQ3I~;t)?|YV^S@Qu1ss~nD zS-*Udvzl7@<76aeXXkv}6hW+y`u9C#nAj|~+|RE^+cc4ef(}2U#;D4@ZvTtEK$U}K z%xWAL$I>xs+f)>6aO28~XUNwfdw2F9;&fpFgb4x^$F-|DktcV&o3Tkr<=GYxUXn4e z?-UqFq59QB#({FVz}-jx7FcbVkQ(oT+0NObV8R(NHQuKtMj@HtDN<3>R6V#dk^x0| zgiW*g@f;^Qe~)YX4>&RDK>PcgHeaU4ozZ!s&P|4v%t>yz1<2Ug)Yo<&9(|UcxQWE~y(9{Z;uZ3PaWr(*A7OyBc9Ta+nq`}eKgIwmS z(&eNMFm(~_b9(=`OeMiRJ$b%tyS?4A{B!>M-Q7dEfQ^*#!Y(z#~`qNkAx1tvH*6a3i)b3 z6g)dIduv}1NlT(3EWuw9Zm!Utzc98QyiSYUzW(oLZFbAp0-cUUto=VFw-s9dzPrx2 zm8c?01MgNa#E<R(`jx7K9>%@ZOhKM0-lAVQY3UbU?&J3 zh)KLRkweJ`0MGn?{-(&-2*Sa@{GET79E;%c6>WZ$=L*TfHt&17$Q~7_uYS9YZ~FVh zbH0&vSzjK~4&^64dh0E0t`TpMkPh~73EO-TAAS=reASk#vs-5Jd<6<_2x0a*earx! zl9UvD3X!)HtJmTPs~hYHBZ4fdMT5OXTep)8nQmum>&qLJv9q)9)q%Tv5j@&d+p1U}~%#1$01v^LeO*ggkzTfrz^%)fTajX=e ztEV=qy+U{ zxil#TvP7#XJPOIggI;NGN;oa{CwwF=%+CNQPJ}9SaT|$zixdX~Of5vC%r{RKgY@$x z3N6eSXy|A-+@6EO^z)2AqW(Ga{&@ixK|eg%GJe2Z0S3{iywsghEoAK?SUdxpM3_RTX^t_NRo0aBIc{sC&Ju?Ch-Of={ z8*96DubrQ|h1cBh{rihRL#LZtPM1I9!QJuG%8HHIFjFQkqrlf7^rxvA!CgXKaY(^X zGLR&9ksjshh;07Sq!MSCQvxa#sY*Krj4gJ=Flj|8ci4u59^G*jA{Z5l^7U!*lrG}0 zkc!6)_U!6%z*AovGt%@zb928*$n^43{y>29>yA*437&>iAwMFNinmF$eB=+`gI-SA zruNqIvByQN@^ZBPwCp@$j8EXxQWNWr%jAS{*vO?zhaULz^K%|_zDN#zxKC&`o<>y4 zbhImC>}+iBShnFiUC|doxKT& zr*E=#wmwy}XhOPh$v?|461ext|zi`#M{CpS0q{I`K4Zn}WvJWOqtX2t2*S#+#i zpdCCby0#{87Z^t^wFAmjSuQg0!TmlyJ^>#u+x;`$4{LUhcshaM!2KNHsQ=rFY&2M* zvk1VM?r>r3{a3e*@wU;jCEU~fxaGt0vsR)fd`Cs2{W!1uq(7Y*ECNt>C^MyXJ4fb<5pKIjE)JOBgHElXMe;`0b z728X$@!U;FdabP~gInMYA%^iqiNHkGKI9IP9yo{sb-Z|cGv)GDot%d#&Ev(|Q&36B z?7Jk5bLs-3A(UDaG(=#o?|bwsqO}yvPrfazf=Z3E5_C9`m5Tk@f*WsxiFa)OW+Yv<=jENlK%a;Q70v_vVb*5aeHuFM)EF`~;tWEo}VkEx}=E{CRNSTr4L z%k9}qxFLq&x!9#KsH24EpvLHd7Zra~XDGVumd%0!MVZQ}s{Zi3%V)-*%cf4(Zw^!& zDfE7~P}?F?RIv8)VirkZe zcSKrQ_5d?`4BY!0f7Dah#)nl=n0eHZ9jTjz1taYSO)l2ih{k?KH`d9%{ssV1#UUn6 zR}($t&)mo+d|#OwgMZ_m1C2|>aCYVvW&cZY89Kt4^Uk`d99*GCH&m$Dc+WWcWz`lK zOTS~&J9?%(B2yTp=bVzIrq0c>gr z_kr~#_ z+YaEM1sEgefJo=x=^64S^gF6F`tcheLO@gWlY#0-hc?6R+&-Qw1ZF}IY|X&t3&M^IJ zR?KCcJ9Z=%c0u4LL9;xpFB7Z_m4WEipI~foi40#ij8x)55NoS+X@X3_8bW)#FcG z$dRCxkBB=&2))_?{y0is70+V(AMxQ#Ti0qETgOaJ9}27lJ(I@k6cXwUML=;T$e8o- ztwt6*b;(lM91-h9;YwX9U`HJU;!gy$J{amPV1S`b3;pu`adf zhNpdGB+R9^D+h8uN;&=Ch_Uc$uXn;NSkeag)7n>&e%NYLA{?1*_3pt)OA9ui)Ww`n zZu&g(aC2|!goaAN$DVcYXSQQo%GOjH)te0z48fzLce6i)7^MZ3TG1`}v#m@ZuVSv& z7g4fVaXcO`Xmb%Z+s}jEHw;d9x8gYQ-dtF_5@j|uH#h3{MiY}HC56qx+t`49Cg6}o zY3?&LSGtZ>4OS6h_CO-~Y0`s$h`jv!k6Y7ytOBwDF~XE_7lk3$BJfW_vVurc?bWt7 z1R>1c=!`dC=y6+fd@zM1W>TZP7=2cWLAh&RPg+ZchyN$(m>@4=$C> zri5M*1qE#_Jpf;?he{$0wTy;=QExU@U$-}0hamP-Az^cMwat722Mr#WqqA}^^fsom znuq~tPz{YmAeHXRI+8+KZ~~XfR9U|CBzZ#DU!UpRZ;!|W*MT}pv+|RhWMu{(aUz3@ zfnGRn;NThpq6F@#|Cly<${pA`RW5$FwcY6P_y0dwZ9iHl>?q~&gLpVfUmv8XPQ_wB zhj;=m6u&;6Og%sW?s~hK2>1mYO~TJWR7%*KW}_ccE|pSRB0xXY-10go*bc_!o0^8C zIaSP41bW#?Sy?^Ub5#`T*(t&Pmp)NQ@_Z;}c;@*_;|bHCT3A{rv`(iz7*-s?UU-2# z%XQ}>ECgg(%5&jnJkK;&FO`}RLLi#P z?s`Pt=@g^-oSTPsU3r7Z`;QdUy}Q~8q%Ncsrp9(nL0@jX1k>;qk?(bzWEpV=&|&5# zIkoM9J)rOzpHF*0AV_d2nTLnY)(i}Dr?2m8B)rqf2}a$DMT?%@!`jVFhF(k7)ym27 z=?S;aY9||@ZYvy#?a)*KZxD-G^IMv4^$1P}dxhK(Q#GT!XiTCE-@a1bWnMal!CjsI zTlW|}1Ay!Y#sq0u9WS%^GC}LSY&`)?qv551VG!*iGGaA~N&n%7 zimB-9$7I8q6bl09pCdRh;0?j;&DaDu(7<#217uEESy-S}8qL7qYam3!;(%0PQv7vz zfwf85C^W1w7k*KVVPVe$m1D#}*Wi6=+5m8{vZ6t&-IPvcemD6hN0cLKIIOe~il_n~ zf?29CMj+H)-&xSs)Ye@BzSJ>iMRe0;pJ9J?`Q!W1G>~pXoieJmJyi#fAMs3D@IE~) z08_=lMGMv|6bzHQLn7csHGN5#`nEXqAhk3RThKX|_X9^YR|yc0_vwc-^!6s!HI(|y zM1IT7<=dlZ2DXJHA6MbPz9>FA{!GpN5Cj-;y3opj`nkcSV+56nc=xU!u~KCVZUaiuIwE;<>vlLS1#^!~dpl3Z(SHV*sHhIsr&8bFS)J;~ zdM5$YJ$OPYz#`(};&QZyVT7cMyHCBkJu4riogAvgdP}|)Ujt5iz(?ARU9;ohxQrnA z4>vrXi2sgHZ#8KKfVu!^cMb^1eO60X{w{6GEFm9mFd|V^35mfVXvA7>2oztS5O!sz zql4cGHbZqx>ZTNbwWbg!rY3(ZOfk91Ikk7qZNJfKvq+yX2pF1}dzojy>gr~En#TaS zgQ*Oz*`r<)&jOHuyDfgjZq$`lGdN*j^2;8{C!CB#a4Xf<73zK~m8&9>-%=jc!dp6s*Vc^F=rdn^L{bJp!FqRh} z?gvO3w^MpFd0F!YfMFt3!+*j*&)5Mi5dcQ=`DO~w%E0Vn5N+IA8b>Vc+_o4y#rpZh zwkTHSOx?B3z&>Aw(zxsSOGfSGvOe>#pBcIUXtib$OFo<6?+V=J-x~Fd7^y17<+=F+ zReE4FQ&7W0ODY;^iujPr%l2))=q_aNH04mZ7p*IB{zTswbk!fRUle=B<6Gz9pyNlp zUC0wlziyoEsKW#oKC>f3g<;IqElP?LSturs35fEfiy}hEaR++c*R~c0=3`-MXEv+O z|D9i$Pk6wR3sYMy!M(q`VZ`qGdWSDo0k15nx)ykJZ87Ig%WuVo+*54m9DmV}|FtovT2tjtTg?|%iY(vx0 zON_~Hm_`$yItf-jL)d)s$%&w;y`!VFsSF;)AQpM*<8HXNIE=|MD%$5Y8K%K{v-254 zcqT-Fs1U+<=(!&zMzx(A(zBwDcG+S@KTaAFxc zSG@fxp6I@k=RJA@%9&w89E^fU5motZefBNap87F5SB5;18>h2>irHn;L?^vlS<-3YSAp(US!&08iU%J_mRa&OO zBT@~kKto7n6$kfp_O*yJ4V7G2M3{|@f&tM?2{^D-R1%dm(P>4`Lvam(zUD`KDEE0# z7~f>6B&0r=SES#%Q*Bkv?EW$AsLMm zD9Z1BN2{!EZ_lhL2gHC0@|x@F&~y3>XMjgiT@zP9dt1XyYkXr0xfVAXrK1g$FQ4ZX zY3B!k&xapP6PUwsL=!j&SfNnX#3JQ*GBYYiCvEn7eE^)_daUwS_bxJ*V!A|<3972w z`>IqJFHtI~5^5Gf%rsdBPG#huAJiw_ z3JwEbZ^3(*$boSc_0u1DW8TPO!jDP-KnKa> zS;x2=2+@HZeD31*wAwi07sZWXS9JFMf;$1&Y#&K*s6Nj(2fad-C>XR4z}E}tKN?BG zKOi$@MMrnzgxozn#Ux{Oth=-o5c&TaFWTHR02Zzjtv^V^o6yu>sM%Fwl%PdV-^7SJ6ae`N+Bw;k1z&UAEy4(u zEk;362@U^h#vVQaKe&X-@psiE6iR?7nBPE7iKp3+DseJf$mhA<+#d4N;6& zktgHY(oCemM^8rT1)qPN-U(hie448 zV9kgL%SlP;eu25z7Hx6Qt7*})#9Kr?i_t{9;yMqFbSDt-lL+F;Ju|DWRV78z82uI$ zv>+y?Dn1Ye+QbqjYpLlWX@$-k>3mZA zDr-xCp;(C?Y4Mc24?y?DYF3Ev-x!CIQ`6FNu-ljd;%jx+7=3V$Qk4ad{HBA8jB>>6 z?6~h@uBt+!<1{%rn zK7h!5dD@FNXU9jLyUjCkI{1&n$*q_xOw0mm&>kG%xBt8%i~G(q5?GjHE+yBFtrwzf0Ih6q&@Q=-ZKf+647H@0yp8OOY8N>gT zY~Bbax{B5Af|pW`9*0zD4>?_8r7Q7P@q6b194bJkV!|HR^jbo?FD1duOpkzqxc59U z6H}~!TyztHb83VKh9KE77>h{)1BjW?E#t?krYl!Fmjj~#DhW>uhV9` zTi{e=KrnEDT7g0ZL%rzBDDU+K9paHi|&M!}w zA2hTy78jTCrKE#{#MJ4jrZw%DzGh>krrtt9v`ySM;2Q1UJOd>BF*-UxTQr%?%a&9< zk4Ym-&v3TB_5#z0%RoO!PL^42PsGKmK;5AYMR`FEiOmQ~)gwzXpMNJ~>Mh=yeCJ=Yb@^FRaS%QILpg!8bl)2=C9}Dt^4`{*7wWV%iiL!z3F=r zprCt7?O{FO16o%VyWK6#SH5J`o=fm-Y@&%o{8(A6U$36H!*BnbEJ(+ZaHLO>+1y7B z$+>Ve@ON}@wdXH2KQvHLv7#}zz}8prqzi9!`+eq%`#&$_M)ka@if}@$6rsR_KR}xf zwCo=oeEAE|3E#paVpslMoDdStL&{3dGpj#6p@E)c99!&H3m0r&I$k&pv-vBpZxpq>`fD&}sLf8iTJplg;Wm4j0Y}(nn(v+$Yt!I% zPA<1KDK(=R?2@E!rO7Y8iPtw zqL)nx2{m2?S`xafFi6}qIH*6+gA!xc#j#CsPg_#@^?`*Y+s?lH{1OB(1@-P=nqDV4 zW^7mM56ZtPd$?5Gza%0av1If4WLyKq4-TKTM)EfOlL8k5+Mnofp{5of$G)piL!XN# zV2^kVXmKnUO@V8404|W70wV##N%*J}o}!A|Lt8ezYYh$xB6UcjQ3@OR1gwxiLE979 zn=P9w)v9UwMM?yr4wlx%LA`+`Lk1(bY6C{o$DU6hmY^|sV1E;lv-g{VS1`IIXK8?t z!(~K1kw|zk}AZ%q_q}sCf%eJAwAp(1q<*H*pCY71fX# zJ2DaySRHsZlWwDoBqSwcT^ueEzbo8UwK~0tD~&=%h=Q@CoO9b7{Ue=_5V7)#NJD;6 z5mfFr>hF#0A&W!yEKVvK!qZJFf`$xuoeFx1?DSvhNtuWaF0NG9p{Hjy3>EaKpcPcU zbbdE_Wop62KOuuua;f`fmLtQ1MV973{c++K0$GPzJk9s{eQ1E$tLENb9~PGU1Z7kn zg%~0?td)eJl%r1{8yQbRFguTg1L8mvOqP`;$8eDpYXE$zoL2ul2!6wm2FjN% z*f%-rUmhoHC**B+@9dPP;Ou(R{(`S_0!&Fce3pvhYM5u6!@&%UjGgbya?}H?;GV|_ zks(umOG4d?j;l+m-9PIJg9ip$!TJ9VT&-@urO^%yc>8$6a1rR!e4IM9 zeSDl&yd82*STS+0x%XU0+*J10T_udZ>-b34>SX8X zrq6J8=o;fk!XF7YKff9WD7a3p-^o`ISJjuy7Xdi0!SP3G_UId+nStV_5X#QOYjH+l zA#A}@5>;-4NPYgQ-@luh-tQvSDkboyE$yT`?9HI!<541Mp1r{g*k5vd&3f&B_Eo-B zyvn^fN&nnC#40K7x#_aZ^*Ue)QHLktHJtRQ3F1EF*~_XuY_jL&;du#aS%b;ffl~l2SA=e(p|9-;SlV12Ws+5~D^6-ROsoh>FJqBLMSnw5B_IJ^*$-4{kh&Pjaj%d`ClAj$@^gZS0#Ep(^AL` zCj~dj8b0A)fG$5ZVa2s#zn2^ESNrI^$^h&{aqlM`< zzxYJU6h4voGv(o`MB!iO`(Y$zJVy;EQ!SJIDmy(s&gXXuCHnkcq1gol-!{9t zZjYvb4Yfa^yO2A7rwRzvy!-KLwACE@=TAI=>p1$GD&4R0U$UiB!)o-l?y%CmxY1N} z>G%-oe=HhS?cAdmgMx)jxe4W|GnhGf1?_biP7`H~%Zqq*R1-%JU86$8BooBwQctAr zkeRAHzozliQqeh$)ti4`uJLHqM>GCSAc$+r^%f#fZ~Z}Y=J-<-D|KXr?1=(qZzqZ7 zl;CR?I};xjBW0uBI!&r90*yjkTuctDwdv&`d@IHiWh;I7X3np~K94rAG$5GeYF3m{ zI2jeY`L^;+Wf`gOTSQfVw-}7aS73I)5gXm38W|L2 zSfeX-GIk9!mw`7WW&L#)u3;3qf)~-J#(@`0a=y+ZwF!CN+rQet?%eS8!~u*OA;dl~ zkyH^(v>=~t4RgC7xGWEUgE@7I4kzMhIyWgb$!&kMjyTtE`jk1(QI?QkYqN!gOIVmf zIB<`N>tQHYhJkPEBED3Afo$U5UkF^F8(qUTucJnNDz)$Jv@1NWxL|!_LsehnqD2#s zLx*ubJbZtFebFiSDL0AEM6eIHEtka4$xJ+Ry4(J|Zz@v}EqZ({`3Xl?w~mPe(qyg5 zYc2<(BBqxaanp)b)NK5^5@*j>7p*D~4%fI#GCM{eb!b}1;a3;kizc~PgpW5FP2~kA z+P2EdP@T5Ls>~^)(7xzKq%b)NGJ~pRqU28V zE{klev+RQUYjY~=OKXx7>NPe3+sZHZ{|&Hf{kJsrk1TMwuYhhI&~|llak&MmgX29p zXNUfVwz&?aL21&5&j`T>2z+R1+C=0@G*Xg>!!%~Vc^MWKMyDaWt)B>&+E)T|+iJ_3 zow-*L38P8Kf!7fhHomTls;Qn;UPFjS-1X&zEN35JzWldEk@4m^k~8#3XG%FeE#IA> zVwRmz)8^&k5x^zfy{VUVmLxZEtktDXg3;Ey{8OeDNCs93&O_q0pIBSVYLyN!kO1>* z)*sHz?cRg#zrwUQAXMhP5{1lpU@h)-@C(=sZ`?OwaRe+saSA$t)nhXlkNkth5ph3H z^Pj{LB}5@*#O#K+ROU@>;bx$TVsO^{u5ZtvfvJCp$IqvaTQ(Is0pA33F@?TpL$b|F zz}wlS@8CzsXQg@)tkVV$fxpa(aCQo7r|ix|oIOCn|3*YWfY1uY0cMm;C*F#HNu%)N zd~S-wfo63FXk~r=Cyh<-`?b8h4B0p&A#FK0auyyIVz1=&b!-Oc=HJ{nTfy|gkqQdB z&j0pbh$ke8Smv085rWJP-rC@r4aUwPV_9j&%OH4$nV*{O3bVFFucjS?>vtz`s@4DhiN&h0B3!+mKOP0;o zE|QlywzGCxyTER0dW|PyL&Fy27V~M)Z*)LcmHq8xUT^#hpm-Sj(8RjHVV+s^Isnt%e+iX)|h&7Y~w^ci# z&2Kp0Y00!ni$_OhviLnt$R(`C_s5hRyvXT&ZnA*~B6sCc#0qa!1PiQPy+u{lrBTzNsY-z(n`pXXjsAUUy*4cxtRk_>v}i;DB^Y z^|ofZeSM4slR9&&E?d;++}5MGwRc@Qi?=FF=UEW^+mpziv~HDm`ewLPkdhjP3i7+& z)}rCUe1Ekvb)q~i>1`@9)&TVHtcqb-uWG13A{_o*$c2Qq55{L$+r6M$YqtdNXJCxf zbhbo~9rY;ul2$Bha#(S8#-gbK0P%02A?8269`Vn4G8fx+6kz1ewRm+lI(KigJb@yAHzs}7M-TzKiLI!>Oak)kCTVC!~3G&;4}hX*5d)#)BpYm+h4?@rXnWWrr~ z{(|{K8=WhzPZT0PGDS*2co)K8QcR z`M!*-_2-Xzaw;kc5y&FKS0BR8by|Dt<9Vsub4x3L%2GTNH2aoW7Hfp1z2f(EJ~y7gx8Sl2BdSTcRGJvho`rQulP5>ir1 z%%kx!QPel$dVik~g@X?Kp`IfcjmsEEc z-5wN2BWhMBhzBm*!hPY2iFq(ijj;&u0*yTHT6>{Nz2{Y`$pJts(i;6|FrVKmH!c{SPyGoq5d8-D9ChZH9pNZzdtJVSN z9%MN1RODQyxW{k7qc@$p5D6qJiOrXopL z?tSpuN3QUJC(mH%g1yik!7+$+$`(Y?!IY2rgJAJ#g;Y2Q*!#O*btAXYRUwa4I)pHM zt;9O5PO;+NPQ`HhvL$W*bJoX`h@c4UjOb;7tx3hlOH;6_A6~1?ZJhRlqXb&0ltw0hh9=w zr&M@yd2(`k(G(Y(Zk_P2oibcG`RYciQace?(udx}s=EG7gkBT`mcEv`ehqt~j!BgAOFJ5BYCK%;hDX^cDb0XLI`HUXp{MUxYn?dQ=h0Ry zMfCh#RvbCM>cRn_1=JSu_4Mt_BLta2N~87j%lG`-FaQ~^`*vF3KZMV0-szAOFm%l#P;pArO&iI*FEyhvbXKdweB<~`ip{D63%fp$qQ^^2dKghr z63bv^b93m0eWEugf`-8IK3PK5S=L?CT|&J`f|5#7ov3BO1W-zuNSLjh)%2jCqP2t( zuD74+z_4WDr<&zrDTv zQ73)I5~a%H*&q#piidpV`2M#OUs4jC-OFAq$l6sMho}ev1tmUm>F(ab%xt5@lg-zv zpAN#Z*FIcA%;d%z8#Q$Vcg{LqKP7D!qhrd&$Jp(~t$jGoy-E=mml*k4x6b(>Ih{jN z^#q8j00TF!^HSBaPT*Oa530#Ha>`8P7UVilo3r|Zgkn}yEEA$?yu_@l&F!Z<_b14A zMP=F3h_daWe677@%cr!W!R7g9G3wt>Q8Q0ZCmk;ZKfj$j>*pkDajO3CvhvCk{PV2_ zkAHvY)avW&!NDDgUbup(8`96Az{3YU2llM(toz1p)+@haIxvU|2J zxS`psI+pSlT&i+2qS zP)HS;{4qY#?^FKbSR0OsRirs#mT<~?o-Ct|MVzgsjFyz0&Wt5n<0Tj*fUVLS%f-nl zI`;7Ll7D#~^z&!`cgi_?rx0D}Ry2THg9QSi6Jb$n{l-Qx_5waHCGUz76JRONn6KT3 z1k7LK5ujwDjTjH%L+#TiA@dGvTkh`{f2Aa=Yc_LoqaYz$!@`it^GqZ4e<);d!Yl3r z%T}jtDvU7^=wN1Fqu@R?9E_WWe}4Z?HsHIc%ymn}zc<~*#vt_*ps|cZt%ogXjuoNH zYNV-tO~6-#fV4D?)R)&M!t+HpW_99w`U}MnF913|6d!_@DJvVegy*$x^bDBscHC~= zp8Z*E*nrQzS$t7*a#?+GY_(){S6JvBy(+TzHtb1Ez2md>3ZjtiS_Xl?4L3J8$2Fs% zgyPa!Tcev4o^^ZBu)kZsZg;$-KZSg`7BKr9b^fng-udWJTZyt zK`|?rdgydAei0nM+c!<#B+`@^EJRij)J!zlZuQR6BwYL+iu3vR(e~nt_n^TD889~yqs15{rWy(FiJqH zD;g58{__}uU_c1sKt7Gtsx~98f$b=yM25KRO3Gwt#pjFlb zA<@qkKxw<#&c(!ZG5wMiP~;d-w!<~0pmuW$ZTelqz+fwYTafdvdkB$Yfc)!OUW+ke zH(yU-h0i1I>)P77CGM2B=bktKCUhhlnJl^5p1qr#oSkJgj;@?M|2?`ARuVRTGk#Nl z6Vx9RiAlX9%15NA+Sa${;w318DJ7}Fhd8VHDb4M6n!Ii;_n0ezDmOBJ!@>ezm5cc8 z4Vv@u$oX}|8Dm%%gug$ARXcFe$VU`RL2*jD%YKi9;%3eHQH2-{hZ_-Uk(rLEyn2b) z-~@S_e|NcI$ar$y5bMPN7s#Q1Rg;D}V#0^nvS~8nF}g1sDz;PV7+gtU>}tzh^}*KzB1*AH8S12nCovq*?Ucl>%B~>>ZwM^n`|9T0 z=F)shb|yt}6xH^Lx33#wtph~Gq78TY`!-J0ahKh?AxEab+B$J}A`H*3*PCYt+l!E{ zl^&LzE|1Trn+X6`-Wv7rJRQItwgOE53g@isk6dI*`EpUaFe!i06=A$7ktK#yB zn8{e_TUiz95?88^Q(=g5g2$h+`0U1^7TwIEII=V#-lMcBN3a*G65$|FI2<@3i|yp~ z&5EZRFqD@Q5D@xwbdVjpnoWpAJWEPT)6mc;0h{BO-?g=9CFHZ?fAqPOoJ`{=o>hQI5In4dhSD0gyoPZPe2qkgl#|XrAM{xd@CBuBVUtheqyFVn zQBqt!UeW%H03DTU6qcQxmY-eP{JZG-BGMO&YqDTv7aI|ArG(g8y0ns3R#DMV8h*w1 zMcuTZAb;98lk8}K-@waD$IUI&uqHkxW^!gGJTjZtiCmcgiAj-eKT4>E=dULPCnu*c zXJuDeV#t=?v)bF4or5Pm&x0CQo@MT+Cq z8G|UML8dezBe~D@x1wO1QW5N7-mKLSA#YkUC`yiL)8ACaY~s7U`&dAmB+0yCOPfo^hUdOG-mk%>;&<730<^CmU<&%RE>;l4t~ zC@w;fc#z|`#bnyt{5%FC<7;V;wy;niKKr4|lNxVu~bt+)R-erG0KO{$Ku-%n5cGY1&Vt~}hTgih1s^S@! zRLvJIVTosH9yH;)1nmauF^R(rT#d^7+csuFY3gG&of>^{VW^f$qKf}AZj7zKCx z^lYERM^(yywM0VM`&<9lzv|e^=5=ReW1IU&4F3cXK4DU)XF$X)5iP!xky+Q^;qD6j zWgdd7wztvBB!<`4{XDUQh8{JaoV=Jzzd2ethG1!TyvNrR6zop(y1DxhUVW8>o}MFy zv70n9V|oN$nV%01pD^L5D2-qq!ZzC&uY)EL*>Y)yaGRLc)zIoAAJ?AbfoKT2@~@C) z7LZjCyI*#dNLV3qS<8;+u& z(EnzVLuXUS^7H9ac-A#%FF_TK7nODF>1uBz{&PK=rDSB}5hT1D3CAN-EFkjvwjBt` zVL9!)8%ZM;6r7nUH`^WGsygBUtFx(QKsM@aXb+XY0d zGcddYKkklkjn3Db&Ke2|tS3_b!Xkw;;K~+H@2ZNc;l|Yk;H;QCQDuL*`BA(fXtAy8 zzQ6)RH>xxN&!&l1{`QmW&dP^)IQAUk-_#YUyxUc9-9Axeu86(-$u5D z-~@Pl?1lnWT*$PKx_^SzKN*;fn8V%x&mIs_JHo~~7j^{GYj=FP8)RFsQoD^9+o(=J zNs|Xsnx~Fw*O17b+s_cgkyhrMo#0&AH_X(s+N3nAc!_wYY0d?3wcnK|A%qdj`3&sw z_!<^%nzh5fR-~!$@Z03s?Ok!EFd24QT&&@9ScZj!J>1=$uebcWXxR!&?;8QaMkEo) zX|I`ZKg8i@(m6_jCx@l+_Enq9mB?C0`=MfHx9`r+?L5+W)X*!dy$OKg5TC;fepcu7 z-ah7qN%yv^EpL%+7(RgmFIlvdH3Fv(pXq4ps}E$gK8^jqeJhk&_&znQQKpkEY~How zOlJFJW5H#0aZ(=cz=)0&gKe8 zfn3Y^_fO;;GnosD z^UreE!|55tz)Ne<3IMzuqM;E@nia)Txz<<8!<`Y!kf%x*%uTvWZikG=-ruR9cHJt{ z+S@9w(U1zo%{;mB=c)}7BTJR}`iVJETA7jJ)=q;Db;X^#r$D`X^tYNx#CO0t7w`3T7>}V{iPpB&}e|Pi!tY4u9aerxGmH-Z1==!1D-RL2M*+V z7rLU*SSZ+=R#S9CTlY43h(Hy}KgX_38nJG%3Y!G6e5sP# z+&`N72+kq~e|s73Hq^~nf?x_BVKd|8@BYCGsVZPSUj(4L!B<5MPF>q848gwNO&EQ= z_<#PxHD0;oqTlQ5>#MG|FJTAd=l!Etx^aspizoL0ZJvODoSvPX-Wgz4|Hs>qz@n`x zDS=tq1ysEL0H)YD{<_v;GG~f}%hjlzsDw=(ee_Jf$>RMc_P`U?zfVPOH#*F>T~z%*{qw$-f2c8Brm=I=+22H|4x7cIx~6KN1V77s5u z#>;RN<$*{QNKZ%En50K{C|*ROY}&8TfF6y)>qM@PnbO5p^7C zL4O23dRXq9y{XZLA;UB*n!32eBqLF&R}Jq4bX9-11uV#)Uu9%gI=$q4ZS~DHG|bKU zE}8kLxv9y>$f*zKhoY5Z6tJ-ofj-OB=y6pU_)VM(KclAVkdUl1513;L`T}0&s5E_n zHA3X7I7TKG9M){XAS||wq*#+|mFDPD&f%s~n7ttz!6qJtDknQvP37gd*Z4 z@u(&!G+8(b7B)6MZf?cWg^FPHZW}gKbxSRe$3SsdWEh7M7A`I~fV0@*l^N);oH_N< z_k|R(Zp6;5J!9MC@!m#CYArl0V{PrUqoXn8eB6_R8i}Uj-*^!rDNT5u(`Qk@Sy%Lf zV%PgpN30uirA1z6D@4n4Fv%w=mr(2>6#QkeADmXR$P47L*5JxLueb}JD;>zrp z>9qeh3)DxYzPC9NT@h%K2N}s8lY^jgXG|Gl%!B5nYkM$^lHED$nWdKg$zbO|`wx$d zIIPw~zkrKD`0e(9A|vh?l=luSl9~b*zvc#y1h)uYZ4*Sw=&I`S`&=>-u?t6jePzn` zumy+o5$mokEUhZwM;6z}1!ZS>1A+(~;NI)R_{EEUt z$c`ypRv@gOpRpYT_^n^oFfP`i?G6qOcq;(x%<1WAe`-}4f9%#KMYwf)b&H>Qd=$^s z8Az!hzJ)~@a)AA@a%7eUH)c0FU-O2y%D!dV41#(V9y-|F2Rp{l&(G(3MQF3x>nq5< zbPhZf>haoAF!PLw_X)H4ME?#EZPV?G7Qk95K(#D88OH2CbWojap&WdIC)L{Pz z5ZxmuI{+eVwa5SjjQ4>ziKX)jqVxItCRf&sL5FZvb@hLr8|MauU~sj)6_t4 z$3>mW;+#D0>wehF3(SL>7R~D?Pc_56%hxA=OhSx$lZPyP9i5R=o0eQ&@WSqF%Sa$Q z;z+5Aa?Trfv6Fq+51@$g@or8%9 zS(VLhjk6OYitv<>8gN|Jj0A?3ge3-y2dkS|Sk#yO4J;~aofcKJ&717N7Z`DWhIO=d z<1ZYe#FASnmN92%%Pl2Y>U#X}xsqxTzE&6WEg0B=G93`wHSkKhU0~-xrp9y?YJPc| z`?j@yXVo9|O3z~OlbaL8`V~I6fcT%|wr~GzEcyeOSY1R5fL6<_N!1s@+D|MPnTD==6T zqTT^$Q-Fzy979F9LwGSTH8J7yuxfd2c8z9oD!kQnW@=q0LBC3HOgO8T=wfSf3N;t@yw)XW12j?NHPIT{?(XbQmP&PNoZ_+}A?pL@H(VOFXb4qiw z-gFNK&u|TGmOV|kWSKG=Ju>Rn-jvG=N09`X_EZX_5z%kP8n{2-W@)ZE)aKRr{$@~& zC-k|w2nGrZ>nJO_2bI`psVxxPyrzBjrvvdEYuMZ+{cFI%%=?Fs; z{U=e0A#+Vl>Cx?`8OBeeKv9rmCQ#V`uE)SLJU%)a5fwFDsNG8|;ee^lwSEKnuN!dR z2*+U$JhKP%N&qC!&*bHfNiNl#n(}8J^U>)Cu00q$d-#xZYe;8Yii+pzopGAug`lR= zkg4-sc98&X`|u8Dp9nXex577KZY#!P|yBp^5#vj{x}M$&<)#+)``;cGB3K&!;W zlhM87=)2Sh=>iy=itCqgHC0srEl@iEJji0EbGmL?fa}#*HK=i`gl zZH~`N#~gk-{FH*7_xm*>ZpOy+){O$8&@`XDb=CsK4V=mN%m1i*tDv~Luv-@m!Gk*l z3ogMOg1fuBThQR{7Ti6!Htz23?(Xh-*0*=nsrs)@oqe~tNL4z7UNp^I?;LZC@vKcq z;VY4-q3@zJ*xPuxB`FbxtS3|WXL(GBQt$$9D`3FrN}ug%A3;>aGKhHPs@# z24?Y!(#n#RS`YTRtA+9ObUa*otYic{QMx-8xDt4z6!^(Rrv|1PlOrOwD=#-YvqgXtuvx$wRQ-E*02b|s z=d9T`IXHEgDa07$B1kSz@gi>T1E=o5wPuk(K|c;ySvk9^A0)JUe*0ypJ80TahmLDb z7l{Hx$f__!g@q`CS&AGAn!gomgh(I)C$+kQY29Ge{;c`=8E}LEHt*EsL3=j9`6!dl zwk`-WrjmnLdEDZBy7g}x?#h>Mqv3p~KmpZ8p{+2j}^?d|>22OtC>*Y0zB6V|}$ z3L>*l_LB~c_ueitI#LbZ9}Nwu5JB7E6XHn3mGBU?LPP)5j-z*pnhgB6`?Licg)=Zf zs)Z`?eUY7pr(J2MyMQ2H-EW(cU*PW05-bbbA!vX!VCV~skzu|>-`}{Tr*OX`WyDIY z+(3WjCW|Qgm}`Qc3-atzl7G|wHY6owuJX6rZ}gF16_+#Xo6t-vWSqSlMdf?aCmSao56vyg)jxokeHI-g?D8+jM6>Nw}%>r zPR}>4dw%hn~6_rHbH{I)g{_~5ixU_T=g+ThKNxgb1zd+z$ zr!}}@*As(UO>uZS;Sb3v(Sen^Ixyolpyawbt*d4V;wrQUL$Y$7#IZ%0F{S$#q^eb? z#h6Hd?u!?LJhA{yckUd0~5dWBI?D^qbyiM+%K}9pa%8W8hld-D&!?`cn#TV7 z22Cp)2oMyGT61;SZT63hTzq^yO#GMj030n}gH_A=Cl?XDAtz<>BZRDu-90>rJ3rJ6 zvnMmT7pJGYm0?)8jjCJIQR7lm!|aT4vR^7I&-T!X<@3i2nU6-TN}~z6ANE`u#!}d# zmNa63RwbcNgZv+R`yzvV*W^1h%thCtd@*V%{BB!w%XP16AtItXof&Oy1{q1Y#H8dD z>^M>Xj+TVYF|C)Jm_2C}p+)|fWyr!@;d?S+oi)Q(aVu$C*Jw67J=*iY!@=b+{??yW zRO%%qxjOHfno0rMrUW3(CbQmwy3Xy7?OaHjD!oqc|N6HXU28W2gi;%Qv4Dm*QH0=j z802B{8-EEj6Q+`3o&)=p3$408JAFLF*~q(sC#TJkNC9{_C^#sXvP`^@1=({dx8mnN zgsdSnlca9F1nSc+CWOS0E|)&8Ly@NdX_WVVPN|WPf=|Dj@f|p$3HBu9ax&+Ub9W3y zY*6`u8Z<3fF{ST}e{7lt6$RH0P+G&4mbdYs#&T0>lGj-`l(rs^IcNn1F~5xlhp=@) zWOI4DI~a6m=2}`<4QHi5l8y1(^}74CGogQDS!!G*|B{aM z3Q^zdIoFW101PsbkxtEm+YhSDUy?qrj)YYw|3m@y6BJv{w-~0edFACYCAa zpl=Y}V%n~3!vv4&wzuzBT^F67-YK8c(+Y)fqiN|@AFowtGc!Qj9C?4Aa51dY?h_MJ zwXyvxzBZC9gl}>HE?sM{2?%8elZnGbot=Y+#}Jz}G77wG86Sy09)&-DRfddv+YK^V z;IiuyhObLR5d4>WPFmRZKYbz}Bt%447Zkfh;sziRqW5vbAE%@g)VGU@N>4?d?a*9P zPy))0MNn-8io6#qayl0=p{!09Dl{xCs@iWxK1jvz`JhZ2R;^Z6EIYva;f#@0kjfE= zzQ#blAT4%T#@HU90qu$-^3DLz^UW<#s>igk+JYVhMFFV8&*rD`>TKL=_X;cCN+?eg{RHBZ6Lr zMvs#EHd{3Bf{c*jg$wh-%gdea+^`!J1Mq5u|2%2gb$XqQr5dz%te?A&+M>q_5F{6% za#u#8ZK-$bGe>XYi4j~G;!7N$#V=C?tR(CiGo>a-AClU(x{XauPXi~d$HBpx*jb0! zpTB<@fLTpU`a>^W3Q`C=yG_l&Q;B#tmTph8Hmio!z}}-{t%r`WJwB=0H(} zNrXZ@AeZsCWsfS1$Ku9k#$;$%vUVs@&Q%_uAnP*l?S|X~y4A{y%b_d-Kf#J14pBP0 z&9+y;&ypDQyf?ib4Ujt%Ek>v4x+2EM$HA`kR8_&)v7>@5po744XMdpWa3xB2AEmGT zd&}tMX!PCtD)BA39_fZ^l|MV_<91japFWf6`1kSs%gD*e?cpRor{_@2(v|4LXsuWYixrN2>MXsAYkvYOiBK0^eNwrl6=c>xx&@h8uUmOu;Y626+Zvh~~n zMMKxB#Hb`PB2w*2xqy*j*wE;jXp8VV{-jDQiYRv1JYq}&dJMaM&o=Z=7+p8WzyrQkqw4@iEa&@(iG_9f>Zzw= zqq7Csg9HgZp2homA?#?YcF@z?O9XHj)%X9apQXhVG;M)w0m!rLY&RC%6jUv{w-U)v zuv6}pGE$D72rPW2T~#_k!FFAVU>QKF6J-R;rUaKnDPinkR!EP>Gt*>5 zv+L$V@4s2GR3vkYyS+dDc-nRrhMaoP5U#ebRsM;GFEYROdMxN0fEcsgY;SGu-28p` zgjBuF_*Z`O51jqIy*^N*bItsXIr5Z_qp%uhtO(G$B!BGHkt9cCGWrs7PxfMkL-i*| zq^IG6SFNtD0`BO`RC&rphCQT^Og0sT+`O>^`|ItN6p7{X#N&FPpX&Yf5wg+iv2`;j z#eyXb5(Y`T?a%e+$L43N`FhKA#@a#cVRSZEb45kv=C-efPL1_4a}0kL5r$2XMaMN2 z8+~%)>)=UZDrK%!5( z>3e*bT7|p4sDgsL_*aC$@#8HnPR(<953Sb?uWTcs&d>KtGgH%^v>m2uqsA@a)N#}A z4Gvsie2>@qBd{R(*Z03Df+<;lhqS@CzyIQ=e{y$RFC!D^F|@r@?HMHe-Khy*U<+`L zec#!I!jPsHmyqzg0`{_^TxQH%KYrMKcq(M51w<(!vJ{eby;Mnm7FH^OVm!sPv6 zjN1T3*{y00e$m=Gnav-=UseXVn@_Lt2GE7XB@!faSiavw!()Oq0)~GtEi(ix1Y#)9 z5OFX`Of?mxm`EopmS?ovnfUkswI(Rm>*-Ds8E~c8zboZanJW+ZucwM4b8cEqL?ofSvzkI%eyi z!6Y#TE!60YurD8NPAJj$Vqu*v;h5AlQOJwzGR5o4!$yH>prBI!n}&n^oH->ORTgIv zB@@%izQYX_7ct0Zhp8FI5s#K&ldg*sF`Y=(tk(lwus?Adl}q^q?m$O0v%5Z}BGDv~ zHIdbO9RdUV{qtPaFC;KM|b)g&o>|4v^MqP^?i9F2qA>_LQ5W#9b3@qt} zqc`Rcc3TO8_~7v0k7kSHU{nKG;@dp_a44~}-x3diK)Ku77aR00-J?lWl$4a{(WGpj zq}vPgi|p(kMJzqeO;~vxuEqs>`|q!x&-^q=bgLeFOF=g?0}C$aS2?=}Co}4ZR4$M$ zc;BLsY*hp^`)3kmup2lS3%+$g0p4QE#9*I`CblG-N z$g`f#o8Yi(rw29I*Br32<1q`cZZD;{DRYUwuB-tz+*hEr`#;qKo4Dy7@KpPw_y?$~ zskxF-mzL)lUVgkgtEkWyp$*yq7!9qC+f1COUnM;v^t$e1Sn()Wxlq^U9;4;@70AzhUG8&rZ@P;Br$QKXHzO^NtU^ z&k=1?t9@ru{mRun^!0tGtHACdLbkVS1dw*W_Wf@7o7z0z-roL~w=Jb0=}K-2^k=8J zxw&h+Itb7{uLe8rsTHvg5b@Zy(l&iQ-=m|W7bcKoItyzm*_c`Bn5a=3N#lpU&huEv zqVG!gOrnMN`<5Dm{aECdj`^#WK0fesH&nNZ0RQOpIGAW@X(^od)(2&71t=%`FEdlN zRC~$XhE#ZGl|lGb z1qB5g8#c&xvqV8AQYI3_3@D~BZ87GQlFw>&WZF~(7E)?r zU5P@wzaj%>)QOu@6HgYBU(sTF0fKBY@m5M$P@bdNWLHEFb9js#P=&f3SqtHl9^q6g zW%6OGn%^BtM}D8~WSdhJw`kO;dC$cQ9Brr#0>}yq=@hWUae*tqy=$Q4db#nwY?gh# z*$D{zxgO$@J$${oJ@yUt_1iy;f=E*PNwB1NXsJegan}h{^%3mHLu&mT(J|(kSk&j| zkLBQdhEv&WR-BE#02(5Yrbq{jczSw7)>z+EdL*&t~cr~M31}6wq%Ph{*E-6(k zlOy^9t6{6{yU-TTNm{yR%vtQ(?^R`FqB>#h0fG+D@4N|j(}nc8=<|+MHudCmD61W& zO&_vcW@CMJdRi|KCz3ZcL>c`zbfiZlV#mm6OO;cH&?hH=rRi(XHnW*}9i(42Lc*7A zaDQ;&UKj|QUD%on%p4XD$R{=aILIGH_bb&BONwW(vftXERad+I;$-|x>hRr>k(Ta5 zc4eG%606boRT8ix@_sU~u%Nm)G1Rb-aK_M2Q_TH4yiXk@`6F4P&oEY<3^g?9>C=!& zF)TWfOxsDd)h0n1e24$26D8CE8X?we_V3}Zh7Tq(CqbA zgY*LE;%V}Ik5doggf^65lEh&~m5r)VF5D>6QZJw4WnZWabIP&E*!s!G19Xc6)S5Fd zqN67OvBsj(4me*fF-_(Fbb-6Qob#XXqtI4Sao+BMe!v@gm>|gZeBLjxP%4t4PQk~+ zDpREbf_B-`lKS5CCE^Qr79*o0G@~O1deT2`>;0sQkAOW?vH+=T{q-A?H|E+=vab7a z2}L&GfGVjhv9PxE_YQ%vU`~haMow)cX2FhnpaD^T_YcNgI@sS66&2Z*u_3Ve=x7)` z@=v>}Omc=In)%hJg$>sb!gCzzn~!0qv#{0u}XpJ z3wO~Mn0m%9gs!;hk+Q=+#a+KSF>C7$s(&vYWE7DLb!k3oqfF~Eqa_dqcn<56DH+ebqfg-5}9cL|P9H22w+jhm1U`E6r@5o0l6c+y20$T#x68X-EPlT_+gPQ}+zi$35=w@-= z5bV+31K2YJH$u{%Ew`$Xp@3(NX9LuhwPu5D6fk3`WDkpMapaZ;AN#?<)t7oNfHE2# z8E$K13xgCD4%cfVxDAY`)0^Y2%u-d0K7b+ycuNfknJZlYv?g$dyw%8Bg*l0v^#XY6 zqqBcAbVbL;#x7+fWo7MRO|aiTxIw)EJfpFZR9`bL69@3}q5u};rkoag1Y%hEYWp~# zr7xrV7ZY-r|IUkfcUND?sP!VKk@Zg@Eis`vV`3cq|p|H6cnlI2H;4wNfQr&3% z#)G4RgA-O1<3pm%8XMb1|7d;5lMfXU9=_7*%770Ero_dxV!)ExL9NzRoxFP90e(*t z-PIR{<~I*St61G`_B_n$u4PW-GOhu+3^_X7wYYh`!|c$uvA5Rr9g-u43{DQd1>1>K zn`+lSA(yGqPQ7qdO8oTU=BP$HZ*(8b@YU(H2*U*9V;O8|6|ndJhqHq}h^s#WYA*8a zxqq{~DWn66M`d&+!-G$^qA0P!RSbzT9Qk*++RZ}?vQR6@Bg*}bL;zP zzYm$ceqUcdUHY+FZEfHjkw8L34fst=uy6YKd;(Yg^L$?_X(E-isH~BKj+I~|UHZp- zRAk%h1h>b-C1_SfL*x0ZcG4S72B-Q#(2tReEBGhv+48NMi_1lyMEuYnxW+-#puAe^ z&5v%1>@$}1cC!zlkYhmP<2LS8x7C{M^;rrlXE$f17(*Hs7XA@z?B?ljq>*rwjVFw@YWnm_%t;c@A5?=(0#FuL#X zXVM^-7_|hbZbc7C(mhtJtB%$ltcQfOkonfP&+;-7! zbAlyYuOXKLjPfDD!OPe*V2mZoNy*7D=|8O&Xc;WHV*oDbD-dA=D+jc9gXJ2ND~QQV zzV`FGWB;Y4$iBXmxrFKj^jN`ejIUsePl{BFkC7{B>2jG|&@>lnM^ef3K@ZKtA)%1m zzyYQwgbUtRNYf2NkU*7AhbK;xUxA1*(=yQ1WUs-c zZM?8(L&qwge7BGK*NOxG)z(G5X!UtmOl3YXz0n$Iq&$RwQVprk?SS3EB_fJ~UuySY z?~P!0gm3EM^>_dyMts)1^-ayuz2e+l$Q>a4vmFFP`DvUd`FceXUY|p&igJ)Vecs<1XR!{g66P)ePKtR@Ki2 z>g$IVqc_{BL;W-T^wBXffvfrU1nJ=nGq|w{#EL(bC%wOXh1csZda%j%d0FntdB_c6 zALt*vY4S`C880zHTvHn(&N&)8r?I&G$j**f-*&2JslQmewg8H2_4QE)eSpR#d+y6v z8DF0o0GK+|MN`!_v#~*#V$VDSo%!wQ6|YD>=Swa-m_%oy{w=$D7I{$wNaQ<% zmOCknugj|tGVjb30QO$XNR9Q{?pYofa4#Ayz$5Hw1WtWn7C5TZK_|H(ge~Ct-Tb?y zWmN!&_0Oj-=Ev0AGd!W@r@XCg<@|o3%oZUokt=gc+g*A2;fx}1ruTVx|2b`5&+GMM zBu|zI72>^nzIOflHy*n+Ha;$g_nEnv*dVu$56#rN0<}t)BS%#H4;kGyCk=IV?9;wB zEX<6Lx;mBx8(Vyw^OG}N99CiBz}8S*V{d94_oc;IHBIe|Z&>WV6+4yFtM2yTF}Cm5r8M;_754{-y>eVUSj|QQiuho`;PE+v!hKW0hM5P;NNd&5D3^* zo7bsYUvGiq#?jHy_vl?9k#4X7p^@-maQ01?TVK`A?h<4)xD^1=0s=Yv`N64=6c!d1 zWw}#xbHA<_r6(jnDZ}IpAF+vwiFtUu20II(#7+m|g|gU9XCNkXvze~6+Og|CcLiA8 z+`>Z%cBHf9Tvf1X*?5tDtMJEF02@rV(CitV0JNPItEy)UzAdd@wU3448c_D!T1vHM^AQp>?RyHUJp^j92+&jFBw+VaZ$M(!-bgMTg#)X%I*N*@9H=l=dLTn+ zYm6?K@`wa_{^PdLN-G+tcSqb039Kv33{Px}?{g|;s^D!sQpdo@>8TO4r*-sKnq#Bg zL~Lv5rm)CJV+3IiLq;yJrfSuvV!ZfFz^!iRiwABC+4ne@YQK9Zn>p|FSfShKE@_a< zMVTTG?yhZXC)4N?Ubo8q;LE1zpfO7&WX+Q`Yfx2D@@o7#QMeM^H30R;7TD`G1ESnz z2^h>jLx67C#6}5@pQ=^1$PZ8qPDu#d8Ew!a#(kQkswMP#lXb81{QH4QQ1sBzxXfY9?UxLdaIxEG{T0zHQiqv zH$S_xKThQU5I|G65-n}YOPSs~T*!0w`c^WSnxq4K_}^mzP+*l2Ex{B=lJO<5K`|f zVB@-VDB-0uIWf(4{l(bQp;VB#)0Imk=ZC#PbuuHWY*Bu0Nk>sD4GV4Lj==y=SA8@7 zxJ=a24NyNXDjFF7YmP8_{g^SGRy5#OKF-wf9iSXpX>o@5ZFj1~B&Tnq@+6Pf&- zf2Iuw=vxmyUa`i~)pS%;v{f5iCkeNB1_B33pae`SDk?&diGuG97lRvV^*ZoFx2yICnsiHVo*3Ptrv0RVN>@obS^qZoLn9~I!l*#LU@@yPBcUhR-$ zj#MkP6H`*iw&3--I6N!o4S_421I(hpipS(}z!RpvV=4{#BnCcd;8<7hY5-}Fn|j>- zTL!k{XcREhPJX`0S*LXxIRUGgujHnC{?C7|$1?@Mk=+{b&tpS7@4t}D(}%9?GX%b0 z{tW1LY8PfC?+ELv)ZI7Uc@$XsPaFyl4_8Nf?^F!mGR@Iq)B$c_5U2#O+xojPOKsL~ zV@`ahIELus*1o6@Xkd>UVauBzwqt3mr$EFL$_YqRw&{HWIP1=vK{Y^Q1h%tk9FCge z@{Gh^aEbVZwI;(FZWOo}hyPid1_%WdMQ3q2?V0@VpWS@iv7lFfu!}@CX>0-q0I@}f;MoCKgH;$r#2V~zZSSfGr%E|f9 ztzW1p@wY|*T)>@nB@E1$XjXXS$f&6G@6lePQWc8Z3Aj-MskNq3#xt&)ZbfxT7LnZ$vzwkm_YVsT~RpEVwd8Mx-vjV~-g;oIE5mrj0Fab-KHMq5}DvG9DHhCS5N} zDH)Q7$bQ5A?%vM*qfHw8v%o;P@UPeG!*^;frhaqxt!`%}xI#is_qsatVvvvZ7;tQ* z_UB~I!fMf0Tt-f*ED_A+G5WVZc2PH-xEzdOmmc292@UlqT6~;;fDm?A+YtuipsN4ZzCHKiY> zjt~TKUcPt=tf_uwIVo56xxCvC_`L3QO-)OesnuXhLsf~^t?=R-xnQ_IZ!YwjmpsgNMM-iYUe?>v&J%~e5h*KzT$Pk zJIuquzN~hgJxH+Ps;Mmyl4W0P06O|aOsGfDAkGW_T(81YRFqz)1*-4MXP+J|x7|h? zkOodtf%86f$djk+0JPa%p8tZlYQ~T}S%5-!H6@>@otp6%%mAAW_w_}hCg$Gs7rS7~ zl75T89~45ukG*)gnlBMPpuH|SeZ!wRAA5y%FDwN8hjuAt4It!5K&x((CYa)g6ag<@bAo6Ao0SYU?8EW)ih*2qfW> z5)+lw)ErOtN?u-Y)lo9cGH%Pu*MQcvf&vriv=o}y(9izpp9pM`n3)#2Uttl^;QOPm zV|NJQ7DMT4x$*C#?z1n}exEH(r=)N&TX59EK?#;<+cqq*ruluwv~&Aeos2yW`jElG z`sE0ylhu5s4yC2DMRzSP-t~{JP%0xxPAy$@Tb?Mkfnhi=&^??S%LHX6MdvrvuYi17 z&2_ZkRTcW6MQF>u3!{AfuGRIG?Az8O?;#m6EwxR*zvo6(YFZQ^<YP@ncG|zYFCg>(8`+OWXSXOqh3!vR%-N z7*elZ*Cpnfi@^-$3boVgbqIsB%!vUO1`0;0b$LZGrNr?3!h$J)L1Q)@qhw$x>R~Zq zm9zu&&z#mbyxA~Mpy2e({qzAJ3>|8BcNZ|LNKA)h%8m7qGzH=GArzZviXr`-io;}% zDqQw^X0t*5^B)j()>OEE4e*LxVGx>4kfCE?0)_YAoo@D4PFDK*YHi{AGnyT#QtR0o ztNVStTO7c-y9l^F1Au}Sv%aBN(s8RIu0`@$L#2`zz~##rCEBOA_YNe`u+h=yJi-ks z0qU@Vf|JqZM*G2Hn#KHDNqKpBWk-Hx-u>`IvgTy8a^CFm(|UX!A%AQ`$&C5i)AilC zIU+YF=Y82qy)CXjc1g-H`RzJyM|`_H2N25wIt< zO0=-*NgXTq`LYybM+)U5^%Dch#y{(6u; zF3`2CN_BvNk>p7T|57e^oH9^lQ{;k5W@kaiOjQ3$8{E?R8jUZC$H;#R_1^bi!l$;T zM*3dbz`&r^bo}JwjtOX@23kklFWVoFWXvg4)YW-L)jRrzzWnSNmF_i(D2%U&B45)_ zxI2*Jy+==!l-a+hpMH+R^yTNs;`K<9bgFZ>NpJ(^J9%n5cSL~f_cepZB0QpurUJ|* zsnt{yW1I=kikeW~7th#=E}2^%6t2p^jiIi#&&7odl{nX zyz?S4GnP+S34gmaQ3)P6R1PJnRw@A50$7Gu8%5P}`U~$4CQ_M9;Pl3rWA5AU#3G}ky?GM304Jwp zfg)|}9}kb^B_wN;C8~SPC2uNiI%oLVa=Ync+_;JC%~~^8)udc?9+xw9xJ%x}lt`qt z=xFr3Al8#sZMjg>2yjePP~Z*zKC2kTbLh5iz!yYM68Q2uNehO8TMbds;DUmo>0y(t z9KSQhFzwD#pkeD$&g*lSf+(BIInFkH!fj##I0IpREGfz^?6jM*r0Y*|x+voJL4c=4 zg+0zV-|AAO(9rl#GOehHs*TUDji?0<_r&M$1}AqZm@6wP3gYnjZs{=f zszD73O-R3;988|l}A};2tqh?R>0db?Dfo`qfRP`fIM5;`g#Kzikto3)V zrX}xEe^6%!Df(AD=csuVRtGVU)UmWnpLbyXSK4DDu%yCo19I1ZzUg^mRk_8q=4GG=LpbP39T1OqY(QA1qA`(Vxq-tA@AMN_~eEVywK%v z%)R7hIv))?dr{sS67N3e+-#`LsbM`l^iymNJ};LoMu;pyRNKQ_pYxJW~|Or7F0 zgN_iOeSHcqi{B?}W)i3-l(~;U*FDy<1MUU@S+U)I>x(9`Q^r3>YG`*&WN2t;WE*>< za4Y2|AiM6OtUQ+|5&_6G?ka>q8^JD~a5i-e<}A1?++4_My^r5UCPzCRj&J(mu^2Kt z6Wm!rVJX6?$^V}N1B%*;G8A{ic`BDs%f(!uoe zdJHHpem;2mFF)(eP>|R)LCa@37a^sW#^V;gq$t?hlBh0dHN4?HWuzr?_M}J>J2w*U zO=`=*sAXkE^={t&%$^r1L9q)26M!U?{W*jt4fO~-Jbdw-lorQ1u691{gFDM&-fSC= zec95?%*I5wOHRd*;1Ke~f~B;}oqNe#xOWb<^ZmC*VneB)da!21-^`s6Wo4DoQ3{F* z+5xFi&*#0K3N&3=2OQ%8=j5(F3qPo%mCjoKT$8Ln;Bnrte&+PcR&qJ7|MD8=#(bP$ zV`uv!Sx)y-`4nnxV)o1MlO-BI)F)mdWmbvMXTF^Gk zpIDa;!EU*f0SdNuT|EG&r>g35f1)yCN#uD2zRxyW2UAxumhyAAeo;5yel}f>?oOp- z?Gq^W{SSKc=1k)~(KqpwJ9jkKYQHTgxeeU&08?8Y-3ct8ZZ~PUL%t3J35owDzwF_f z$C}ds|AV=-NhAOQ2b`Tgh3DTEcZg;suEb=npB?49W4$%GeB`fVM+W`;@_BjIgh@t| zl1!A)3H_zsS^b z+w76qWz&TAi+c4dYOvoetv#hRe&M7L3zg`+>AqTRk0E^Jc z!C~k1F7-w5hE#hBYtFJBK#ihDprN4wHRc`wB>I+Jff5}alQySL5*$?JM3EP7?&jvE zpny{G44_cFBegXfo%H{8jUzitm1SNiS{GcsjLME8dc7P8a|5ceXRXhtcgu9=l-#br((?&>rl*w4`n{@2sbzLqN_3H&`T> z%@)-!GEDXTJ5cIf-Ienli^2@lCrSCOCO*Caw=j<>m_ta+ssp~mB8lh4?}X*CgCC>H zW^N+AR>0U|*u}NjYKol|v&@!&&+`Z%_!K_qzDXwoRbT@#TthR1cB>8NM4wMELBXt6 z3sc!rWO41;-ngwsViLc=iJ-({2;Tt$H-lzf@$2rL%K)-~hD5~e~LKZZtR*H~9^Lgw3C{T0*)*+Wl#$6&sw}3opbMvDrpZC)scq}e1 zu7~CkFzTHd&O|%3F*&voIrGt&8d3HaEi3mU;yOrxE2`V>eh&b0TU^d@6SpmhSTakV zY3Sme|lv)kU&fZ*Wc1)(% zSwTZ1?s}gX$Job^030|Sae37Ah3knAa%N^&L55%77k^!R2PMec+gCR#H6aml$Oq@m z%Z=Iq_h_Jpzwo?s!rGERa~^#iXw5!7WFP4_sU8y*Jv8>4^3QBe8MmNYGar2WZZhDu zy^Jsz?Lt-eZLO_Dn&bAJc~aVi;7qY>Iw2`>L-C-$A5@E!VwwJ=u>2q64v3bf5BovF zY$hY-|X3;zAvJ2+5Oh?4wO7jexC zK~)fiD>6u#OksUT6W9=vbM>(fP}e`-AD^F}0pe2vaxs*}WUk@e-f%onfu+%`9Sy(N zIdoAv%etYwK~GOV-^ikYpkGv*%Rz@;J^rB`g5cs*EjIjNX8Wd`v<{S|0)4s4)QN5@ zIS9b>vKaK{JR*^Edey2f{`v6SS#QO~ z(^}12ZLFzby1jA0!%LUG4%(RmY9xVPQhq2Hn9sli?MA!J=%^@OhrQ6m#6;Pm-9z6z z9ac)pQ2*~3O+?RAs6hX)(?pIC6f{S;ty99$2X=}R*S6UVJ}?#nuPmj^L+)`qIGDSR zIrH{m>Va76IjDPg>4q{?`M`8`OB~5}jM^D$g78Vwn zH1SK_YXtb(I@-YqzvH<%mWRswQC%L0!%{wIFg3!VAR0u}q#PXsWIY-mDq9L$nyNWo z-9>@SCL()a{c**S2_YdNfChX9pbo$=`514NZVRku!14;Gh@MqECSy|C)zt+g9yqzV zAJavJ*m_Kp|S} zWx~p~UCCGBYZKtS5uhtLIXb>RUkAwrqQ?O5M?x*^JUcZ2z7-!IpPnwoPEA8oQf-F& z7@I9L%VM>6wcYFG>3Q^pJ{ST_5D$z;64;n>`h0jA8twphotvAR($Z4Oh_^AFIJrL; z7Z*xJvOv@}g~cMy0wTL3T2+=HBwKx*#pIv#k6IAumpmj`ARE}xFM!DoSRuwoMq2({ z8v@U*SOU;r3+@W%EnBS(Kex(%B#-j)@>SjIrNHI4w4`O{*T&8o_t~q-lB0$d6chmOn)>?tsa#;vS$}_f0}6qF?_eqe9_+st z&s|kYDnhoXtfGSMP+3*==G~dH9oWuH+qgG0H*0+VHe}4?-2x5NvjDqBEUaWCG%j$k z|Gx1z2!jb0S`8X*;vTRO8^PRfyBY#^`3w^7M*TbQsR+BBCr?;f0q50{FV_R|v3IX} zbkSX)Q#T)bWw2QJ@h#hwb<|HX{g*~BxGfCG5NoP30&rmhry*=d51q# zcmFGX=jx%L=;PlbmwixGms|gFmOmJz=GlW(3(L!O-eoEF76}H{$>Ds`qTq z*T$pyB(e(apoQWs1m>%!EON6Uk%@-aO9>&GQ=!OjX0(K!kE|u+PAAv{*1$W&~ z8LruJgPSNQ}qOt^zv`6{Zw!a z4e!0_C-?4z4wn}t+uGINlfM2{b%l4zY8A37M|N^Hk+EDBAwyCUBjz8b2|ci!9X?h} z&caPqy+3KhDpq5_+geJHFBDw7cZE`WwY}P+f59EG9^UI%EuOJuEG+gDZq^M=$sIk5 z%<5s+CcHL3_&8YZE~Hkft9eNcY&biT%JgzjlJLJy`pDd};&ZfR7Cu+SOd8uAY?l6e zRo8hZ0bvZhQyZHUZfE&~NIJ>r1{04yhaicqyMGo=@R=>}ihzuJN0r22+*(Ep?h})D zA8b7b|LAkJ{XRW|)jDi8isB8+jj~|c_)5TzuTt8+_ubpN5;WCrd{{tP>m_&eq8#eq z+|}Pa%07Y}*w9fxVxXdBX!J(vT9tiZ_2A@|wPH`h(+6)=rZ;8UHj}i}!!NbWT=C9l zGrv%v7ozCQUsUpwkSnRr^DcS+!iIQbm0SM}U{v??u-%xvk6HvF2(F^xuB_;{#puQ@ z%eFQ4t0$~n9Y%9!O)Uf%D630(-9qW8m_E$Xxqa@t+@cg*xR0v0mVUhwge}#h^*^`g_k(;!fQZ7Sv{d9hJQDWbA&K8mBD?OoT%Z>?;=Ef)Z zyizM&S*$uutG>y}AIU=%>Ym)hnz#OHbCn`{*17KZcG2+2pc3Wn?D9HQDC@mCMO(f?X?{&WRWg9I%gSGSX!E8@Na^H>anpmxFJuwSG8`q zMHcs^C!orXoh1gJ4Sms|#Y6z`1?Xv+j&B@#k}R*JPwh6t`2WT~YOfn)lhv%}G+Nmh`BH0owlcQ=1H4 zr~W*%nEc{=)G4he@Sa#oruQwAX6+=(NQ_-wA433HfpFDQ(mLEZn;3MjbArcT*Gkm# z-SjZI2=H~>4L6W~*dSkSay(YSlB?_Ji`z99sKdS|cbt@hVy=VM@r2s4R@49HE}+U7 z$lg>IWANF8MTPNV1@$e+6k7yjagG;V;Igu>*bn*$NxuC+xSuZancQod-sD&W``W0bB_)t2v)P#%$of9JI znp=oS$Xjuv-b4kWTF89G46CTB#p8FJzS);L7|&QD2BB=aDGZVdMIBelM}eAO*khaM zI#t;8z3%j)(H1wQ!y+`WygRXI!`4z2|A2*^i~S=0O8C>uVC_x9DpJT--cYFhFbNYMCm1H*Iiw6rRg~m z7vm@*b>~&WeD)LpQd;}Z=jj~pXuvhi17TW5Kt#_1o+eYEsP2nrJGaXyA3^v0h*a{e z2;uI)D_;(a_Ma{mf~Zbzq`vnL;qwmn)vS4SWc?8wCb7-yJO1)8u^a|n!g@TuWkz^6 zPeFRq)N@`qG()e*Fd2}()`Fi)m`v5Yaza8v@pZ&KF}V)`tHt$5B7ASp?!{`ifTR6x z-uVDr!&PFuLL&s&l+cTz7!=p1Rl>2wa^p#Gh>RGt)n$%Ms7@=(z!Z)+$auB8SYs?x zYotxf4SLbB>d;I(j2-bB11-58KMMP0peha2V^z2PiCKTbD3k z9skUPiH0Uue&~pGpISwOj+qDBaqRx5rOA!jYbTGru}_gjIXb-R`$NA;#E%z4c`Pts z;yi+98TrTiI(hV^B`S;Ynu_0!d#;Hm_fE5-@K^q!s3Dpp8Gw;?zW-k{CKwpl)E8#p zBEZ1D*8#)d{~G`P-#`EVJoG<4_kaK8|KK5D_yj)w$AA3)c<6t8?*9$X%afWbbGzp)cWtQ=%cJBvps(sStK^&|J=)CL43=EW>}&E2+o;)&4P`MT^+*-)nL-n=9k$ zG`R?=yZPxee14O9W4&`WyGY6x&0XQ$H<~-#j{D?h*>`w2dvf`icM!+!l9k=YzVWbb zWx6cu`ZC3y$Ih>JwLgC0qrH4y<0SfOq00Kdzwl_TjLws(3qkMECWpstIa4VW=lov> z+;lC%@xw(m3NwuLg_I4Mt1c`nm9S_W31%@uDH0=*|#m^+5NqZ33-s7 zI2r1UkBvwZ7Xom>UIEpkVyycZ$7@kTu(~x3AzHZ25r0Q}3diF35|RcE4z zOT}X>BAI?!ACk0Rma&qXz^+9(8<3K(MeXfUklfte(YesVW$tVry><;14YzaM7?H0( zoy}uGT#Z74fpwvMTfrtK@+r^8GunK}sXQRTt4;w45fDxn!LMPU7AlT1M#(6~`V;<@ zI47#B4lcmuRu}$EAfpH*TbPNGTX=I1YJAEi`Vps&JCnX352C28>BIc*<@VyN!wFqg z@nB`&F!+pp;trLLIc80BXzv=9wR9)-^0M)U-aY*(pTA%pgesO=+?#%K%39h=H$e|c z9x1ZqxUB|h`K6`Vozdi6cTT(2?6D-##N|1?$j!BqKVMAwI6R==$#FD~lK?fnU|sbwabU0D*W!Ec zSAfJRe5p9HGaUP%oa%i&-3+M#l{Py#-i2Xj94=0K)d7Nx-vzl1B>CcUbDtI%L`$Q5~e7udr#hj%c z3D+~UhZ!MgYBShnen@v#;6LcXtv=~3{;gnsMbJ5JmB3JOJ{u=(o=1EOU`ukBnNBn3 z1O1G3{1JVg7pC>zN|bfrxXq+zCh>ZhR(FtzLN?ncJ$Br;I8n=sQRf`BcDPYtgBcnH z-)ucL)Cmfc{d_aCNPG1vp-*a4)Jy88Xb^Cxk?B6;)o{0#0e%Ko>O$#-=7+})7plic zk2@4Z5?UUh?>|~S7tgsqo*O$j9SgEb#N~XX235KD2iu%@BP%Y#Ia3sR#MdHuu|BYW z9^R!htJZEaFyz(*p)dxU1;@~R_KLr_hDJeW16zhx>@4c>y3bAK)+McnBDS`xPnqBG zP9V<}uf$;AI)?V*UU4hc1y#S`^o1}xzR&Y;6sObdBF8xdrGMr6M3}41ss1@*ukZav zx}WDy7H5K(rkj^i&Y-=q#=)gZT)$svGas(qm_OsQGO1q{Sy|aAf$!;$b*_w(BDxV_ zP+y!$FH9%<@~3cL=+}pit9X;z>{up~AnPw_m|OdF`sK!NCJO_>2Ms)T3s7*p5Ag4l zuE%H&Rw<^zK8tku7}11AX@*H1oEuZ9V-3BAL%i^Y2Z7C@7oAHzCIQVHY9sx>m=WtA zpS-I^O=VNajL3x6l0bSTXQJ%}DafKfSnosDnSh`dgjAS+t5o*leX`|Q-JVejRKp_m zZPB+ErR5BLtB2#7|0m4^GW(haY)}9I0MIkKXwxS18GFP}6_KrFWS;pOCwNOuiK?mW z{EZ`(dYv`J8Qs-9w&E=z<$O?Xa=M01FoAv^9s=eZ_tL*baCwNaP{_p$qfINXV+5AY z+*97%B~78AT~N~$-`Qup9jI{kc;Mh2)5e7UXR%|zn+M;}=_CGqsrt=OyN+K-vU(i< zX#%cVt+`Ie80y!|E_6Cscj!HOpD$(EX~}gBx7Y`)0|&Epg>K%C%*8s!UM9l^1poj5 zJ)_GuZKCi=?(Dx}ODC!M3ygJI+{H=L#8F(h5pD^aki5dzlmQ2}&qKECyA66q&ITP{ zd6!jaZEexg(-Jo)cQsdm;i9M{YK8~HNH?qv;^Ln2mE%R7f~Ufl4^V~=)n=B|i>w6q ziLA|hMOxGSzEr0r*OuMkdN7Ek+*_7$7hWTVJ0r9K006+_3~kJVC-N+>rKbOl2$z+;`mb|JV?CBkc>mFN+u~WXPS^e^x#w5U3}o1rWZ&$}>Nug5%+-;* zJ}Vf+HH8x@0t*%mp&R=W&%E?m%7O0^Ui#OCB15ngNIK;+Pfs})wAvm!klUSFKmhy7_4OLz>H&=mhS>rhVHI>>Xu928|R@0=hWAoNsDb)oVMpl#h`A8Uk z)C|5Btx_NQ`rH$hU(C+auibl)SvG%7;J~(b5b$r5l>v7*NHK@~)%SU`LhJA}S4xX8vQish50001b+JM&9 z)-IpW>oh90`RM;$)2M5!b&OOjakMik!%i005xp z2z&9eS=iZ0d*_mA@-GkjxFFEOd)F*)QDwoVMD_~lU35eM004k~8QOX;nXCIUreNP~ zWynsYX-&Q!rofs3004j<(wi@j_HH^&YHndtMsZfTPU__R!t~(r51PUO00000p$z~4 z0N_byfmHwi004l{1^@s600?aW0002}!~Y8a0RR71fEFwiNEibE0000 and check out all the available +platform that can simplify plugin development. + +## Performance + +Build with scalability in mind. + +- Consider data with many fields +- Consider data with high cardinality fields +- Consider large data sets, that span a long time range +- Consider slow internet and low bandwidth environments + +## Accessibility + +Did you know Kibana makes a public statement about our commitment to creating an accessible product for people +with disabilities? [We do](https://www.elastic.co/guide/en/kibana/master/accessibility.html)! It's very important +all of our apps are accessible. + +- Learn how [EUI tackles accessibility](https://elastic.github.io/eui/#/guidelines/accessibility) +- If you don't use EUI, follow the same EUI accessibility standards + + + Elasticians, check out the #accessibility channel to ask questions and receive guidance. + + +## Localization + +Kibana is translated into other languages. Use our i18n utilities to ensure your public facing strings will be translated to ensure all Kibana apps are localized. Read and adhere to our [i18n guidelines](https://github.com/elastic/kibana/blob/master/packages/kbn-i18n/GUIDELINE.md) + + + Elasticians, check out the #kibana-localization channel to ask questions and receive guidance. + + +## Styleguide + +We use es-lint rules when possible, but please review our [styleguide](https://github.com/elastic/kibana/blob/master/STYLEGUIDE.md), which includes recommendations that can't be linted on. + +Es-lint overrides on a per-plugin level are discouraged. + +## Plugin best practices + +Don't export without reason. Make your public APIs as small as possible. You will have to maintain them, and consider backward compatibility when making changes. + +Add `README.md` to all your plugins and services and include contact information. + +## Re-inventing the wheel + +Over-refactoring can be a problem in it's own right, but it's still important to be aware of the existing services that are out there and use them when it makes sense. Check out our to see what high-level services are at your disposal. In addition, our lists additional services. + +## Feature development + +### Timing + + + +Try not to put your PR in review mode, or merge large changes, right before Feature Freeze. It's inevitably one of the most volatile times for the +Kibana code base, try not to contribute to this volatility. Doing this can: + +- increase the likelyhood of conflicts from other features being merged at the last minute +- means your feature has less QA time +- means your feature gets less careful review as reviewers are often swamped at this time + +All of the above contributes to more bugs being found in the QA cycle and can cause a delay in the release. Prefer instead to merge +your large change right _after_ feature freeze. If you are worried about missing your initial release version goals, review our +[release train philophy](https://github.com/elastic/dev/blob/master/shared/time-based-releases.md). It's okay! + + + +### Size + +When possible, build features with incrementals sets of small and focused PRs, but don't check in unused code, and don't expose any feature on master that you would not be comfortable releasing. + +![product_stages](./assets/product_stages.png) + +If your feature cannot be broken down into smaller components, or multiple engineers will be contributing, you have a few other options to consider. + +**1. Hide your feature behind a feature flag** + +Features can be merged behind a flag if you are not ready to make them the default experience, but all code should still be tested, complete and bug free. + +A good question to ask yourself is, how will you feel if a customer turns this feature on? Is it usable, even if not up to the +level of something we would market? It should have some level of minimal utility. + +Another question to ask yourself is, if this feature gets cancelled, how difficult will it be to remove? + +**2. Develop on a feature branch** + +This option is useful if you have more than one contributor working on a large feature. The downside is handling code conflicts when rebasing with the main branch. + +Consider how you want to handle the PR review. Reviewing each PR going into the feature branch can lighten the review process when merging into the main branch. + +**3. Use an example plugin** + +If you are building a service for developers, create an [example plugin](https://github.com/elastic/kibana/tree/master/examples) to showcase and test intended usage. This is a great way for reviewers and PMs to play around with a feature through the UI, before the production UI is ready. This can also help developers consuming your services get hands on. + +## Embrace the monorepo + +Kibana uses a monorepo and our processes and tooling are built around this decision. Utilizing a monorepo allows us to have a consistent peer review process and enforce the same code quality standards across all of Kibana's code. It also eliminates the necessity to have separate versioning strategies and constantly coordinate changes across repos. + +When experimenting with code, it's completely fine to create a separate GitHub repo to use for initial development. Once the code has matured to a point where it's ready to be used within Kibana, it should be integrated into the Kibana GitHub repo. + +There are some exceptions where a separate repo makes sense. However, they are exceptions to the rule. A separate repo has proven beneficial when there's a dedicated team collaborating on a package which has multiple consumers, for example [EUI](https://github.com/elastic/eui). + +It may be tempting to get caught up in the dream of writing the next package which is published to npm and downloaded millions of times a week. Knowing the quality of developers that are working on Kibana, this is a real possibility. However, knowing which packages will see mass adoption is impossible to predict. Instead of jumping directly to writing code in a separate repo and accepting all of the complications that come along with it, prefer keeping code inside the Kibana repo. A [Kibana package](https://github.com/elastic/kibana/tree/master/packages) can be used to publish a package to npm, while still keeping the code inside the Kibana repo. Move code to an external repo only when there is a good reason, for example to enable external contributions. + +## Hardening + +Review the following items related to vulnerability and security risks. + +- XSS + - Check for usages of `dangerouslySetInnerHtml`, `Element.innerHTML`, `Element.outerHTML` + - Ensure all user input is properly escaped. + - Ensure any input in `$.html`, `$.append`, `$.appendTo`, $.prepend`, `$.prependTo`is escaped. Instead use`$.text`, or don't use jQuery at all. +- CSRF + - Ensure all APIs are running inside the Kibana HTTP service. +- RCE + - Ensure no usages of `eval` + - Ensure no usages of dynamic requires + - Check for template injection + - Check for usages of templating libraries, including `_.template`, and ensure that user provided input isn't influencing the template and is only used as data for rendering the template. + - Check for possible prototype pollution. +- Prototype Pollution - more info [here](https://docs.google.com/document/d/19V-d9sb6IF-fbzF4iyiPpAropQNydCnoJApzSX5FdcI/edit?usp=sharing) + - Check for instances of `anObject[a][b] = c` where a, b, and c are user defined. This includes code paths where the following logical code steps could be performed in separate files by completely different operations, or recursively using dynamic operations. + - Validate any user input, including API url-parameters/query-parameters/payloads, preferable against a schema which only allows specific keys/values. At a very minimum, black-list `__proto__` and `prototype.constructor` for use within keys + - When calling APIs which spawn new processes or potentially perform code generation from strings, defensively protect against Prototype Pollution by checking `Object.hasOwnProperty` if the arguments to the APIs originate from an Object. An example is the Code app's [spawnProcess](https://github.com/elastic/kibana/blob/b49192626a8528af5d888545fb14cd1ce66a72e7/x-pack/legacy/plugins/code/server/lsp/workspace_command.ts#L40-L44). + - Common Node.js offenders: `child_process.spawn`, `child_process.exec`, `eval`, `Function('some string')`, `vm.runIn*Context(x)` + - Common Client-side offenders: `eval`, `Function('some string')`, `setTimeout('some string', num)`, `setInterval('some string', num)` +- Check for accidental reveal of sensitive information + - The biggest culprit is errors which contain stack traces or other sensitive information which end up in the HTTP Response +- Checked for Mishandled API requests + - Ensure no sensitive cookies are forwarded to external resources. + - Ensure that all user controllable variables that are used in constructing a URL are escaped properly. This is relevant when using `transport.request` with the Elasticsearch client as no automatic escaping is performed. +- Reverse tabnabbing - https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/HTML5_Security_Cheat_Sheet.md#tabnabbing + - When there are user controllable links or hard-coded links to third-party domains that specify target="\_blank" or target="\_window", the `a` tag should have the rel="noreferrer noopener" attribute specified. + - Allowing users to input markdown is a common culprit, a custom link renderer should be used +- SSRF - https://www.owasp.org/index.php/Server_Side_Request_Forgery + - All network requests made from the Kibana server should use an explicit configuration or white-list specified in the `kibana.yml` From 52d0fc044adc1f705cdaef0538763d3e1503e047 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Tue, 23 Mar 2021 22:52:44 -0500 Subject: [PATCH 14/35] update codeowners (#95249) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index dde90bf1bc47d..2f2f260addb35 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -53,6 +53,7 @@ /src/plugins/navigation/ @elastic/kibana-app-services /src/plugins/share/ @elastic/kibana-app-services /src/plugins/ui_actions/ @elastic/kibana-app-services +/src/plugins/index_pattern_field_editor @elastic/kibana-app-services /x-pack/examples/ui_actions_enhanced_examples/ @elastic/kibana-app-services /x-pack/plugins/data_enhanced/ @elastic/kibana-app-services /x-pack/plugins/embeddable_enhanced/ @elastic/kibana-app-services From 585f6f2c5c9e5d8d77aa6962555bbc3828a01071 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 24 Mar 2021 09:29:38 +0100 Subject: [PATCH 15/35] Make sure color mapping setting is respected for legacy palette (#95164) --- docs/management/advanced-options.asciidoc | 2 +- src/plugins/charts/public/mocks.ts | 4 +- src/plugins/charts/public/plugin.ts | 2 +- .../public/services/legacy_colors/mock.ts | 1 + .../services/palettes/palettes.test.tsx | 55 +++++++++++++++++-- .../public/services/palettes/palettes.tsx | 7 +-- .../public/services/palettes/service.ts | 5 +- src/plugins/charts/server/plugin.ts | 2 +- 8 files changed, 61 insertions(+), 17 deletions(-) diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index 5c27a7bdacdee..446b6a2cfd851 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -457,7 +457,7 @@ Enables the legacy charts library for aggregation-based area, line, and bar char [[visualization-colormapping]]`visualization:colorMapping`:: **This setting is deprecated and will not be supported as of 8.0.** -Maps values to specific colors in *Visualize* charts and *TSVB*. This setting does not apply to *Lens*. +Maps values to specific colors in charts using the *Compatibility* palette. [[visualization-dimmingopacity]]`visualization:dimmingOpacity`:: The opacity of the chart items that are dimmed when highlighting another element diff --git a/src/plugins/charts/public/mocks.ts b/src/plugins/charts/public/mocks.ts index a6cde79057be8..c85a91a1ef563 100644 --- a/src/plugins/charts/public/mocks.ts +++ b/src/plugins/charts/public/mocks.ts @@ -17,13 +17,13 @@ export type Start = jest.Mocked>; const createSetupContract = (): Setup => ({ legacyColors: colorsServiceMock, theme: themeServiceMock, - palettes: paletteServiceMock.setup({} as any, {} as any), + palettes: paletteServiceMock.setup({} as any), }); const createStartContract = (): Start => ({ legacyColors: colorsServiceMock, theme: themeServiceMock, - palettes: paletteServiceMock.setup({} as any, {} as any), + palettes: paletteServiceMock.setup({} as any), }); export { colorMapsMock } from './static/color_maps/mock'; diff --git a/src/plugins/charts/public/plugin.ts b/src/plugins/charts/public/plugin.ts index a21264703f6c4..5bc0b8c84560f 100644 --- a/src/plugins/charts/public/plugin.ts +++ b/src/plugins/charts/public/plugin.ts @@ -43,7 +43,7 @@ export class ChartsPlugin implements Plugin { - const palettes: Record = buildPalettes( - coreMock.createStart().uiSettings, - colorsServiceMock - ); + const palettes: Record = buildPalettes(colorsServiceMock); describe('default palette', () => { describe('syncColors: false', () => { it('should return different colors based on behind text flag', () => { @@ -302,6 +298,7 @@ describe('palettes', () => { beforeEach(() => { (colorsServiceMock.mappedColors.mapKeys as jest.Mock).mockClear(); + (colorsServiceMock.mappedColors.getColorFromConfig as jest.Mock).mockReset(); (colorsServiceMock.mappedColors.get as jest.Mock).mockClear(); }); @@ -323,6 +320,30 @@ describe('palettes', () => { expect(colorsServiceMock.mappedColors.get).not.toHaveBeenCalled(); }); + it('should respect the advanced settings color mapping', () => { + const configColorGetter = colorsServiceMock.mappedColors.getColorFromConfig as jest.Mock; + configColorGetter.mockImplementation(() => 'blue'); + const result = palette.getColor( + [ + { + name: 'abc', + rankAtDepth: 2, + totalSeriesAtDepth: 10, + }, + { + name: 'def', + rankAtDepth: 0, + totalSeriesAtDepth: 10, + }, + ], + { + syncColors: false, + } + ); + expect(result).toEqual('blue'); + expect(configColorGetter).toHaveBeenCalledWith('abc'); + }); + it('should return a color from the legacy palette based on position of first series', () => { const result = palette.getColor( [ @@ -363,6 +384,30 @@ describe('palettes', () => { expect(colorsServiceMock.mappedColors.get).toHaveBeenCalledWith('abc'); }); + it('should respect the advanced settings color mapping', () => { + const configColorGetter = colorsServiceMock.mappedColors.getColorFromConfig as jest.Mock; + configColorGetter.mockImplementation(() => 'blue'); + const result = palette.getColor( + [ + { + name: 'abc', + rankAtDepth: 2, + totalSeriesAtDepth: 10, + }, + { + name: 'def', + rankAtDepth: 0, + totalSeriesAtDepth: 10, + }, + ], + { + syncColors: false, + } + ); + expect(result).toEqual('blue'); + expect(configColorGetter).toHaveBeenCalledWith('abc'); + }); + it('should always use root series', () => { palette.getColor( [ diff --git a/src/plugins/charts/public/services/palettes/palettes.tsx b/src/plugins/charts/public/services/palettes/palettes.tsx index 8a1dee72139ed..b11d598c1c1cb 100644 --- a/src/plugins/charts/public/services/palettes/palettes.tsx +++ b/src/plugins/charts/public/services/palettes/palettes.tsx @@ -9,7 +9,6 @@ // @ts-ignore import chroma from 'chroma-js'; import { i18n } from '@kbn/i18n'; -import { IUiSettingsClient } from 'src/core/public'; import { euiPaletteColorBlind, euiPaletteCool, @@ -130,7 +129,8 @@ function buildSyncedKibanaPalette( colors.mappedColors.mapKeys([series[0].name]); outputColor = colors.mappedColors.get(series[0].name); } else { - outputColor = staticColors[series[0].rankAtDepth % staticColors.length]; + const configColor = colors.mappedColors.getColorFromConfig(series[0].name); + outputColor = configColor || staticColors[series[0].rankAtDepth % staticColors.length]; } if (!chartConfiguration.maxDepth || chartConfiguration.maxDepth === 1) { @@ -199,9 +199,8 @@ function buildCustomPalette(): PaletteDefinition { } export const buildPalettes: ( - uiSettings: IUiSettingsClient, legacyColorsService: LegacyColorsService -) => Record = (uiSettings, legacyColorsService) => { +) => Record = (legacyColorsService) => { return { default: { title: i18n.translate('charts.palettes.defaultPaletteLabel', { diff --git a/src/plugins/charts/public/services/palettes/service.ts b/src/plugins/charts/public/services/palettes/service.ts index 6090bfc0fd140..bb9000e896742 100644 --- a/src/plugins/charts/public/services/palettes/service.ts +++ b/src/plugins/charts/public/services/palettes/service.ts @@ -6,7 +6,6 @@ * Side Public License, v 1. */ -import { CoreSetup } from 'kibana/public'; import { ExpressionsSetup } from '../../../../../../src/plugins/expressions/public'; import { ChartsPluginSetup, @@ -24,12 +23,12 @@ export class PaletteService { private palettes: Record> | undefined = undefined; constructor() {} - public setup(core: CoreSetup, colorsService: LegacyColorsService) { + public setup(colorsService: LegacyColorsService) { return { getPalettes: async (): Promise => { if (!this.palettes) { const { buildPalettes } = await import('./palettes'); - this.palettes = buildPalettes(core.uiSettings, colorsService); + this.palettes = buildPalettes(colorsService); } return { get: (name: string) => { diff --git a/src/plugins/charts/server/plugin.ts b/src/plugins/charts/server/plugin.ts index 39a93962832f3..63b703e6b7538 100644 --- a/src/plugins/charts/server/plugin.ts +++ b/src/plugins/charts/server/plugin.ts @@ -31,7 +31,7 @@ export class ChartsServerPlugin implements Plugin { type: 'json', description: i18n.translate('charts.advancedSettings.visualization.colorMappingText', { defaultMessage: - 'Maps values to specific colors in Visualize charts and TSVB. This setting does not apply to Lens.', + 'Maps values to specific colors in charts using the Compatibility palette.', }), deprecation: { message: i18n.translate( From 3f3cc8ee359d03675176cb0df29f6c9eea00032a Mon Sep 17 00:00:00 2001 From: Aleh Zasypkin Date: Wed, 24 Mar 2021 09:54:08 +0100 Subject: [PATCH 16/35] Expose session invalidation API. (#92376) --- docs/api/session-management.asciidoc | 9 + .../session-management/invalidate.asciidoc | 114 ++++++ docs/user/api.asciidoc | 1 + .../security/authentication/index.asciidoc | 8 + .../user/security/session-management.asciidoc | 2 + .../authentication/authenticator.test.ts | 50 +-- .../server/authentication/authenticator.ts | 22 +- .../server/routes/session_management/index.ts | 2 + .../session_management/invalidate.test.ts | 155 ++++++++ .../routes/session_management/invalidate.ts | 49 +++ .../server/session_management/session.mock.ts | 2 +- .../server/session_management/session.test.ts | 115 ++++-- .../server/session_management/session.ts | 93 +++-- .../session_management/session_index.mock.ts | 2 +- .../session_management/session_index.test.ts | 140 ++++++- .../session_management/session_index.ts | 70 +++- x-pack/scripts/functional_tests.js | 1 + .../session_invalidate.config.ts | 55 +++ .../tests/session_invalidate/index.ts | 16 + .../tests/session_invalidate/invalidate.ts | 350 ++++++++++++++++++ 20 files changed, 1163 insertions(+), 93 deletions(-) create mode 100644 docs/api/session-management.asciidoc create mode 100644 docs/api/session-management/invalidate.asciidoc create mode 100644 x-pack/plugins/security/server/routes/session_management/invalidate.test.ts create mode 100644 x-pack/plugins/security/server/routes/session_management/invalidate.ts create mode 100644 x-pack/test/security_api_integration/session_invalidate.config.ts create mode 100644 x-pack/test/security_api_integration/tests/session_invalidate/index.ts create mode 100644 x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts diff --git a/docs/api/session-management.asciidoc b/docs/api/session-management.asciidoc new file mode 100644 index 0000000000000..7ac8b9dddcdbb --- /dev/null +++ b/docs/api/session-management.asciidoc @@ -0,0 +1,9 @@ +[role="xpack"] +[[session-management-api]] +== User session management APIs + +The following <> management APIs are available: + +* <> to invalidate user sessions + +include::session-management/invalidate.asciidoc[] diff --git a/docs/api/session-management/invalidate.asciidoc b/docs/api/session-management/invalidate.asciidoc new file mode 100644 index 0000000000000..c3dced17e72b7 --- /dev/null +++ b/docs/api/session-management/invalidate.asciidoc @@ -0,0 +1,114 @@ +[[session-management-api-invalidate]] +=== Invalidate user sessions API +++++ +Invalidate user sessions +++++ + +experimental[] Invalidates user sessions that match provided query. + +[[session-management-api-invalidate-prereqs]] +==== Prerequisite + +To use the invalidate user sessions API, you must be a `superuser`. + +[[session-management-api-invalidate-request]] +==== Request + +`POST :/api/security/session/_invalidate` + +[role="child_attributes"] +[[session-management-api-invalidate-request-body]] +==== Request body + +`match`:: +(Required, string) Specifies how {kib} determines which sessions to invalidate. Can either be `all` to invalidate all existing sessions, or `query` to only invalidate sessions that match the query specified in the additional `query` parameter. + +`query`:: +(Optional, object) Specifies the query that {kib} uses to match the sessions to invalidate when the `match` parameter is set to `query`. You cannot use this parameter if `match` is set to `all`. ++ +.Properties of `query` +[%collapsible%open] +===== +`provider` ::: +(Required, object) Describes the <> for which to invalidate sessions. + +`type` :::: +(Required, string) The authentication provider `type`. + +`name` :::: +(Optional, string) The authentication provider `name`. + +`username` ::: +(Optional, string) The username for which to invalidate sessions. +===== + +[[session-management-api-invalidate-response-body]] +==== Response body + +`total`:: +(number) The number of successfully invalidated sessions. + +[[session-management-api-invalidate-response-codes]] +==== Response codes + +`200`:: + Indicates a successful call. + +`403`:: + Indicates that the user may not be authorized to invalidate sessions for other users. Refer to <>. + +==== Examples + +Invalidate all existing sessions: + +[source,sh] +-------------------------------------------------- +$ curl -X POST api/security/session/_invalidate +{ + "match" : "all" +} +-------------------------------------------------- +// KIBANA + +Invalidate sessions that were created by any <>: + +[source,sh] +-------------------------------------------------- +$ curl -X POST api/security/session/_invalidate +{ + "match" : "query", + "query": { + "provider" : { "type": "saml" } + } +} +-------------------------------------------------- +// KIBANA + +Invalidate sessions that were created by the <> with the name `saml1`: + +[source,sh] +-------------------------------------------------- +$ curl -X POST api/security/session/_invalidate +{ + "match" : "query", + "query": { + "provider" : { "type": "saml", "name": "saml1" } + } +} +-------------------------------------------------- +// KIBANA + +Invalidate sessions that were created by any <> for the user with the username `user@my-oidc-sso.com`: + +[source,sh] +-------------------------------------------------- +$ curl -X POST api/security/session/_invalidate +{ + "match" : "query", + "query": { + "provider" : { "type": "oidc" }, + "username": "user@my-oidc-sso.com" + } +} +-------------------------------------------------- +// KIBANA diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index 459dbbdd34b27..c41f3d8a829e4 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -97,6 +97,7 @@ curl -X POST \ include::{kib-repo-dir}/api/features.asciidoc[] include::{kib-repo-dir}/api/spaces-management.asciidoc[] include::{kib-repo-dir}/api/role-management.asciidoc[] +include::{kib-repo-dir}/api/session-management.asciidoc[] include::{kib-repo-dir}/api/saved-objects.asciidoc[] include::{kib-repo-dir}/api/alerts.asciidoc[] include::{kib-repo-dir}/api/actions-and-connectors.asciidoc[] diff --git a/docs/user/security/authentication/index.asciidoc b/docs/user/security/authentication/index.asciidoc index b2d85de91b9fc..a4acc93310e5d 100644 --- a/docs/user/security/authentication/index.asciidoc +++ b/docs/user/security/authentication/index.asciidoc @@ -397,6 +397,14 @@ NOTE: *Public URL* is available only when anonymous access is configured and you + For more information, refer to <>. +[float] +[[anonymous-access-session]] +===== Anonymous access session + +{kib} maintains a separate <> for every anonymous user, as it does for all other authentication mechanisms. + +You can configure <> and <> for anonymous sessions the same as you do for any other session with the exception that idle timeout is explicitly disabled for anonymous sessions by default. The global <> setting doesn't affect anonymous sessions. To change the idle timeout for anonymous sessions, you must configure the provider-level <.session.idleTimeout`>> setting. + [[http-authentication]] ==== HTTP authentication diff --git a/docs/user/security/session-management.asciidoc b/docs/user/security/session-management.asciidoc index 0df5b3b31a203..ac7a777eb0580 100644 --- a/docs/user/security/session-management.asciidoc +++ b/docs/user/security/session-management.asciidoc @@ -6,6 +6,8 @@ When you log in, {kib} creates a session that is used to authenticate subsequent When your session expires, or you log out, {kib} will invalidate your cookie and remove session information from the index. {kib} also periodically invalidates and removes any expired sessions that weren't explicitly invalidated. +To manage user sessions programmatically, {kib} exposes <>. + [[session-idle-timeout]] ==== Session idle timeout diff --git a/x-pack/plugins/security/server/authentication/authenticator.test.ts b/x-pack/plugins/security/server/authentication/authenticator.test.ts index e0b9144f6a66f..be53caffc066d 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.test.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.test.ts @@ -585,8 +585,8 @@ describe('Authenticator', () => { expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalledWith(request); + expect(mockOptions.session.invalidate).toHaveBeenCalledTimes(1); + expect(mockOptions.session.invalidate).toHaveBeenCalledWith(request, { match: 'current' }); }); it('clears session if provider asked to do so in `succeeded` result.', async () => { @@ -605,8 +605,8 @@ describe('Authenticator', () => { expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalledWith(request); + expect(mockOptions.session.invalidate).toHaveBeenCalledTimes(1); + expect(mockOptions.session.invalidate).toHaveBeenCalledWith(request, { match: 'current' }); }); it('clears session if provider asked to do so in `redirected` result.', async () => { @@ -624,8 +624,8 @@ describe('Authenticator', () => { expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalledWith(request); + expect(mockOptions.session.invalidate).toHaveBeenCalledTimes(1); + expect(mockOptions.session.invalidate).toHaveBeenCalledWith(request, { match: 'current' }); }); describe('with Access Agreement', () => { @@ -1191,7 +1191,7 @@ describe('Authenticator', () => { expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('extends session for non-system API calls.', async () => { @@ -1213,7 +1213,7 @@ describe('Authenticator', () => { expect(mockOptions.session.extend).toHaveBeenCalledWith(request, mockSessVal); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('does not touch session for system API calls if authentication fails with non-401 reason.', async () => { @@ -1234,7 +1234,7 @@ describe('Authenticator', () => { expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('does not touch session for non-system API calls if authentication fails with non-401 reason.', async () => { @@ -1255,7 +1255,7 @@ describe('Authenticator', () => { expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('replaces existing session with the one returned by authentication provider for system API requests', async () => { @@ -1281,7 +1281,7 @@ describe('Authenticator', () => { }); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('replaces existing session with the one returned by authentication provider for non-system API requests', async () => { @@ -1307,7 +1307,7 @@ describe('Authenticator', () => { }); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('clears session if provider failed to authenticate system API request with 401 with active session.', async () => { @@ -1324,8 +1324,8 @@ describe('Authenticator', () => { AuthenticationResult.failed(Boom.unauthorized()) ); - expect(mockOptions.session.clear).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalledWith(request); + expect(mockOptions.session.invalidate).toHaveBeenCalledTimes(1); + expect(mockOptions.session.invalidate).toHaveBeenCalledWith(request, { match: 'current' }); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); @@ -1345,8 +1345,8 @@ describe('Authenticator', () => { AuthenticationResult.failed(Boom.unauthorized()) ); - expect(mockOptions.session.clear).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalledWith(request); + expect(mockOptions.session.invalidate).toHaveBeenCalledTimes(1); + expect(mockOptions.session.invalidate).toHaveBeenCalledWith(request, { match: 'current' }); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); @@ -1364,8 +1364,8 @@ describe('Authenticator', () => { AuthenticationResult.redirectTo('some-url', { state: null }) ); - expect(mockOptions.session.clear).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalledWith(request); + expect(mockOptions.session.invalidate).toHaveBeenCalledTimes(1); + expect(mockOptions.session.invalidate).toHaveBeenCalledWith(request, { match: 'current' }); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); @@ -1382,7 +1382,7 @@ describe('Authenticator', () => { AuthenticationResult.notHandled() ); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); @@ -1399,7 +1399,7 @@ describe('Authenticator', () => { AuthenticationResult.notHandled() ); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); expect(mockOptions.session.create).not.toHaveBeenCalled(); expect(mockOptions.session.update).not.toHaveBeenCalled(); expect(mockOptions.session.extend).not.toHaveBeenCalled(); @@ -1789,7 +1789,7 @@ describe('Authenticator', () => { DeauthenticationResult.notHandled() ); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('clears session and returns whatever authentication provider returns.', async () => { @@ -1804,7 +1804,7 @@ describe('Authenticator', () => { ); expect(mockBasicAuthenticationProvider.logout).toHaveBeenCalledTimes(1); - expect(mockOptions.session.clear).toHaveBeenCalled(); + expect(mockOptions.session.invalidate).toHaveBeenCalled(); }); it('if session does not exist but provider name is valid, returns whatever authentication provider returns.', async () => { @@ -1823,7 +1823,7 @@ describe('Authenticator', () => { expect(mockBasicAuthenticationProvider.logout).toHaveBeenCalledTimes(1); expect(mockBasicAuthenticationProvider.logout).toHaveBeenCalledWith(request, null); - expect(mockOptions.session.clear).toHaveBeenCalled(); + expect(mockOptions.session.invalidate).toHaveBeenCalled(); }); it('if session does not exist and provider name is not available, returns whatever authentication provider returns.', async () => { @@ -1840,7 +1840,7 @@ describe('Authenticator', () => { expect(mockBasicAuthenticationProvider.logout).toHaveBeenCalledTimes(1); expect(mockBasicAuthenticationProvider.logout).toHaveBeenCalledWith(request); - expect(mockOptions.session.clear).not.toHaveBeenCalled(); + expect(mockOptions.session.invalidate).not.toHaveBeenCalled(); }); it('returns `notHandled` if session does not exist and provider name is invalid', async () => { @@ -1852,7 +1852,7 @@ describe('Authenticator', () => { ); expect(mockBasicAuthenticationProvider.logout).not.toHaveBeenCalled(); - expect(mockOptions.session.clear).toHaveBeenCalled(); + expect(mockOptions.session.invalidate).toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/security/server/authentication/authenticator.ts b/x-pack/plugins/security/server/authentication/authenticator.ts index ff6f3ff0c2ae7..f86ff54963da9 100644 --- a/x-pack/plugins/security/server/authentication/authenticator.ts +++ b/x-pack/plugins/security/server/authentication/authenticator.ts @@ -396,7 +396,7 @@ export class Authenticator { sessionValue?.provider.name ?? request.url.searchParams.get(LOGOUT_PROVIDER_QUERY_STRING_PARAMETER); if (suggestedProviderName) { - await this.session.clear(request); + await this.invalidateSessionValue(request); // Provider name may be passed in a query param and sourced from the browser's local storage; // hence, we can't assume that this provider exists, so we have to check it. @@ -522,7 +522,7 @@ export class Authenticator { this.logger.warn( `Attempted to retrieve session for the "${existingSessionValue.provider.type}/${existingSessionValue.provider.name}" provider, but it is not configured.` ); - await this.session.clear(request); + await this.invalidateSessionValue(request); return null; } @@ -556,7 +556,7 @@ export class Authenticator { // attempt didn't fail. if (authenticationResult.shouldClearState()) { this.logger.debug('Authentication provider requested to invalidate existing session.'); - await this.session.clear(request); + await this.invalidateSessionValue(request); return null; } @@ -570,7 +570,7 @@ export class Authenticator { if (authenticationResult.failed()) { if (ownsSession && getErrorStatusCode(authenticationResult.error) === 401) { this.logger.debug('Authentication attempt failed, existing session will be invalidated.'); - await this.session.clear(request); + await this.invalidateSessionValue(request); } return null; } @@ -608,17 +608,17 @@ export class Authenticator { this.logger.debug( 'Authentication provider has changed, existing session will be invalidated.' ); - await this.session.clear(request); + await this.invalidateSessionValue(request); existingSessionValue = null; } else if (sessionHasBeenAuthenticated) { this.logger.debug( 'Session is authenticated, existing unauthenticated session will be invalidated.' ); - await this.session.clear(request); + await this.invalidateSessionValue(request); existingSessionValue = null; } else if (usernameHasChanged) { this.logger.debug('Username has changed, existing session will be invalidated.'); - await this.session.clear(request); + await this.invalidateSessionValue(request); existingSessionValue = null; } @@ -651,6 +651,14 @@ export class Authenticator { }; } + /** + * Invalidates session value associated with the specified request. + * @param request Request instance. + */ + private async invalidateSessionValue(request: KibanaRequest) { + await this.session.invalidate(request, { match: 'current' }); + } + /** * Checks whether request should be redirected to the Login Selector UI. * @param request Request instance. diff --git a/x-pack/plugins/security/server/routes/session_management/index.ts b/x-pack/plugins/security/server/routes/session_management/index.ts index 1348179386ce0..16cda7b7b409d 100644 --- a/x-pack/plugins/security/server/routes/session_management/index.ts +++ b/x-pack/plugins/security/server/routes/session_management/index.ts @@ -8,8 +8,10 @@ import type { RouteDefinitionParams } from '../'; import { defineSessionExtendRoutes } from './extend'; import { defineSessionInfoRoutes } from './info'; +import { defineInvalidateSessionsRoutes } from './invalidate'; export function defineSessionManagementRoutes(params: RouteDefinitionParams) { defineSessionInfoRoutes(params); defineSessionExtendRoutes(params); + defineInvalidateSessionsRoutes(params); } diff --git a/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts b/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts new file mode 100644 index 0000000000000..215a66a3364e5 --- /dev/null +++ b/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts @@ -0,0 +1,155 @@ +/* + * Copyright 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 { ObjectType } from '@kbn/config-schema'; +import type { PublicMethodsOf } from '@kbn/utility-types'; + +import type { RequestHandler, RouteConfig } from '../../../../../../src/core/server'; +import { kibanaResponseFactory } from '../../../../../../src/core/server'; +import { httpServerMock } from '../../../../../../src/core/server/mocks'; +import type { Session } from '../../session_management'; +import { sessionMock } from '../../session_management/session.mock'; +import type { SecurityRequestHandlerContext, SecurityRouter } from '../../types'; +import { routeDefinitionParamsMock } from '../index.mock'; +import { defineInvalidateSessionsRoutes } from './invalidate'; + +describe('Invalidate sessions routes', () => { + let router: jest.Mocked; + let session: jest.Mocked>; + beforeEach(() => { + const routeParamsMock = routeDefinitionParamsMock.create(); + router = routeParamsMock.router; + + session = sessionMock.create(); + routeParamsMock.getSession.mockReturnValue(session); + + defineInvalidateSessionsRoutes(routeParamsMock); + }); + + describe('invalidate sessions', () => { + let routeHandler: RequestHandler; + let routeConfig: RouteConfig; + beforeEach(() => { + const [extendRouteConfig, extendRouteHandler] = router.post.mock.calls.find( + ([{ path }]) => path === '/api/security/session/_invalidate' + )!; + + routeConfig = extendRouteConfig; + routeHandler = extendRouteHandler; + }); + + it('correctly defines route.', () => { + expect(routeConfig.options).toEqual({ tags: ['access:sessionManagement'] }); + + const bodySchema = (routeConfig.validate as any).body as ObjectType; + expect(() => bodySchema.validate({})).toThrowErrorMatchingInlineSnapshot( + `"[match]: expected at least one defined value but got [undefined]"` + ); + expect(() => bodySchema.validate({ match: 'current' })).toThrowErrorMatchingInlineSnapshot(` + "[match]: types that failed validation: + - [match.0]: expected value to equal [all] + - [match.1]: expected value to equal [query]" + `); + expect(() => + bodySchema.validate({ match: 'all', query: { provider: { type: 'basic' } } }) + ).toThrowErrorMatchingInlineSnapshot(`"[query]: a value wasn't expected to be present"`); + expect(() => bodySchema.validate({ match: 'query' })).toThrowErrorMatchingInlineSnapshot( + `"[query.provider.type]: expected value of type [string] but got [undefined]"` + ); + expect(() => + bodySchema.validate({ match: 'query', query: { username: 'user' } }) + ).toThrowErrorMatchingInlineSnapshot( + `"[query.provider.type]: expected value of type [string] but got [undefined]"` + ); + expect(() => + bodySchema.validate({ + match: 'query', + query: { provider: { name: 'basic1' }, username: 'user' }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"[query.provider.type]: expected value of type [string] but got [undefined]"` + ); + + expect(bodySchema.validate({ match: 'all' })).toEqual({ match: 'all' }); + expect( + bodySchema.validate({ match: 'query', query: { provider: { type: 'basic' } } }) + ).toEqual({ + match: 'query', + query: { provider: { type: 'basic' } }, + }); + expect( + bodySchema.validate({ + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' } }, + }) + ).toEqual({ match: 'query', query: { provider: { type: 'basic', name: 'basic1' } } }); + expect( + bodySchema.validate({ + match: 'query', + query: { provider: { type: 'basic' }, username: 'user' }, + }) + ).toEqual({ match: 'query', query: { provider: { type: 'basic' }, username: 'user' } }); + expect( + bodySchema.validate({ + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' }, username: 'user' }, + }) + ).toEqual({ + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' }, username: 'user' }, + }); + }); + + it('properly constructs `query` match filter.', async () => { + session.invalidate.mockResolvedValue(30); + + const mockRequest = httpServerMock.createKibanaRequest({ + body: { + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' }, username: 'user' }, + }, + }); + await expect( + routeHandler( + ({} as unknown) as SecurityRequestHandlerContext, + mockRequest, + kibanaResponseFactory + ) + ).resolves.toEqual({ + status: 200, + options: { body: { total: 30 } }, + payload: { total: 30 }, + }); + + expect(session.invalidate).toHaveBeenCalledTimes(1); + expect(session.invalidate).toHaveBeenCalledWith(mockRequest, { + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' }, username: 'user' }, + }); + }); + + it('properly constructs `all` match filter.', async () => { + session.invalidate.mockResolvedValue(30); + + const mockRequest = httpServerMock.createKibanaRequest({ body: { match: 'all' } }); + await expect( + routeHandler( + ({} as unknown) as SecurityRequestHandlerContext, + mockRequest, + kibanaResponseFactory + ) + ).resolves.toEqual({ + status: 200, + options: { body: { total: 30 } }, + payload: { total: 30 }, + }); + + expect(session.invalidate).toHaveBeenCalledTimes(1); + expect(session.invalidate).toHaveBeenCalledWith(mockRequest, { match: 'all' }); + }); + }); +}); diff --git a/x-pack/plugins/security/server/routes/session_management/invalidate.ts b/x-pack/plugins/security/server/routes/session_management/invalidate.ts new file mode 100644 index 0000000000000..3416be3dd2965 --- /dev/null +++ b/x-pack/plugins/security/server/routes/session_management/invalidate.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 { schema } from '@kbn/config-schema'; + +import type { RouteDefinitionParams } from '..'; + +/** + * Defines routes required for session invalidation. + */ +export function defineInvalidateSessionsRoutes({ router, getSession }: RouteDefinitionParams) { + router.post( + { + path: '/api/security/session/_invalidate', + validate: { + body: schema.object({ + match: schema.oneOf([schema.literal('all'), schema.literal('query')]), + query: schema.conditional( + schema.siblingRef('match'), + schema.literal('query'), + schema.object({ + provider: schema.object({ + type: schema.string(), + name: schema.maybe(schema.string()), + }), + username: schema.maybe(schema.string()), + }), + schema.never() + ), + }), + }, + options: { tags: ['access:sessionManagement'] }, + }, + async (_context, request, response) => { + return response.ok({ + body: { + total: await getSession().invalidate(request, { + match: request.body.match, + query: request.body.query, + }), + }, + }); + } + ); +} diff --git a/x-pack/plugins/security/server/session_management/session.mock.ts b/x-pack/plugins/security/server/session_management/session.mock.ts index dfe1293f57e92..65ae43e5fa705 100644 --- a/x-pack/plugins/security/server/session_management/session.mock.ts +++ b/x-pack/plugins/security/server/session_management/session.mock.ts @@ -18,7 +18,7 @@ export const sessionMock = { create: jest.fn(), update: jest.fn(), extend: jest.fn(), - clear: jest.fn(), + invalidate: jest.fn(), }), createValue: (sessionValue: Partial = {}): SessionValue => ({ diff --git a/x-pack/plugins/security/server/session_management/session.test.ts b/x-pack/plugins/security/server/session_management/session.test.ts index bd94c9483d561..dfe6ba343ca3c 100644 --- a/x-pack/plugins/security/server/session_management/session.test.ts +++ b/x-pack/plugins/security/server/session_management/session.test.ts @@ -103,7 +103,7 @@ describe('Session', () => { await expect(session.get(httpServerMock.createKibanaRequest())).resolves.toBeNull(); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); - expect(mockSessionIndex.clear).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); }); it('clears session value if session is expired because of lifespan', async () => { @@ -122,7 +122,7 @@ describe('Session', () => { await expect(session.get(httpServerMock.createKibanaRequest())).resolves.toBeNull(); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); - expect(mockSessionIndex.clear).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); }); it('clears session value if session cookie does not have corresponding session index value', async () => { @@ -151,7 +151,7 @@ describe('Session', () => { await expect(session.get(httpServerMock.createKibanaRequest())).resolves.toBeNull(); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); - expect(mockSessionIndex.clear).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); }); it('clears session value if session index value content cannot be decrypted because of wrong AAD', async () => { @@ -170,7 +170,7 @@ describe('Session', () => { await expect(session.get(httpServerMock.createKibanaRequest())).resolves.toBeNull(); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); - expect(mockSessionIndex.clear).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); }); it('returns session value with decrypted content', async () => { @@ -199,7 +199,7 @@ describe('Session', () => { username: 'some-user', }); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); }); }); @@ -279,7 +279,7 @@ describe('Session', () => { const mockRequest = httpServerMock.createKibanaRequest(); await expect(session.update(mockRequest, sessionMock.createValue())).resolves.toBeNull(); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); expect(mockSessionCookie.clear).toHaveBeenCalledWith(mockRequest); }); @@ -432,7 +432,7 @@ describe('Session', () => { }) ); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); } @@ -485,7 +485,7 @@ describe('Session', () => { ); expect(mockSessionIndex.update).not.toHaveBeenCalled(); expect(mockSessionCookie.set).not.toHaveBeenCalled(); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); }); @@ -563,7 +563,7 @@ describe('Session', () => { mockRequest, expect.objectContaining({ idleTimeoutExpiration: expectedNewExpiration }) ); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); }); @@ -582,7 +582,7 @@ describe('Session', () => { ) ).resolves.toBeNull(); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); expect(mockSessionCookie.clear).toHaveBeenCalledWith(mockRequest); }); @@ -625,7 +625,7 @@ describe('Session', () => { mockRequest, expect.objectContaining({ idleTimeoutExpiration: expectedNewExpiration }) ); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); }); @@ -653,7 +653,7 @@ describe('Session', () => { mockRequest, expect.objectContaining({ idleTimeoutExpiration: expectedNewExpiration }) ); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); }); @@ -696,7 +696,7 @@ describe('Session', () => { mockRequest, expect.objectContaining({ idleTimeoutExpiration: expectedNewExpiration }) ); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); }); }); @@ -764,7 +764,7 @@ describe('Session', () => { ); } - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); } @@ -786,27 +786,98 @@ describe('Session', () => { }); }); - describe('#clear', () => { - it('does not clear anything if session does not exist', async () => { + describe('#invalidate', () => { + beforeEach(() => { + mockSessionCookie.get.mockResolvedValue(sessionCookieMock.createValue()); + mockSessionIndex.invalidate.mockResolvedValue(10); + }); + + it('[match=current] does not clear anything if session does not exist', async () => { mockSessionCookie.get.mockResolvedValue(null); - await session.clear(httpServerMock.createKibanaRequest()); + await session.invalidate(httpServerMock.createKibanaRequest(), { match: 'current' }); - expect(mockSessionIndex.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).not.toHaveBeenCalled(); expect(mockSessionCookie.clear).not.toHaveBeenCalled(); }); - it('clears both session cookie and session index', async () => { + it('[match=current] clears both session cookie and session index', async () => { mockSessionCookie.get.mockResolvedValue(sessionCookieMock.createValue()); const mockRequest = httpServerMock.createKibanaRequest(); - await session.clear(mockRequest); + await session.invalidate(mockRequest, { match: 'current' }); - expect(mockSessionIndex.clear).toHaveBeenCalledTimes(1); - expect(mockSessionIndex.clear).toHaveBeenCalledWith('some-long-sid'); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledWith({ + match: 'sid', + sid: 'some-long-sid', + }); expect(mockSessionCookie.clear).toHaveBeenCalledTimes(1); expect(mockSessionCookie.clear).toHaveBeenCalledWith(mockRequest); }); + + it('[match=all] clears all sessions even if current initiator request does not have a session', async () => { + mockSessionCookie.get.mockResolvedValue(null); + + await expect( + session.invalidate(httpServerMock.createKibanaRequest(), { match: 'all' }) + ).resolves.toBe(10); + + expect(mockSessionCookie.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledWith({ match: 'all' }); + }); + + it('[match=query] properly forwards filter with the provider type to the session index', async () => { + await expect( + session.invalidate(httpServerMock.createKibanaRequest(), { + match: 'query', + query: { provider: { type: 'basic' } }, + }) + ).resolves.toBe(10); + + expect(mockSessionCookie.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledWith({ + match: 'query', + query: { provider: { type: 'basic' } }, + }); + }); + + it('[match=query] properly forwards filter with the provider type and provider name to the session index', async () => { + await expect( + session.invalidate(httpServerMock.createKibanaRequest(), { + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' } }, + }) + ).resolves.toBe(10); + + expect(mockSessionCookie.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledWith({ + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' } }, + }); + }); + + it('[match=query] properly forwards filter with the provider type, provider name, and username hash to the session index', async () => { + await expect( + session.invalidate(httpServerMock.createKibanaRequest(), { + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' }, username: 'elastic' }, + }) + ).resolves.toBe(10); + + expect(mockSessionCookie.clear).not.toHaveBeenCalled(); + expect(mockSessionIndex.invalidate).toHaveBeenCalledTimes(1); + expect(mockSessionIndex.invalidate).toHaveBeenCalledWith({ + match: 'query', + query: { + provider: { type: 'basic', name: 'basic1' }, + usernameHash: 'eb28536c8ead72bf81a0a9226e38fc9bad81f5e07c2081bb801b2a5c8842924e', + }, + }); + }); }); }); diff --git a/x-pack/plugins/security/server/session_management/session.ts b/x-pack/plugins/security/server/session_management/session.ts index 7fada4d1730cd..8d2b56b4d2b7a 100644 --- a/x-pack/plugins/security/server/session_management/session.ts +++ b/x-pack/plugins/security/server/session_management/session.ts @@ -79,6 +79,18 @@ export interface SessionValueContentToEncrypt { state: unknown; } +/** + * Filter provided for the `Session.invalidate` method that determines which session values should + * be invalidated. It can have three possible types: + * - `all` means that all existing active and inactive sessions should be invalidated. + * - `current` means that session associated with the current request should be invalidated. + * - `query` means that only sessions that match specified query should be invalidated. + */ +export type InvalidateSessionsFilter = + | { match: 'all' } + | { match: 'current' } + | { match: 'query'; query: { provider: { type: string; name?: string }; username?: string } }; + /** * The SIDs and AAD must be unpredictable to prevent guessing attacks, where an attacker is able to * guess or predict the ID of a valid session through statistical analysis techniques. That's why we @@ -133,7 +145,7 @@ export class Session { (sessionCookieValue.lifespanExpiration && sessionCookieValue.lifespanExpiration < now) ) { sessionLogger.debug('Session has expired and will be invalidated.'); - await this.clear(request); + await this.invalidate(request, { match: 'current' }); return null; } @@ -155,7 +167,7 @@ export class Session { sessionLogger.warn( `Unable to decrypt session content, session will be invalidated: ${err.message}` ); - await this.clear(request); + await this.invalidate(request, { match: 'current' }); return null; } @@ -194,7 +206,7 @@ export class Session { ...publicSessionValue, ...sessionExpirationInfo, sid, - usernameHash: username && createHash('sha3-256').update(username).digest('hex'), + usernameHash: username && Session.getUsernameHash(username), content: await this.crypto.encrypt(JSON.stringify({ username, state }), aad), }); @@ -230,7 +242,7 @@ export class Session { ...sessionValue.metadata.index, ...publicSessionInfo, ...sessionExpirationInfo, - usernameHash: username && createHash('sha3-256').update(username).digest('hex'), + usernameHash: username && Session.getUsernameHash(username), content: await this.crypto.encrypt( JSON.stringify({ username, state }), sessionCookieValue.aad @@ -358,24 +370,53 @@ export class Session { } /** - * Clears session value for the specified request. - * @param request Request instance to clear session value for. + * Invalidates sessions that match the specified filter. + * @param request Request instance initiated invalidation. + * @param filter Filter that narrows down the list of the sessions that should be invalidated. */ - async clear(request: KibanaRequest) { + async invalidate(request: KibanaRequest, filter: InvalidateSessionsFilter) { + // We don't require request to have the associated session, but nevertheless we still want to + // log the SID if session is available. const sessionCookieValue = await this.options.sessionCookie.get(request); - if (!sessionCookieValue) { - return; - } - - const sessionLogger = this.getLoggerForSID(sessionCookieValue.sid); - sessionLogger.debug('Invalidating session.'); + const sessionLogger = this.getLoggerForSID(sessionCookieValue?.sid); + + // We clear session cookie only when the current session should be invalidated since it's the + // only case when this action is explicitly and unequivocally requested. This behavior doesn't + // introduce any risk since even if the current session has been affected the session cookie + // will be automatically invalidated as soon as client attempts to re-use it due to missing + // underlying session index value. + let invalidateIndexValueFilter; + if (filter.match === 'current') { + if (!sessionCookieValue) { + return; + } - await Promise.all([ - this.options.sessionCookie.clear(request), - this.options.sessionIndex.clear(sessionCookieValue.sid), - ]); + sessionLogger.debug('Invalidating current session.'); + await this.options.sessionCookie.clear(request); + invalidateIndexValueFilter = { match: 'sid' as 'sid', sid: sessionCookieValue.sid }; + } else if (filter.match === 'all') { + sessionLogger.debug('Invalidating all sessions.'); + invalidateIndexValueFilter = filter; + } else { + sessionLogger.debug( + `Invalidating sessions that match query: ${JSON.stringify( + filter.query.username ? { ...filter.query, username: '[REDACTED]' } : filter.query + )}.` + ); + invalidateIndexValueFilter = filter.query.username + ? { + ...filter, + query: { + provider: filter.query.provider, + usernameHash: Session.getUsernameHash(filter.query.username), + }, + } + : filter; + } - sessionLogger.debug('Successfully invalidated session.'); + const invalidatedCount = await this.options.sessionIndex.invalidate(invalidateIndexValueFilter); + sessionLogger.debug(`Successfully invalidated ${invalidatedCount} session(s).`); + return invalidatedCount; } private calculateExpiry( @@ -414,9 +455,19 @@ export class Session { /** * Creates logger scoped to a specified session ID. - * @param sid Session ID to create logger for. + * @param [sid] Session ID to create logger for. + */ + private getLoggerForSID(sid?: string) { + return this.options.logger.get(sid?.slice(-10) ?? 'no_session'); + } + + /** + * Generates a sha3-256 hash for the specified `username`. The hash is intended to be stored in + * the session index to allow querying user specific sessions and don't expose the original + * `username` at the same time. + * @param username Username string to generate hash for. */ - private getLoggerForSID(sid: string) { - return this.options.logger.get(sid?.slice(-10)); + private static getUsernameHash(username: string) { + return createHash('sha3-256').update(username).digest('hex'); } } diff --git a/x-pack/plugins/security/server/session_management/session_index.mock.ts b/x-pack/plugins/security/server/session_management/session_index.mock.ts index 56049a3ae9205..9498b60d916a2 100644 --- a/x-pack/plugins/security/server/session_management/session_index.mock.ts +++ b/x-pack/plugins/security/server/session_management/session_index.mock.ts @@ -14,7 +14,7 @@ export const sessionIndexMock = { get: jest.fn(), create: jest.fn(), update: jest.fn(), - clear: jest.fn(), + invalidate: jest.fn(), initialize: jest.fn(), cleanUp: jest.fn(), }), diff --git a/x-pack/plugins/security/server/session_management/session_index.test.ts b/x-pack/plugins/security/server/session_management/session_index.test.ts index 2b3ec0adeb51e..b5b4f64438902 100644 --- a/x-pack/plugins/security/server/session_management/session_index.test.ts +++ b/x-pack/plugins/security/server/session_management/session_index.test.ts @@ -162,7 +162,7 @@ describe('Session index', () => { }); }); - describe('cleanUp', () => { + describe('#cleanUp', () => { const now = 123456; beforeEach(() => { mockElasticsearchClient.deleteByQuery.mockResolvedValue( @@ -797,18 +797,26 @@ describe('Session index', () => { }); }); - describe('#clear', () => { - it('throws if call to Elasticsearch fails', async () => { + describe('#invalidate', () => { + beforeEach(() => { + mockElasticsearchClient.deleteByQuery.mockResolvedValue( + securityMock.createApiResponse({ body: { deleted: 10 } }) + ); + }); + + it('[match=sid] throws if call to Elasticsearch fails', async () => { const failureReason = new errors.ResponseError( securityMock.createApiResponse(securityMock.createApiResponse({ body: { type: 'Uh oh.' } })) ); mockElasticsearchClient.delete.mockRejectedValue(failureReason); - await expect(sessionIndex.clear('some-long-sid')).rejects.toBe(failureReason); + await expect(sessionIndex.invalidate({ match: 'sid', sid: 'some-long-sid' })).rejects.toBe( + failureReason + ); }); - it('properly removes session value from the index', async () => { - await sessionIndex.clear('some-long-sid'); + it('[match=sid] properly removes session value from the index', async () => { + await sessionIndex.invalidate({ match: 'sid', sid: 'some-long-sid' }); expect(mockElasticsearchClient.delete).toHaveBeenCalledTimes(1); expect(mockElasticsearchClient.delete).toHaveBeenCalledWith( @@ -816,5 +824,125 @@ describe('Session index', () => { { ignore: [404] } ); }); + + it('[match=all] throws if call to Elasticsearch fails', async () => { + const failureReason = new errors.ResponseError( + securityMock.createApiResponse(securityMock.createApiResponse({ body: { type: 'Uh oh.' } })) + ); + mockElasticsearchClient.deleteByQuery.mockRejectedValue(failureReason); + + await expect(sessionIndex.invalidate({ match: 'all' })).rejects.toBe(failureReason); + }); + + it('[match=all] properly constructs query', async () => { + await expect(sessionIndex.invalidate({ match: 'all' })).resolves.toBe(10); + + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ + index: indexName, + refresh: true, + body: { query: { match_all: {} } }, + }); + }); + + it('[match=query] throws if call to Elasticsearch fails', async () => { + const failureReason = new errors.ResponseError( + securityMock.createApiResponse(securityMock.createApiResponse({ body: { type: 'Uh oh.' } })) + ); + mockElasticsearchClient.deleteByQuery.mockRejectedValue(failureReason); + + await expect( + sessionIndex.invalidate({ match: 'query', query: { provider: { type: 'basic' } } }) + ).rejects.toBe(failureReason); + }); + + it('[match=query] when only provider type is specified', async () => { + await expect( + sessionIndex.invalidate({ match: 'query', query: { provider: { type: 'basic' } } }) + ).resolves.toBe(10); + + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ + index: indexName, + refresh: true, + body: { query: { bool: { must: [{ term: { 'provider.type': 'basic' } }] } } }, + }); + }); + + it('[match=query] when both provider type and provider name are specified', async () => { + await expect( + sessionIndex.invalidate({ + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' } }, + }) + ).resolves.toBe(10); + + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ + index: indexName, + refresh: true, + body: { + query: { + bool: { + must: [ + { term: { 'provider.type': 'basic' } }, + { term: { 'provider.name': 'basic1' } }, + ], + }, + }, + }, + }); + }); + + it('[match=query] when both provider type and username hash are specified', async () => { + await expect( + sessionIndex.invalidate({ + match: 'query', + query: { provider: { type: 'basic' }, usernameHash: 'some-hash' }, + }) + ).resolves.toBe(10); + + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ + index: indexName, + refresh: true, + body: { + query: { + bool: { + must: [ + { term: { 'provider.type': 'basic' } }, + { term: { usernameHash: 'some-hash' } }, + ], + }, + }, + }, + }); + }); + + it('[match=query] when provider type, provider name, and username hash are specified', async () => { + await expect( + sessionIndex.invalidate({ + match: 'query', + query: { provider: { type: 'basic', name: 'basic1' }, usernameHash: 'some-hash' }, + }) + ).resolves.toBe(10); + + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledTimes(1); + expect(mockElasticsearchClient.deleteByQuery).toHaveBeenCalledWith({ + index: indexName, + refresh: true, + body: { + query: { + bool: { + must: [ + { term: { 'provider.type': 'basic' } }, + { term: { 'provider.name': 'basic1' } }, + { term: { usernameHash: 'some-hash' } }, + ], + }, + }, + }, + }); + }); }); }); diff --git a/x-pack/plugins/security/server/session_management/session_index.ts b/x-pack/plugins/security/server/session_management/session_index.ts index 828c8fa11acdd..1b5c820ec4710 100644 --- a/x-pack/plugins/security/server/session_management/session_index.ts +++ b/x-pack/plugins/security/server/session_management/session_index.ts @@ -17,6 +17,18 @@ export interface SessionIndexOptions { readonly logger: Logger; } +/** + * Filter provided for the `SessionIndex.invalidate` method that determines which session index + * values should be invalidated (removed from the index). It can have three possible types: + * - `all` means that all existing active and inactive sessions should be invalidated. + * - `sid` means that only session with the specified SID should be invalidated. + * - `query` means that only sessions that match specified query should be invalidated. + */ +export type InvalidateSessionsFilter = + | { match: 'all' } + | { match: 'sid'; sid: string } + | { match: 'query'; query: { provider: { type: string; name?: string }; usernameHash?: string } }; + /** * Version of the current session index template. */ @@ -237,19 +249,57 @@ export class SessionIndex { } /** - * Clears session value with the specified ID. - * @param sid Session ID to clear. + * Clears session value(s) determined by the specified filter. + * @param filter Filter that narrows down the list of the session values that should be cleared. */ - async clear(sid: string) { + async invalidate(filter: InvalidateSessionsFilter) { + if (filter.match === 'sid') { + try { + // We don't specify primary term and sequence number as delete should always take precedence + // over any updates that could happen in the meantime. + const { statusCode } = await this.options.elasticsearchClient.delete( + { id: filter.sid, index: this.indexName, refresh: 'wait_for' }, + { ignore: [404] } + ); + + // 404 means the session with such SID wasn't found and hence nothing was removed. + return statusCode !== 404 ? 1 : 0; + } catch (err) { + this.options.logger.error(`Failed to clear session value: ${err.message}`); + throw err; + } + } + + // If filter is specified we should clear only session values that are matched by the filter. + // Otherwise all session values should be cleared. + let deleteQuery; + if (filter.match === 'query') { + deleteQuery = { + bool: { + must: [ + { term: { 'provider.type': filter.query.provider.type } }, + ...(filter.query.provider.name + ? [{ term: { 'provider.name': filter.query.provider.name } }] + : []), + ...(filter.query.usernameHash + ? [{ term: { usernameHash: filter.query.usernameHash } }] + : []), + ], + }, + }; + } else { + deleteQuery = { match_all: {} }; + } + try { - // We don't specify primary term and sequence number as delete should always take precedence - // over any updates that could happen in the meantime. - await this.options.elasticsearchClient.delete( - { id: sid, index: this.indexName, refresh: 'wait_for' }, - { ignore: [404] } - ); + const { body: response } = await this.options.elasticsearchClient.deleteByQuery({ + index: this.indexName, + refresh: true, + body: { query: deleteQuery }, + }); + return response.deleted as number; } catch (err) { - this.options.logger.error(`Failed to clear session value: ${err.message}`); + this.options.logger.error(`Failed to clear session value(s): ${err.message}`); throw err; } } diff --git a/x-pack/scripts/functional_tests.js b/x-pack/scripts/functional_tests.js index 132915922fcea..88c4410fde941 100644 --- a/x-pack/scripts/functional_tests.js +++ b/x-pack/scripts/functional_tests.js @@ -40,6 +40,7 @@ const onlyNotInCoverageTests = [ require.resolve('../test/plugin_api_integration/config.ts'), require.resolve('../test/security_api_integration/saml.config.ts'), require.resolve('../test/security_api_integration/session_idle.config.ts'), + require.resolve('../test/security_api_integration/session_invalidate.config.ts'), require.resolve('../test/security_api_integration/session_lifespan.config.ts'), require.resolve('../test/security_api_integration/login_selector.config.ts'), require.resolve('../test/security_api_integration/audit.config.ts'), diff --git a/x-pack/test/security_api_integration/session_invalidate.config.ts b/x-pack/test/security_api_integration/session_invalidate.config.ts new file mode 100644 index 0000000000000..82510062035a9 --- /dev/null +++ b/x-pack/test/security_api_integration/session_invalidate.config.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { resolve } from 'path'; +import { FtrConfigProviderContext } from '@kbn/test/types/ftr'; +import { services } from './services'; + +// the default export of config files must be a config provider +// that returns an object with the projects config values +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); + + const kibanaPort = xPackAPITestsConfig.get('servers.kibana.port'); + const idpPath = resolve(__dirname, './fixtures/saml/idp_metadata.xml'); + + return { + testFiles: [resolve(__dirname, './tests/session_invalidate')], + services, + servers: xPackAPITestsConfig.get('servers'), + esTestCluster: { + ...xPackAPITestsConfig.get('esTestCluster'), + serverArgs: [ + ...xPackAPITestsConfig.get('esTestCluster.serverArgs'), + 'xpack.security.authc.token.enabled=true', + 'xpack.security.authc.realms.native.native1.order=0', + 'xpack.security.authc.realms.saml.saml1.order=1', + `xpack.security.authc.realms.saml.saml1.idp.metadata.path=${idpPath}`, + 'xpack.security.authc.realms.saml.saml1.idp.entity_id=http://www.elastic.co/saml1', + `xpack.security.authc.realms.saml.saml1.sp.entity_id=http://localhost:${kibanaPort}`, + `xpack.security.authc.realms.saml.saml1.sp.logout=http://localhost:${kibanaPort}/logout`, + `xpack.security.authc.realms.saml.saml1.sp.acs=http://localhost:${kibanaPort}/api/security/saml/callback`, + 'xpack.security.authc.realms.saml.saml1.attributes.principal=urn:oid:0.0.7', + ], + }, + + kbnTestServer: { + ...xPackAPITestsConfig.get('kbnTestServer'), + serverArgs: [ + ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), + `--xpack.security.authc.providers=${JSON.stringify({ + basic: { basic1: { order: 0 } }, + saml: { saml1: { order: 1, realm: 'saml1' } }, + })}`, + ], + }, + + junit: { + reportName: 'X-Pack Security API Integration Tests (Session Invalidate)', + }, + }; +} diff --git a/x-pack/test/security_api_integration/tests/session_invalidate/index.ts b/x-pack/test/security_api_integration/tests/session_invalidate/index.ts new file mode 100644 index 0000000000000..6408e4cfbd43d --- /dev/null +++ b/x-pack/test/security_api_integration/tests/session_invalidate/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('security APIs - Session Invalidate', function () { + this.tags('ciGroup6'); + + loadTestFile(require.resolve('./invalidate')); + }); +} diff --git a/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts b/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts new file mode 100644 index 0000000000000..60605c88ce45e --- /dev/null +++ b/x-pack/test/security_api_integration/tests/session_invalidate/invalidate.ts @@ -0,0 +1,350 @@ +/* + * Copyright 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 request, { Cookie } from 'request'; +import expect from '@kbn/expect'; +import { adminTestUser } from '@kbn/test'; +import type { AuthenticationProvider } from '../../../../plugins/security/common/model'; +import { getSAMLRequestId, getSAMLResponse } from '../../fixtures/saml/saml_tools'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const supertest = getService('supertestWithoutAuth'); + const es = getService('es'); + const security = getService('security'); + const esDeleteAllIndices = getService('esDeleteAllIndices'); + const config = getService('config'); + const randomness = getService('randomness'); + const kibanaServerConfig = config.get('servers.kibana'); + const notSuperuserTestUser = { username: 'test_user', password: 'changeme' }; + + async function checkSessionCookie( + sessionCookie: Cookie, + username: string, + provider: AuthenticationProvider + ) { + const apiResponse = await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', sessionCookie.cookieString()) + .expect(200); + + expect(apiResponse.body.username).to.be(username); + expect(apiResponse.body.authentication_provider).to.eql(provider); + + return Array.isArray(apiResponse.headers['set-cookie']) + ? request.cookie(apiResponse.headers['set-cookie'][0])! + : undefined; + } + + async function loginWithSAML() { + const handshakeResponse = await supertest + .post('/internal/security/login') + .set('kbn-xsrf', 'xxx') + .send({ providerType: 'saml', providerName: 'saml1', currentURL: '' }) + .expect(200); + + const authenticationResponse = await supertest + .post('/api/security/saml/callback') + .set('kbn-xsrf', 'xxx') + .set('Cookie', request.cookie(handshakeResponse.headers['set-cookie'][0])!.cookieString()) + .send({ + SAMLResponse: await getSAMLResponse({ + destination: `http://localhost:${kibanaServerConfig.port}/api/security/saml/callback`, + sessionIndex: String(randomness.naturalNumber()), + inResponseTo: await getSAMLRequestId(handshakeResponse.body.location), + }), + }) + .expect(302); + + const cookie = request.cookie(authenticationResponse.headers['set-cookie'][0])!; + await checkSessionCookie(cookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + return cookie; + } + + async function loginWithBasic(credentials: { username: string; password: string }) { + const authenticationResponse = await supertest + .post('/internal/security/login') + .set('kbn-xsrf', 'xxx') + .send({ + providerType: 'basic', + providerName: 'basic1', + currentURL: '/', + params: credentials, + }) + .expect(200); + + const cookie = request.cookie(authenticationResponse.headers['set-cookie'][0])!; + await checkSessionCookie(cookie, credentials.username, { type: 'basic', name: 'basic1' }); + return cookie; + } + + describe('Session Invalidate', () => { + beforeEach(async () => { + await es.cluster.health({ index: '.kibana_security_session*', wait_for_status: 'green' }); + await esDeleteAllIndices('.kibana_security_session*'); + await security.testUser.setRoles(['kibana_admin']); + }); + + it('should be able to invalidate all sessions at once', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + // Invalidate all sessions and make sure neither of the sessions is active now. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'all' }) + .expect(200, { total: 2 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', basicSessionCookie.cookieString()) + .expect(401); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', samlSessionCookie.cookieString()) + .expect(401); + }); + + it('should do nothing if specified provider type is not configured', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'oidc' } } }) + .expect(200, { total: 0 }); + await checkSessionCookie(basicSessionCookie, notSuperuserTestUser.username, { + type: 'basic', + name: 'basic1', + }); + await checkSessionCookie(samlSessionCookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + }); + + it('should be able to invalidate session only for a specific provider type', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + // Invalidate `basic` session and make sure that only `saml` session is still active. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'basic' } } }) + .expect(200, { total: 1 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', basicSessionCookie.cookieString()) + .expect(401); + await checkSessionCookie(samlSessionCookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + + // Invalidate `saml` session and make sure neither of the sessions is active now. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'saml' } } }) + .expect(200, { total: 1 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', samlSessionCookie.cookieString()) + .expect(401); + }); + + it('should do nothing if specified provider name is not configured', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'basic', name: 'basic2' } } }) + .expect(200, { total: 0 }); + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'saml', name: 'saml2' } } }) + .expect(200, { total: 0 }); + await checkSessionCookie(basicSessionCookie, notSuperuserTestUser.username, { + type: 'basic', + name: 'basic1', + }); + await checkSessionCookie(samlSessionCookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + }); + + it('should be able to invalidate session only for a specific provider name', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + // Invalidate `saml1` session and make sure that only `basic1` session is still active. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'saml', name: 'saml1' } } }) + .expect(200, { total: 1 }); + await checkSessionCookie(basicSessionCookie, notSuperuserTestUser.username, { + type: 'basic', + name: 'basic1', + }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', samlSessionCookie.cookieString()) + .expect(401); + + // Invalidate `basic1` session and make sure neither of the sessions is active now. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ match: 'query', query: { provider: { type: 'basic', name: 'basic1' } } }) + .expect(200, { total: 1 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', basicSessionCookie.cookieString()) + .expect(401); + }); + + it('should do nothing if specified username does not have session', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ + match: 'query', + query: { + provider: { type: 'basic', name: 'basic1' }, + username: `_${notSuperuserTestUser.username}`, + }, + }) + .expect(200, { total: 0 }); + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ + match: 'query', + query: { provider: { type: 'saml', name: 'saml1' }, username: '_a@b.c' }, + }) + .expect(200, { total: 0 }); + await checkSessionCookie(basicSessionCookie, notSuperuserTestUser.username, { + type: 'basic', + name: 'basic1', + }); + await checkSessionCookie(samlSessionCookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + }); + + it('should be able to invalidate session only for a specific user', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + // Invalidate session for `test_user` and make sure that only session of `a@b.c` is still active. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ + match: 'query', + query: { + provider: { type: 'basic', name: 'basic1' }, + username: notSuperuserTestUser.username, + }, + }) + .expect(200, { total: 1 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', basicSessionCookie.cookieString()) + .expect(401); + await checkSessionCookie(samlSessionCookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + + // Invalidate session for `a@b.c` and make sure neither of the sessions is active now. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(adminTestUser.username, adminTestUser.password) + .send({ + match: 'query', + query: { provider: { type: 'saml', name: 'saml1' }, username: 'a@b.c' }, + }) + .expect(200, { total: 1 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', samlSessionCookie.cookieString()) + .expect(401); + }); + + it('only super users should be able to invalidate sessions', async function () { + const basicSessionCookie = await loginWithBasic(notSuperuserTestUser); + const samlSessionCookie = await loginWithSAML(); + + // User without a superuser role shouldn't be able to invalidate sessions. + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(notSuperuserTestUser.username, notSuperuserTestUser.password) + .send({ match: 'all' }) + .expect(403); + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(notSuperuserTestUser.username, notSuperuserTestUser.password) + .send({ match: 'query', query: { provider: { type: 'basic' } } }) + .expect(403); + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(notSuperuserTestUser.username, notSuperuserTestUser.password) + .send({ + match: 'query', + query: { provider: { type: 'basic' }, username: notSuperuserTestUser.username }, + }) + .expect(403); + + await checkSessionCookie(basicSessionCookie, notSuperuserTestUser.username, { + type: 'basic', + name: 'basic1', + }); + await checkSessionCookie(samlSessionCookie, 'a@b.c', { type: 'saml', name: 'saml1' }); + + // With superuser role, it should be possible now. + await security.testUser.setRoles(['superuser']); + + await supertest + .post('/api/security/session/_invalidate') + .set('kbn-xsrf', 'xxx') + .auth(notSuperuserTestUser.username, notSuperuserTestUser.password) + .send({ match: 'all' }) + .expect(200, { total: 2 }); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', basicSessionCookie.cookieString()) + .expect(401); + await supertest + .get('/internal/security/me') + .set('kbn-xsrf', 'xxx') + .set('Cookie', samlSessionCookie.cookieString()) + .expect(401); + }); + }); +} From fdda564a84da90e54c259e89e7082ddfe307308d Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 24 Mar 2021 10:29:46 +0000 Subject: [PATCH 17/35] [ML] Adding additional runtime mapping checks (#94760) * [ML] Adding additional runtime mapping checks * adding functional test for datafeed preview * renaming findFieldsInAgg * updating query check * always use runtime mappings if present in agg field exists check * changes based on review * updating tests based on review * fixing permission check on endpoint and test Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../job_creator/advanced_job_creator.ts | 1 + .../util/filter_runtime_mappings.ts | 31 +- .../services/ml_api_service/index.ts | 5 +- .../polled_data_checker.js | 4 +- .../models/data_visualizer/data_visualizer.ts | 8 +- .../models/fields_service/fields_service.ts | 3 + .../ml/server/models/job_service/datafeeds.ts | 1 + .../models/job_validation/job_validation.ts | 8 +- .../ml/server/routes/fields_service.ts | 4 +- .../plugins/ml/server/routes/job_service.ts | 2 +- .../routes/schemas/fields_service_schema.ts | 1 + .../apis/ml/jobs/datafeed_preview.ts | 272 ++++++++++++++++++ .../api_integration/apis/ml/jobs/index.ts | 1 + 13 files changed, 327 insertions(+), 14 deletions(-) create mode 100644 x-pack/test/api_integration/apis/ml/jobs/datafeed_preview.ts diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts index da5cfc53b7950..2ca95a14fb812 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts @@ -181,6 +181,7 @@ export class AdvancedJobCreator extends JobCreator { index: this._indexPatternTitle, timeFieldName: this.timeFieldName, query: this.query, + runtimeMappings: this.datafeedConfig.runtime_mappings, indicesOptions: this.datafeedConfig.indices_options, }); this.setTimeRange(start.epoch, end.epoch); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.ts index 5319cd3c3aabc..bfed2d811e206 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/util/filter_runtime_mappings.ts @@ -13,6 +13,7 @@ import type { RuntimeMappings } from '../../../../../../../common/types/fields'; import type { Datafeed, Job } from '../../../../../../../common/types/anomaly_detection_jobs'; +import { isPopulatedObject } from '../../../../../../../common/util/object_utils'; interface Response { runtime_mappings: RuntimeMappings; @@ -20,7 +21,10 @@ interface Response { } export function filterRuntimeMappings(job: Job, datafeed: Datafeed): Response { - if (datafeed.runtime_mappings === undefined) { + if ( + datafeed.runtime_mappings === undefined || + isPopulatedObject(datafeed.runtime_mappings) === false + ) { return { runtime_mappings: {}, discarded_mappings: {}, @@ -71,13 +75,18 @@ function findFieldsInJob(job: Job, datafeed: Datafeed) { findFieldsInAgg(aggs).forEach((f) => usedFields.add(f)); } + const query = datafeed.query; + if (query !== undefined) { + findFieldsInQuery(query).forEach((f) => usedFields.add(f)); + } + return [...usedFields]; } -function findFieldsInAgg(obj: Record) { +function findFieldsInAgg(obj: Record) { const fields: string[] = []; Object.entries(obj).forEach(([key, val]) => { - if (typeof val === 'object' && val !== null) { + if (isPopulatedObject(val)) { fields.push(...findFieldsInAgg(val)); } else if (typeof val === 'string' && key === 'field') { fields.push(val); @@ -86,6 +95,22 @@ function findFieldsInAgg(obj: Record) { return fields; } +function findFieldsInQuery(obj: object) { + const fields: string[] = []; + Object.entries(obj).forEach(([key, val]) => { + // return all nested keys in the object + // most will not be fields, but better to catch everything + // and not accidentally remove a used runtime field. + if (isPopulatedObject(val)) { + fields.push(key); + fields.push(...findFieldsInQuery(val)); + } else { + fields.push(key); + } + }); + return fields; +} + function createMappings(rm: RuntimeMappings, usedFieldNames: string[]) { return { runtimeMappings: usedFieldNames.reduce((acc, cur) => { diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts index e6d0d93cade1f..4acb7fca09d0d 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/index.ts @@ -25,6 +25,7 @@ import { import { MlCapabilitiesResponse } from '../../../../common/types/capabilities'; import { Calendar, CalendarId, UpdateCalendar } from '../../../../common/types/calendars'; import { BucketSpanEstimatorData } from '../../../../common/types/job_service'; +import { RuntimeMappings } from '../../../../common/types/fields'; import { Job, JobStats, @@ -690,14 +691,16 @@ export function mlApiServicesProvider(httpService: HttpService) { index, timeFieldName, query, + runtimeMappings, indicesOptions, }: { index: string; timeFieldName?: string; query: any; + runtimeMappings?: RuntimeMappings; indicesOptions?: IndicesOptions; }) { - const body = JSON.stringify({ index, timeFieldName, query, indicesOptions }); + const body = JSON.stringify({ index, timeFieldName, query, runtimeMappings, indicesOptions }); return httpService.http({ path: `${basePath()}/fields_service/time_field_range`, diff --git a/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js b/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js index 8a40787f44490..5fe783e1fc1d5 100644 --- a/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js +++ b/x-pack/plugins/ml/server/models/bucket_span_estimator/polled_data_checker.js @@ -15,11 +15,12 @@ import { get } from 'lodash'; export function polledDataCheckerFactory({ asCurrentUser }) { class PolledDataChecker { - constructor(index, timeField, duration, query, indicesOptions) { + constructor(index, timeField, duration, query, runtimeMappings, indicesOptions) { this.index = index; this.timeField = timeField; this.duration = duration; this.query = query; + this.runtimeMappings = runtimeMappings; this.indicesOptions = indicesOptions; this.isPolled = false; @@ -62,6 +63,7 @@ export function polledDataCheckerFactory({ asCurrentUser }) { }, }, }, + ...this.runtimeMappings, }; return search; diff --git a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts index 4db8295d93997..2a820e0629b75 100644 --- a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts +++ b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -625,15 +625,13 @@ export class DataVisualizer { cardinalityField = aggs[`${safeFieldName}_cardinality`] = { cardinality: { script: datafeedConfig?.script_fields[field].script }, }; - } else if (datafeedConfig?.runtime_mappings?.hasOwnProperty(field)) { - cardinalityField = { - cardinality: { field }, - }; - runtimeMappings.runtime_mappings = datafeedConfig.runtime_mappings; } else { cardinalityField = { cardinality: { field }, }; + if (datafeedConfig !== undefined && isPopulatedObject(datafeedConfig?.runtime_mappings)) { + runtimeMappings.runtime_mappings = datafeedConfig.runtime_mappings; + } } aggs[`${safeFieldName}_cardinality`] = cardinalityField; }); diff --git a/x-pack/plugins/ml/server/models/fields_service/fields_service.ts b/x-pack/plugins/ml/server/models/fields_service/fields_service.ts index 1270cc6f08e23..8e4dbaf23212f 100644 --- a/x-pack/plugins/ml/server/models/fields_service/fields_service.ts +++ b/x-pack/plugins/ml/server/models/fields_service/fields_service.ts @@ -14,6 +14,7 @@ import { AggCardinality } from '../../../common/types/fields'; import { isValidAggregationField } from '../../../common/util/validation_utils'; import { getDatafeedAggregations } from '../../../common/util/datafeed_utils'; import { Datafeed, IndicesOptions } from '../../../common/types/anomaly_detection_jobs'; +import { RuntimeMappings } from '../../../common/types/fields'; /** * Service for carrying out queries to obtain data @@ -212,6 +213,7 @@ export function fieldsServiceProvider({ asCurrentUser }: IScopedClusterClient) { index: string[] | string, timeFieldName: string, query: any, + runtimeMappings?: RuntimeMappings, indicesOptions?: IndicesOptions ): Promise<{ success: boolean; @@ -239,6 +241,7 @@ export function fieldsServiceProvider({ asCurrentUser }: IScopedClusterClient) { }, }, }, + ...(runtimeMappings !== undefined ? { runtime_mappings: runtimeMappings } : {}), }, ...(indicesOptions ?? {}), }); diff --git a/x-pack/plugins/ml/server/models/job_service/datafeeds.ts b/x-pack/plugins/ml/server/models/job_service/datafeeds.ts index cb651a0a410af..cf9b2027225c9 100644 --- a/x-pack/plugins/ml/server/models/job_service/datafeeds.ts +++ b/x-pack/plugins/ml/server/models/job_service/datafeeds.ts @@ -219,6 +219,7 @@ export function datafeedsProvider(client: IScopedClusterClient, mlClient: MlClie datafeed.indices, job.data_description.time_field, query, + datafeed.runtime_mappings, datafeed.indices_options ); diff --git a/x-pack/plugins/ml/server/models/job_validation/job_validation.ts b/x-pack/plugins/ml/server/models/job_validation/job_validation.ts index 31d98753f0bd1..2beade7f5dbc4 100644 --- a/x-pack/plugins/ml/server/models/job_validation/job_validation.ts +++ b/x-pack/plugins/ml/server/models/job_validation/job_validation.ts @@ -64,7 +64,13 @@ export async function validateJob( const fs = fieldsServiceProvider(client); const index = job.datafeed_config.indices.join(','); const timeField = job.data_description.time_field; - const timeRange = await fs.getTimeFieldRange(index, timeField, job.datafeed_config.query); + const timeRange = await fs.getTimeFieldRange( + index, + timeField, + job.datafeed_config.query, + job.datafeed_config.runtime_mappings, + job.datafeed_config.indices_options + ); duration = { start: timeRange.start.epoch, diff --git a/x-pack/plugins/ml/server/routes/fields_service.ts b/x-pack/plugins/ml/server/routes/fields_service.ts index c087b86172fa9..dc43d915e87a2 100644 --- a/x-pack/plugins/ml/server/routes/fields_service.ts +++ b/x-pack/plugins/ml/server/routes/fields_service.ts @@ -22,8 +22,8 @@ function getCardinalityOfFields(client: IScopedClusterClient, payload: any) { function getTimeFieldRange(client: IScopedClusterClient, payload: any) { const fs = fieldsServiceProvider(client); - const { index, timeFieldName, query, indicesOptions } = payload; - return fs.getTimeFieldRange(index, timeFieldName, query, indicesOptions); + const { index, timeFieldName, query, runtimeMappings, indicesOptions } = payload; + return fs.getTimeFieldRange(index, timeFieldName, query, runtimeMappings, indicesOptions); } /** diff --git a/x-pack/plugins/ml/server/routes/job_service.ts b/x-pack/plugins/ml/server/routes/job_service.ts index b3aa9f956895a..1f755c27db871 100644 --- a/x-pack/plugins/ml/server/routes/job_service.ts +++ b/x-pack/plugins/ml/server/routes/job_service.ts @@ -791,7 +791,7 @@ export function jobServiceRoutes({ router, routeGuard }: RouteInitialization) { body: datafeedPreviewSchema, }, options: { - tags: ['access:ml:canGetJobs'], + tags: ['access:ml:canPreviewDatafeed'], }, }, routeGuard.fullLicenseAPIGuard(async ({ client, mlClient, request, response }) => { diff --git a/x-pack/plugins/ml/server/routes/schemas/fields_service_schema.ts b/x-pack/plugins/ml/server/routes/schemas/fields_service_schema.ts index db827b26fe73a..76a307e710dc8 100644 --- a/x-pack/plugins/ml/server/routes/schemas/fields_service_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/fields_service_schema.ts @@ -31,5 +31,6 @@ export const getTimeFieldRangeSchema = schema.object({ /** Query to match documents in the index(es). */ query: schema.maybe(schema.any()), /** Additional search options. */ + runtimeMappings: schema.maybe(schema.any()), indicesOptions: indicesOptionsSchema, }); diff --git a/x-pack/test/api_integration/apis/ml/jobs/datafeed_preview.ts b/x-pack/test/api_integration/apis/ml/jobs/datafeed_preview.ts new file mode 100644 index 0000000000000..2fcf75f99ff17 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/jobs/datafeed_preview.ts @@ -0,0 +1,272 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/ml/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../../functional/services/ml/common_api'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + const jobId = `fq_datafeed_preview_${Date.now()}`; + + const job = { + job_id: `${jobId}_1`, + description: '', + groups: ['automated', 'farequote'], + analysis_config: { + bucket_span: '30m', + detectors: [{ function: 'distinct_count', field_name: 'airline' }], + influencers: [], + }, + data_description: { time_field: '@timestamp' }, + analysis_limits: { model_memory_limit: '11MB' }, + }; + + function isUpperCase(str: string) { + return /^[A-Z]+$/.test(str); + } + + function isLowerCase(str: string) { + return !/[A-Z]+/.test(str); + } + + describe('Datafeed preview', function () { + before(async () => { + await esArchiver.loadIfNeeded('ml/farequote'); + await ml.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it(`should return a normal datafeed preview`, async () => { + const datafeed = { + datafeed_id: '', + job_id: '', + indices: ['ft_farequote'], + query: { + bool: { + must: [ + { + match_all: {}, + }, + ], + }, + }, + runtime_mappings: {}, + }; + + const { body } = await supertest + .post('/api/ml/jobs/datafeed_preview') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_REQUEST_HEADERS) + .send({ job, datafeed }) + .expect(200); + + expect(body.hits.total.value).to.eql(3207, 'Response body total hits should be 3207'); + expect(Array.isArray(body.hits?.hits[0]?.fields?.airline)).to.eql( + true, + 'Response body airlines should be an array' + ); + + const airlines: string[] = body.hits.hits.map((a: any) => a.fields.airline[0]); + expect(airlines.length).to.not.eql(0, 'airlines length should not be 0'); + expect(airlines.every((a) => isUpperCase(a))).to.eql( + true, + 'Response body airlines should all be upper case' + ); + }); + + it(`should return a datafeed preview using custom query`, async () => { + const datafeed = { + datafeed_id: '', + job_id: '', + indices: ['ft_farequote'], + query: { + bool: { + should: [ + { + match: { + airline: 'AAL', + }, + }, + ], + }, + }, + runtime_mappings: {}, + }; + + const { body } = await supertest + .post('/api/ml/jobs/datafeed_preview') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_REQUEST_HEADERS) + .send({ job, datafeed }) + .expect(200); + + expect(body.hits.total.value).to.eql(300, 'Response body total hits should be 300'); + expect(Array.isArray(body.hits?.hits[0]?.fields?.airline)).to.eql( + true, + 'Response body airlines should be an array' + ); + + const airlines: string[] = body.hits.hits.map((a: any) => a.fields.airline[0]); + expect(airlines.length).to.not.eql(0, 'airlines length should not be 0'); + expect(airlines.every((a) => a === 'AAL')).to.eql( + true, + 'Response body airlines should all be AAL' + ); + }); + + it(`should return a datafeed preview using runtime mappings`, async () => { + const datafeed = { + datafeed_id: '', + job_id: '', + indices: ['ft_farequote'], + query: { + bool: { + must: [ + { + match_all: {}, + }, + ], + }, + }, + runtime_mappings: { + lowercase_airline: { + type: 'keyword', + script: { + source: 'emit(params._source.airline.toLowerCase())', + }, + }, + }, + }; + + const { body } = await supertest + .post('/api/ml/jobs/datafeed_preview') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_REQUEST_HEADERS) + .send({ job, datafeed }) + .expect(200); + + expect(body.hits.total.value).to.eql(3207, 'Response body total hits should be 3207'); + expect(Array.isArray(body.hits?.hits[0]?.fields?.lowercase_airline)).to.eql( + true, + 'Response body airlines should be an array' + ); + + const airlines: string[] = body.hits.hits.map((a: any) => a.fields.lowercase_airline[0]); + expect(airlines.length).to.not.eql(0, 'airlines length should not be 0'); + expect(isLowerCase(airlines[0])).to.eql( + true, + 'Response body airlines should all be lower case' + ); + }); + + it(`should return a datafeed preview using custom query and runtime mappings which override the field name`, async () => { + const datafeed = { + datafeed_id: '', + job_id: '', + indices: ['ft_farequote'], + query: { + bool: { + should: [ + { + match: { + airline: 'aal', + }, + }, + ], + }, + }, + runtime_mappings: { + // override the airline field name + airline: { + type: 'keyword', + script: { + source: 'emit(params._source.airline.toLowerCase())', + }, + }, + }, + }; + + const { body } = await supertest + .post('/api/ml/jobs/datafeed_preview') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_REQUEST_HEADERS) + .send({ job, datafeed }) + .expect(200); + + expect(body.hits.total.value).to.eql(300, 'Response body total hits should be 300'); + expect(Array.isArray(body.hits?.hits[0]?.fields?.airline)).to.eql( + true, + 'Response body airlines should be an array' + ); + + const airlines: string[] = body.hits.hits.map((a: any) => a.fields.airline[0]); + expect(airlines.length).to.not.eql(0, 'airlines length should not be 0'); + expect(isLowerCase(airlines[0])).to.eql( + true, + 'Response body airlines should all be lower case' + ); + }); + + it(`should return not a datafeed preview for ML viewer user`, async () => { + const datafeed = { + datafeed_id: '', + job_id: '', + indices: ['ft_farequote'], + query: { + bool: { + must: [ + { + match_all: {}, + }, + ], + }, + }, + runtime_mappings: {}, + }; + + await supertest + .post('/api/ml/jobs/datafeed_preview') + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_REQUEST_HEADERS) + .send({ job, datafeed }) + .expect(403); + }); + + it(`should return not a datafeed preview for unauthorized user`, async () => { + const datafeed = { + datafeed_id: '', + job_id: '', + indices: ['ft_farequote'], + query: { + bool: { + must: [ + { + match_all: {}, + }, + ], + }, + }, + runtime_mappings: {}, + }; + + await supertest + .post('/api/ml/jobs/datafeed_preview') + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(COMMON_REQUEST_HEADERS) + .send({ job, datafeed }) + .expect(403); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/jobs/index.ts b/x-pack/test/api_integration/apis/ml/jobs/index.ts index bea6d5972e7a6..4c52f2ef862c3 100644 --- a/x-pack/test/api_integration/apis/ml/jobs/index.ts +++ b/x-pack/test/api_integration/apis/ml/jobs/index.ts @@ -17,5 +17,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./jobs_exist_spaces')); loadTestFile(require.resolve('./close_jobs_spaces')); loadTestFile(require.resolve('./delete_jobs_spaces')); + loadTestFile(require.resolve('./datafeed_preview')); }); } From f07b1722cb71609663b70dd889545d2d4aeec028 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 24 Mar 2021 11:44:23 +0100 Subject: [PATCH 18/35] [Lens] Implement filtered metric (#92589) --- api_docs/charts.json | 42 +- api_docs/data.json | 345 +- api_docs/data_search.json | 4404 +++++++++++++---- api_docs/expressions.json | 81 + api_docs/fleet.json | 177 +- api_docs/lens.json | 18 +- api_docs/observability.json | 4 +- ...c.aggfunctionsmapping.aggfilteredmetric.md | 11 + ...plugins-data-public.aggfunctionsmapping.md | 1 + ...plugin-plugins-data-public.metric_types.md | 1 + ...r.aggfunctionsmapping.aggfilteredmetric.md | 11 + ...plugins-data-server.aggfunctionsmapping.md | 1 + ...plugin-plugins-data-server.metric_types.md | 1 + .../data/common/search/aggs/agg_config.ts | 4 +- .../data/common/search/aggs/agg_configs.ts | 20 +- .../data/common/search/aggs/agg_type.ts | 8 + .../data/common/search/aggs/agg_types.ts | 2 + .../common/search/aggs/aggs_service.test.ts | 2 + .../data/common/search/aggs/buckets/filter.ts | 27 +- .../search/aggs/buckets/filter_fn.test.ts | 21 + .../common/search/aggs/buckets/filter_fn.ts | 19 +- .../aggs/metrics/filtered_metric.test.ts | 72 + .../search/aggs/metrics/filtered_metric.ts | 56 + .../aggs/metrics/filtered_metric_fn.test.ts | 51 + .../search/aggs/metrics/filtered_metric_fn.ts | 94 + .../data/common/search/aggs/metrics/index.ts | 2 + .../metrics/lib/parent_pipeline_agg_helper.ts | 1 + .../lib/sibling_pipeline_agg_helper.ts | 8 +- .../search/aggs/metrics/metric_agg_types.ts | 1 + src/plugins/data/common/search/aggs/types.ts | 4 + src/plugins/data/public/public.api.md | 14 +- .../public/search/aggs/aggs_service.test.ts | 4 +- src/plugins/data/server/server.api.md | 10 +- .../vis_type_metric/public/metric_vis_type.ts | 1 + .../public/legacy/table_vis_legacy_type.ts | 2 +- .../vis_type_table/public/table_vis_type.ts | 2 +- .../public/tag_cloud_type.ts | 1 + src/plugins/vis_type_vislib/public/gauge.ts | 1 + src/plugins/vis_type_vislib/public/goal.ts | 1 + src/plugins/vis_type_vislib/public/heatmap.ts | 1 + .../vis_type_xy/public/vis_types/area.ts | 2 +- .../vis_type_xy/public/vis_types/histogram.ts | 2 +- .../public/vis_types/horizontal_bar.ts | 2 +- .../vis_type_xy/public/vis_types/line.ts | 2 +- .../dimension_panel/advanced_options.tsx | 82 + .../dimension_panel/dimension_editor.tsx | 69 +- .../dimension_panel/dimension_panel.test.tsx | 227 +- .../dimension_panel/filtering.tsx | 131 + .../dimension_panel/time_scaling.tsx | 65 +- .../indexpattern.test.ts | 117 + .../definitions/calculations/counter_rate.tsx | 2 + .../calculations/cumulative_sum.tsx | 2 + .../definitions/calculations/derivative.tsx | 2 + .../calculations/moving_average.tsx | 2 + .../operations/definitions/cardinality.tsx | 2 + .../operations/definitions/column_types.ts | 2 + .../operations/definitions/count.tsx | 2 + .../filters/filter_popover.test.tsx | 3 +- .../definitions/filters/filter_popover.tsx | 56 +- .../operations/definitions/index.ts | 1 + .../operations/definitions/last_value.tsx | 2 + .../operations/definitions/metrics.tsx | 2 + .../operations/layer_helpers.test.ts | 43 + .../operations/layer_helpers.ts | 13 +- .../operations/mocks.ts | 1 + .../indexpattern_datasource/query_input.tsx | 66 + .../indexpattern_datasource/to_expression.ts | 53 +- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 69 files changed, 4976 insertions(+), 1505 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilteredmetric.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilteredmetric.md create mode 100644 src/plugins/data/common/search/aggs/metrics/filtered_metric.test.ts create mode 100644 src/plugins/data/common/search/aggs/metrics/filtered_metric.ts create mode 100644 src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.test.ts create mode 100644 src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.ts create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/advanced_options.tsx create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/filtering.tsx create mode 100644 x-pack/plugins/lens/public/indexpattern_datasource/query_input.tsx diff --git a/api_docs/charts.json b/api_docs/charts.json index 5c4008d0f25bc..70bf2166de7c8 100644 --- a/api_docs/charts.json +++ b/api_docs/charts.json @@ -1597,7 +1597,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 3160 + "lineNumber": 174 }, "signature": [ { @@ -1816,7 +1816,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 558 + "lineNumber": 56 }, "signature": [ { @@ -1837,7 +1837,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 559 + "lineNumber": 57 } }, { @@ -1848,7 +1848,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 562 + "lineNumber": 60 }, "signature": [ "[number, number[]][]" @@ -1859,7 +1859,7 @@ "label": "[ColorSchemas.Greens]", "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 557 + "lineNumber": 55 } }, { @@ -1875,7 +1875,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1078 + "lineNumber": 74 }, "signature": [ { @@ -1896,7 +1896,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1079 + "lineNumber": 75 } }, { @@ -1907,7 +1907,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1082 + "lineNumber": 78 }, "signature": [ "[number, number[]][]" @@ -1918,7 +1918,7 @@ "label": "[ColorSchemas.Greys]", "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1077 + "lineNumber": 73 } }, { @@ -1934,7 +1934,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1598 + "lineNumber": 92 }, "signature": [ { @@ -1955,7 +1955,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1599 + "lineNumber": 93 } }, { @@ -1966,7 +1966,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1602 + "lineNumber": 96 }, "signature": [ "[number, number[]][]" @@ -1977,7 +1977,7 @@ "label": "[ColorSchemas.Reds]", "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 1597 + "lineNumber": 91 } }, { @@ -1993,7 +1993,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2118 + "lineNumber": 110 }, "signature": [ { @@ -2014,7 +2014,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2119 + "lineNumber": 111 } }, { @@ -2025,7 +2025,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2122 + "lineNumber": 114 }, "signature": [ "[number, number[]][]" @@ -2036,7 +2036,7 @@ "label": "[ColorSchemas.YellowToRed]", "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2117 + "lineNumber": 109 } }, { @@ -2052,7 +2052,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2639 + "lineNumber": 129 }, "signature": [ { @@ -2073,7 +2073,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2640 + "lineNumber": 130 } }, { @@ -2084,7 +2084,7 @@ "description": [], "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2643 + "lineNumber": 133 }, "signature": [ "[number, number[]][]" @@ -2095,7 +2095,7 @@ "label": "[ColorSchemas.GreenToRed]", "source": { "path": "src/plugins/charts/public/static/color_maps/color_maps.ts", - "lineNumber": 2638 + "lineNumber": 128 } } ], diff --git a/api_docs/data.json b/api_docs/data.json index a78aec92b1fa5..a9ef03d881ce8 100644 --- a/api_docs/data.json +++ b/api_docs/data.json @@ -608,7 +608,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 263 + "lineNumber": 265 } }, { @@ -634,7 +634,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 294 + "lineNumber": 296 } }, { @@ -654,7 +654,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 305 + "lineNumber": 307 } }, { @@ -680,7 +680,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 314 + "lineNumber": 316 } }, { @@ -712,7 +712,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 369 + "lineNumber": 371 } }, { @@ -736,7 +736,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 373 + "lineNumber": 375 } }, { @@ -760,7 +760,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 377 + "lineNumber": 379 } }, { @@ -782,7 +782,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 381 + "lineNumber": 383 } } ], @@ -790,7 +790,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 381 + "lineNumber": 383 } }, { @@ -812,7 +812,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 385 + "lineNumber": 387 } }, { @@ -825,7 +825,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 385 + "lineNumber": 387 } } ], @@ -833,7 +833,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 385 + "lineNumber": 387 } }, { @@ -849,7 +849,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 393 + "lineNumber": 395 } }, { @@ -865,7 +865,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 399 + "lineNumber": 401 } }, { @@ -883,7 +883,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 408 + "lineNumber": 410 } }, { @@ -905,7 +905,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 412 + "lineNumber": 414 } } ], @@ -913,7 +913,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 412 + "lineNumber": 414 } }, { @@ -936,7 +936,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 426 + "lineNumber": 428 } }, { @@ -960,7 +960,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 430 + "lineNumber": 432 } }, { @@ -976,7 +976,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 434 + "lineNumber": 436 } }, { @@ -992,7 +992,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 439 + "lineNumber": 441 } }, { @@ -1003,7 +1003,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 446 + "lineNumber": 448 }, "signature": [ { @@ -1023,7 +1023,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 450 + "lineNumber": 452 }, "signature": [ { @@ -1068,7 +1068,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 480 + "lineNumber": 482 } } ], @@ -1076,7 +1076,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 480 + "lineNumber": 482 } } ], @@ -1101,7 +1101,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 58 + "lineNumber": 65 }, "signature": [ { @@ -1121,7 +1121,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 59 + "lineNumber": 66 }, "signature": [ { @@ -1142,7 +1142,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 62 + "lineNumber": 69 }, "signature": [ { @@ -1180,7 +1180,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 65 + "lineNumber": 72 } }, { @@ -1217,7 +1217,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 66 + "lineNumber": 73 } }, { @@ -1236,7 +1236,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 67 + "lineNumber": 74 } } ], @@ -1244,7 +1244,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 64 + "lineNumber": 71 } }, { @@ -1280,7 +1280,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 79 + "lineNumber": 86 } } ], @@ -1288,7 +1288,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 79 + "lineNumber": 86 } }, { @@ -1317,7 +1317,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 97 + "lineNumber": 104 } } ], @@ -1325,7 +1325,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 97 + "lineNumber": 104 } }, { @@ -1366,7 +1366,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 111 + "lineNumber": 118 } }, { @@ -1379,7 +1379,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 112 + "lineNumber": 119 } } ], @@ -1429,7 +1429,7 @@ "label": "createAggConfig", "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 110 + "lineNumber": 117 }, "tags": [], "returnComment": [] @@ -1472,7 +1472,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 153 + "lineNumber": 160 } } ], @@ -1480,7 +1480,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 153 + "lineNumber": 160 } }, { @@ -1502,7 +1502,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 165 + "lineNumber": 172 } } ], @@ -1510,7 +1510,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 165 + "lineNumber": 172 } }, { @@ -1534,7 +1534,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 227 + "lineNumber": 241 } }, { @@ -1563,7 +1563,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 231 + "lineNumber": 245 } } ], @@ -1571,7 +1571,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 231 + "lineNumber": 245 } }, { @@ -1601,7 +1601,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 235 + "lineNumber": 249 } } ], @@ -1609,7 +1609,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 235 + "lineNumber": 249 } }, { @@ -1639,7 +1639,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 239 + "lineNumber": 253 } } ], @@ -1647,7 +1647,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 239 + "lineNumber": 253 } }, { @@ -1677,7 +1677,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 243 + "lineNumber": 257 } } ], @@ -1685,7 +1685,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 243 + "lineNumber": 257 } }, { @@ -1715,7 +1715,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 247 + "lineNumber": 261 } } ], @@ -1723,7 +1723,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 247 + "lineNumber": 261 } }, { @@ -1753,7 +1753,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 251 + "lineNumber": 265 } } ], @@ -1761,7 +1761,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 251 + "lineNumber": 265 } }, { @@ -1785,7 +1785,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 255 + "lineNumber": 269 } }, { @@ -1815,7 +1815,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 269 + "lineNumber": 283 } } ], @@ -1823,7 +1823,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 269 + "lineNumber": 283 } }, { @@ -1851,7 +1851,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 284 + "lineNumber": 298 } }, { @@ -1885,7 +1885,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 298 + "lineNumber": 312 } } ], @@ -1895,7 +1895,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 298 + "lineNumber": 312 } }, { @@ -1941,7 +1941,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 307 + "lineNumber": 321 } }, { @@ -1961,7 +1961,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 307 + "lineNumber": 321 } } ], @@ -1969,13 +1969,13 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 307 + "lineNumber": 321 } } ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 57 + "lineNumber": 64 }, "initialIsOpen": false }, @@ -6059,7 +6059,7 @@ "type": "Function", "label": "setField", "signature": [ - "(field: K, value: ", + "(field: K, value: ", { "pluginId": "data", "scope": "common", @@ -6123,7 +6123,7 @@ "type": "Function", "label": "removeField", "signature": [ - "(field: K) => this" + "(field: K) => this" ], "description": [ "\nremove field" @@ -6250,7 +6250,7 @@ "type": "Function", "label": "getField", "signature": [ - "(field: K, recurse?: boolean) => ", + "(field: K, recurse?: boolean) => ", { "pluginId": "data", "scope": "common", @@ -6303,7 +6303,7 @@ "type": "Function", "label": "getOwnField", "signature": [ - "(field: K) => ", + "(field: K) => ", { "pluginId": "data", "scope": "common", @@ -7635,7 +7635,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 204 + "lineNumber": 207 }, "signature": [ "FunctionDefinition" @@ -7649,7 +7649,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 205 + "lineNumber": 208 }, "signature": [ "FunctionDefinition" @@ -7663,7 +7663,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 206 + "lineNumber": 209 }, "signature": [ "FunctionDefinition" @@ -7677,7 +7677,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 207 + "lineNumber": 210 }, "signature": [ "FunctionDefinition" @@ -7691,7 +7691,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 208 + "lineNumber": 211 }, "signature": [ "FunctionDefinition" @@ -7705,7 +7705,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 209 + "lineNumber": 212 }, "signature": [ "FunctionDefinition" @@ -7719,7 +7719,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 210 + "lineNumber": 213 }, "signature": [ "FunctionDefinition" @@ -7733,7 +7733,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 211 + "lineNumber": 214 }, "signature": [ "FunctionDefinition" @@ -7747,7 +7747,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 212 + "lineNumber": 215 }, "signature": [ "FunctionDefinition" @@ -7761,7 +7761,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 213 + "lineNumber": 216 }, "signature": [ "FunctionDefinition" @@ -7775,7 +7775,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 214 + "lineNumber": 217 }, "signature": [ "FunctionDefinition" @@ -7789,7 +7789,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 215 + "lineNumber": 218 }, "signature": [ "FunctionDefinition" @@ -7803,7 +7803,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 216 + "lineNumber": 219 }, "signature": [ "FunctionDefinition" @@ -7817,7 +7817,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 217 + "lineNumber": 220 }, "signature": [ "FunctionDefinition" @@ -7831,7 +7831,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 218 + "lineNumber": 221 }, "signature": [ "FunctionDefinition" @@ -7845,7 +7845,21 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 219 + "lineNumber": 222 + }, + "signature": [ + "FunctionDefinition" + ] + }, + { + "tags": [], + "id": "def-public.AggFunctionsMapping.aggFilteredMetric", + "type": "Object", + "label": "aggFilteredMetric", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/types.ts", + "lineNumber": 223 }, "signature": [ "FunctionDefinition" @@ -7859,7 +7873,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 220 + "lineNumber": 224 }, "signature": [ "FunctionDefinition" @@ -7873,7 +7887,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 221 + "lineNumber": 225 }, "signature": [ "FunctionDefinition" @@ -7887,7 +7901,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 222 + "lineNumber": 226 }, "signature": [ "FunctionDefinition" @@ -7901,7 +7915,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 223 + "lineNumber": 227 }, "signature": [ "FunctionDefinition" @@ -7915,7 +7929,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 224 + "lineNumber": 228 }, "signature": [ "FunctionDefinition" @@ -7929,7 +7943,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 225 + "lineNumber": 229 }, "signature": [ "FunctionDefinition" @@ -7943,7 +7957,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 226 + "lineNumber": 230 }, "signature": [ "FunctionDefinition" @@ -7957,7 +7971,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 227 + "lineNumber": 231 }, "signature": [ "FunctionDefinition" @@ -7971,7 +7985,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 228 + "lineNumber": 232 }, "signature": [ "FunctionDefinition" @@ -7985,7 +7999,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 229 + "lineNumber": 233 }, "signature": [ "FunctionDefinition" @@ -7999,7 +8013,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 230 + "lineNumber": 234 }, "signature": [ "FunctionDefinition" @@ -8013,7 +8027,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 231 + "lineNumber": 235 }, "signature": [ "FunctionDefinition" @@ -8027,7 +8041,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 232 + "lineNumber": 236 }, "signature": [ "FunctionDefinition" @@ -8041,7 +8055,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 233 + "lineNumber": 237 }, "signature": [ "FunctionDefinition" @@ -8055,7 +8069,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 234 + "lineNumber": 238 }, "signature": [ "FunctionDefinition" @@ -8069,7 +8083,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 235 + "lineNumber": 239 }, "signature": [ "FunctionDefinition" @@ -8078,7 +8092,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 203 + "lineNumber": 206 }, "initialIsOpen": false }, @@ -11407,7 +11421,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 139 + "lineNumber": 141 }, "signature": [ "{ calculateAutoTimeExpression: (range: TimeRange) => string | undefined; getDateMetaByDatatableColumn: (column: DatatableColumn) => Promise<{ timeZone: string; timeRange?: TimeRange | undefined; interval: string; } | undefined>; datatableUtilities: { getIndexPattern: (column: DatatableColumn) => Promise; getAggConfig: (column: DatatableColumn) => Promise; isFilterable: (column: DatatableColumn) => boolean; }; createAggConfigs: (indexPattern: IndexPattern, configStates?: Pick>" @@ -11946,7 +11960,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 29 + "lineNumber": 32 }, "signature": [ "{ type: \"kibana_context\"; } & ExecutionContextSearch" @@ -18807,7 +18821,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 204 + "lineNumber": 207 }, "signature": [ "FunctionDefinition" @@ -18821,7 +18835,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 205 + "lineNumber": 208 }, "signature": [ "FunctionDefinition" @@ -18835,7 +18849,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 206 + "lineNumber": 209 }, "signature": [ "FunctionDefinition" @@ -18849,7 +18863,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 207 + "lineNumber": 210 }, "signature": [ "FunctionDefinition" @@ -18863,7 +18877,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 208 + "lineNumber": 211 }, "signature": [ "FunctionDefinition" @@ -18877,7 +18891,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 209 + "lineNumber": 212 }, "signature": [ "FunctionDefinition" @@ -18891,7 +18905,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 210 + "lineNumber": 213 }, "signature": [ "FunctionDefinition" @@ -18905,7 +18919,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 211 + "lineNumber": 214 }, "signature": [ "FunctionDefinition" @@ -18919,7 +18933,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 212 + "lineNumber": 215 }, "signature": [ "FunctionDefinition" @@ -18933,7 +18947,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 213 + "lineNumber": 216 }, "signature": [ "FunctionDefinition" @@ -18947,7 +18961,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 214 + "lineNumber": 217 }, "signature": [ "FunctionDefinition" @@ -18961,7 +18975,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 215 + "lineNumber": 218 }, "signature": [ "FunctionDefinition" @@ -18975,7 +18989,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 216 + "lineNumber": 219 }, "signature": [ "FunctionDefinition" @@ -18989,7 +19003,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 217 + "lineNumber": 220 }, "signature": [ "FunctionDefinition" @@ -19003,7 +19017,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 218 + "lineNumber": 221 }, "signature": [ "FunctionDefinition" @@ -19017,7 +19031,21 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 219 + "lineNumber": 222 + }, + "signature": [ + "FunctionDefinition" + ] + }, + { + "tags": [], + "id": "def-server.AggFunctionsMapping.aggFilteredMetric", + "type": "Object", + "label": "aggFilteredMetric", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/types.ts", + "lineNumber": 223 }, "signature": [ "FunctionDefinition" @@ -19031,7 +19059,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 220 + "lineNumber": 224 }, "signature": [ "FunctionDefinition" @@ -19045,7 +19073,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 221 + "lineNumber": 225 }, "signature": [ "FunctionDefinition" @@ -19059,7 +19087,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 222 + "lineNumber": 226 }, "signature": [ "FunctionDefinition" @@ -19073,7 +19101,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 223 + "lineNumber": 227 }, "signature": [ "FunctionDefinition" @@ -19087,7 +19115,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 224 + "lineNumber": 228 }, "signature": [ "FunctionDefinition" @@ -19101,7 +19129,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 225 + "lineNumber": 229 }, "signature": [ "FunctionDefinition" @@ -19115,7 +19143,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 226 + "lineNumber": 230 }, "signature": [ "FunctionDefinition" @@ -19129,7 +19157,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 227 + "lineNumber": 231 }, "signature": [ "FunctionDefinition" @@ -19143,7 +19171,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 228 + "lineNumber": 232 }, "signature": [ "FunctionDefinition" @@ -19157,7 +19185,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 229 + "lineNumber": 233 }, "signature": [ "FunctionDefinition" @@ -19171,7 +19199,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 230 + "lineNumber": 234 }, "signature": [ "FunctionDefinition" @@ -19185,7 +19213,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 231 + "lineNumber": 235 }, "signature": [ "FunctionDefinition" @@ -19199,7 +19227,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 232 + "lineNumber": 236 }, "signature": [ "FunctionDefinition" @@ -19213,7 +19241,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 233 + "lineNumber": 237 }, "signature": [ "FunctionDefinition" @@ -19227,7 +19255,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 234 + "lineNumber": 238 }, "signature": [ "FunctionDefinition" @@ -19241,7 +19269,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 235 + "lineNumber": 239 }, "signature": [ "FunctionDefinition" @@ -19250,7 +19278,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 203 + "lineNumber": 206 }, "initialIsOpen": false }, @@ -20453,7 +20481,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 14 + "lineNumber": 15 }, "signature": [ "{ filters?: Filter[] | undefined; query?: Query | Query[] | undefined; timeRange?: TimeRange | undefined; }" @@ -20499,7 +20527,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 25 + "lineNumber": 26 }, "signature": [ "ExpressionFunctionDefinition<\"kibana_context\", ", @@ -20530,7 +20558,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 20 + "lineNumber": 21 }, "signature": [ "{ type: \"kibana_context\"; } & ExecutionContextSearch" @@ -20593,7 +20621,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 58 + "lineNumber": 59 }, "signature": [ "AggType>" @@ -20722,7 +20750,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 29 + "lineNumber": 32 }, "signature": [ "{ type: \"kibana_context\"; } & ExecutionContextSearch" @@ -22654,7 +22682,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 40 + "lineNumber": 42 } }, { @@ -22667,7 +22695,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 41 + "lineNumber": 43 } }, { @@ -22680,7 +22708,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 42 + "lineNumber": 44 } }, { @@ -22693,7 +22721,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 43 + "lineNumber": 45 } }, { @@ -22706,7 +22734,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 44 + "lineNumber": 46 } }, { @@ -22725,7 +22753,7 @@ "description": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 45 + "lineNumber": 47 } } ], @@ -22733,7 +22761,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/es_query/filters/build_filters.ts", - "lineNumber": 39 + "lineNumber": 41 }, "initialIsOpen": false }, @@ -23062,7 +23090,7 @@ "section": "def-common.FilterStateStore", "text": "FilterStateStore" }, - ") => ", + " | undefined) => ", { "pluginId": "data", "scope": "common", @@ -23183,9 +23211,9 @@ } }, { - "type": "Enum", + "type": "CompoundType", "label": "store", - "isRequired": true, + "isRequired": false, "signature": [ { "pluginId": "data", @@ -23193,7 +23221,8 @@ "docId": "kibDataPluginApi", "section": "def-common.FilterStateStore", "text": "FilterStateStore" - } + }, + " | undefined" ], "description": [], "source": { diff --git a/api_docs/data_search.json b/api_docs/data_search.json index 68cf4a1123bdb..a75b669cbd288 100644 --- a/api_docs/data_search.json +++ b/api_docs/data_search.json @@ -2955,7 +2955,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 263 + "lineNumber": 265 } }, { @@ -2981,7 +2981,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 294 + "lineNumber": 296 } }, { @@ -3001,7 +3001,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 305 + "lineNumber": 307 } }, { @@ -3027,7 +3027,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 314 + "lineNumber": 316 } }, { @@ -3059,7 +3059,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 369 + "lineNumber": 371 } }, { @@ -3083,7 +3083,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 373 + "lineNumber": 375 } }, { @@ -3107,7 +3107,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 377 + "lineNumber": 379 } }, { @@ -3129,7 +3129,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 381 + "lineNumber": 383 } } ], @@ -3137,7 +3137,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 381 + "lineNumber": 383 } }, { @@ -3159,7 +3159,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 385 + "lineNumber": 387 } }, { @@ -3172,7 +3172,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 385 + "lineNumber": 387 } } ], @@ -3180,7 +3180,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 385 + "lineNumber": 387 } }, { @@ -3196,7 +3196,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 393 + "lineNumber": 395 } }, { @@ -3212,7 +3212,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 399 + "lineNumber": 401 } }, { @@ -3230,7 +3230,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 408 + "lineNumber": 410 } }, { @@ -3252,7 +3252,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 412 + "lineNumber": 414 } } ], @@ -3260,7 +3260,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 412 + "lineNumber": 414 } }, { @@ -3283,7 +3283,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 426 + "lineNumber": 428 } }, { @@ -3307,7 +3307,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 430 + "lineNumber": 432 } }, { @@ -3323,7 +3323,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 434 + "lineNumber": 436 } }, { @@ -3339,7 +3339,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 439 + "lineNumber": 441 } }, { @@ -3350,7 +3350,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 446 + "lineNumber": 448 }, "signature": [ { @@ -3370,7 +3370,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 450 + "lineNumber": 452 }, "signature": [ { @@ -3415,7 +3415,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 480 + "lineNumber": 482 } } ], @@ -3423,7 +3423,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 480 + "lineNumber": 482 } } ], @@ -3448,7 +3448,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 58 + "lineNumber": 65 }, "signature": [ { @@ -3468,7 +3468,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 59 + "lineNumber": 66 }, "signature": [ { @@ -3489,7 +3489,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 62 + "lineNumber": 69 }, "signature": [ { @@ -3527,7 +3527,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 65 + "lineNumber": 72 } }, { @@ -3564,7 +3564,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 66 + "lineNumber": 73 } }, { @@ -3583,7 +3583,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 67 + "lineNumber": 74 } } ], @@ -3591,7 +3591,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 64 + "lineNumber": 71 } }, { @@ -3627,7 +3627,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 79 + "lineNumber": 86 } } ], @@ -3635,7 +3635,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 79 + "lineNumber": 86 } }, { @@ -3664,7 +3664,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 97 + "lineNumber": 104 } } ], @@ -3672,7 +3672,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 97 + "lineNumber": 104 } }, { @@ -3713,7 +3713,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 111 + "lineNumber": 118 } }, { @@ -3726,7 +3726,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 112 + "lineNumber": 119 } } ], @@ -3776,7 +3776,7 @@ "label": "createAggConfig", "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 110 + "lineNumber": 117 }, "tags": [], "returnComment": [] @@ -3819,7 +3819,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 153 + "lineNumber": 160 } } ], @@ -3827,7 +3827,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 153 + "lineNumber": 160 } }, { @@ -3849,7 +3849,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 165 + "lineNumber": 172 } } ], @@ -3857,7 +3857,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 165 + "lineNumber": 172 } }, { @@ -3881,7 +3881,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 227 + "lineNumber": 241 } }, { @@ -3910,7 +3910,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 231 + "lineNumber": 245 } } ], @@ -3918,7 +3918,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 231 + "lineNumber": 245 } }, { @@ -3948,7 +3948,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 235 + "lineNumber": 249 } } ], @@ -3956,7 +3956,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 235 + "lineNumber": 249 } }, { @@ -3986,7 +3986,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 239 + "lineNumber": 253 } } ], @@ -3994,7 +3994,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 239 + "lineNumber": 253 } }, { @@ -4024,7 +4024,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 243 + "lineNumber": 257 } } ], @@ -4032,7 +4032,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 243 + "lineNumber": 257 } }, { @@ -4062,7 +4062,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 247 + "lineNumber": 261 } } ], @@ -4070,7 +4070,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 247 + "lineNumber": 261 } }, { @@ -4100,7 +4100,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 251 + "lineNumber": 265 } } ], @@ -4108,7 +4108,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 251 + "lineNumber": 265 } }, { @@ -4132,7 +4132,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 255 + "lineNumber": 269 } }, { @@ -4162,7 +4162,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 269 + "lineNumber": 283 } } ], @@ -4170,7 +4170,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 269 + "lineNumber": 283 } }, { @@ -4198,7 +4198,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 284 + "lineNumber": 298 } }, { @@ -4232,7 +4232,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 298 + "lineNumber": 312 } } ], @@ -4242,7 +4242,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 298 + "lineNumber": 312 } }, { @@ -4288,7 +4288,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 307 + "lineNumber": 321 } }, { @@ -4308,7 +4308,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 307 + "lineNumber": 321 } } ], @@ -4316,13 +4316,13 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 307 + "lineNumber": 321 } } ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 57 + "lineNumber": 64 }, "initialIsOpen": false }, @@ -4572,7 +4572,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 70 + "lineNumber": 71 } }, { @@ -4583,7 +4583,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 72 + "lineNumber": 73 } }, { @@ -4594,7 +4594,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 73 + "lineNumber": 74 }, "signature": [ "string | undefined" @@ -4613,7 +4613,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 80 + "lineNumber": 81 } }, { @@ -4629,7 +4629,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 87 + "lineNumber": 88 } }, { @@ -4645,7 +4645,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 94 + "lineNumber": 95 } }, { @@ -4658,7 +4658,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 99 + "lineNumber": 100 }, "signature": [ "\"string\" | \"number\" | \"boolean\" | \"object\" | \"date\" | \"ip\" | \"_source\" | \"attachment\" | \"geo_point\" | \"geo_shape\" | \"murmur3\" | \"unknown\" | \"conflict\" | \"nested\" | \"histogram\" | \"null\" | undefined" @@ -4676,7 +4676,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 108 + "lineNumber": 109 }, "signature": [ "((aggConfig: TAggConfig) => string) | (() => string)" @@ -4695,7 +4695,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 123 + "lineNumber": 124 }, "signature": [ "any" @@ -4713,7 +4713,22 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 131 + "lineNumber": 132 + } + }, + { + "tags": [ + "type" + ], + "id": "def-common.AggType.hasNoDslParams", + "type": "boolean", + "label": "hasNoDslParams", + "description": [ + "\nFlag that prevents params from this aggregation from being included in the dsl. Sibling and parent aggs are still written.\n" + ], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_type.ts", + "lineNumber": 138 } }, { @@ -4726,7 +4741,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 138 + "lineNumber": 145 }, "signature": [ "((aggConfig: TAggConfig, key: any, params?: any) => any) | undefined" @@ -4745,7 +4760,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 145 + "lineNumber": 152 }, "signature": [ "TParam[]" @@ -4763,7 +4778,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 155 + "lineNumber": 162 }, "signature": [ "((aggConfig: TAggConfig) => TAggConfig[]) | (() => void | TAggConfig[])" @@ -4781,7 +4796,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 166 + "lineNumber": 173 }, "signature": [ "((aggConfig: TAggConfig) => TAggConfig[]) | (() => void | TAggConfig[])" @@ -4797,7 +4812,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 171 + "lineNumber": 178 }, "signature": [ "() => any" @@ -4815,7 +4830,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 184 + "lineNumber": 191 }, "signature": [ "(resp: any, aggConfigs: ", @@ -4857,7 +4872,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 202 + "lineNumber": 209 }, "signature": [ "(agg: TAggConfig) => ", @@ -4879,7 +4894,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 204 + "lineNumber": 211 }, "signature": [ "(agg: TAggConfig, bucket: any) => any" @@ -4893,7 +4908,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 206 + "lineNumber": 213 }, "signature": [ "((bucket: any, key: any, agg: TAggConfig) => any) | undefined" @@ -4913,7 +4928,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 208 + "lineNumber": 215 } } ], @@ -4924,7 +4939,7 @@ "label": "paramByName", "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 208 + "lineNumber": 215 }, "tags": [], "returnComment": [] @@ -4943,7 +4958,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 212 + "lineNumber": 219 } } ], @@ -4954,7 +4969,7 @@ "label": "getValueBucketPath", "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 212 + "lineNumber": 219 }, "tags": [], "returnComment": [] @@ -4997,7 +5012,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 225 + "lineNumber": 232 } } ], @@ -5008,13 +5023,13 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 225 + "lineNumber": 232 } } ], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 60 + "lineNumber": 61 }, "initialIsOpen": false }, @@ -6450,7 +6465,7 @@ "type": "Function", "label": "setField", "signature": [ - "(field: K, value: ", + "(field: K, value: ", { "pluginId": "data", "scope": "common", @@ -6514,7 +6529,7 @@ "type": "Function", "label": "removeField", "signature": [ - "(field: K) => this" + "(field: K) => this" ], "description": [ "\nremove field" @@ -6641,7 +6656,7 @@ "type": "Function", "label": "getField", "signature": [ - "(field: K, recurse?: boolean) => ", + "(field: K, recurse?: boolean) => ", { "pluginId": "data", "scope": "common", @@ -6694,7 +6709,7 @@ "type": "Function", "label": "getOwnField", "signature": [ - "(field: K) => ", + "(field: K) => ", { "pluginId": "data", "scope": "common", @@ -7625,6 +7640,23 @@ "returnComment": [], "initialIsOpen": false }, + { + "id": "def-common.aggFilteredMetric", + "type": "Function", + "children": [], + "signature": [ + "() => FunctionDefinition" + ], + "description": [], + "label": "aggFilteredMetric", + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.ts", + "lineNumber": 30 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false + }, { "id": "def-common.aggFilters", "type": "Function", @@ -8457,6 +8489,76 @@ }, "initialIsOpen": false }, + { + "id": "def-common.filtersToAst", + "type": "Function", + "children": [ + { + "type": "CompoundType", + "label": "filters", + "isRequired": true, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + " | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[]" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/filters_to_ast.ts", + "lineNumber": 13 + } + } + ], + "signature": [ + "(filters: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + " | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[]) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionAstExpressionBuilder", + "text": "ExpressionAstExpressionBuilder" + }, + "[]" + ], + "description": [], + "label": "filtersToAst", + "source": { + "path": "src/plugins/data/common/search/expressions/filters_to_ast.ts", + "lineNumber": 13 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false + }, { "id": "def-common.functionWrapper", "type": "Function", @@ -8983,9 +9085,37 @@ { "id": "def-common.getFilterBucketAgg", "type": "Function", - "children": [], + "children": [ + { + "id": "def-common.getFilterBucketAgg.{-getConfig }", + "type": "Object", + "label": "{ getConfig }", + "tags": [], + "description": [], + "children": [ + { + "tags": [], + "id": "def-common.getFilterBucketAgg.{-getConfig }.getConfig", + "type": "Function", + "label": "getConfig", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/buckets/filter.ts", + "lineNumber": 27 + }, + "signature": [ + "(key: string) => any" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/aggs/buckets/filter.ts", + "lineNumber": 27 + } + } + ], "signature": [ - "() => ", + "({ getConfig }: { getConfig: (key: string) => any; }) => ", { "pluginId": "data", "scope": "common", @@ -9007,7 +9137,40 @@ "label": "getFilterBucketAgg", "source": { "path": "src/plugins/data/common/search/aggs/buckets/filter.ts", - "lineNumber": 24 + "lineNumber": 27 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false + }, + { + "id": "def-common.getFilteredMetricAgg", + "type": "Function", + "children": [], + "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" + }, + ">" + ], + "description": [], + "label": "getFilteredMetricAgg", + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/filtered_metric.ts", + "lineNumber": 30 }, "tags": [], "returnComment": [], @@ -11475,7 +11638,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 38 + "lineNumber": 45 }, "signature": [ { @@ -11490,7 +11653,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/agg_configs.ts", - "lineNumber": 37 + "lineNumber": 44 }, "initialIsOpen": false }, @@ -11511,7 +11674,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 204 + "lineNumber": 207 }, "signature": [ "FunctionDefinition" @@ -11525,7 +11688,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 205 + "lineNumber": 208 }, "signature": [ "FunctionDefinition" @@ -11539,7 +11702,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 206 + "lineNumber": 209 }, "signature": [ "FunctionDefinition" @@ -11553,7 +11716,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 207 + "lineNumber": 210 }, "signature": [ "FunctionDefinition" @@ -11567,7 +11730,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 208 + "lineNumber": 211 }, "signature": [ "FunctionDefinition" @@ -11581,7 +11744,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 209 + "lineNumber": 212 }, "signature": [ "FunctionDefinition" @@ -11595,7 +11758,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 210 + "lineNumber": 213 }, "signature": [ "FunctionDefinition" @@ -11609,7 +11772,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 211 + "lineNumber": 214 }, "signature": [ "FunctionDefinition" @@ -11623,7 +11786,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 212 + "lineNumber": 215 }, "signature": [ "FunctionDefinition" @@ -11637,7 +11800,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 213 + "lineNumber": 216 }, "signature": [ "FunctionDefinition" @@ -11651,7 +11814,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 214 + "lineNumber": 217 }, "signature": [ "FunctionDefinition" @@ -11665,7 +11828,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 215 + "lineNumber": 218 }, "signature": [ "FunctionDefinition" @@ -11679,7 +11842,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 216 + "lineNumber": 219 }, "signature": [ "FunctionDefinition" @@ -11693,7 +11856,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 217 + "lineNumber": 220 }, "signature": [ "FunctionDefinition" @@ -11707,7 +11870,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 218 + "lineNumber": 221 }, "signature": [ "FunctionDefinition" @@ -11721,7 +11884,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 219 + "lineNumber": 222 }, "signature": [ "FunctionDefinition" @@ -11729,13 +11892,13 @@ }, { "tags": [], - "id": "def-common.AggFunctionsMapping.aggCardinality", + "id": "def-common.AggFunctionsMapping.aggFilteredMetric", "type": "Object", - "label": "aggCardinality", + "label": "aggFilteredMetric", "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 220 + "lineNumber": 223 }, "signature": [ "FunctionDefinition" @@ -11743,13 +11906,27 @@ }, { "tags": [], - "id": "def-common.AggFunctionsMapping.aggCount", + "id": "def-common.AggFunctionsMapping.aggCardinality", "type": "Object", - "label": "aggCount", + "label": "aggCardinality", "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 221 + "lineNumber": 224 + }, + "signature": [ + "FunctionDefinition" + ] + }, + { + "tags": [], + "id": "def-common.AggFunctionsMapping.aggCount", + "type": "Object", + "label": "aggCount", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/types.ts", + "lineNumber": 225 }, "signature": [ "FunctionDefinition" @@ -11763,7 +11940,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 222 + "lineNumber": 226 }, "signature": [ "FunctionDefinition" @@ -11777,7 +11954,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 223 + "lineNumber": 227 }, "signature": [ "FunctionDefinition" @@ -11791,7 +11968,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 224 + "lineNumber": 228 }, "signature": [ "FunctionDefinition" @@ -11805,7 +11982,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 225 + "lineNumber": 229 }, "signature": [ "FunctionDefinition" @@ -11819,7 +11996,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 226 + "lineNumber": 230 }, "signature": [ "FunctionDefinition" @@ -11833,7 +12010,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 227 + "lineNumber": 231 }, "signature": [ "FunctionDefinition" @@ -11847,7 +12024,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 228 + "lineNumber": 232 }, "signature": [ "FunctionDefinition" @@ -11861,7 +12038,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 229 + "lineNumber": 233 }, "signature": [ "FunctionDefinition" @@ -11875,7 +12052,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 230 + "lineNumber": 234 }, "signature": [ "FunctionDefinition" @@ -11889,7 +12066,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 231 + "lineNumber": 235 }, "signature": [ "FunctionDefinition" @@ -11903,7 +12080,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 232 + "lineNumber": 236 }, "signature": [ "FunctionDefinition" @@ -11917,7 +12094,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 233 + "lineNumber": 237 }, "signature": [ "FunctionDefinition" @@ -11931,7 +12108,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 234 + "lineNumber": 238 }, "signature": [ "FunctionDefinition" @@ -11945,7 +12122,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 235 + "lineNumber": 239 }, "signature": [ "FunctionDefinition" @@ -11954,7 +12131,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 203 + "lineNumber": 206 }, "initialIsOpen": false }, @@ -12823,7 +13000,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/buckets/filter.ts", - "lineNumber": 21 + "lineNumber": 24 }, "signature": [ "Partial<{ top_left: GeoPoint; top_right: GeoPoint; bottom_right: GeoPoint; bottom_left: GeoPoint; }> | { wkt: string; } | GeoBox | undefined" @@ -12832,7 +13009,76 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/buckets/filter.ts", - "lineNumber": 20 + "lineNumber": 23 + }, + "initialIsOpen": false + }, + { + "id": "def-common.AggParamsFilteredMetric", + "type": "Interface", + "label": "AggParamsFilteredMetric", + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.AggParamsFilteredMetric", + "text": "AggParamsFilteredMetric" + }, + " extends ", + "BaseAggParams" + ], + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.AggParamsFilteredMetric.customMetric", + "type": "Object", + "label": "customMetric", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/filtered_metric.ts", + "lineNumber": 18 + }, + "signature": [ + "{ type: string; enabled?: boolean | undefined; id?: string | undefined; params?: {} | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + " | undefined; schema?: string | undefined; } | undefined" + ] + }, + { + "tags": [], + "id": "def-common.AggParamsFilteredMetric.customBucket", + "type": "Object", + "label": "customBucket", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/filtered_metric.ts", + "lineNumber": 19 + }, + "signature": [ + "{ type: string; enabled?: boolean | undefined; id?: string | undefined; params?: {} | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.SerializableState", + "text": "SerializableState" + }, + " | undefined; schema?: string | undefined; } | undefined" + ] + } + ], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/filtered_metric.ts", + "lineNumber": 17 }, "initialIsOpen": false }, @@ -14347,6 +14593,20 @@ "boolean | undefined" ] }, + { + "tags": [], + "id": "def-common.AggTypeConfig.hasNoDslParams", + "type": "CompoundType", + "label": "hasNoDslParams", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_type.ts", + "lineNumber": 35 + }, + "signature": [ + "boolean | undefined" + ] + }, { "tags": [], "id": "def-common.AggTypeConfig.params", @@ -14355,7 +14615,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 35 + "lineNumber": 36 }, "signature": [ "Partial[] | undefined" @@ -14369,7 +14629,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 36 + "lineNumber": 37 }, "signature": [ "\"string\" | \"number\" | \"boolean\" | \"object\" | \"date\" | \"ip\" | \"_source\" | \"attachment\" | \"geo_point\" | \"geo_shape\" | \"murmur3\" | \"unknown\" | \"conflict\" | \"nested\" | \"histogram\" | \"null\" | undefined" @@ -14383,7 +14643,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 37 + "lineNumber": 38 }, "signature": [ "((aggConfig: TAggConfig) => TAggConfig[]) | (() => void | TAggConfig[]) | undefined" @@ -14397,7 +14657,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 38 + "lineNumber": 39 }, "signature": [ "((aggConfig: TAggConfig) => TAggConfig[]) | (() => void | TAggConfig[]) | undefined" @@ -14411,7 +14671,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 39 + "lineNumber": 40 }, "signature": [ "boolean | undefined" @@ -14425,7 +14685,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 40 + "lineNumber": 41 }, "signature": [ "boolean | undefined" @@ -14439,7 +14699,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 41 + "lineNumber": 42 }, "signature": [ "(() => any) | undefined" @@ -14453,7 +14713,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 42 + "lineNumber": 43 }, "signature": [ "((resp: any, aggConfigs: ", @@ -14491,7 +14751,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 51 + "lineNumber": 52 }, "signature": [ "((agg: TAggConfig) => ", @@ -14513,7 +14773,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 52 + "lineNumber": 53 }, "signature": [ "((agg: TAggConfig, bucket: any) => any) | undefined" @@ -14527,7 +14787,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 53 + "lineNumber": 54 }, "signature": [ "((bucket: any, key: any, agg: TAggConfig) => any) | undefined" @@ -14541,7 +14801,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 54 + "lineNumber": 55 }, "signature": [ "((agg: TAggConfig) => string) | undefined" @@ -17926,6 +18186,21 @@ ], "initialIsOpen": false }, + { + "tags": [], + "id": "def-common.aggFilteredMetricFnName", + "type": "string", + "label": "aggFilteredMetricFnName", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.ts", + "lineNumber": 14 + }, + "signature": [ + "\"aggFilteredMetric\"" + ], + "initialIsOpen": false + }, { "tags": [], "id": "def-common.aggFilterFnName", @@ -18223,7 +18498,7 @@ ], "source": { "path": "src/plugins/data/common/search/aggs/types.ts", - "lineNumber": 139 + "lineNumber": 141 }, "signature": [ "{ calculateAutoTimeExpression: (range: TimeRange) => string | undefined; getDateMetaByDatatableColumn: (column: DatatableColumn) => Promise<{ timeZone: string; timeRange?: TimeRange | undefined; interval: string; } | undefined>; datatableUtilities: { getIndexPattern: (column: DatatableColumn) => Promise; getAggConfig: (column: DatatableColumn) => Promise; isFilterable: (column: DatatableColumn) => boolean; }; createAggConfigs: (indexPattern: IndexPattern, configStates?: Pick | null, object, ", - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionValueBoxed", - "text": "ExpressionValueBoxed" - }, - "<\"kibana_context\", ExecutionContextSearch>, ExecutionContext>" - ], - "initialIsOpen": false - }, - { - "id": "def-common.ExpressionFunctionKibanaContext", + "id": "def-common.ExpressionFunctionExistsFilter", "type": "Type", - "label": "ExpressionFunctionKibanaContext", + "label": "ExpressionFunctionExistsFilter", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 25 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 20 }, "signature": [ - "ExpressionFunctionDefinition<\"kibana_context\", ", + "ExpressionFunctionDefinition<\"existsFilter\", null, Arguments, ", { "pluginId": "expressions", "scope": "common", @@ -18517,30 +18761,15 @@ "section": "def-common.ExpressionValueBoxed", "text": "ExpressionValueBoxed" }, - "<\"kibana_context\", ExecutionContextSearch> | null, Arguments, Promise<", + "<\"kibana_filter\", ", { - "pluginId": "expressions", + "pluginId": "data", "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionValueBoxed", - "text": "ExpressionValueBoxed" + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" }, - "<\"kibana_context\", ExecutionContextSearch>>, ExecutionContext>" - ], - "initialIsOpen": false - }, - { - "id": "def-common.ExpressionFunctionKibanaTimerange", - "type": "Type", - "label": "ExpressionFunctionKibanaTimerange", - "tags": [], - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 15 - }, - "signature": [ - "ExpressionFunctionDefinition<\"timerange\", null, TimeRange, ExpressionValueBoxed<\"timerange\", TimeRange>, ", + ">, ", { "pluginId": "expressions", "scope": "common", @@ -18557,23 +18786,22 @@ "text": "Adapters" }, ", ", - "SerializableState", - ">>" + "SerializableState" ], "initialIsOpen": false }, { - "id": "def-common.ExpressionFunctionKql", + "id": "def-common.ExpressionFunctionField", "type": "Type", - "label": "ExpressionFunctionKql", + "label": "ExpressionFunctionField", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 17 + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 19 }, "signature": [ - "ExpressionFunctionDefinition<\"kql\", null, Arguments, ", + "ExpressionFunctionDefinition<\"field\", null, Arguments, ", { "pluginId": "expressions", "scope": "common", @@ -18581,13 +18809,13 @@ "section": "def-common.ExpressionValueBoxed", "text": "ExpressionValueBoxed" }, - "<\"kibana_query\", ", + "<\"kibana_field\", ", { "pluginId": "data", - "scope": "common", + "scope": "public", "docId": "kibDataPluginApi", - "section": "def-common.Query", - "text": "Query" + "section": "def-public.IndexPatternField", + "text": "IndexPatternField" }, ">, ", { @@ -18611,17 +18839,17 @@ "initialIsOpen": false }, { - "id": "def-common.ExpressionFunctionLucene", + "id": "def-common.ExpressionFunctionKibana", "type": "Type", - "label": "ExpressionFunctionLucene", + "label": "ExpressionFunctionKibana", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", + "path": "src/plugins/data/common/search/expressions/kibana.ts", "lineNumber": 17 }, "signature": [ - "ExpressionFunctionDefinition<\"lucene\", null, Arguments, ", + "ExpressionFunctionDefinition<\"kibana\", ", { "pluginId": "expressions", "scope": "common", @@ -18629,193 +18857,513 @@ "section": "def-common.ExpressionValueBoxed", "text": "ExpressionValueBoxed" }, - "<\"kibana_query\", ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Query", - "text": "Query" - }, - ">, ", + "<\"kibana_context\", ExecutionContextSearch> | null, object, ", { "pluginId": "expressions", "scope": "common", "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", - "SerializableState" + "<\"kibana_context\", ExecutionContextSearch>, ExecutionContext>" ], "initialIsOpen": false }, { - "id": "def-common.ExpressionValueSearchContext", + "id": "def-common.ExpressionFunctionKibanaContext", "type": "Type", - "label": "ExpressionValueSearchContext", + "label": "ExpressionFunctionKibanaContext", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 20 + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 26 }, "signature": [ - "{ type: \"kibana_context\"; } & ExecutionContextSearch" + "ExpressionFunctionDefinition<\"kibana_context\", ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_context\", ExecutionContextSearch> | null, Arguments, Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_context\", ExecutionContextSearch>>, ExecutionContext>" ], "initialIsOpen": false }, { - "id": "def-common.FieldTypes", + "id": "def-common.ExpressionFunctionKibanaFilter", "type": "Type", - "label": "FieldTypes", + "label": "ExpressionFunctionKibanaFilter", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/param_types/field.ts", - "lineNumber": 19 + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 18 }, "signature": [ + "ExpressionFunctionDefinition<\"kibanaFilter\", null, Arguments, ", { - "pluginId": "data", + "pluginId": "expressions", "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KBN_FIELD_TYPES", - "text": "KBN_FIELD_TYPES" + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" }, - "._SOURCE | ", + "<\"kibana_filter\", ", { "pluginId": "data", - "scope": "common", + "scope": "public", "docId": "kibDataPluginApi", - "section": "def-common.KBN_FIELD_TYPES", - "text": "KBN_FIELD_TYPES" + "section": "def-public.Filter", + "text": "Filter" }, - ".ATTACHMENT | ", + ">, ", { - "pluginId": "data", + "pluginId": "expressions", "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KBN_FIELD_TYPES", - "text": "KBN_FIELD_TYPES" + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" }, - ".BOOLEAN | ", + "<", { - "pluginId": "data", + "pluginId": "inspector", "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KBN_FIELD_TYPES", - "text": "KBN_FIELD_TYPES" + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" }, - ".DATE | ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.KBN_FIELD_TYPES", - "text": "KBN_FIELD_TYPES" - } + ", ", + "SerializableState" ], "initialIsOpen": false }, { - "id": "def-common.IAggConfig", + "id": "def-common.ExpressionFunctionKibanaTimerange", "type": "Type", - "label": "IAggConfig", - "tags": [ - "name", - "description" - ], + "label": "ExpressionFunctionKibanaTimerange", + "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/agg_config.ts", - "lineNumber": 53 + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 15 }, "signature": [ - "AggConfig" + "ExpressionFunctionDefinition<\"timerange\", null, TimeRange, ExpressionValueBoxed<\"timerange\", TimeRange>, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" ], "initialIsOpen": false }, { - "id": "def-common.IAggType", + "id": "def-common.ExpressionFunctionKql", "type": "Type", - "label": "IAggType", + "label": "ExpressionFunctionKql", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/agg_type.ts", - "lineNumber": 58 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 17 }, "signature": [ - "AggType>" + "ExpressionFunctionDefinition<\"kql\", null, Arguments, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_query\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ">, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState" ], "initialIsOpen": false }, { - "id": "def-common.IEsSearchResponse", + "id": "def-common.ExpressionFunctionLucene", "type": "Type", - "label": "IEsSearchResponse", + "label": "ExpressionFunctionLucene", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/es_search/types.ts", - "lineNumber": 23 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 17 }, "signature": [ - "IKibanaSearchResponse>" + "ExpressionFunctionDefinition<\"lucene\", null, Arguments, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_query\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ">, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState" ], "initialIsOpen": false }, { - "id": "def-common.IFieldParamType", + "id": "def-common.ExpressionFunctionPhraseFilter", "type": "Type", - "label": "IFieldParamType", + "label": "ExpressionFunctionPhraseFilter", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/param_types/field.ts", + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", "lineNumber": 21 }, "signature": [ - "FieldParamType" + "ExpressionFunctionDefinition<\"rangeFilter\", null, Arguments, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_filter\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + ">, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState" ], "initialIsOpen": false }, { - "id": "def-common.IMetricAggType", + "id": "def-common.ExpressionFunctionRange", "type": "Type", - "label": "IMetricAggType", - "tags": [], - "description": [], - "source": { - "path": "src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts", - "lineNumber": 35 - }, - "signature": [ - "MetricAggType" - ], - "initialIsOpen": false - }, - { + "label": "ExpressionFunctionRange", "tags": [], - "id": "def-common.intervalOptions", - "type": "Array", - "label": "intervalOptions", "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/buckets/_interval_options.ts", - "lineNumber": 15 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 21 }, "signature": [ - "({ display: string; val: string; enabled(agg: ", + "ExpressionFunctionDefinition<\"range\", null, Arguments, ExpressionValueBoxed<\"kibana_range\", Arguments>, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">>" + ], + "initialIsOpen": false + }, + { + "id": "def-common.ExpressionFunctionRangeFilter", + "type": "Type", + "label": "ExpressionFunctionRangeFilter", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 22 + }, + "signature": [ + "ExpressionFunctionDefinition<\"rangeFilter\", null, Arguments, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_filter\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + ">, ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState" + ], + "initialIsOpen": false + }, + { + "id": "def-common.ExpressionValueSearchContext", + "type": "Type", + "label": "ExpressionValueSearchContext", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 21 + }, + "signature": [ + "{ type: \"kibana_context\"; } & ExecutionContextSearch" + ], + "initialIsOpen": false + }, + { + "id": "def-common.FieldTypes", + "type": "Type", + "label": "FieldTypes", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/param_types/field.ts", + "lineNumber": 19 + }, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + "._SOURCE | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ".ATTACHMENT | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ".BOOLEAN | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + }, + ".DATE | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.KBN_FIELD_TYPES", + "text": "KBN_FIELD_TYPES" + } + ], + "initialIsOpen": false + }, + { + "id": "def-common.IAggConfig", + "type": "Type", + "label": "IAggConfig", + "tags": [ + "name", + "description" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_config.ts", + "lineNumber": 53 + }, + "signature": [ + "AggConfig" + ], + "initialIsOpen": false + }, + { + "id": "def-common.IAggType", + "type": "Type", + "label": "IAggType", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/agg_type.ts", + "lineNumber": 59 + }, + "signature": [ + "AggType>" + ], + "initialIsOpen": false + }, + { + "id": "def-common.IEsSearchResponse", + "type": "Type", + "label": "IEsSearchResponse", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/es_search/types.ts", + "lineNumber": 23 + }, + "signature": [ + "IKibanaSearchResponse>" + ], + "initialIsOpen": false + }, + { + "id": "def-common.IFieldParamType", + "type": "Type", + "label": "IFieldParamType", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/param_types/field.ts", + "lineNumber": 21 + }, + "signature": [ + "FieldParamType" + ], + "initialIsOpen": false + }, + { + "id": "def-common.IMetricAggType", + "type": "Type", + "label": "IMetricAggType", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/metric_agg_type.ts", + "lineNumber": 35 + }, + "signature": [ + "MetricAggType" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.intervalOptions", + "type": "Array", + "label": "intervalOptions", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/buckets/_interval_options.ts", + "lineNumber": 15 + }, + "signature": [ + "({ display: string; val: string; enabled(agg: ", { "pluginId": "data", "scope": "common", @@ -19037,7 +19585,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 28 + "lineNumber": 31 }, "signature": [ "\"kibana_context\"" @@ -19052,7 +19600,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 29 + "lineNumber": 32 }, "signature": [ "{ type: \"kibana_context\"; } & ExecutionContextSearch" @@ -19060,65 +19608,110 @@ "initialIsOpen": false }, { - "id": "def-common.KibanaQueryOutput", + "id": "def-common.KibanaField", "type": "Type", - "label": "KibanaQueryOutput", + "label": "KibanaField", "tags": [], "description": [], "source": { "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 25 + "lineNumber": 28 }, "signature": [ - "{ type: \"kibana_query\"; } & Query" + "{ type: \"kibana_field\"; } & IndexPatternField" ], "initialIsOpen": false }, { - "id": "def-common.KibanaTimerangeOutput", + "id": "def-common.KibanaFilter", "type": "Type", - "label": "KibanaTimerangeOutput", + "label": "KibanaFilter", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 13 + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 27 }, "signature": [ - "{ type: \"timerange\"; } & TimeRange" + "{ type: \"kibana_filter\"; } & Filter" ], "initialIsOpen": false }, { + "id": "def-common.KibanaQueryOutput", + "type": "Type", + "label": "KibanaQueryOutput", "tags": [], - "id": "def-common.parentPipelineType", - "type": "string", - "label": "parentPipelineType", "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", "lineNumber": 26 }, + "signature": [ + "{ type: \"kibana_query\"; } & Query" + ], "initialIsOpen": false }, { - "id": "def-common.ParsedInterval", + "id": "def-common.KibanaRange", "type": "Type", - "label": "ParsedInterval", + "label": "KibanaRange", "tags": [], "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.ts", - "lineNumber": 18 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 19 }, "signature": [ - "{ value: number; unit: Unit; type: \"calendar\" | \"fixed\"; }" + "{ type: \"kibana_range\"; } & Arguments" ], "initialIsOpen": false }, { + "id": "def-common.KibanaTimerangeOutput", + "type": "Type", + "label": "KibanaTimerangeOutput", "tags": [], - "id": "def-common.SEARCH_SESSION_TYPE", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 13 + }, + "signature": [ + "{ type: \"timerange\"; } & TimeRange" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.parentPipelineType", + "type": "string", + "label": "parentPipelineType", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 27 + }, + "initialIsOpen": false + }, + { + "id": "def-common.ParsedInterval", + "type": "Type", + "label": "ParsedInterval", + "tags": [], + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/utils/date_interval_utils/parse_es_interval.ts", + "lineNumber": 18 + }, + "signature": [ + "{ value: number; unit: Unit; type: \"calendar\" | \"fixed\"; }" + ], + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.SEARCH_SESSION_TYPE", "type": "string", "label": "SEARCH_SESSION_TYPE", "description": [], @@ -19169,7 +19762,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 33 + "lineNumber": 34 }, "initialIsOpen": false }, @@ -19253,634 +19846,2109 @@ "initialIsOpen": false }, { - "id": "def-common.kibana", + "id": "def-common.existsFilterFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibana.name", + "id": "def-common.existsFilterFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 27 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 28 }, "signature": [ - "\"kibana\"" + "\"existsFilter\"" ] }, { "tags": [], - "id": "def-common.kibana.type", + "id": "def-common.existsFilterFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 28 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 29 }, "signature": [ - "\"kibana_context\"" + "\"kibana_filter\"" ] }, { "tags": [], - "id": "def-common.kibana.inputTypes", + "id": "def-common.existsFilterFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", "lineNumber": 30 }, "signature": [ - "(\"kibana_context\" | \"null\")[]" + "\"null\"[]" ] }, { "tags": [], - "id": "def-common.kibana.help", + "id": "def-common.existsFilterFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 32 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 31 } }, { - "id": "def-common.kibana.args", + "id": "def-common.existsFilterFunction.args", "type": "Object", "tags": [], - "children": [], + "children": [ + { + "id": "def-common.existsFilterFunction.args.field", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.existsFilterFunction.args.field.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 36 + }, + "signature": [ + "\"kibana_field\"[]" + ] + }, + { + "tags": [], + "id": "def-common.existsFilterFunction.args.field.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 37 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.existsFilterFunction.args.field.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 38 + } + } + ], + "description": [], + "label": "field", + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 35 + } + }, + { + "id": "def-common.existsFilterFunction.args.negate", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.existsFilterFunction.args.negate.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 43 + }, + "signature": [ + "\"boolean\"[]" + ] + }, + { + "tags": [], + "id": "def-common.existsFilterFunction.args.negate.default", + "type": "boolean", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 44 + }, + "signature": [ + "false" + ] + }, + { + "tags": [], + "id": "def-common.existsFilterFunction.args.negate.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 45 + } + } + ], + "description": [], + "label": "negate", + "source": { + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 42 + } + } + ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 36 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 34 } }, { - "id": "def-common.kibana.fn", + "id": "def-common.existsFilterFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: Input, _: object, { getSearchContext }: ", - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", + "(input: null, args: Arguments) => { $state?: ", { "pluginId": "data", "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">) => ", - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExpressionValueBoxed", - "text": "ExpressionValueBoxed" + "docId": "kibDataPluginApi", + "section": "def-common.FilterState", + "text": "FilterState" }, - "<\"kibana_context\", ", + " | undefined; meta: ", { "pluginId": "data", "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - } + "docId": "kibDataPluginApi", + "section": "def-common.FilterMeta", + "text": "FilterMeta" + }, + "; query?: any; type: \"kibana_filter\"; }" ], "description": [], "children": [ - { - "type": "CompoundType", - "label": "input", - "isRequired": false, - "signature": [ - "Input" - ], - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 - } - }, { "type": "Uncategorized", - "label": "_", + "label": "input", "isRequired": true, "signature": [ - "object" + "null" ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 51 } }, { "type": "Object", - "label": "{ getSearchContext }", + "label": "args", "isRequired": true, "signature": [ - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">" + "Arguments" ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 51 } } ], "tags": [], "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 38 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 51 } } ], "description": [], - "label": "kibana", + "label": "existsFilterFunction", "source": { - "path": "src/plugins/data/common/search/expressions/kibana.ts", - "lineNumber": 26 + "path": "src/plugins/data/common/search/expressions/exists_filter.ts", + "lineNumber": 27 }, "initialIsOpen": false }, { - "id": "def-common.kibanaContext", + "id": "def-common.fieldFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContext.name", + "id": "def-common.fieldFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 32 - } + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 27 + }, + "signature": [ + "\"field\"" + ] }, { - "id": "def-common.kibanaContext.from", - "type": "Object", "tags": [], - "children": [ - { + "id": "def-common.fieldFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 28 + }, + "signature": [ + "\"kibana_field\"" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 29 + }, + "signature": [ + "\"null\"[]" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 30 + } + }, + { + "id": "def-common.fieldFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.fieldFunction.args.name", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.fieldFunction.args.name.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 35 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.args.name.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 36 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.args.name.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 37 + } + } + ], + "description": [], + "label": "name", + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 34 + } + }, + { + "id": "def-common.fieldFunction.args.type", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.fieldFunction.args.type.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 42 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.args.type.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 43 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.args.type.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 44 + } + } + ], + "description": [], + "label": "type", + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 41 + } + }, + { + "id": "def-common.fieldFunction.args.script", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.fieldFunction.args.script.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 49 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.fieldFunction.args.script.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 50 + } + } + ], + "description": [], + "label": "script", + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 48 + } + } + ], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 33 + } + }, + { + "id": "def-common.fieldFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: null, args: Arguments) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_field\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataIndexPatternsPluginApi", + "section": "def-common.IndexPatternField", + "text": "IndexPatternField" + }, + ">" + ], + "description": [], + "children": [ + { + "type": "Uncategorized", + "label": "input", + "isRequired": true, + "signature": [ + "null" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 56 + } + }, + { + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + "Arguments" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 56 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 56 + } + } + ], + "description": [], + "label": "fieldFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/field.ts", + "lineNumber": 26 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kibana", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibana.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 27 + }, + "signature": [ + "\"kibana\"" + ] + }, + { + "tags": [], + "id": "def-common.kibana.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 28 + }, + "signature": [ + "\"kibana_context\"" + ] + }, + { + "tags": [], + "id": "def-common.kibana.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 30 + }, + "signature": [ + "(\"kibana_context\" | \"null\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibana.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 32 + } + }, + { + "id": "def-common.kibana.args", + "type": "Object", + "tags": [], + "children": [], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 36 + } + }, + { + "id": "def-common.kibana.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: Input, _: object, { getSearchContext }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">) => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "<\"kibana_context\", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + } + ], + "description": [], + "children": [ + { + "type": "CompoundType", + "label": "input", + "isRequired": false, + "signature": [ + "Input" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + }, + { + "type": "Uncategorized", + "label": "_", + "isRequired": true, + "signature": [ + "object" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + }, + { + "type": "Object", + "label": "{ getSearchContext }", + "isRequired": true, + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 38 + } + } + ], + "description": [], + "label": "kibana", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana.ts", + "lineNumber": 26 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kibanaContext", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContext.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 35 + } + }, + { + "id": "def-common.kibanaContext.from", + "type": "Object", + "tags": [], + "children": [ + { "id": "def-common.kibanaContext.from.null", "type": "Function", "children": [], "signature": [ - "() => { type: string; }" + "() => { type: string; }" + ], + "description": [], + "label": "null", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 37 + }, + "tags": [], + "returnComment": [] + } + ], + "description": [], + "label": "from", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 36 + } + }, + { + "id": "def-common.kibanaContext.to", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.kibanaContext.to.null", + "type": "Function", + "children": [], + "signature": [ + "() => { type: string; }" + ], + "description": [], + "label": "null", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 44 + }, + "tags": [], + "returnComment": [] + } + ], + "description": [], + "label": "to", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 43 + } + } + ], + "description": [], + "label": "kibanaContext", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", + "lineNumber": 34 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kibanaContextFunction", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 44 + }, + "signature": [ + "\"kibana_context\"" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 45 + }, + "signature": [ + "\"kibana_context\"" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 46 + }, + "signature": [ + "(\"kibana_context\" | \"null\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 47 + } + }, + { + "id": "def-common.kibanaContextFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.kibanaContextFunction.args.q", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 52 + }, + "signature": [ + "(\"null\" | \"kibana_query\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.aliases", + "type": "Array", + "label": "aliases", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 53 + }, + "signature": [ + "string[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.default", + "type": "Uncategorized", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 54 + }, + "signature": [ + "null" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.q.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 55 + } + } + ], + "description": [], + "label": "q", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 51 + } + }, + { + "id": "def-common.kibanaContextFunction.args.filters", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.filters.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 60 + }, + "signature": [ + "(\"null\" | \"kibana_filter\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.filters.multi", + "type": "boolean", + "label": "multi", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 61 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.filters.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 62 + } + } + ], + "description": [], + "label": "filters", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 59 + } + }, + { + "id": "def-common.kibanaContextFunction.args.timeRange", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.timeRange.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 67 + }, + "signature": [ + "(\"null\" | \"timerange\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.timeRange.default", + "type": "Uncategorized", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 68 + }, + "signature": [ + "null" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.timeRange.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 69 + } + } + ], + "description": [], + "label": "timeRange", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 66 + } + }, + { + "id": "def-common.kibanaContextFunction.args.savedSearchId", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.savedSearchId.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 74 + }, + "signature": [ + "(\"string\" | \"null\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.savedSearchId.default", + "type": "Uncategorized", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 75 + }, + "signature": [ + "null" + ] + }, + { + "tags": [], + "id": "def-common.kibanaContextFunction.args.savedSearchId.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 76 + } + } + ], + "description": [], + "label": "savedSearchId", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 73 + } + } + ], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 50 + } + }, + { + "id": "def-common.kibanaContextFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: Input, args: Arguments, { getSavedObject }: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">) => Promise<{ type: \"kibana_context\"; query: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + "[]; filters: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.Filter", + "text": "Filter" + } + ], + "description": [], + "children": [ + { + "type": "CompoundType", + "label": "input", + "isRequired": false, + "signature": [ + "Input" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 82 + } + }, + { + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + "Arguments" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 82 + } + }, + { + "type": "Object", + "label": "{ getSavedObject }", + "isRequired": true, + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.ExecutionContextSearch", + "text": "ExecutionContextSearch" + }, + ">" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 82 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 82 + } + } + ], + "description": [], + "label": "kibanaContextFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_context.ts", + "lineNumber": 43 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kibanaFilterFunction", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaFilterFunction.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 26 + }, + "signature": [ + "\"kibanaFilter\"" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 27 + }, + "signature": [ + "\"kibana_filter\"" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 28 + }, + "signature": [ + "\"null\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 29 + } + }, + { + "id": "def-common.kibanaFilterFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.kibanaFilterFunction.args.query", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.query.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 34 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.query.aliases", + "type": "Array", + "label": "aliases", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 35 + }, + "signature": [ + "string[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.query.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 36 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.query.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 37 + } + } + ], + "description": [], + "label": "query", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 33 + } + }, + { + "id": "def-common.kibanaFilterFunction.args.negate", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.negate.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 42 + }, + "signature": [ + "\"boolean\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.negate.default", + "type": "boolean", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 43 + }, + "signature": [ + "false" + ] + }, + { + "tags": [], + "id": "def-common.kibanaFilterFunction.args.negate.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 44 + } + } + ], + "description": [], + "label": "negate", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 41 + } + } + ], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 32 + } + }, + { + "id": "def-common.kibanaFilterFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: null, args: Arguments) => any" + ], + "description": [], + "children": [ + { + "type": "Uncategorized", + "label": "input", + "isRequired": true, + "signature": [ + "null" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 50 + } + }, + { + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + "Arguments" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 50 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 50 + } + } + ], + "description": [], + "label": "kibanaFilterFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/kibana_filter.ts", + "lineNumber": 25 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kibanaTimerangeFunction", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 23 + }, + "signature": [ + "\"timerange\"" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 24 + }, + "signature": [ + "\"timerange\"" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 25 + }, + "signature": [ + "\"null\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 26 + } + }, + { + "id": "def-common.kibanaTimerangeFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.kibanaTimerangeFunction.args.from", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.from.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 31 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.from.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 32 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.from.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 33 + } + } + ], + "description": [], + "label": "from", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 30 + } + }, + { + "id": "def-common.kibanaTimerangeFunction.args.to", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.to.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 38 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.to.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 39 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.to.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 40 + } + } + ], + "description": [], + "label": "to", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 37 + } + }, + { + "id": "def-common.kibanaTimerangeFunction.args.mode", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.mode.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 45 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.mode.options", + "type": "Array", + "label": "options", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 46 + }, + "signature": [ + "(\"absolute\" | \"relative\")[]" + ] + }, + { + "tags": [], + "id": "def-common.kibanaTimerangeFunction.args.mode.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 47 + } + } + ], + "description": [], + "label": "mode", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 44 + } + } + ], + "description": [], + "label": "args", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 29 + } + }, + { + "id": "def-common.kibanaTimerangeFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: null, args: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + ") => { type: \"timerange\"; from: string; to: string; mode: \"absolute\" | \"relative\" | undefined; }" + ], + "description": [], + "children": [ + { + "type": "Uncategorized", + "label": "input", + "isRequired": true, + "signature": [ + "null" ], "description": [], - "label": "null", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 34 - }, + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 53 + } + }, + { + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + } + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 53 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 53 + } + } + ], + "description": [], + "label": "kibanaTimerangeFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/timerange.ts", + "lineNumber": 22 + }, + "initialIsOpen": false + }, + { + "id": "def-common.kqlFunction", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.kqlFunction.name", + "type": "string", + "label": "name", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 25 + }, + "signature": [ + "\"kql\"" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.type", + "type": "string", + "label": "type", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 26 + }, + "signature": [ + "\"kibana_query\"" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.inputTypes", + "type": "Array", + "label": "inputTypes", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 27 + }, + "signature": [ + "\"null\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 28 + } + }, + { + "id": "def-common.kqlFunction.args", + "type": "Object", + "tags": [], + "children": [ + { + "id": "def-common.kqlFunction.args.q", + "type": "Object", "tags": [], - "returnComment": [] + "children": [ + { + "tags": [], + "id": "def-common.kqlFunction.args.q.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 33 + }, + "signature": [ + "\"string\"[]" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.args.q.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 34 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.args.q.aliases", + "type": "Array", + "label": "aliases", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 35 + }, + "signature": [ + "string[]" + ] + }, + { + "tags": [], + "id": "def-common.kqlFunction.args.q.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 36 + } + } + ], + "description": [], + "label": "q", + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 32 + } } ], "description": [], - "label": "from", + "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 33 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 31 } }, { - "id": "def-common.kibanaContext.to", - "type": "Object", - "tags": [], + "id": "def-common.kqlFunction.fn", + "type": "Function", + "label": "fn", + "signature": [ + "(input: null, args: Arguments) => { type: \"kibana_query\"; language: string; query: string; }" + ], + "description": [], "children": [ { - "id": "def-common.kibanaContext.to.null", - "type": "Function", - "children": [], + "type": "Uncategorized", + "label": "input", + "isRequired": true, "signature": [ - "() => { type: string; }" + "null" ], "description": [], - "label": "null", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 41 - }, - "tags": [], - "returnComment": [] + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 42 + } + }, + { + "type": "Object", + "label": "args", + "isRequired": true, + "signature": [ + "Arguments" + ], + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 42 + } } ], - "description": [], - "label": "to", + "tags": [], + "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 40 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 42 } } ], "description": [], - "label": "kibanaContext", + "label": "kqlFunction", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context_type.ts", - "lineNumber": 31 + "path": "src/plugins/data/common/search/expressions/kql.ts", + "lineNumber": 24 }, "initialIsOpen": false }, { - "id": "def-common.kibanaContextFunction", + "id": "def-common.luceneFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.name", + "id": "def-common.luceneFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 43 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 25 }, "signature": [ - "\"kibana_context\"" + "\"lucene\"" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.type", + "id": "def-common.luceneFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 44 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 26 }, "signature": [ - "\"kibana_context\"" + "\"kibana_query\"" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.inputTypes", + "id": "def-common.luceneFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 45 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 27 }, "signature": [ - "(\"kibana_context\" | \"null\")[]" + "\"null\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.help", + "id": "def-common.luceneFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 46 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 28 } }, { - "id": "def-common.kibanaContextFunction.args", + "id": "def-common.luceneFunction.args", "type": "Object", "tags": [], "children": [ { - "id": "def-common.kibanaContextFunction.args.q", - "type": "Object", - "tags": [], - "children": [ - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.q.types", - "type": "Array", - "label": "types", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 51 - }, - "signature": [ - "(\"null\" | \"kibana_query\")[]" - ] - }, - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.q.aliases", - "type": "Array", - "label": "aliases", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 52 - }, - "signature": [ - "string[]" - ] - }, - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.q.default", - "type": "Uncategorized", - "label": "default", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 53 - }, - "signature": [ - "null" - ] - }, - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.q.help", - "type": "string", - "label": "help", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 54 - } - } - ], - "description": [], - "label": "q", - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 50 - } - }, - { - "id": "def-common.kibanaContextFunction.args.filters", - "type": "Object", - "tags": [], - "children": [ - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.filters.types", - "type": "Array", - "label": "types", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 59 - }, - "signature": [ - "(\"string\" | \"null\")[]" - ] - }, - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.filters.default", - "type": "string", - "label": "default", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 60 - } - }, - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.filters.help", - "type": "string", - "label": "help", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 61 - } - } - ], - "description": [], - "label": "filters", - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 58 - } - }, - { - "id": "def-common.kibanaContextFunction.args.timeRange", + "id": "def-common.luceneFunction.args.q", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaContextFunction.args.timeRange.types", + "id": "def-common.luceneFunction.args.q.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 66 - }, - "signature": [ - "(\"null\" | \"timerange\")[]" - ] - }, - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.timeRange.default", - "type": "Uncategorized", - "label": "default", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 67 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 33 }, "signature": [ - "null" + "\"string\"[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.timeRange.help", - "type": "string", - "label": "help", - "description": [], - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 68 - } - } - ], - "description": [], - "label": "timeRange", - "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 65 - } - }, - { - "id": "def-common.kibanaContextFunction.args.savedSearchId", - "type": "Object", - "tags": [], - "children": [ - { - "tags": [], - "id": "def-common.kibanaContextFunction.args.savedSearchId.types", - "type": "Array", - "label": "types", + "id": "def-common.luceneFunction.args.q.required", + "type": "boolean", + "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 73 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 34 }, "signature": [ - "(\"string\" | \"null\")[]" + "true" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.savedSearchId.default", - "type": "Uncategorized", - "label": "default", + "id": "def-common.luceneFunction.args.q.aliases", + "type": "Array", + "label": "aliases", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 74 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 35 }, "signature": [ - "null" + "string[]" ] }, { "tags": [], - "id": "def-common.kibanaContextFunction.args.savedSearchId.help", + "id": "def-common.luceneFunction.args.q.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 75 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 36 } } ], "description": [], - "label": "savedSearchId", + "label": "q", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 72 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 32 } } ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 49 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 31 } }, { - "id": "def-common.kibanaContextFunction.fn", + "id": "def-common.luceneFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: Input, args: Arguments, { getSavedObject }: ", - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">) => Promise<{ type: \"kibana_context\"; query: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.Query", - "text": "Query" - }, - "[]; filters: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataPluginApi", - "section": "def-common.Filter", - "text": "Filter" - } + "(input: null, args: Arguments) => { type: \"kibana_query\"; language: string; query: any; }" ], "description": [], "children": [ { - "type": "CompoundType", + "type": "Uncategorized", "label": "input", - "isRequired": false, + "isRequired": true, "signature": [ - "Input" + "null" ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 81 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 42 } }, { @@ -19892,105 +21960,201 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 81 + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 42 } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 42 + } + } + ], + "description": [], + "label": "luceneFunction", + "source": { + "path": "src/plugins/data/common/search/expressions/lucene.ts", + "lineNumber": 24 + }, + "initialIsOpen": false + }, + { + "tags": [], + "id": "def-common.migrateIncludeExcludeFormat", + "type": "Object", + "label": "migrateIncludeExcludeFormat", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/buckets/migrate_include_exclude_format.ts", + "lineNumber": 25 + }, + "signature": [ + "Partial<", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.BucketAggParam", + "text": "BucketAggParam" + }, + "<", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IBucketAggConfig", + "text": "IBucketAggConfig" + }, + ">>" + ], + "initialIsOpen": false + }, + { + "id": "def-common.parentPipelineAggHelper", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.parentPipelineAggHelper.subtype", + "type": "string", + "label": "subtype", + "description": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 35 + } + }, + { + "id": "def-common.parentPipelineAggHelper.params", + "type": "Function", + "label": "params", + "signature": [ + "() => ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.MetricAggParam", + "text": "MetricAggParam" + }, + "<", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IMetricAggConfig", + "text": "IMetricAggConfig" + }, + ">[]" + ], + "description": [], + "children": [], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 36 + } + }, + { + "id": "def-common.parentPipelineAggHelper.getSerializedFormat", + "type": "Function", + "label": "getSerializedFormat", + "signature": [ + "(agg: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.IMetricAggConfig", + "text": "IMetricAggConfig" }, + ") => any" + ], + "description": [], + "children": [ { "type": "Object", - "label": "{ getSavedObject }", + "label": "agg", "isRequired": true, "signature": [ - { - "pluginId": "expressions", - "scope": "common", - "docId": "kibExpressionsPluginApi", - "section": "def-common.ExecutionContext", - "text": "ExecutionContext" - }, - "<", - { - "pluginId": "inspector", - "scope": "common", - "docId": "kibInspectorPluginApi", - "section": "def-common.Adapters", - "text": "Adapters" - }, - ", ", { "pluginId": "data", "scope": "common", "docId": "kibDataSearchPluginApi", - "section": "def-common.ExecutionContextSearch", - "text": "ExecutionContextSearch" - }, - ">" + "section": "def-common.IMetricAggConfig", + "text": "IMetricAggConfig" + } ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 81 + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 64 } } ], "tags": [], "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 81 + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 64 } } ], "description": [], - "label": "kibanaContextFunction", + "label": "parentPipelineAggHelper", "source": { - "path": "src/plugins/data/common/search/expressions/kibana_context.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", + "lineNumber": 34 }, "initialIsOpen": false }, { - "id": "def-common.kibanaTimerangeFunction", + "id": "def-common.phraseFilterFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaTimerangeFunction.name", + "id": "def-common.phraseFilterFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 23 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 29 }, "signature": [ - "\"timerange\"" + "\"rangeFilter\"" ] }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.type", + "id": "def-common.phraseFilterFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 24 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 30 }, "signature": [ - "\"timerange\"" + "\"kibana_filter\"" ] }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.inputTypes", + "id": "def-common.phraseFilterFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 25 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 31 }, "signature": [ "\"null\"[]" @@ -19998,48 +22162,48 @@ }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.help", + "id": "def-common.phraseFilterFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 26 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 32 } }, { - "id": "def-common.kibanaTimerangeFunction.args", + "id": "def-common.phraseFilterFunction.args", "type": "Object", "tags": [], "children": [ { - "id": "def-common.kibanaTimerangeFunction.args.from", + "id": "def-common.phraseFilterFunction.args.field", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.from.types", + "id": "def-common.phraseFilterFunction.args.field.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 31 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 37 }, "signature": [ - "\"string\"[]" + "\"kibana_field\"[]" ] }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.from.required", + "id": "def-common.phraseFilterFunction.args.field.required", "type": "boolean", "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 32 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 38 }, "signature": [ "true" @@ -20047,37 +22211,37 @@ }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.from.help", + "id": "def-common.phraseFilterFunction.args.field.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 33 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 39 } } ], "description": [], - "label": "from", + "label": "field", "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 30 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 36 } }, { - "id": "def-common.kibanaTimerangeFunction.args.to", + "id": "def-common.phraseFilterFunction.args.phrase", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.to.types", + "id": "def-common.phraseFilterFunction.args.phrase.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 38 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 44 }, "signature": [ "\"string\"[]" @@ -20085,13 +22249,27 @@ }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.to.required", + "id": "def-common.phraseFilterFunction.args.phrase.multi", + "type": "boolean", + "label": "multi", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 45 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.phraseFilterFunction.args.phrase.required", "type": "boolean", "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 39 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 46 }, "signature": [ "true" @@ -20099,97 +22277,105 @@ }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.to.help", + "id": "def-common.phraseFilterFunction.args.phrase.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 40 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 47 } } ], "description": [], - "label": "to", + "label": "phrase", "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 37 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 43 } }, { - "id": "def-common.kibanaTimerangeFunction.args.mode", + "id": "def-common.phraseFilterFunction.args.negate", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.mode.types", + "id": "def-common.phraseFilterFunction.args.negate.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 45 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 52 }, "signature": [ - "\"string\"[]" + "\"boolean\"[]" ] }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.mode.options", - "type": "Array", - "label": "options", + "id": "def-common.phraseFilterFunction.args.negate.default", + "type": "boolean", + "label": "default", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 46 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 53 }, "signature": [ - "(\"absolute\" | \"relative\")[]" + "false" ] }, { "tags": [], - "id": "def-common.kibanaTimerangeFunction.args.mode.help", + "id": "def-common.phraseFilterFunction.args.negate.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 47 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 54 } } ], "description": [], - "label": "mode", + "label": "negate", "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 44 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 51 } } ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 29 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 35 } }, { - "id": "def-common.kibanaTimerangeFunction.fn", + "id": "def-common.phraseFilterFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: null, args: ", + "(input: null, args: Arguments) => { $state?: ", { "pluginId": "data", "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.TimeRange", - "text": "TimeRange" + "docId": "kibDataPluginApi", + "section": "def-common.FilterState", + "text": "FilterState" }, - ") => { type: \"timerange\"; from: string; to: string; mode: \"absolute\" | \"relative\" | undefined; }" + " | undefined; meta: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.FilterMeta", + "text": "FilterMeta" + }, + "; query?: any; type: \"kibana_filter\"; }" ], "description": [], "children": [ @@ -20202,8 +22388,8 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 53 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 60 } }, { @@ -20211,79 +22397,73 @@ "label": "args", "isRequired": true, "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataQueryPluginApi", - "section": "def-common.TimeRange", - "text": "TimeRange" - } + "Arguments" ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 53 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 60 } } ], "tags": [], "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 53 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 60 } } ], "description": [], - "label": "kibanaTimerangeFunction", + "label": "phraseFilterFunction", "source": { - "path": "src/plugins/data/common/search/expressions/timerange.ts", - "lineNumber": 22 + "path": "src/plugins/data/common/search/expressions/phrase_filter.ts", + "lineNumber": 28 }, "initialIsOpen": false }, { - "id": "def-common.kqlFunction", + "id": "def-common.rangeFilterFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kqlFunction.name", + "id": "def-common.rangeFilterFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 25 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 30 }, "signature": [ - "\"kql\"" + "\"rangeFilter\"" ] }, { "tags": [], - "id": "def-common.kqlFunction.type", + "id": "def-common.rangeFilterFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 26 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 31 }, "signature": [ - "\"kibana_query\"" + "\"kibana_filter\"" ] }, { "tags": [], - "id": "def-common.kqlFunction.inputTypes", + "id": "def-common.rangeFilterFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 27 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 32 }, "signature": [ "\"null\"[]" @@ -20291,48 +22471,48 @@ }, { "tags": [], - "id": "def-common.kqlFunction.help", + "id": "def-common.rangeFilterFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 28 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 33 } }, { - "id": "def-common.kqlFunction.args", + "id": "def-common.rangeFilterFunction.args", "type": "Object", "tags": [], "children": [ { - "id": "def-common.kqlFunction.args.q", + "id": "def-common.rangeFilterFunction.args.field", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.kqlFunction.args.q.types", + "id": "def-common.rangeFilterFunction.args.field.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 33 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 38 }, "signature": [ - "\"string\"[]" + "\"kibana_field\"[]" ] }, { "tags": [], - "id": "def-common.kqlFunction.args.q.required", + "id": "def-common.rangeFilterFunction.args.field.required", "type": "boolean", "label": "required", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 34 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 39 }, "signature": [ "true" @@ -20340,51 +22520,157 @@ }, { "tags": [], - "id": "def-common.kqlFunction.args.q.aliases", + "id": "def-common.rangeFilterFunction.args.field.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 40 + } + } + ], + "description": [], + "label": "field", + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 37 + } + }, + { + "id": "def-common.rangeFilterFunction.args.range", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.rangeFilterFunction.args.range.types", "type": "Array", - "label": "aliases", + "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 35 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 45 }, "signature": [ - "string[]" + "\"kibana_range\"[]" ] }, { "tags": [], - "id": "def-common.kqlFunction.args.q.help", + "id": "def-common.rangeFilterFunction.args.range.required", + "type": "boolean", + "label": "required", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 46 + }, + "signature": [ + "true" + ] + }, + { + "tags": [], + "id": "def-common.rangeFilterFunction.args.range.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 36 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 47 } } ], "description": [], - "label": "q", + "label": "range", "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 32 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 44 + } + }, + { + "id": "def-common.rangeFilterFunction.args.negate", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.rangeFilterFunction.args.negate.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 52 + }, + "signature": [ + "\"boolean\"[]" + ] + }, + { + "tags": [], + "id": "def-common.rangeFilterFunction.args.negate.default", + "type": "boolean", + "label": "default", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 53 + }, + "signature": [ + "false" + ] + }, + { + "tags": [], + "id": "def-common.rangeFilterFunction.args.negate.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 54 + } + } + ], + "description": [], + "label": "negate", + "source": { + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 51 } } ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 31 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 36 } }, { - "id": "def-common.kqlFunction.fn", + "id": "def-common.rangeFilterFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: null, args: Arguments) => { type: \"kibana_query\"; language: string; query: string; }" + "(input: null, args: Arguments) => { $state?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.FilterState", + "text": "FilterState" + }, + " | undefined; meta: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataPluginApi", + "section": "def-common.FilterMeta", + "text": "FilterMeta" + }, + "; query?: any; type: \"kibana_filter\"; }" ], "description": [], "children": [ @@ -20397,8 +22683,8 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 60 } }, { @@ -20410,69 +22696,69 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 60 } } ], "tags": [], "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 60 } } ], "description": [], - "label": "kqlFunction", + "label": "rangeFilterFunction", "source": { - "path": "src/plugins/data/common/search/expressions/kql.ts", - "lineNumber": 24 + "path": "src/plugins/data/common/search/expressions/range_filter.ts", + "lineNumber": 29 }, "initialIsOpen": false }, { - "id": "def-common.luceneFunction", + "id": "def-common.rangeFunction", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.luceneFunction.name", + "id": "def-common.rangeFunction.name", "type": "string", "label": "name", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 25 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 29 }, "signature": [ - "\"lucene\"" + "\"range\"" ] }, { "tags": [], - "id": "def-common.luceneFunction.type", + "id": "def-common.rangeFunction.type", "type": "string", "label": "type", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 26 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 30 }, "signature": [ - "\"kibana_query\"" + "\"kibana_range\"" ] }, { "tags": [], - "id": "def-common.luceneFunction.inputTypes", + "id": "def-common.rangeFunction.inputTypes", "type": "Array", "label": "inputTypes", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 27 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 31 }, "signature": [ "\"null\"[]" @@ -20480,100 +22766,186 @@ }, { "tags": [], - "id": "def-common.luceneFunction.help", + "id": "def-common.rangeFunction.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 28 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 32 } }, { - "id": "def-common.luceneFunction.args", + "id": "def-common.rangeFunction.args", "type": "Object", "tags": [], "children": [ { - "id": "def-common.luceneFunction.args.q", + "id": "def-common.rangeFunction.args.gt", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.luceneFunction.args.q.types", + "id": "def-common.rangeFunction.args.gt.types", "type": "Array", "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 33 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 37 }, "signature": [ - "\"string\"[]" + "(\"string\" | \"number\")[]" ] }, { "tags": [], - "id": "def-common.luceneFunction.args.q.required", - "type": "boolean", - "label": "required", + "id": "def-common.rangeFunction.args.gt.help", + "type": "string", + "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 34 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 38 + } + } + ], + "description": [], + "label": "gt", + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 36 + } + }, + { + "id": "def-common.rangeFunction.args.lt", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.rangeFunction.args.lt.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 43 }, "signature": [ - "true" + "(\"string\" | \"number\")[]" ] }, { "tags": [], - "id": "def-common.luceneFunction.args.q.aliases", + "id": "def-common.rangeFunction.args.lt.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 44 + } + } + ], + "description": [], + "label": "lt", + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 42 + } + }, + { + "id": "def-common.rangeFunction.args.gte", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.rangeFunction.args.gte.types", "type": "Array", - "label": "aliases", + "label": "types", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 35 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 49 }, "signature": [ - "string[]" + "(\"string\" | \"number\")[]" ] }, { "tags": [], - "id": "def-common.luceneFunction.args.q.help", + "id": "def-common.rangeFunction.args.gte.help", "type": "string", "label": "help", "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 36 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 50 } } ], "description": [], - "label": "q", + "label": "gte", "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 32 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 48 + } + }, + { + "id": "def-common.rangeFunction.args.lte", + "type": "Object", + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.rangeFunction.args.lte.types", + "type": "Array", + "label": "types", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 55 + }, + "signature": [ + "(\"string\" | \"number\")[]" + ] + }, + { + "tags": [], + "id": "def-common.rangeFunction.args.lte.help", + "type": "string", + "label": "help", + "description": [], + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 56 + } + } + ], + "description": [], + "label": "lte", + "source": { + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 54 } } ], "description": [], "label": "args", "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 31 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 35 } }, { - "id": "def-common.luceneFunction.fn", + "id": "def-common.rangeFunction.fn", "type": "Function", "label": "fn", "signature": [ - "(input: null, args: Arguments) => { type: \"kibana_query\"; language: string; query: any; }" + "(input: null, args: Arguments) => { gt?: string | number | undefined; lt?: string | number | undefined; gte?: string | number | undefined; lte?: string | number | undefined; type: \"kibana_range\"; }" ], "description": [], "children": [ @@ -20586,8 +22958,8 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 62 } }, { @@ -20599,80 +22971,49 @@ ], "description": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 62 } } ], "tags": [], "returnComment": [], "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 42 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 62 } } ], "description": [], - "label": "luceneFunction", - "source": { - "path": "src/plugins/data/common/search/expressions/lucene.ts", - "lineNumber": 24 - }, - "initialIsOpen": false - }, - { - "tags": [], - "id": "def-common.migrateIncludeExcludeFormat", - "type": "Object", - "label": "migrateIncludeExcludeFormat", - "description": [], + "label": "rangeFunction", "source": { - "path": "src/plugins/data/common/search/aggs/buckets/migrate_include_exclude_format.ts", - "lineNumber": 25 + "path": "src/plugins/data/common/search/expressions/range.ts", + "lineNumber": 28 }, - "signature": [ - "Partial<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.BucketAggParam", - "text": "BucketAggParam" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IBucketAggConfig", - "text": "IBucketAggConfig" - }, - ">>" - ], "initialIsOpen": false }, { - "id": "def-common.parentPipelineAggHelper", + "id": "def-common.siblingPipelineAggHelper", "type": "Object", "tags": [], "children": [ { "tags": [], - "id": "def-common.parentPipelineAggHelper.subtype", + "id": "def-common.siblingPipelineAggHelper.subtype", "type": "string", "label": "subtype", "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", - "lineNumber": 34 + "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", + "lineNumber": 42 } }, { - "id": "def-common.parentPipelineAggHelper.params", + "id": "def-common.siblingPipelineAggHelper.params", "type": "Function", "label": "params", "signature": [ - "() => ", + "(bucketFilter?: string[]) => ", { "pluginId": "data", "scope": "common", @@ -20691,113 +23032,26 @@ ">[]" ], "description": [], - "children": [], - "tags": [], - "returnComment": [], - "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", - "lineNumber": 35 - } - }, - { - "id": "def-common.parentPipelineAggHelper.getSerializedFormat", - "type": "Function", - "label": "getSerializedFormat", - "signature": [ - "(agg: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IMetricAggConfig", - "text": "IMetricAggConfig" - }, - ") => any" - ], - "description": [], "children": [ { - "type": "Object", - "label": "agg", + "type": "Array", + "label": "bucketFilter", "isRequired": true, "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IMetricAggConfig", - "text": "IMetricAggConfig" - } + "string[]" ], "description": [], "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", - "lineNumber": 63 + "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", + "lineNumber": 43 } } ], "tags": [], "returnComment": [], - "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", - "lineNumber": 63 - } - } - ], - "description": [], - "label": "parentPipelineAggHelper", - "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts", - "lineNumber": 33 - }, - "initialIsOpen": false - }, - { - "id": "def-common.siblingPipelineAggHelper", - "type": "Object", - "tags": [], - "children": [ - { - "tags": [], - "id": "def-common.siblingPipelineAggHelper.subtype", - "type": "string", - "label": "subtype", - "description": [], - "source": { - "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 41 - } - }, - { - "id": "def-common.siblingPipelineAggHelper.params", - "type": "Function", - "label": "params", - "signature": [ - "() => ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.MetricAggParam", - "text": "MetricAggParam" - }, - "<", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IMetricAggConfig", - "text": "IMetricAggConfig" - }, - ">[]" - ], - "description": [], - "children": [], - "tags": [], - "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 42 + "lineNumber": 43 } }, { @@ -20833,7 +23087,7 @@ "description": [], "source": { "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 77 + "lineNumber": 79 } } ], @@ -20841,7 +23095,7 @@ "returnComment": [], "source": { "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 77 + "lineNumber": 79 } } ], @@ -20849,7 +23103,7 @@ "label": "siblingPipelineAggHelper", "source": { "path": "src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts", - "lineNumber": 40 + "lineNumber": 41 }, "initialIsOpen": false } diff --git a/api_docs/expressions.json b/api_docs/expressions.json index f80d9b6c4cdd3..eefffb009be2a 100644 --- a/api_docs/expressions.json +++ b/api_docs/expressions.json @@ -21952,6 +21952,41 @@ "returnComment": [], "initialIsOpen": false }, + { + "id": "def-common.createMockContext", + "type": "Function", + "children": [], + "signature": [ + "() => ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExecutionContext", + "text": "ExecutionContext" + }, + "<", + { + "pluginId": "inspector", + "scope": "common", + "docId": "kibInspectorPluginApi", + "section": "def-common.Adapters", + "text": "Adapters" + }, + ", ", + "SerializableState", + ">" + ], + "description": [], + "label": "createMockContext", + "source": { + "path": "src/plugins/expressions/common/util/test_utils.ts", + "lineNumber": 11 + }, + "tags": [], + "returnComment": [], + "initialIsOpen": false + }, { "id": "def-common.format", "type": "Function", @@ -22465,6 +22500,52 @@ "tags": [], "returnComment": [], "initialIsOpen": false + }, + { + "id": "def-common.unboxExpressionValue", + "type": "Function", + "label": "unboxExpressionValue", + "signature": [ + "({\n type,\n ...value\n}: ", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + ") => T" + ], + "description": [], + "children": [ + { + "type": "CompoundType", + "label": "{\n type,\n ...value\n}", + "isRequired": true, + "signature": [ + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.ExpressionValueBoxed", + "text": "ExpressionValueBoxed" + }, + "" + ], + "description": [], + "source": { + "path": "src/plugins/expressions/common/expression_types/unbox_expression_value.ts", + "lineNumber": 11 + } + } + ], + "tags": [], + "returnComment": [], + "source": { + "path": "src/plugins/expressions/common/expression_types/unbox_expression_value.ts", + "lineNumber": 11 + }, + "initialIsOpen": false } ], "interfaces": [ diff --git a/api_docs/fleet.json b/api_docs/fleet.json index d9774d14e4c96..ed51f88ee9d5d 100644 --- a/api_docs/fleet.json +++ b/api_docs/fleet.json @@ -2515,7 +2515,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 94 + "lineNumber": 95 }, "signature": [ { @@ -2535,7 +2535,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 95 + "lineNumber": 96 }, "signature": [ { @@ -2556,7 +2556,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 96 + "lineNumber": 97 }, "signature": [ { @@ -2577,7 +2577,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 97 + "lineNumber": 98 }, "signature": [ { @@ -2597,7 +2597,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 98 + "lineNumber": 99 }, "signature": [ { @@ -2618,7 +2618,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 99 + "lineNumber": 100 }, "signature": [ "Pick<", @@ -2635,7 +2635,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 93 + "lineNumber": 94 }, "initialIsOpen": false }, @@ -2735,7 +2735,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 137 + "lineNumber": 140 }, "signature": [ "[\"packagePolicyCreate\", (newPackagePolicy: ", @@ -2837,7 +2837,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 122 + "lineNumber": 125 }, "signature": [ "void" @@ -2862,7 +2862,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 161 + "lineNumber": 164 }, "signature": [ { @@ -2882,7 +2882,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 162 + "lineNumber": 165 }, "signature": [ { @@ -2902,7 +2902,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 163 + "lineNumber": 166 }, "signature": [ { @@ -2924,7 +2924,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 167 + "lineNumber": 170 }, "signature": [ { @@ -2944,7 +2944,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 168 + "lineNumber": 171 }, "signature": [ { @@ -2966,7 +2966,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 173 + "lineNumber": 176 }, "signature": [ "(...args: ", @@ -2990,7 +2990,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 179 + "lineNumber": 182 }, "signature": [ "(packageName: string) => ", @@ -3006,7 +3006,7 @@ ], "source": { "path": "x-pack/plugins/fleet/server/plugin.ts", - "lineNumber": 160 + "lineNumber": 163 }, "lifecycle": "start", "initialIsOpen": true @@ -3274,7 +3274,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/index.ts", - "lineNumber": 38 + "lineNumber": 39 }, "signature": [ "(o: T) => [keyof T, T[keyof T]][]" @@ -4486,59 +4486,44 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 86 + "lineNumber": 91 } }, { "tags": [], - "id": "def-common.BulkInstallPackageInfo.newVersion", + "id": "def-common.BulkInstallPackageInfo.version", "type": "string", - "label": "newVersion", + "label": "version", "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 87 + "lineNumber": 92 } }, { "tags": [], - "id": "def-common.BulkInstallPackageInfo.oldVersion", - "type": "CompoundType", - "label": "oldVersion", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 89 - }, - "signature": [ - "string | null" - ] - }, - { - "tags": [], - "id": "def-common.BulkInstallPackageInfo.assets", - "type": "Array", - "label": "assets", + "id": "def-common.BulkInstallPackageInfo.result", + "type": "Object", + "label": "result", "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 90 + "lineNumber": 93 }, "signature": [ { "pluginId": "fleet", "scope": "common", "docId": "kibFleetPluginApi", - "section": "def-common.AssetReference", - "text": "AssetReference" - }, - "[]" + "section": "def-common.InstallResult", + "text": "InstallResult" + } ] } ], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 85 + "lineNumber": 90 }, "initialIsOpen": false }, @@ -4557,7 +4542,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 98 + "lineNumber": 101 }, "signature": [ "{ packages: string[]; }" @@ -4566,7 +4551,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 97 + "lineNumber": 100 }, "initialIsOpen": false }, @@ -4585,7 +4570,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 94 + "lineNumber": 97 }, "signature": [ "(", @@ -4610,7 +4595,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 93 + "lineNumber": 96 }, "initialIsOpen": false }, @@ -5235,7 +5220,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 108 + "lineNumber": 111 }, "signature": [ "{ pkgkey: string; }" @@ -5244,7 +5229,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 107 + "lineNumber": 110 }, "initialIsOpen": false }, @@ -5263,7 +5248,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 114 + "lineNumber": 117 }, "signature": [ { @@ -5279,7 +5264,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 113 + "lineNumber": 116 }, "initialIsOpen": false }, @@ -5507,7 +5492,7 @@ "lineNumber": 15 }, "signature": [ - "{ enabled: boolean; tlsCheckDisabled: boolean; pollingRequestTimeout: number; maxConcurrentConnections: number; kibana: { host?: string | string[] | undefined; ca_sha256?: string | undefined; }; elasticsearch: { host?: string | undefined; ca_sha256?: string | undefined; }; agentPolicyRolloutRateLimitIntervalMs: number; agentPolicyRolloutRateLimitRequestPerInterval: number; }" + "{ enabled: boolean; fleetServerEnabled: boolean; tlsCheckDisabled: boolean; pollingRequestTimeout: number; maxConcurrentConnections: number; kibana: { host?: string | string[] | undefined; ca_sha256?: string | undefined; }; elasticsearch: { host?: string | undefined; ca_sha256?: string | undefined; }; agentPolicyRolloutRateLimitIntervalMs: number; agentPolicyRolloutRateLimitRequestPerInterval: number; }" ] } ], @@ -8609,6 +8594,55 @@ }, "initialIsOpen": false }, + { + "id": "def-common.InstallResult", + "type": "Interface", + "label": "InstallResult", + "description": [], + "tags": [], + "children": [ + { + "tags": [], + "id": "def-common.InstallResult.assets", + "type": "Array", + "label": "assets", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", + "lineNumber": 86 + }, + "signature": [ + { + "pluginId": "fleet", + "scope": "common", + "docId": "kibFleetPluginApi", + "section": "def-common.AssetReference", + "text": "AssetReference" + }, + "[]" + ] + }, + { + "tags": [], + "id": "def-common.InstallResult.status", + "type": "CompoundType", + "label": "status", + "description": [], + "source": { + "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", + "lineNumber": 87 + }, + "signature": [ + "\"installed\" | \"already_installed\"" + ] + } + ], + "source": { + "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", + "lineNumber": 85 + }, + "initialIsOpen": false + }, { "id": "def-common.InstallScriptRequest", "type": "Interface", @@ -8824,13 +8858,13 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 104 + "lineNumber": 107 } } ], "source": { "path": "x-pack/plugins/fleet/common/types/rest_spec/epm.ts", - "lineNumber": 103 + "lineNumber": 106 }, "initialIsOpen": false }, @@ -13209,7 +13243,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 13 + "lineNumber": 12 }, "signature": [ "\"fleet_server\"" @@ -13246,21 +13280,6 @@ ], "initialIsOpen": false }, - { - "tags": [], - "id": "def-common.INDEX_PATTERN_SAVED_OBJECT_TYPE", - "type": "string", - "label": "INDEX_PATTERN_SAVED_OBJECT_TYPE", - "description": [], - "source": { - "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 10 - }, - "signature": [ - "\"index-pattern\"" - ], - "initialIsOpen": false - }, { "tags": [], "id": "def-common.INSTALL_SCRIPT_API_ROUTES", @@ -13460,7 +13479,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 11 + "lineNumber": 10 }, "signature": [ "60000" @@ -14087,7 +14106,7 @@ ], "source": { "path": "x-pack/plugins/fleet/common/types/index.ts", - "lineNumber": 43 + "lineNumber": 44 }, "signature": [ "T[keyof T]" @@ -14443,7 +14462,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 24 + "lineNumber": 23 }, "signature": [ "{ readonly Input: \"input\"; }" @@ -15151,7 +15170,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 28 + "lineNumber": 27 }, "signature": [ "{ readonly Logs: \"logs\"; readonly Metrics: \"metrics\"; }" @@ -15481,7 +15500,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 22 + "lineNumber": 21 }, "signature": [ "{ readonly System: \"system\"; readonly Endpoint: \"endpoint\"; readonly ElasticAgent: \"elastic_agent\"; }" @@ -16058,7 +16077,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 33 + "lineNumber": 32 }, "signature": [ "{ readonly Installed: \"installed\"; readonly NotInstalled: \"not_installed\"; }" @@ -16416,7 +16435,7 @@ "description": [], "source": { "path": "x-pack/plugins/fleet/common/constants/epm.ts", - "lineNumber": 15 + "lineNumber": 14 }, "signature": [ "{ readonly System: \"system\"; readonly Endpoint: \"endpoint\"; readonly ElasticAgent: \"elastic_agent\"; }" diff --git a/api_docs/lens.json b/api_docs/lens.json index abebd217ad7d5..e586016c22fc3 100644 --- a/api_docs/lens.json +++ b/api_docs/lens.json @@ -288,7 +288,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts", - "lineNumber": 44 + "lineNumber": 46 }, "signature": [ "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"terms\" | \"avg\" | \"median\" | \"cumulative_sum\" | \"derivative\" | \"moving_average\" | \"counter_rate\" | \"cardinality\" | \"percentile\" | \"last_value\" | undefined" @@ -302,7 +302,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts", - "lineNumber": 45 + "lineNumber": 47 }, "signature": [ "string | undefined" @@ -311,7 +311,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/column_types.ts", - "lineNumber": 43 + "lineNumber": 45 }, "initialIsOpen": false }, @@ -1318,7 +1318,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 125 + "lineNumber": 127 }, "signature": [ "BaseIndexPatternColumn & { params?: { format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; } | undefined; } & FieldBasedIndexPatternColumn & { operationType: \"avg\"; }" @@ -1475,7 +1475,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 127 + "lineNumber": 129 }, "signature": [ "BaseIndexPatternColumn & { params?: { format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; } | undefined; } & FieldBasedIndexPatternColumn & { operationType: \"max\"; }" @@ -1490,7 +1490,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 128 + "lineNumber": 130 }, "signature": [ "BaseIndexPatternColumn & { params?: { format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; } | undefined; } & FieldBasedIndexPatternColumn & { operationType: \"median\"; }" @@ -1505,7 +1505,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 126 + "lineNumber": 128 }, "signature": [ "BaseIndexPatternColumn & { params?: { format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; } | undefined; } & FieldBasedIndexPatternColumn & { operationType: \"min\"; }" @@ -1538,7 +1538,7 @@ ], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts", - "lineNumber": 405 + "lineNumber": 406 }, "signature": [ "\"range\" | \"filters\" | \"count\" | \"max\" | \"min\" | \"date_histogram\" | \"sum\" | \"terms\" | \"avg\" | \"median\" | \"cumulative_sum\" | \"derivative\" | \"moving_average\" | \"counter_rate\" | \"cardinality\" | \"percentile\" | \"last_value\"" @@ -1598,7 +1598,7 @@ "description": [], "source": { "path": "x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx", - "lineNumber": 124 + "lineNumber": 126 }, "signature": [ "BaseIndexPatternColumn & { params?: { format?: { id: string; params?: { decimals: number; } | undefined; } | undefined; } | undefined; } & FieldBasedIndexPatternColumn & { operationType: \"sum\"; }" diff --git a/api_docs/observability.json b/api_docs/observability.json index a3d1bc950cb53..439fd18db6469 100644 --- a/api_docs/observability.json +++ b/api_docs/observability.json @@ -2351,7 +2351,7 @@ "description": [], "source": { "path": "x-pack/plugins/observability/server/plugin.ts", - "lineNumber": 22 + "lineNumber": 23 }, "signature": [ "LazyScopedAnnotationsClientFactory" @@ -2360,7 +2360,7 @@ ], "source": { "path": "x-pack/plugins/observability/server/plugin.ts", - "lineNumber": 21 + "lineNumber": 22 }, "lifecycle": "setup", "initialIsOpen": true diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilteredmetric.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilteredmetric.md new file mode 100644 index 0000000000000..71e3e025b931d --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilteredmetric.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [AggFunctionsMapping](./kibana-plugin-plugins-data-public.aggfunctionsmapping.md) > [aggFilteredMetric](./kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilteredmetric.md) + +## AggFunctionsMapping.aggFilteredMetric property + +Signature: + +```typescript +aggFilteredMetric: ReturnType; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.md index b175b8d473d34..05388e2b86d7b 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.aggfunctionsmapping.md @@ -28,6 +28,7 @@ export interface AggFunctionsMapping | [aggDateRange](./kibana-plugin-plugins-data-public.aggfunctionsmapping.aggdaterange.md) | ReturnType<typeof aggDateRange> | | | [aggDerivative](./kibana-plugin-plugins-data-public.aggfunctionsmapping.aggderivative.md) | ReturnType<typeof aggDerivative> | | | [aggFilter](./kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilter.md) | ReturnType<typeof aggFilter> | | +| [aggFilteredMetric](./kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilteredmetric.md) | ReturnType<typeof aggFilteredMetric> | | | [aggFilters](./kibana-plugin-plugins-data-public.aggfunctionsmapping.aggfilters.md) | ReturnType<typeof aggFilters> | | | [aggGeoBounds](./kibana-plugin-plugins-data-public.aggfunctionsmapping.agggeobounds.md) | ReturnType<typeof aggGeoBounds> | | | [aggGeoCentroid](./kibana-plugin-plugins-data-public.aggfunctionsmapping.agggeocentroid.md) | ReturnType<typeof aggGeoCentroid> | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.metric_types.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.metric_types.md index 637717692a38c..3b5cecf1a0b82 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.metric_types.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.metric_types.md @@ -20,6 +20,7 @@ export declare enum METRIC_TYPES | COUNT | "count" | | | CUMULATIVE\_SUM | "cumulative_sum" | | | DERIVATIVE | "derivative" | | +| FILTERED\_METRIC | "filtered_metric" | | | GEO\_BOUNDS | "geo_bounds" | | | GEO\_CENTROID | "geo_centroid" | | | MAX | "max" | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilteredmetric.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilteredmetric.md new file mode 100644 index 0000000000000..9885a0afa40c6 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilteredmetric.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [AggFunctionsMapping](./kibana-plugin-plugins-data-server.aggfunctionsmapping.md) > [aggFilteredMetric](./kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilteredmetric.md) + +## AggFunctionsMapping.aggFilteredMetric property + +Signature: + +```typescript +aggFilteredMetric: ReturnType; +``` diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.md index f059bb2914847..86bf797572b09 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.aggfunctionsmapping.md @@ -28,6 +28,7 @@ export interface AggFunctionsMapping | [aggDateRange](./kibana-plugin-plugins-data-server.aggfunctionsmapping.aggdaterange.md) | ReturnType<typeof aggDateRange> | | | [aggDerivative](./kibana-plugin-plugins-data-server.aggfunctionsmapping.aggderivative.md) | ReturnType<typeof aggDerivative> | | | [aggFilter](./kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilter.md) | ReturnType<typeof aggFilter> | | +| [aggFilteredMetric](./kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilteredmetric.md) | ReturnType<typeof aggFilteredMetric> | | | [aggFilters](./kibana-plugin-plugins-data-server.aggfunctionsmapping.aggfilters.md) | ReturnType<typeof aggFilters> | | | [aggGeoBounds](./kibana-plugin-plugins-data-server.aggfunctionsmapping.agggeobounds.md) | ReturnType<typeof aggGeoBounds> | | | [aggGeoCentroid](./kibana-plugin-plugins-data-server.aggfunctionsmapping.agggeocentroid.md) | ReturnType<typeof aggGeoCentroid> | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md index 49df98b6d70a1..250173d11a056 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.metric_types.md @@ -20,6 +20,7 @@ export declare enum METRIC_TYPES | COUNT | "count" | | | CUMULATIVE\_SUM | "cumulative_sum" | | | DERIVATIVE | "derivative" | | +| FILTERED\_METRIC | "filtered_metric" | | | GEO\_BOUNDS | "geo_bounds" | | | GEO\_CENTROID | "geo_centroid" | | | MAX | "max" | | diff --git a/src/plugins/data/common/search/aggs/agg_config.ts b/src/plugins/data/common/search/aggs/agg_config.ts index f62fedc13b32a..0e9cf6aeb1f2f 100644 --- a/src/plugins/data/common/search/aggs/agg_config.ts +++ b/src/plugins/data/common/search/aggs/agg_config.ts @@ -232,7 +232,9 @@ export class AggConfig { const output = this.write(aggConfigs) as any; const configDsl = {} as any; - configDsl[this.type.dslName || this.type.name] = output.params; + if (!this.type.hasNoDslParams) { + configDsl[this.type.dslName || this.type.name] = output.params; + } // if the config requires subAggs, write them to the dsl as well if (this.subAggs.length) { diff --git a/src/plugins/data/common/search/aggs/agg_configs.ts b/src/plugins/data/common/search/aggs/agg_configs.ts index c9986b7e93bed..03c702aa72fb5 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.ts @@ -21,7 +21,14 @@ import { TimeRange } from '../../../common'; function removeParentAggs(obj: any) { for (const prop in obj) { if (prop === 'parentAggs') delete obj[prop]; - else if (typeof obj[prop] === 'object') removeParentAggs(obj[prop]); + else if (typeof obj[prop] === 'object') { + const hasParentAggsKey = 'parentAggs' in obj[prop]; + removeParentAggs(obj[prop]); + // delete object if parentAggs was the last key + if (hasParentAggsKey && Object.keys(obj[prop]).length === 0) { + delete obj[prop]; + } + } } } @@ -193,10 +200,12 @@ export class AggConfigs { // advance the cursor and nest under the previous agg, or // put it on the same level if the previous agg doesn't accept // sub aggs - dslLvlCursor = prevDsl.aggs || dslLvlCursor; + dslLvlCursor = prevDsl?.aggs || dslLvlCursor; } - const dsl = (dslLvlCursor[config.id] = config.toDsl(this)); + const dsl = config.type.hasNoDslParams + ? config.toDsl(this) + : (dslLvlCursor[config.id] = config.toDsl(this)); let subAggs: any; parseParentAggs(dslLvlCursor, dsl); @@ -206,6 +215,11 @@ export class AggConfigs { subAggs = dsl.aggs || (dsl.aggs = {}); } + if (subAggs) { + _.each(subAggs, (agg) => { + parseParentAggs(subAggs, agg); + }); + } if (subAggs && nestedMetrics) { nestedMetrics.forEach((agg: any) => { subAggs[agg.config.id] = agg.dsl; diff --git a/src/plugins/data/common/search/aggs/agg_type.ts b/src/plugins/data/common/search/aggs/agg_type.ts index 4583be17478e3..33fdc45a605b7 100644 --- a/src/plugins/data/common/search/aggs/agg_type.ts +++ b/src/plugins/data/common/search/aggs/agg_type.ts @@ -32,6 +32,7 @@ export interface AggTypeConfig< makeLabel?: ((aggConfig: TAggConfig) => string) | (() => string); ordered?: any; hasNoDsl?: boolean; + hasNoDslParams?: boolean; params?: Array>; valueType?: DatatableColumnType; getRequestAggs?: ((aggConfig: TAggConfig) => TAggConfig[]) | (() => TAggConfig[] | void); @@ -129,6 +130,12 @@ export class AggType< * @type {Boolean} */ hasNoDsl: boolean; + /** + * Flag that prevents params from this aggregation from being included in the dsl. Sibling and parent aggs are still written. + * + * @type {Boolean} + */ + hasNoDslParams: boolean; /** * The method to create a filter representation of the bucket * @param {object} aggConfig The instance of the aggConfig @@ -232,6 +239,7 @@ export class AggType< this.makeLabel = config.makeLabel || constant(this.name); this.ordered = config.ordered; this.hasNoDsl = !!config.hasNoDsl; + this.hasNoDslParams = !!config.hasNoDslParams; if (config.createFilter) { this.createFilter = config.createFilter; diff --git a/src/plugins/data/common/search/aggs/agg_types.ts b/src/plugins/data/common/search/aggs/agg_types.ts index a7af68a5ad8b4..d02f8e1fc5af4 100644 --- a/src/plugins/data/common/search/aggs/agg_types.ts +++ b/src/plugins/data/common/search/aggs/agg_types.ts @@ -44,6 +44,7 @@ export const getAggTypes = () => ({ { name: METRIC_TYPES.SUM_BUCKET, fn: metrics.getBucketSumMetricAgg }, { name: METRIC_TYPES.MIN_BUCKET, fn: metrics.getBucketMinMetricAgg }, { name: METRIC_TYPES.MAX_BUCKET, fn: metrics.getBucketMaxMetricAgg }, + { name: METRIC_TYPES.FILTERED_METRIC, fn: metrics.getFilteredMetricAgg }, { name: METRIC_TYPES.GEO_BOUNDS, fn: metrics.getGeoBoundsMetricAgg }, { name: METRIC_TYPES.GEO_CENTROID, fn: metrics.getGeoCentroidMetricAgg }, ], @@ -80,6 +81,7 @@ export const getAggTypesFunctions = () => [ metrics.aggBucketMax, metrics.aggBucketMin, metrics.aggBucketSum, + metrics.aggFilteredMetric, metrics.aggCardinality, metrics.aggCount, metrics.aggCumulativeSum, 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 92e6168b169c6..bba67640890ad 100644 --- a/src/plugins/data/common/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/common/search/aggs/aggs_service.test.ts @@ -97,6 +97,7 @@ describe('Aggs service', () => { "sum_bucket", "min_bucket", "max_bucket", + "filtered_metric", "geo_bounds", "geo_centroid", ] @@ -142,6 +143,7 @@ describe('Aggs service', () => { "sum_bucket", "min_bucket", "max_bucket", + "filtered_metric", "geo_bounds", "geo_centroid", ] diff --git a/src/plugins/data/common/search/aggs/buckets/filter.ts b/src/plugins/data/common/search/aggs/buckets/filter.ts index 14a8f84c2cb9f..900848bb9517f 100644 --- a/src/plugins/data/common/search/aggs/buckets/filter.ts +++ b/src/plugins/data/common/search/aggs/buckets/filter.ts @@ -6,12 +6,15 @@ * Side Public License, v 1. */ +import { cloneDeep } from 'lodash'; import { i18n } from '@kbn/i18n'; import { BucketAggType } from './bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; import { GeoBoundingBox } from './lib/geo_point'; import { aggFilterFnName } from './filter_fn'; import { BaseAggParams } from '../types'; +import { Query } from '../../../types'; +import { buildEsQuery, getEsQueryConfig } from '../../../es_query'; const filterTitle = i18n.translate('data.search.aggs.buckets.filterTitle', { defaultMessage: 'Filter', @@ -21,7 +24,7 @@ export interface AggParamsFilter extends BaseAggParams { geo_bounding_box?: GeoBoundingBox; } -export const getFilterBucketAgg = () => +export const getFilterBucketAgg = ({ getConfig }: { getConfig: (key: string) => any }) => new BucketAggType({ name: BUCKET_TYPES.FILTER, expressionName: aggFilterFnName, @@ -31,5 +34,27 @@ export const getFilterBucketAgg = () => { name: 'geo_bounding_box', }, + { + name: 'filter', + write(aggConfig, output) { + const filter: Query = aggConfig.params.filter; + + const input = cloneDeep(filter); + + if (!input) { + return; + } + + const esQueryConfigs = getEsQueryConfig({ get: getConfig }); + const query = buildEsQuery(aggConfig.getIndexPattern(), [input], [], esQueryConfigs); + + if (!query) { + console.log('malformed filter agg params, missing "query" on input'); // eslint-disable-line no-console + return; + } + + output.params = query; + }, + }, ], }); diff --git a/src/plugins/data/common/search/aggs/buckets/filter_fn.test.ts b/src/plugins/data/common/search/aggs/buckets/filter_fn.test.ts index 0b9f2915e9aa4..8b4642bf595cd 100644 --- a/src/plugins/data/common/search/aggs/buckets/filter_fn.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/filter_fn.test.ts @@ -23,6 +23,7 @@ describe('agg_expression_functions', () => { "id": undefined, "params": Object { "customLabel": undefined, + "filter": undefined, "geo_bounding_box": undefined, "json": undefined, }, @@ -46,6 +47,7 @@ describe('agg_expression_functions', () => { "id": undefined, "params": Object { "customLabel": undefined, + "filter": undefined, "geo_bounding_box": Object { "wkt": "BBOX (-74.1, -71.12, 40.73, 40.01)", }, @@ -57,6 +59,25 @@ describe('agg_expression_functions', () => { `); }); + test('correctly parses filter string argument', () => { + const actual = fn({ + filter: '{ "language": "kuery", "query": "a: b" }', + }); + + expect(actual.value.params.filter).toEqual({ language: 'kuery', query: 'a: b' }); + }); + + test('errors out if geo_bounding_box is used together with filter', () => { + expect(() => + fn({ + filter: '{ "language": "kuery", "query": "a: b" }', + geo_bounding_box: JSON.stringify({ + wkt: 'BBOX (-74.1, -71.12, 40.73, 40.01)', + }), + }) + ).toThrow(); + }); + test('correctly parses json string argument', () => { const actual = fn({ json: '{ "foo": true }', diff --git a/src/plugins/data/common/search/aggs/buckets/filter_fn.ts b/src/plugins/data/common/search/aggs/buckets/filter_fn.ts index 468b063046549..4c68251f5e42e 100644 --- a/src/plugins/data/common/search/aggs/buckets/filter_fn.ts +++ b/src/plugins/data/common/search/aggs/buckets/filter_fn.ts @@ -17,7 +17,7 @@ export const aggFilterFnName = 'aggFilter'; type Input = any; type AggArgs = AggExpressionFunctionArgs; -type Arguments = Assign; +type Arguments = Assign; type Output = AggExpressionType; type FunctionDefinition = ExpressionFunctionDefinition< @@ -59,6 +59,13 @@ export const aggFilter = (): FunctionDefinition => ({ defaultMessage: 'Filter results based on a point location within a bounding box', }), }, + filter: { + types: ['string'], + help: i18n.translate('data.search.aggs.buckets.filter.filter.help', { + defaultMessage: + 'Filter results based on a kql or lucene query. Do not use together with geo_bounding_box', + }), + }, json: { types: ['string'], help: i18n.translate('data.search.aggs.buckets.filter.json.help', { @@ -75,6 +82,13 @@ export const aggFilter = (): FunctionDefinition => ({ fn: (input, args) => { const { id, enabled, schema, ...rest } = args; + const geoBoundingBox = getParsedValue(args, 'geo_bounding_box'); + const filter = getParsedValue(args, 'filter'); + + if (geoBoundingBox && filter) { + throw new Error("filter and geo_bounding_box can't be used together"); + } + return { type: 'agg_type', value: { @@ -84,7 +98,8 @@ export const aggFilter = (): FunctionDefinition => ({ type: BUCKET_TYPES.FILTER, params: { ...rest, - geo_bounding_box: getParsedValue(args, 'geo_bounding_box'), + geo_bounding_box: geoBoundingBox, + filter, }, }, }; diff --git a/src/plugins/data/common/search/aggs/metrics/filtered_metric.test.ts b/src/plugins/data/common/search/aggs/metrics/filtered_metric.test.ts new file mode 100644 index 0000000000000..b27e4dd1494be --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/filtered_metric.test.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { AggConfigs, IAggConfigs } from '../agg_configs'; +import { mockAggTypesRegistry } from '../test_helpers'; +import { METRIC_TYPES } from './metric_agg_types'; + +describe('filtered metric agg type', () => { + let aggConfigs: IAggConfigs; + + beforeEach(() => { + const typesRegistry = mockAggTypesRegistry(); + const field = { + name: 'bytes', + }; + const indexPattern = { + id: '1234', + title: 'logstash-*', + fields: { + getByName: () => field, + filter: () => [field], + }, + } as any; + + aggConfigs = new AggConfigs( + indexPattern, + [ + { + id: METRIC_TYPES.FILTERED_METRIC, + type: METRIC_TYPES.FILTERED_METRIC, + schema: 'metric', + params: { + customBucket: { + type: 'filter', + params: { + filter: { language: 'kuery', query: 'a: b' }, + }, + }, + customMetric: { + type: 'cardinality', + params: { + field: 'bytes', + }, + }, + }, + }, + ], + { + typesRegistry, + } + ); + }); + + it('converts the response', () => { + const agg = aggConfigs.getResponseAggs()[0]; + + expect( + agg.getValue({ + 'filtered_metric-bucket': { + 'filtered_metric-metric': { + value: 10, + }, + }, + }) + ).toEqual(10); + }); +}); diff --git a/src/plugins/data/common/search/aggs/metrics/filtered_metric.ts b/src/plugins/data/common/search/aggs/metrics/filtered_metric.ts new file mode 100644 index 0000000000000..aa2417bbf8415 --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/filtered_metric.ts @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; +import { MetricAggType } from './metric_agg_type'; +import { makeNestedLabel } from './lib/make_nested_label'; +import { siblingPipelineAggHelper } from './lib/sibling_pipeline_agg_helper'; +import { METRIC_TYPES } from './metric_agg_types'; +import { AggConfigSerialized, BaseAggParams } from '../types'; +import { aggFilteredMetricFnName } from './filtered_metric_fn'; + +export interface AggParamsFilteredMetric extends BaseAggParams { + customMetric?: AggConfigSerialized; + customBucket?: AggConfigSerialized; +} + +const filteredMetricLabel = i18n.translate('data.search.aggs.metrics.filteredMetricLabel', { + defaultMessage: 'filtered', +}); + +const filteredMetricTitle = i18n.translate('data.search.aggs.metrics.filteredMetricTitle', { + defaultMessage: 'Filtered metric', +}); + +export const getFilteredMetricAgg = () => { + const { subtype, params, getSerializedFormat } = siblingPipelineAggHelper; + + return new MetricAggType({ + name: METRIC_TYPES.FILTERED_METRIC, + expressionName: aggFilteredMetricFnName, + title: filteredMetricTitle, + makeLabel: (agg) => makeNestedLabel(agg, filteredMetricLabel), + subtype, + params: [...params(['filter'])], + hasNoDslParams: true, + getSerializedFormat, + getValue(agg, bucket) { + const customMetric = agg.getParam('customMetric'); + const customBucket = agg.getParam('customBucket'); + return customMetric.getValue(bucket[customBucket.id]); + }, + getValueBucketPath(agg) { + const customBucket = agg.getParam('customBucket'); + const customMetric = agg.getParam('customMetric'); + if (customMetric.type.name === 'count') { + return customBucket.getValueBucketPath(); + } + return `${customBucket.getValueBucketPath()}>${customMetric.getValueBucketPath()}`; + }, + }); +}; diff --git a/src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.test.ts b/src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.test.ts new file mode 100644 index 0000000000000..22e97fe18b604 --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.test.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { functionWrapper } from '../test_helpers'; +import { aggFilteredMetric } from './filtered_metric_fn'; + +describe('agg_expression_functions', () => { + describe('aggFilteredMetric', () => { + const fn = functionWrapper(aggFilteredMetric()); + + test('handles customMetric and customBucket as a subexpression', () => { + const actual = fn({ + customMetric: fn({}), + customBucket: fn({}), + }); + + expect(actual.value.params).toMatchInlineSnapshot(` + Object { + "customBucket": Object { + "enabled": true, + "id": undefined, + "params": Object { + "customBucket": undefined, + "customLabel": undefined, + "customMetric": undefined, + }, + "schema": undefined, + "type": "filtered_metric", + }, + "customLabel": undefined, + "customMetric": Object { + "enabled": true, + "id": undefined, + "params": Object { + "customBucket": undefined, + "customLabel": undefined, + "customMetric": undefined, + }, + "schema": undefined, + "type": "filtered_metric", + }, + } + `); + }); + }); +}); diff --git a/src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.ts b/src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.ts new file mode 100644 index 0000000000000..6a7ff5fa5fd40 --- /dev/null +++ b/src/plugins/data/common/search/aggs/metrics/filtered_metric_fn.ts @@ -0,0 +1,94 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Assign } from '@kbn/utility-types'; +import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; +import { AggExpressionType, AggExpressionFunctionArgs, METRIC_TYPES } from '../'; + +export const aggFilteredMetricFnName = 'aggFilteredMetric'; + +type Input = any; +type AggArgs = AggExpressionFunctionArgs; +type Arguments = Assign< + AggArgs, + { customBucket?: AggExpressionType; customMetric?: AggExpressionType } +>; +type Output = AggExpressionType; +type FunctionDefinition = ExpressionFunctionDefinition< + typeof aggFilteredMetricFnName, + Input, + Arguments, + Output +>; + +export const aggFilteredMetric = (): FunctionDefinition => ({ + name: aggFilteredMetricFnName, + help: i18n.translate('data.search.aggs.function.metrics.filtered_metric.help', { + defaultMessage: 'Generates a serialized agg config for a filtered metric agg', + }), + type: 'agg_type', + args: { + id: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.filtered_metric.id.help', { + defaultMessage: 'ID for this aggregation', + }), + }, + enabled: { + types: ['boolean'], + default: true, + help: i18n.translate('data.search.aggs.metrics.filtered_metric.enabled.help', { + defaultMessage: 'Specifies whether this aggregation should be enabled', + }), + }, + schema: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.filtered_metric.schema.help', { + defaultMessage: 'Schema to use for this aggregation', + }), + }, + customBucket: { + types: ['agg_type'], + help: i18n.translate('data.search.aggs.metrics.filtered_metric.customBucket.help', { + defaultMessage: + 'Agg config to use for building sibling pipeline aggregations. Has to be a filter aggregation', + }), + }, + customMetric: { + types: ['agg_type'], + help: i18n.translate('data.search.aggs.metrics.filtered_metric.customMetric.help', { + defaultMessage: 'Agg config to use for building sibling pipeline aggregations', + }), + }, + customLabel: { + types: ['string'], + help: i18n.translate('data.search.aggs.metrics.filtered_metric.customLabel.help', { + defaultMessage: 'Represents a custom label for this aggregation', + }), + }, + }, + fn: (input, args) => { + const { id, enabled, schema, ...rest } = args; + + return { + type: 'agg_type', + value: { + id, + enabled, + schema, + type: METRIC_TYPES.FILTERED_METRIC, + params: { + ...rest, + customBucket: args.customBucket?.value, + customMetric: args.customMetric?.value, + }, + }, + }; + }, +}); diff --git a/src/plugins/data/common/search/aggs/metrics/index.ts b/src/plugins/data/common/search/aggs/metrics/index.ts index 4ab3b021ef93a..7038673d5d7c4 100644 --- a/src/plugins/data/common/search/aggs/metrics/index.ts +++ b/src/plugins/data/common/search/aggs/metrics/index.ts @@ -16,6 +16,8 @@ export * from './bucket_min_fn'; export * from './bucket_min'; export * from './bucket_sum_fn'; export * from './bucket_sum'; +export * from './filtered_metric_fn'; +export * from './filtered_metric'; export * from './cardinality_fn'; export * from './cardinality'; export * from './count'; diff --git a/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts b/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts index b72a6ca9f73ba..d51038d8a15e8 100644 --- a/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts +++ b/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts @@ -21,6 +21,7 @@ const metricAggFilter = [ '!std_dev', '!geo_bounds', '!geo_centroid', + '!filtered_metric', ]; export const parentPipelineType = i18n.translate( diff --git a/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts b/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts index d91ceae414f35..c0d1be4f47f9b 100644 --- a/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts +++ b/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts @@ -27,6 +27,7 @@ const metricAggFilter: string[] = [ '!cumulative_sum', '!geo_bounds', '!geo_centroid', + '!filtered_metric', ]; const bucketAggFilter: string[] = []; @@ -39,12 +40,12 @@ export const siblingPipelineType = i18n.translate( export const siblingPipelineAggHelper = { subtype: siblingPipelineType, - params() { + params(bucketFilter = bucketAggFilter) { return [ { name: 'customBucket', type: 'agg', - allowedAggs: bucketAggFilter, + allowedAggs: bucketFilter, default: null, makeAgg(agg: IMetricAggConfig, state = { type: 'date_histogram' }) { const orderAgg = agg.aggConfigs.createAggConfig(state, { addToAggConfigs: false }); @@ -69,7 +70,8 @@ export const siblingPipelineAggHelper = { modifyAggConfigOnSearchRequestStart: forwardModifyAggConfigOnSearchRequestStart( 'customMetric' ), - write: siblingPipelineAggWriter, + write: (agg: IMetricAggConfig, output: Record) => + siblingPipelineAggWriter(agg, output), }, ] as Array>; }, 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 b49004be2db01..3b6c9d8a0d55d 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 @@ -8,6 +8,7 @@ export enum METRIC_TYPES { AVG = 'avg', + FILTERED_METRIC = 'filtered_metric', CARDINALITY = 'cardinality', AVG_BUCKET = 'avg_bucket', MAX_BUCKET = 'max_bucket', diff --git a/src/plugins/data/common/search/aggs/types.ts b/src/plugins/data/common/search/aggs/types.ts index 48ded7fa7a7fc..e57410962fc08 100644 --- a/src/plugins/data/common/search/aggs/types.ts +++ b/src/plugins/data/common/search/aggs/types.ts @@ -41,6 +41,7 @@ import { AggParamsBucketMax, AggParamsBucketMin, AggParamsBucketSum, + AggParamsFilteredMetric, AggParamsCardinality, AggParamsCumulativeSum, AggParamsDateHistogram, @@ -84,6 +85,7 @@ import { getCalculateAutoTimeExpression, METRIC_TYPES, AggConfig, + aggFilteredMetric, } from './'; export { IAggConfig, AggConfigSerialized } from './agg_config'; @@ -188,6 +190,7 @@ export interface AggParamsMapping { [METRIC_TYPES.MAX_BUCKET]: AggParamsBucketMax; [METRIC_TYPES.MIN_BUCKET]: AggParamsBucketMin; [METRIC_TYPES.SUM_BUCKET]: AggParamsBucketSum; + [METRIC_TYPES.FILTERED_METRIC]: AggParamsFilteredMetric; [METRIC_TYPES.CUMULATIVE_SUM]: AggParamsCumulativeSum; [METRIC_TYPES.DERIVATIVE]: AggParamsDerivative; [METRIC_TYPES.MOVING_FN]: AggParamsMovingAvg; @@ -217,6 +220,7 @@ export interface AggFunctionsMapping { aggBucketMax: ReturnType; aggBucketMin: ReturnType; aggBucketSum: ReturnType; + aggFilteredMetric: ReturnType; aggCardinality: ReturnType; aggCount: ReturnType; aggCumulativeSum: ReturnType; diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index a61b8f400d285..5dc5a8ab2ce93 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -329,6 +329,10 @@ export interface AggFunctionsMapping { // // (undocumented) aggFilter: ReturnType; + // Warning: (ae-forgotten-export) The symbol "aggFilteredMetric" needs to be exported by the entry point index.d.ts + // + // (undocumented) + aggFilteredMetric: ReturnType; // Warning: (ae-forgotten-export) The symbol "aggFilters" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -711,7 +715,7 @@ export const ES_SEARCH_STRATEGY = "es"; // Warning: (ae-missing-release-tag) "EsaggsExpressionFunctionDefinition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type EsaggsExpressionFunctionDefinition = ExpressionFunctionDefinition<'esaggs', Input_34, Arguments_20, Output_34>; +export type EsaggsExpressionFunctionDefinition = ExpressionFunctionDefinition<'esaggs', Input_35, Arguments_21, Output_35>; // Warning: (ae-forgotten-export) The symbol "name" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "Input" needs to be exported by the entry point index.d.ts @@ -720,7 +724,7 @@ export type EsaggsExpressionFunctionDefinition = ExpressionFunctionDefinition<'e // Warning: (ae-missing-release-tag) "EsdslExpressionFunctionDefinition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type EsdslExpressionFunctionDefinition = ExpressionFunctionDefinition_2; +export type EsdslExpressionFunctionDefinition = ExpressionFunctionDefinition_2; // Warning: (ae-missing-release-tag) "esFilters" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -861,7 +865,7 @@ export type ExpressionFunctionKibana = ExpressionFunctionDefinition<'kibana', Ex // Warning: (ae-missing-release-tag) "ExpressionFunctionKibanaContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ExpressionFunctionKibanaContext = ExpressionFunctionDefinition<'kibana_context', KibanaContext | null, Arguments_21, Promise, ExecutionContext>; +export type ExpressionFunctionKibanaContext = ExpressionFunctionDefinition<'kibana_context', KibanaContext | null, Arguments_22, Promise, ExecutionContext>; // Warning: (ae-missing-release-tag) "ExpressionValueSearchContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1830,6 +1834,8 @@ export enum METRIC_TYPES { // (undocumented) DERIVATIVE = "derivative", // (undocumented) + FILTERED_METRIC = "filtered_metric", + // (undocumented) GEO_BOUNDS = "geo_bounds", // (undocumented) GEO_CENTROID = "geo_centroid", @@ -2649,7 +2655,7 @@ export const UI_SETTINGS: { // src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts:65:5 - (ae-forgotten-export) The symbol "FormatFieldFn" needs to be exported by the entry point index.d.ts // src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts:138:7 - (ae-forgotten-export) The symbol "FieldAttrSet" needs to be exported by the entry point index.d.ts // src/plugins/data/common/index_patterns/index_patterns/index_pattern.ts:169:7 - (ae-forgotten-export) The symbol "RuntimeField" needs to be exported by the entry point index.d.ts -// src/plugins/data/common/search/aggs/types.ts:139:51 - (ae-forgotten-export) The symbol "AggTypesRegistryStart" needs to be exported by the entry point index.d.ts +// src/plugins/data/common/search/aggs/types.ts:141:51 - (ae-forgotten-export) The symbol "AggTypesRegistryStart" needs to be exported by the entry point index.d.ts // src/plugins/data/public/field_formats/field_formats_service.ts:56:3 - (ae-forgotten-export) The symbol "FormatFactory" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:56:23 - (ae-forgotten-export) The symbol "FILTERS" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:56:23 - (ae-forgotten-export) The symbol "getDisplayValueFromFilter" needs to be exported by the entry point index.d.ts 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 63c27eeaf0b11..7e9170b98f132 100644 --- a/src/plugins/data/public/search/aggs/aggs_service.test.ts +++ b/src/plugins/data/public/search/aggs/aggs_service.test.ts @@ -54,7 +54,7 @@ describe('AggsService - public', () => { service.setup(setupDeps); const start = service.start(startDeps); expect(start.types.getAll().buckets.length).toBe(11); - expect(start.types.getAll().metrics.length).toBe(21); + expect(start.types.getAll().metrics.length).toBe(22); }); test('registers custom agg types', () => { @@ -71,7 +71,7 @@ describe('AggsService - public', () => { const start = service.start(startDeps); expect(start.types.getAll().buckets.length).toBe(12); expect(start.types.getAll().buckets.some(({ name }) => name === 'foo')).toBe(true); - expect(start.types.getAll().metrics.length).toBe(22); + expect(start.types.getAll().metrics.length).toBe(23); expect(start.types.getAll().metrics.some(({ name }) => name === 'bar')).toBe(true); }); }); diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index 83f7c67eba057..2b7da7fe194ca 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -134,6 +134,10 @@ export interface AggFunctionsMapping { // // (undocumented) aggFilter: ReturnType; + // Warning: (ae-forgotten-export) The symbol "aggFilteredMetric" needs to be exported by the entry point index.d.ts + // + // (undocumented) + aggFilteredMetric: ReturnType; // Warning: (ae-forgotten-export) The symbol "aggFilters" needs to be exported by the entry point index.d.ts // // (undocumented) @@ -405,7 +409,7 @@ export const ES_SEARCH_STRATEGY = "es"; // Warning: (ae-missing-release-tag) "EsaggsExpressionFunctionDefinition" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type EsaggsExpressionFunctionDefinition = ExpressionFunctionDefinition<'esaggs', Input_34, Arguments_20, Output_34>; +export type EsaggsExpressionFunctionDefinition = ExpressionFunctionDefinition<'esaggs', Input_35, Arguments_21, Output_35>; // Warning: (ae-missing-release-tag) "esFilters" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -485,7 +489,7 @@ export type ExpressionFunctionKibana = ExpressionFunctionDefinition<'kibana', Ex // Warning: (ae-missing-release-tag) "ExpressionFunctionKibanaContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export type ExpressionFunctionKibanaContext = ExpressionFunctionDefinition<'kibana_context', KibanaContext | null, Arguments_21, Promise, ExecutionContext>; +export type ExpressionFunctionKibanaContext = ExpressionFunctionDefinition<'kibana_context', KibanaContext | null, Arguments_22, Promise, ExecutionContext>; // Warning: (ae-missing-release-tag) "ExpressionValueSearchContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -1141,6 +1145,8 @@ export enum METRIC_TYPES { // (undocumented) DERIVATIVE = "derivative", // (undocumented) + FILTERED_METRIC = "filtered_metric", + // (undocumented) GEO_BOUNDS = "geo_bounds", // (undocumented) GEO_CENTROID = "geo_centroid", diff --git a/src/plugins/vis_type_metric/public/metric_vis_type.ts b/src/plugins/vis_type_metric/public/metric_vis_type.ts index 732205fb31eab..9e2e248c6ccd5 100644 --- a/src/plugins/vis_type_metric/public/metric_vis_type.ts +++ b/src/plugins/vis_type_metric/public/metric_vis_type.ts @@ -63,6 +63,7 @@ export const createMetricVisTypeDefinition = (): VisTypeDefinition => '!moving_avg', '!cumulative_sum', '!geo_bounds', + '!filtered_metric', ], aggSettings: { top_hits: { diff --git a/src/plugins/vis_type_table/public/legacy/table_vis_legacy_type.ts b/src/plugins/vis_type_table/public/legacy/table_vis_legacy_type.ts index 020a317e0471b..2f30faa8e9a89 100644 --- a/src/plugins/vis_type_table/public/legacy/table_vis_legacy_type.ts +++ b/src/plugins/vis_type_table/public/legacy/table_vis_legacy_type.ts @@ -50,7 +50,7 @@ export const tableVisLegacyTypeDefinition: VisTypeDefinition = { title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.metricTitle', { defaultMessage: 'Metric', }), - aggFilter: ['!geo_centroid', '!geo_bounds'], + aggFilter: ['!geo_centroid', '!geo_bounds', '!filtered_metric'], aggSettings: { top_hits: { allowStrings: true, diff --git a/src/plugins/vis_type_table/public/table_vis_type.ts b/src/plugins/vis_type_table/public/table_vis_type.ts index 774742f02dde5..d645af3180b08 100644 --- a/src/plugins/vis_type_table/public/table_vis_type.ts +++ b/src/plugins/vis_type_table/public/table_vis_type.ts @@ -46,7 +46,7 @@ export const tableVisTypeDefinition: VisTypeDefinition = { title: i18n.translate('visTypeTable.tableVisEditorConfig.schemas.metricTitle', { defaultMessage: 'Metric', }), - aggFilter: ['!geo_centroid', '!geo_bounds'], + aggFilter: ['!geo_centroid', '!geo_bounds', '!filtered_metric'], aggSettings: { top_hits: { allowStrings: true, diff --git a/src/plugins/vis_type_tagcloud/public/tag_cloud_type.ts b/src/plugins/vis_type_tagcloud/public/tag_cloud_type.ts index 6f2c6112064a9..4052ecbe21997 100644 --- a/src/plugins/vis_type_tagcloud/public/tag_cloud_type.ts +++ b/src/plugins/vis_type_tagcloud/public/tag_cloud_type.ts @@ -51,6 +51,7 @@ export const tagCloudVisTypeDefinition = { '!derivative', '!geo_bounds', '!geo_centroid', + '!filtered_metric', ], defaults: [{ schema: 'metric', type: 'count' }], }, diff --git a/src/plugins/vis_type_vislib/public/gauge.ts b/src/plugins/vis_type_vislib/public/gauge.ts index 172ce83b4f7c2..7e3ff8226fbb6 100644 --- a/src/plugins/vis_type_vislib/public/gauge.ts +++ b/src/plugins/vis_type_vislib/public/gauge.ts @@ -119,6 +119,7 @@ export const gaugeVisTypeDefinition: VisTypeDefinition = { '!moving_avg', '!cumulative_sum', '!geo_bounds', + '!filtered_metric', ], defaults: [{ schema: 'metric', type: 'count' }], }, diff --git a/src/plugins/vis_type_vislib/public/goal.ts b/src/plugins/vis_type_vislib/public/goal.ts index aaeae4f675f3f..468651bb4cf4c 100644 --- a/src/plugins/vis_type_vislib/public/goal.ts +++ b/src/plugins/vis_type_vislib/public/goal.ts @@ -83,6 +83,7 @@ export const goalVisTypeDefinition: VisTypeDefinition = { '!moving_avg', '!cumulative_sum', '!geo_bounds', + '!filtered_metric', ], defaults: [{ schema: 'metric', type: 'count' }], }, diff --git a/src/plugins/vis_type_vislib/public/heatmap.ts b/src/plugins/vis_type_vislib/public/heatmap.ts index 6f6160f3756fd..8d538399f68b2 100644 --- a/src/plugins/vis_type_vislib/public/heatmap.ts +++ b/src/plugins/vis_type_vislib/public/heatmap.ts @@ -94,6 +94,7 @@ export const heatmapVisTypeDefinition: VisTypeDefinition = { 'cardinality', 'std_dev', 'top_hits', + '!filtered_metric', ], defaults: [{ schema: 'metric', type: 'count' }], }, diff --git a/src/plugins/vis_type_xy/public/vis_types/area.ts b/src/plugins/vis_type_xy/public/vis_types/area.ts index a61c25bbc075a..dfe9bc2f42b84 100644 --- a/src/plugins/vis_type_xy/public/vis_types/area.ts +++ b/src/plugins/vis_type_xy/public/vis_types/area.ts @@ -133,7 +133,7 @@ export const getAreaVisTypeDefinition = ( title: i18n.translate('visTypeXy.area.metricsTitle', { defaultMessage: 'Y-axis', }), - aggFilter: ['!geo_centroid', '!geo_bounds'], + aggFilter: ['!geo_centroid', '!geo_bounds', '!filtered_metric'], min: 1, defaults: [{ schema: 'metric', type: 'count' }], }, diff --git a/src/plugins/vis_type_xy/public/vis_types/histogram.ts b/src/plugins/vis_type_xy/public/vis_types/histogram.ts index 2c2a83b48802d..ba20502a3b9af 100644 --- a/src/plugins/vis_type_xy/public/vis_types/histogram.ts +++ b/src/plugins/vis_type_xy/public/vis_types/histogram.ts @@ -137,7 +137,7 @@ export const getHistogramVisTypeDefinition = ( defaultMessage: 'Y-axis', }), min: 1, - aggFilter: ['!geo_centroid', '!geo_bounds'], + aggFilter: ['!geo_centroid', '!geo_bounds', '!filtered_metric'], defaults: [{ schema: 'metric', type: 'count' }], }, { diff --git a/src/plugins/vis_type_xy/public/vis_types/horizontal_bar.ts b/src/plugins/vis_type_xy/public/vis_types/horizontal_bar.ts index 75c4ddd75d0b3..62da0448e56bd 100644 --- a/src/plugins/vis_type_xy/public/vis_types/horizontal_bar.ts +++ b/src/plugins/vis_type_xy/public/vis_types/horizontal_bar.ts @@ -136,7 +136,7 @@ export const getHorizontalBarVisTypeDefinition = ( defaultMessage: 'Y-axis', }), min: 1, - aggFilter: ['!geo_centroid', '!geo_bounds'], + aggFilter: ['!geo_centroid', '!geo_bounds', '!filtered_metric'], defaults: [{ schema: 'metric', type: 'count' }], }, { diff --git a/src/plugins/vis_type_xy/public/vis_types/line.ts b/src/plugins/vis_type_xy/public/vis_types/line.ts index 87165a20592e5..5a9eb5198df35 100644 --- a/src/plugins/vis_type_xy/public/vis_types/line.ts +++ b/src/plugins/vis_type_xy/public/vis_types/line.ts @@ -132,7 +132,7 @@ export const getLineVisTypeDefinition = ( name: 'metric', title: i18n.translate('visTypeXy.line.metricTitle', { defaultMessage: 'Y-axis' }), min: 1, - aggFilter: ['!geo_centroid', '!geo_bounds'], + aggFilter: ['!geo_centroid', '!geo_bounds', '!filtered_metric'], defaults: [{ schema: 'metric', type: 'count' }], }, { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/advanced_options.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/advanced_options.tsx new file mode 100644 index 0000000000000..ea5eb14d9c20e --- /dev/null +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/advanced_options.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 { EuiLink, EuiText, EuiPopover, EuiButtonEmpty, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useState } from 'react'; + +export function AdvancedOptions(props: { + options: Array<{ + title: string; + dataTestSubj: string; + onClick: () => void; + showInPopover: boolean; + inlineElement: React.ReactElement | null; + }>; +}) { + const [popoverOpen, setPopoverOpen] = useState(false); + const popoverOptions = props.options.filter((option) => option.showInPopover); + const inlineOptions = props.options + .filter((option) => option.inlineElement) + .map((option) => React.cloneElement(option.inlineElement!, { key: option.dataTestSubj })); + + return ( + <> + {popoverOptions.length > 0 && ( + + + { + setPopoverOpen(!popoverOpen); + }} + > + {i18n.translate('xpack.lens.indexPattern.advancedSettings', { + defaultMessage: 'Add advanced options', + })} + + } + isOpen={popoverOpen} + closePopover={() => { + setPopoverOpen(false); + }} + > + {popoverOptions.map(({ dataTestSubj, onClick, title }, index) => ( + + + { + setPopoverOpen(false); + onClick(); + }} + > + {title} + + + {popoverOptions.length - 1 !== index && } + + ))} + + + )} + {inlineOptions.length > 0 && ( + <> + + {inlineOptions} + + )} + + ); +} 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 08842fb755888..1fc755ec489c7 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 @@ -32,6 +32,7 @@ import { resetIncomplete, FieldBasedIndexPatternColumn, canTransition, + DEFAULT_TIME_SCALE, } from '../operations'; import { mergeLayer } from '../state_helpers'; import { FieldSelect } from './field_select'; @@ -41,7 +42,9 @@ import { IndexPattern, IndexPatternLayer } from '../types'; import { trackUiEvent } from '../../lens_ui_telemetry'; import { FormatSelector } from './format_selector'; import { ReferenceEditor } from './reference_editor'; -import { TimeScaling } from './time_scaling'; +import { setTimeScaling, TimeScaling } from './time_scaling'; +import { defaultFilter, Filtering, setFilter } from './filtering'; +import { AdvancedOptions } from './advanced_options'; const operationPanels = getOperationDisplay(); @@ -156,6 +159,8 @@ export function DimensionEditor(props: DimensionEditorProps) { .filter((type) => fieldByOperation[type]?.size || operationWithoutField.has(type)); }, [fieldByOperation, operationWithoutField]); + const [filterByOpenInitially, setFilterByOpenInitally] = useState(false); + // Operations are compatible if they match inputs. They are always compatible in // the empty state. Field-based operations are not compatible with field-less operations. const operationsWithCompatibility = [...possibleOperations].map((operationType) => { @@ -458,11 +463,63 @@ export function DimensionEditor(props: DimensionEditorProps) { )} {!currentFieldIsInvalid && !incompleteInfo && selectedColumn && ( - { + setStateWrapper( + setTimeScaling(columnId, state.layers[layerId], DEFAULT_TIME_SCALE) + ); + }, + showInPopover: Boolean( + operationDefinitionMap[selectedColumn.operationType].timeScalingMode && + operationDefinitionMap[selectedColumn.operationType].timeScalingMode !== + 'disabled' && + Object.values(state.layers[layerId].columns).some( + (col) => col.operationType === 'date_histogram' + ) && + !selectedColumn.timeScale + ), + inlineElement: ( + + ), + }, + { + title: i18n.translate('xpack.lens.indexPattern.filterBy.label', { + defaultMessage: 'Filter by', + }), + dataTestSubj: 'indexPattern-filter-by-enable', + onClick: () => { + setFilterByOpenInitally(true); + setStateWrapper(setFilter(columnId, state.layers[layerId], defaultFilter)); + }, + showInPopover: Boolean( + operationDefinitionMap[selectedColumn.operationType].filterable && + !selectedColumn.filter + ), + inlineElement: + operationDefinitionMap[selectedColumn.operationType].filterable && + selectedColumn.filter ? ( + + ) : null, + }, + ]} /> )} 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 a6d2361be21d4..d586818cb3c11 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 @@ -6,7 +6,7 @@ */ import { ReactWrapper, ShallowWrapper } from 'enzyme'; -import React, { ChangeEvent, MouseEvent } from 'react'; +import React, { ChangeEvent, MouseEvent, ReactElement } from 'react'; import { act } from 'react-dom/test-utils'; import { EuiComboBox, @@ -15,6 +15,7 @@ import { EuiRange, EuiSelect, EuiButtonIcon, + EuiPopover, } from '@elastic/eui'; import { DataPublicPluginStart } from '../../../../../../src/plugins/data/public'; import { @@ -30,10 +31,14 @@ import { documentField } from '../document_field'; import { OperationMetadata } from '../../types'; import { DateHistogramIndexPatternColumn } from '../operations/definitions/date_histogram'; import { getFieldByNameFactory } from '../pure_helpers'; -import { TimeScaling } from './time_scaling'; import { DimensionEditor } from './dimension_editor'; +import { AdvancedOptions } from './advanced_options'; +import { Filtering } from './filtering'; jest.mock('../loader'); +jest.mock('../query_input', () => ({ + QueryInput: () => null, +})); jest.mock('../operations'); jest.mock('lodash', () => { const original = jest.requireActual('lodash'); @@ -1029,7 +1034,7 @@ describe('IndexPatternDimensionEditorPanel', () => { } it('should not show custom options if time scaling is not available', () => { - wrapper = mount( + wrapper = shallow( { })} /> ); - expect(wrapper.find('[data-test-subj="indexPattern-time-scaling"]')).toHaveLength(0); + expect( + wrapper + .find(DimensionEditor) + .dive() + .find(AdvancedOptions) + .dive() + .find('[data-test-subj="indexPattern-time-scaling-enable"]') + ).toHaveLength(0); }); it('should show custom options if time scaling is available', () => { - wrapper = mount(); + wrapper = shallow(); expect( wrapper - .find(TimeScaling) - .find('[data-test-subj="indexPattern-time-scaling-popover"]') - .exists() - ).toBe(true); + .find(DimensionEditor) + .dive() + .find(AdvancedOptions) + .dive() + .find('[data-test-subj="indexPattern-time-scaling-enable"]') + ).toHaveLength(1); }); it('should show current time scaling if set', () => { @@ -1066,7 +1080,7 @@ describe('IndexPatternDimensionEditorPanel', () => { wrapper .find(DimensionEditor) .dive() - .find(TimeScaling) + .find(AdvancedOptions) .dive() .find('[data-test-subj="indexPattern-time-scaling-enable"]') .prop('onClick')!({} as MouseEvent); @@ -1239,6 +1253,199 @@ describe('IndexPatternDimensionEditorPanel', () => { }); }); + describe('filtering', () => { + function getProps(colOverrides: Partial) { + return { + ...defaultProps, + state: getStateWithColumns({ + datecolumn: { + dataType: 'date', + isBucketed: true, + label: '', + customLabel: true, + operationType: 'date_histogram', + sourceField: 'ts', + params: { + interval: '1d', + }, + }, + col2: { + dataType: 'number', + isBucketed: false, + label: 'Count of records', + operationType: 'count', + sourceField: 'Records', + ...colOverrides, + } as IndexPatternColumn, + }), + columnId: 'col2', + }; + } + + it('should not show custom options if time scaling is not available', () => { + wrapper = shallow( + + ); + expect( + wrapper + .find(DimensionEditor) + .dive() + .find(AdvancedOptions) + .dive() + .find('[data-test-subj="indexPattern-filter-by-enable"]') + ).toHaveLength(0); + }); + + it('should show custom options if filtering is available', () => { + wrapper = shallow(); + expect( + wrapper + .find(DimensionEditor) + .dive() + .find(AdvancedOptions) + .dive() + .find('[data-test-subj="indexPattern-filter-by-enable"]') + ).toHaveLength(1); + }); + + it('should show current filter if set', () => { + wrapper = mount( + + ); + expect( + (wrapper.find(Filtering).find(EuiPopover).prop('children') as ReactElement).props.value + ).toEqual({ language: 'kuery', query: 'a: b' }); + }); + + it('should allow to set filter initially', () => { + const props = getProps({}); + wrapper = shallow(); + wrapper + .find(DimensionEditor) + .dive() + .find(AdvancedOptions) + .dive() + .find('[data-test-subj="indexPattern-filter-by-enable"]') + .prop('onClick')!({} as MouseEvent); + expect(props.setState).toHaveBeenCalledWith( + { + ...props.state, + layers: { + first: { + ...props.state.layers.first, + columns: { + ...props.state.layers.first.columns, + col2: expect.objectContaining({ + filter: { + language: 'kuery', + query: '', + }, + }), + }, + }, + }, + }, + { shouldRemoveDimension: false, shouldReplaceDimension: true } + ); + }); + + it('should carry over filter to other operation if possible', () => { + const props = getProps({ + filter: { language: 'kuery', query: 'a: b' }, + sourceField: 'bytes', + operationType: 'sum', + label: 'Sum of bytes per hour', + }); + wrapper = mount(); + wrapper + .find('button[data-test-subj="lns-indexPatternDimension-count incompatible"]') + .simulate('click'); + expect(props.setState).toHaveBeenCalledWith( + { + ...props.state, + layers: { + first: { + ...props.state.layers.first, + columns: { + ...props.state.layers.first.columns, + col2: expect.objectContaining({ + filter: { language: 'kuery', query: 'a: b' }, + }), + }, + }, + }, + }, + { shouldRemoveDimension: false, shouldReplaceDimension: true } + ); + }); + + it('should allow to change filter', () => { + const props = getProps({ + filter: { language: 'kuery', query: 'a: b' }, + }); + wrapper = mount(); + (wrapper.find(Filtering).find(EuiPopover).prop('children') as ReactElement).props.onChange({ + language: 'kuery', + query: 'c: d', + }); + expect(props.setState).toHaveBeenCalledWith( + { + ...props.state, + layers: { + first: { + ...props.state.layers.first, + columns: { + ...props.state.layers.first.columns, + col2: expect.objectContaining({ + filter: { language: 'kuery', query: 'c: d' }, + }), + }, + }, + }, + }, + { shouldRemoveDimension: false, shouldReplaceDimension: true } + ); + }); + + it('should allow to remove filter', () => { + const props = getProps({ + filter: { language: 'kuery', query: 'a: b' }, + }); + wrapper = mount(); + wrapper + .find('[data-test-subj="indexPattern-filter-by-remove"]') + .find(EuiButtonIcon) + .prop('onClick')!( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + {} as any + ); + expect(props.setState).toHaveBeenCalledWith( + { + ...props.state, + layers: { + first: { + ...props.state.layers.first, + columns: { + ...props.state.layers.first.columns, + col2: expect.objectContaining({ + filter: undefined, + }), + }, + }, + }, + }, + { shouldRemoveDimension: false, shouldReplaceDimension: true } + ); + }); + }); + it('should render invalid field if field reference is broken', () => { wrapper = mount( void; + isInitiallyOpen: boolean; +}) { + const [filterPopoverOpen, setFilterPopoverOpen] = useState(isInitiallyOpen); + const selectedOperation = operationDefinitionMap[selectedColumn.operationType]; + if (!selectedOperation.filterable || !selectedColumn.filter) { + return null; + } + + const isInvalid = !isQueryValid(selectedColumn.filter, indexPattern); + + return ( + + + + { + setFilterPopoverOpen(false); + }} + anchorClassName="eui-fullWidth" + panelClassName="lnsIndexPatternDimensionEditor__filtersEditor" + button={ + + + {/* Empty for spacing */} + + { + setFilterPopoverOpen(!filterPopoverOpen); + }} + color={isInvalid ? 'danger' : 'text'} + title={i18n.translate('xpack.lens.indexPattern.filterBy.clickToEdit', { + defaultMessage: 'Click to edit', + })} + > + {selectedColumn.filter.query || + i18n.translate('xpack.lens.indexPattern.filterBy.emptyFilterQuery', { + defaultMessage: '(empty)', + })} + + + + + } + > + { + updateLayer(setFilter(columnId, layer, newQuery)); + }} + isInvalid={false} + onSubmit={() => {}} + /> + + + + { + updateLayer(setFilter(columnId, layer, undefined)); + }} + iconType="cross" + /> + + + + ); +} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_scaling.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_scaling.tsx index a9362060b2dd0..bf5b64bf3d615 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_scaling.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_scaling.tsx @@ -7,23 +7,11 @@ import { EuiToolTip } from '@elastic/eui'; import { EuiIcon } from '@elastic/eui'; -import { - EuiLink, - EuiFormRow, - EuiSelect, - EuiFlexItem, - EuiFlexGroup, - EuiButtonIcon, - EuiText, - EuiPopover, - EuiButtonEmpty, - EuiSpacer, -} from '@elastic/eui'; +import { EuiFormRow, EuiSelect, EuiFlexItem, EuiFlexGroup, EuiButtonIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { useState } from 'react'; +import React from 'react'; import { adjustTimeScaleLabelSuffix, - DEFAULT_TIME_SCALE, IndexPatternColumn, operationDefinitionMap, } from '../operations'; @@ -64,7 +52,6 @@ export function TimeScaling({ layer: IndexPatternLayer; updateLayer: (newLayer: IndexPatternLayer) => void; }) { - const [popoverOpen, setPopoverOpen] = useState(false); const hasDateHistogram = layer.columnOrder.some( (colId) => layer.columns[colId].operationType === 'date_histogram' ); @@ -72,56 +59,12 @@ export function TimeScaling({ if ( !selectedOperation.timeScalingMode || selectedOperation.timeScalingMode === 'disabled' || - !hasDateHistogram + !hasDateHistogram || + !selectedColumn.timeScale ) { return null; } - if (!selectedColumn.timeScale) { - return ( - - - { - setPopoverOpen(!popoverOpen); - }} - > - {i18n.translate('xpack.lens.indexPattern.timeScale.advancedSettings', { - defaultMessage: 'Add advanced options', - })} - - } - isOpen={popoverOpen} - closePopover={() => { - setPopoverOpen(false); - }} - > - - { - setPopoverOpen(false); - updateLayer(setTimeScaling(columnId, layer, DEFAULT_TIME_SCALE)); - }} - > - {i18n.translate('xpack.lens.indexPattern.timeScale.enableTimeScale', { - defaultMessage: 'Normalize by unit', - })} - - - - - ); - } - return ( { ]); }); + it('should wrap filtered metrics in filtered metric aggregation', async () => { + const queryBaseState: IndexPatternBaseState = { + currentIndexPatternId: '1', + layers: { + first: { + indexPatternId: '1', + columnOrder: ['col1', 'col2', 'col3'], + columns: { + col1: { + label: 'Count of records', + dataType: 'number', + isBucketed: false, + sourceField: 'Records', + operationType: 'count', + timeScale: 'h', + filter: { + language: 'kuery', + query: 'bytes > 5', + }, + }, + col2: { + label: 'Average of bytes', + dataType: 'number', + isBucketed: false, + sourceField: 'bytes', + operationType: 'avg', + timeScale: 'h', + }, + col3: { + label: 'Date', + dataType: 'date', + isBucketed: true, + operationType: 'date_histogram', + sourceField: 'timestamp', + params: { + interval: 'auto', + }, + }, + }, + }, + }, + }; + + const state = enrichBaseState(queryBaseState); + + const ast = indexPatternDatasource.toExpression(state, 'first') as Ast; + expect(ast.chain[0].arguments.aggs[0]).toMatchInlineSnapshot(` + Object { + "chain": Array [ + Object { + "arguments": Object { + "customBucket": Array [ + Object { + "chain": Array [ + Object { + "arguments": Object { + "enabled": Array [ + true, + ], + "filter": Array [ + "{\\"language\\":\\"kuery\\",\\"query\\":\\"bytes > 5\\"}", + ], + "id": Array [ + "col1-filter", + ], + "schema": Array [ + "bucket", + ], + }, + "function": "aggFilter", + "type": "function", + }, + ], + "type": "expression", + }, + ], + "customMetric": Array [ + Object { + "chain": Array [ + Object { + "arguments": Object { + "enabled": Array [ + true, + ], + "id": Array [ + "col1-metric", + ], + "schema": Array [ + "metric", + ], + }, + "function": "aggCount", + "type": "function", + }, + ], + "type": "expression", + }, + ], + "enabled": Array [ + true, + ], + "id": Array [ + "col1", + ], + "schema": Array [ + "metric", + ], + }, + "function": "aggFilteredMetric", + "type": "function", + }, + ], + "type": "expression", + } + `); + }); + it('should add time_scale and format function if time scale is set and supported', async () => { const queryBaseState: IndexPatternBaseState = { currentIndexPatternId: '1', diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/counter_rate.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/counter_rate.tsx index b02926fe03fc3..331aa528e6d55 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/counter_rate.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/counter_rate.tsx @@ -82,6 +82,7 @@ export const counterRateOperation: OperationDefinition< scale: 'ratio', references: referenceIds, timeScale, + filter: previousColumn?.filter, params: getFormatFromPreviousColumn(previousColumn), }; }, @@ -106,4 +107,5 @@ export const counterRateOperation: OperationDefinition< )?.join(', '); }, timeScalingMode: 'mandatory', + filterable: true, }; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/cumulative_sum.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/cumulative_sum.tsx index 2bf46e3acad1b..1664f3639b598 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/cumulative_sum.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/cumulative_sum.tsx @@ -77,6 +77,7 @@ export const cumulativeSumOperation: OperationDefinition< operationType: 'cumulative_sum', isBucketed: false, scale: 'ratio', + filter: previousColumn?.filter, references: referenceIds, params: getFormatFromPreviousColumn(previousColumn), }; @@ -101,4 +102,5 @@ export const cumulativeSumOperation: OperationDefinition< }) )?.join(', '); }, + filterable: true, }; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/derivative.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/derivative.tsx index 2d4b69a151115..5fb0bc3a83528 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/derivative.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/derivative.tsx @@ -83,6 +83,7 @@ export const derivativeOperation: OperationDefinition< scale: 'ratio', references: referenceIds, timeScale: previousColumn?.timeScale, + filter: previousColumn?.filter, params: getFormatFromPreviousColumn(previousColumn), }; }, @@ -108,4 +109,5 @@ export const derivativeOperation: OperationDefinition< )?.join(', '); }, timeScalingMode: 'optional', + filterable: true, }; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/moving_average.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/moving_average.tsx index f9dfc962ce8b7..0af750a1fd481 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/moving_average.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/calculations/moving_average.tsx @@ -89,6 +89,7 @@ export const movingAverageOperation: OperationDefinition< scale: 'ratio', references: referenceIds, timeScale: previousColumn?.timeScale, + filter: previousColumn?.filter, params: { window: 5, ...getFormatFromPreviousColumn(previousColumn), @@ -119,6 +120,7 @@ export const movingAverageOperation: OperationDefinition< )?.join(', '); }, timeScalingMode: 'optional', + filterable: true, }; function MovingAverageParamEditor({ diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx index 80885a58e17f5..513bac14af7a3 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/cardinality.tsx @@ -70,6 +70,7 @@ export const cardinalityOperation: OperationDefinition ofName(getSafeName(column.sourceField, indexPattern)), buildColumn({ field, previousColumn }) { return { @@ -79,6 +80,7 @@ export const cardinalityOperation: OperationDefinition ({ isQueryValid: () => true, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filter_popover.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filter_popover.tsx index 569e394335648..f5428bf24348f 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filter_popover.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/filters/filter_popover.tsx @@ -8,13 +8,12 @@ import './filter_popover.scss'; import React, { MouseEventHandler, useEffect, useState } from 'react'; -import useDebounce from 'react-use/lib/useDebounce'; import { EuiPopover, EuiSpacer } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { FilterValue, defaultLabel, isQueryValid } from '.'; import { IndexPattern } from '../../../types'; -import { QueryStringInput, Query } from '../../../../../../../../src/plugins/data/public'; +import { Query } from '../../../../../../../../src/plugins/data/public'; import { LabelInput } from '../shared_components'; +import { QueryInput } from '../../../query_input'; export const FilterPopover = ({ filter, @@ -94,54 +93,3 @@ export const FilterPopover = ({ ); }; - -export const QueryInput = ({ - value, - onChange, - indexPattern, - isInvalid, - onSubmit, -}: { - value: Query; - onChange: (input: Query) => void; - indexPattern: IndexPattern; - isInvalid: boolean; - onSubmit: () => void; -}) => { - const [inputValue, setInputValue] = useState(value); - - useDebounce(() => onChange(inputValue), 256, [inputValue]); - - const handleInputChange = (input: Query) => { - setInputValue(input); - }; - - return ( - { - if (inputValue.query) { - onSubmit(); - } - }} - placeholder={ - inputValue.language === 'kuery' - ? i18n.translate('xpack.lens.indexPattern.filters.queryPlaceholderKql', { - defaultMessage: '{example}', - values: { example: 'method : "GET" or status : "404"' }, - }) - : i18n.translate('xpack.lens.indexPattern.filters.queryPlaceholderLucene', { - defaultMessage: '{example}', - values: { example: 'method:GET OR status:404' }, - }) - } - languageSwitcherPopoverAnchorPosition="rightDown" - /> - ); -}; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts index 433c69466dc00..cdb93048c9a58 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/index.ts @@ -230,6 +230,7 @@ interface BaseOperationDefinitionProps { * If set to optional, time scaling won't be enabled by default and can be removed. */ timeScalingMode?: TimeScalingMode; + filterable?: boolean; getHelpMessage?: (props: HelpProps) => React.ReactNode; } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx index 54d884c83020d..4f5c897fb5378 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/last_value.tsx @@ -161,12 +161,14 @@ export const lastValueOperation: OperationDefinition { return buildExpressionFunction('aggTopHit', { id: columnId, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx index b24b08c0be0c3..1767b76e88202 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/metrics.tsx @@ -99,6 +99,7 @@ function buildMetricOperation>({ isBucketed: false, scale: 'ratio', timeScale: optionalTimeScaling ? previousColumn?.timeScale : undefined, + filter: previousColumn?.filter, params: getFormatFromPreviousColumn(previousColumn), } as T), onFieldChange: (oldColumn, field) => { @@ -118,6 +119,7 @@ function buildMetricOperation>({ }, getErrorMessage: (layer, columnId, indexPattern) => getInvalidFieldMessage(layer.columns[columnId] as FieldBasedIndexPatternColumn, indexPattern), + filterable: true, } as OperationDefinition; } diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts index 4f915160a52a8..4a05e6f372d30 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.test.ts @@ -967,6 +967,49 @@ describe('state_helpers', () => { ); }); + it('should remove filter from the wrapped column if it gets wrapped (case new1)', () => { + const expectedColumn = { + label: 'Count', + customLabel: true, + dataType: 'number' as const, + isBucketed: false, + sourceField: 'Records', + operationType: 'count' as const, + }; + + const testFilter = { language: 'kuery', query: '' }; + + const layer: IndexPatternLayer = { + indexPatternId: '1', + columnOrder: ['col1'], + columns: { col1: { ...expectedColumn, filter: testFilter } }, + }; + const result = replaceColumn({ + layer, + indexPattern, + columnId: 'col1', + op: 'testReference' as OperationType, + visualizationGroups: [], + }); + + expect(operationDefinitionMap.testReference.buildColumn).toHaveBeenCalledWith( + expect.objectContaining({ + referenceIds: ['id1'], + previousColumn: expect.objectContaining({ + // filter should be passed to the buildColumn function of the target operation + filter: testFilter, + }), + }) + ); + expect(result.columns).toEqual( + expect.objectContaining({ + // filter should be stripped from the original column + id1: expectedColumn, + col1: expect.any(Object), + }) + ); + }); + it('should create a new no-input operation to use as reference (case new2)', () => { // @ts-expect-error this function is not valid operationDefinitionMap.testReference.requiredReferences = [ diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts index 3a67e8e464323..7853b7da7956e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/layer_helpers.ts @@ -509,7 +509,18 @@ function applyReferenceTransition({ if (!hasExactMatch && isColumnValidAsReference({ validation, column: previousColumn })) { hasExactMatch = true; - const newLayer = { ...layer, columns: { ...layer.columns, [newId]: { ...previousColumn } } }; + const newLayer = { + ...layer, + columns: { + ...layer.columns, + [newId]: { + ...previousColumn, + // drop the filter for the referenced column because the wrapping operation + // is filterable as well and will handle it one level higher. + filter: operationDefinition.filterable ? undefined : previousColumn.filter, + }, + }, + }; layer = { ...layer, columnOrder: getColumnOrder(newLayer), diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/mocks.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/mocks.ts index d5ea34f003561..429d881341e79 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/mocks.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/mocks.ts @@ -32,6 +32,7 @@ export const createMockedReferenceOperation = () => { references: args.referenceIds, }; }), + filterable: true, isTransferable: jest.fn(), toExpression: jest.fn().mockReturnValue([]), getPossibleOperation: jest.fn().mockReturnValue({ dataType: 'number', isBucketed: false }), diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/query_input.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/query_input.tsx new file mode 100644 index 0000000000000..50941148342c3 --- /dev/null +++ b/x-pack/plugins/lens/public/indexpattern_datasource/query_input.tsx @@ -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 React, { useState } from 'react'; +import useDebounce from 'react-use/lib/useDebounce'; +import { i18n } from '@kbn/i18n'; +import { IndexPattern } from './types'; +import { QueryStringInput, Query } from '../../../../../src/plugins/data/public'; + +export const QueryInput = ({ + value, + onChange, + indexPattern, + isInvalid, + onSubmit, + disableAutoFocus, +}: { + value: Query; + onChange: (input: Query) => void; + indexPattern: IndexPattern; + isInvalid: boolean; + onSubmit: () => void; + disableAutoFocus?: boolean; +}) => { + const [inputValue, setInputValue] = useState(value); + + useDebounce(() => onChange(inputValue), 256, [inputValue]); + + const handleInputChange = (input: Query) => { + setInputValue(input); + }; + + return ( + { + if (inputValue.query) { + onSubmit(); + } + }} + placeholder={ + inputValue.language === 'kuery' + ? i18n.translate('xpack.lens.indexPattern.filters.queryPlaceholderKql', { + defaultMessage: '{example}', + values: { example: 'method : "GET" or status : "404"' }, + }) + : i18n.translate('xpack.lens.indexPattern.filters.queryPlaceholderLucene', { + defaultMessage: '{example}', + values: { example: 'method:GET OR status:404' }, + }) + } + languageSwitcherPopoverAnchorPosition="rightDown" + /> + ); +}; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts b/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts index 6a0fbb3006847..d786d781199b6 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/to_expression.ts @@ -7,6 +7,7 @@ import type { IUiSettingsClient } from 'kibana/public'; import { + AggFunctionsMapping, EsaggsExpressionFunctionDefinition, IndexPatternLoadExpressionFunctionDefinition, } from '../../../../../src/plugins/data/public'; @@ -29,11 +30,32 @@ function getExpressionForLayer( indexPattern: IndexPattern, uiSettings: IUiSettingsClient ): ExpressionAstExpression | null { - const { columns, columnOrder } = layer; + const { columnOrder } = layer; if (columnOrder.length === 0 || !indexPattern) { return null; } + const columns = { ...layer.columns }; + Object.keys(columns).forEach((columnId) => { + const column = columns[columnId]; + const rootDef = operationDefinitionMap[column.operationType]; + if ( + 'references' in column && + rootDef.filterable && + rootDef.input === 'fullReference' && + column.filter + ) { + // inherit filter to all referenced operations + column.references.forEach((referenceColumnId) => { + const referencedColumn = columns[referenceColumnId]; + const referenceDef = operationDefinitionMap[column.operationType]; + if (referenceDef.filterable) { + columns[referenceColumnId] = { ...referencedColumn, filter: column.filter }; + } + }); + } + }); + const columnEntries = columnOrder.map((colId) => [colId, columns[colId]] as const); if (columnEntries.length) { @@ -44,10 +66,37 @@ function getExpressionForLayer( if (def.input === 'fullReference') { expressions.push(...def.toExpression(layer, colId, indexPattern)); } else { + const wrapInFilter = Boolean(def.filterable && col.filter); + let aggAst = def.toEsAggsFn( + col, + wrapInFilter ? `${colId}-metric` : colId, + indexPattern, + layer, + uiSettings + ); + if (wrapInFilter) { + aggAst = buildExpressionFunction( + 'aggFilteredMetric', + { + id: colId, + enabled: true, + schema: 'metric', + customBucket: buildExpression([ + buildExpressionFunction('aggFilter', { + id: `${colId}-filter`, + enabled: true, + schema: 'bucket', + filter: JSON.stringify(col.filter), + }), + ]), + customMetric: buildExpression({ type: 'expression', chain: [aggAst] }), + } + ).toAst(); + } aggs.push( buildExpression({ type: 'expression', - chain: [def.toEsAggsFn(col, colId, indexPattern, layer, uiSettings)], + chain: [aggAst], }) ); } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c07210f2e3eff..9b7a25ff62661 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -12095,7 +12095,6 @@ "xpack.lens.indexPattern.terms.otherLabel": "その他", "xpack.lens.indexPattern.terms.size": "値の数", "xpack.lens.indexPattern.termsOf": "{name} のトップの値", - "xpack.lens.indexPattern.timeScale.advancedSettings": "高度なオプションを追加", "xpack.lens.indexPattern.timeScale.enableTimeScale": "単位で正規化", "xpack.lens.indexPattern.timeScale.label": "単位で正規化", "xpack.lens.indexPattern.timeScale.tooltip": "基本の日付間隔に関係なく、常に指定された時間単位のレートとして表示されるように値を正規化します。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 8a027942c4275..7bb27ee6626b8 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -12253,7 +12253,6 @@ "xpack.lens.indexPattern.terms.otherLabel": "其他", "xpack.lens.indexPattern.terms.size": "值数目", "xpack.lens.indexPattern.termsOf": "{name} 排名最前值", - "xpack.lens.indexPattern.timeScale.advancedSettings": "添加高级选项", "xpack.lens.indexPattern.timeScale.enableTimeScale": "按单位标准化", "xpack.lens.indexPattern.timeScale.label": "按单位标准化", "xpack.lens.indexPattern.timeScale.tooltip": "将值标准化为始终显示为每指定时间单位速率,无论基础日期时间间隔是多少。", From c218ce292af1cc90ce619fbc4f1b7459e3255d4b Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 24 Mar 2021 11:47:56 +0100 Subject: [PATCH 19/35] [Lens] Add ability to remove runtime field (#94949) --- .../indexpattern_datasource/datapanel.tsx | 46 ++++++++++-- .../indexpattern_datasource/field_item.tsx | 65 +++++++++++++---- .../indexpattern_datasource/field_list.tsx | 4 ++ .../fields_accordion.tsx | 4 ++ x-pack/plugins/lens/server/usage/schema.ts | 38 ++++++++++ .../schema/xpack_plugins.json | 72 +++++++++++++++++++ .../functional/apps/lens/runtime_fields.ts | 6 ++ .../test/functional/page_objects/lens_page.ts | 15 ++++ 8 files changed, 230 insertions(+), 20 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx index 68a3e9056b05d..2cad77b003454 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/datapanel.tsx @@ -496,6 +496,15 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ }; }, []); + const refreshFieldList = useCallback(async () => { + const newlyMappedIndexPattern = await loadIndexPatterns({ + indexPatternsService: data.indexPatterns, + cache: {}, + patterns: [currentIndexPattern.id], + }); + onUpdateIndexPattern(newlyMappedIndexPattern[currentIndexPattern.id]); + }, [data, currentIndexPattern, onUpdateIndexPattern]); + const editField = useMemo( () => editPermission @@ -509,17 +518,39 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ fieldName, onSave: async () => { trackUiEvent(`save_field_${uiAction}`); - const newlyMappedIndexPattern = await loadIndexPatterns({ - indexPatternsService: data.indexPatterns, - cache: {}, - patterns: [currentIndexPattern.id], - }); - onUpdateIndexPattern(newlyMappedIndexPattern[currentIndexPattern.id]); + await refreshFieldList(); + }, + }); + } + : undefined, + [data, indexPatternFieldEditor, currentIndexPattern, editPermission, refreshFieldList] + ); + + const removeField = useMemo( + () => + editPermission + ? async (fieldName: string) => { + trackUiEvent('open_field_delete_modal'); + const indexPatternInstance = await data.indexPatterns.get(currentIndexPattern.id); + closeFieldEditor.current = indexPatternFieldEditor.openDeleteModal({ + ctx: { + indexPattern: indexPatternInstance, + }, + fieldName, + onDelete: async () => { + trackUiEvent('delete_field'); + await refreshFieldList(); }, }); } : undefined, - [data, indexPatternFieldEditor, currentIndexPattern, editPermission, onUpdateIndexPattern] + [ + currentIndexPattern.id, + data.indexPatterns, + editPermission, + indexPatternFieldEditor, + refreshFieldList, + ] ); const addField = useMemo( @@ -765,6 +796,7 @@ export const InnerIndexPatternDataPanel = function InnerIndexPatternDataPanel({ dropOntoWorkspace={dropOntoWorkspace} hasSuggestionForField={hasSuggestionForField} editField={editField} + removeField={removeField} /> diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx index 3094b6463fe15..8ae62e4d843c2 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -73,6 +73,7 @@ export interface FieldItemProps { groupIndex: number; dropOntoWorkspace: DatasourceDataPanelProps['dropOntoWorkspace']; editField?: (name: string) => void; + removeField?: (name: string) => void; hasSuggestionForField: DatasourceDataPanelProps['hasSuggestionForField']; } @@ -107,6 +108,7 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { groupIndex, dropOntoWorkspace, editField, + removeField, } = props; const [infoIsOpen, setOpen] = useState(false); @@ -122,6 +124,17 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { [editField, setOpen] ); + const closeAndRemove = useMemo( + () => + removeField + ? (name: string) => { + removeField(name); + setOpen(false); + } + : undefined, + [removeField, setOpen] + ); + const dropOntoWorkspaceAndClose = useCallback( (droppedField: DragDropIdentifier) => { dropOntoWorkspace(droppedField); @@ -270,6 +283,7 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { {...state} {...props} editField={closeAndEdit} + removeField={closeAndRemove} dropOntoWorkspace={dropOntoWorkspaceAndClose} /> @@ -285,12 +299,14 @@ function FieldPanelHeader({ hasSuggestionForField, dropOntoWorkspace, editField, + removeField, }: { field: IndexPatternField; indexPatternId: string; hasSuggestionForField: DatasourceDataPanelProps['hasSuggestionForField']; dropOntoWorkspace: DatasourceDataPanelProps['dropOntoWorkspace']; editField?: (name: string) => void; + removeField?: (name: string) => void; }) { const draggableField = { indexPatternId, @@ -302,7 +318,7 @@ function FieldPanelHeader({ }; return ( - +
{field.displayName}
@@ -315,20 +331,41 @@ function FieldPanelHeader({ field={draggableField} /> {editField && ( - - editField(field.name)} - iconType="pencil" - data-test-subj="lnsFieldListPanelEdit" - aria-label={i18n.translate('xpack.lens.indexPattern.editFieldLabel', { + + - + > + editField(field.name)} + iconType="pencil" + data-test-subj="lnsFieldListPanelEdit" + aria-label={i18n.translate('xpack.lens.indexPattern.editFieldLabel', { + defaultMessage: 'Edit index pattern field', + })} + /> + +
+ )} + {removeField && field.runtime && ( + + + removeField(field.name)} + iconType="trash" + data-test-subj="lnsFieldListPanelRemove" + color="danger" + aria-label={i18n.translate('xpack.lens.indexPattern.removeFieldLabel', { + defaultMessage: 'Remove index pattern field', + })} + /> + + )}
); @@ -347,6 +384,7 @@ function FieldItemPopoverContents(props: State & FieldItemProps) { data: { fieldFormats }, dropOntoWorkspace, editField, + removeField, hasSuggestionForField, hideDetails, } = props; @@ -379,6 +417,7 @@ function FieldItemPopoverContents(props: State & FieldItemProps) { dropOntoWorkspace={dropOntoWorkspace} hasSuggestionForField={hasSuggestionForField} editField={editField} + removeField={removeField} /> ); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx index 01ba0726d9e4d..ceeb1f5b1caf3 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_list.tsx @@ -53,6 +53,7 @@ export const FieldList = React.memo(function FieldList({ dropOntoWorkspace, hasSuggestionForField, editField, + removeField, }: { exists: (field: IndexPatternField) => boolean; fieldGroups: FieldGroups; @@ -68,6 +69,7 @@ export const FieldList = React.memo(function FieldList({ dropOntoWorkspace: DatasourceDataPanelProps['dropOntoWorkspace']; hasSuggestionForField: DatasourceDataPanelProps['hasSuggestionForField']; editField?: (name: string) => void; + removeField?: (name: string) => void; }) { const [pageSize, setPageSize] = useState(PAGINATION_SIZE); const [scrollContainer, setScrollContainer] = useState(undefined); @@ -144,6 +146,7 @@ export const FieldList = React.memo(function FieldList({ exists={exists(field)} field={field} editField={editField} + removeField={removeField} hideDetails={true} key={field.name} itemIndex={index} @@ -169,6 +172,7 @@ export const FieldList = React.memo(function FieldList({ helpTooltip={fieldGroup.helpText} exists={exists} editField={editField} + removeField={removeField} hideDetails={fieldGroup.hideDetails} hasLoaded={!!hasSyncedExistingFields} fieldsCount={fieldGroup.fields.length} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/fields_accordion.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/fields_accordion.tsx index 74ea13a81539f..a00f25b04651b 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/fields_accordion.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/fields_accordion.tsx @@ -55,6 +55,7 @@ export interface FieldsAccordionProps { dropOntoWorkspace: DatasourceDataPanelProps['dropOntoWorkspace']; hasSuggestionForField: DatasourceDataPanelProps['hasSuggestionForField']; editField?: (name: string) => void; + removeField?: (name: string) => void; } export const FieldsAccordion = memo(function InnerFieldsAccordion({ @@ -76,6 +77,7 @@ export const FieldsAccordion = memo(function InnerFieldsAccordion({ dropOntoWorkspace, hasSuggestionForField, editField, + removeField, }: FieldsAccordionProps) { const renderField = useCallback( (field: IndexPatternField, index) => ( @@ -90,6 +92,7 @@ export const FieldsAccordion = memo(function InnerFieldsAccordion({ dropOntoWorkspace={dropOntoWorkspace} hasSuggestionForField={hasSuggestionForField} editField={editField} + removeField={removeField} /> ), [ @@ -100,6 +103,7 @@ export const FieldsAccordion = memo(function InnerFieldsAccordion({ hasSuggestionForField, groupIndex, editField, + removeField, ] ); diff --git a/x-pack/plugins/lens/server/usage/schema.ts b/x-pack/plugins/lens/server/usage/schema.ts index 158e62ee8cfd8..5c15855aca48a 100644 --- a/x-pack/plugins/lens/server/usage/schema.ts +++ b/x-pack/plugins/lens/server/usage/schema.ts @@ -34,6 +34,44 @@ const eventsSchema: MakeSchemaFrom = { xy_change_layer_display: { type: 'long' }, xy_layer_removed: { type: 'long' }, xy_layer_added: { type: 'long' }, + open_field_editor_edit: { + type: 'long', + _meta: { + description: + 'Number of times the user opened the editor flyout to edit a field from within Lens.', + }, + }, + open_field_editor_add: { + type: 'long', + _meta: { + description: + 'Number of times the user opened the editor flyout to add a field from within Lens.', + }, + }, + save_field_edit: { + type: 'long', + _meta: { + description: 'Number of times the user edited a field from within Lens.', + }, + }, + save_field_add: { + type: 'long', + _meta: { + description: 'Number of times the user added a field from within Lens.', + }, + }, + open_field_delete_modal: { + type: 'long', + _meta: { + description: 'Number of times the user opened the field delete modal from within Lens.', + }, + }, + delete_field: { + type: 'long', + _meta: { + description: 'Number of times the user deleted a field from within Lens.', + }, + }, indexpattern_dimension_operation_terms: { type: 'long', _meta: { diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index ed8e44072b914..6bb152433f2fb 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -2033,6 +2033,42 @@ "indexpattern_dimension_operation_moving_average": { "type": "long", "_meta": { "description": "Number of times the moving average function was selected" } + }, + "open_field_editor_edit": { + "type": "long", + "_meta": { + "description": "Number of times the user opened the editor flyout to edit a field from within Lens." + } + }, + "open_field_editor_add": { + "type": "long", + "_meta": { + "description": "Number of times the user opened the editor flyout to add a field from within Lens." + } + }, + "save_field_edit": { + "type": "long", + "_meta": { + "description": "Number of times the user edited a field from within Lens." + } + }, + "save_field_add": { + "type": "long", + "_meta": { + "description": "Number of times the user added a field from within Lens." + } + }, + "open_field_delete_modal": { + "type": "long", + "_meta": { + "description": "Number of times the user opened the field delete modal from within Lens." + } + }, + "delete_field": { + "type": "long", + "_meta": { + "description": "Number of times the user deleted a field from within Lens." + } } } }, @@ -2198,6 +2234,42 @@ "indexpattern_dimension_operation_moving_average": { "type": "long", "_meta": { "description": "Number of times the moving average function was selected" } + }, + "open_field_editor_edit": { + "type": "long", + "_meta": { + "description": "Number of times the user opened the editor flyout to edit a field from within Lens." + } + }, + "open_field_editor_add": { + "type": "long", + "_meta": { + "description": "Number of times the user opened the editor flyout to add a field from within Lens." + } + }, + "save_field_edit": { + "type": "long", + "_meta": { + "description": "Number of times the user edited a field from within Lens." + } + }, + "save_field_add": { + "type": "long", + "_meta": { + "description": "Number of times the user added a field from within Lens." + } + }, + "open_field_delete_modal": { + "type": "long", + "_meta": { + "description": "Number of times the user opened the field delete modal from within Lens." + } + }, + "delete_field": { + "type": "long", + "_meta": { + "description": "Number of times the user deleted a field from within Lens." + } } } }, diff --git a/x-pack/test/functional/apps/lens/runtime_fields.ts b/x-pack/test/functional/apps/lens/runtime_fields.ts index 9b8ef3a8b6905..53fe9eab0e654 100644 --- a/x-pack/test/functional/apps/lens/runtime_fields.ts +++ b/x-pack/test/functional/apps/lens/runtime_fields.ts @@ -62,5 +62,11 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); expect(await PageObjects.lens.getDatatableCellText(0, 0)).to.eql('abc'); }); + + it('should able to remove field', async () => { + await PageObjects.lens.clickField('runtimefield2'); + await PageObjects.lens.removeField(); + await PageObjects.lens.waitForFieldMissing('runtimefield2'); + }); }); } diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 3858b5834d483..3c2f7f1268331 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -188,6 +188,15 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont }); }, + async removeField() { + await retry.try(async () => { + await testSubjects.click('lnsFieldListPanelRemove'); + await testSubjects.missingOrFail('lnsFieldListPanelRemove'); + await testSubjects.click('confirmModalConfirmButton'); + await testSubjects.missingOrFail('confirmModalConfirmButton'); + }); + }, + async searchField(name: string) { await testSubjects.setValue('lnsIndexPatternFieldSearch', name); }, @@ -198,6 +207,12 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont }); }, + async waitForFieldMissing(field: string) { + await retry.try(async () => { + await testSubjects.missingOrFail(`lnsFieldListPanelField-${field}`); + }); + }, + /** * Copies field to chosen destination that is defined by distance of `steps` * (right arrow presses) from it From cb61b4a8fd07069396c9697a1d0d386dcf65e75f Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Wed, 24 Mar 2021 12:09:19 +0100 Subject: [PATCH 20/35] [Discover] Move doc viewer table row actions to left (#95064) * Move doc viewer table actions to left * Improve SCSS --- .../components/doc_viewer/doc_viewer.scss | 6 +-- .../components/table/table_row.tsx | 40 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss b/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss index 95a50b54b5364..f5a4180207c33 100644 --- a/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss +++ b/src/plugins/discover/public/application/components/doc_viewer/doc_viewer.scss @@ -1,5 +1,5 @@ .kbnDocViewerTable { - @include euiBreakpoint('xs', 's') { + @include euiBreakpoint('xs', 's','m') { table-layout: fixed; } } @@ -52,7 +52,7 @@ white-space: nowrap; } .kbnDocViewer__buttons { - width: 96px; + width: 108px; // Show all icons if one is focused, &:focus-within { @@ -64,7 +64,7 @@ .kbnDocViewer__field { width: $euiSize * 10; - @include euiBreakpoint('xs', 's') { + @include euiBreakpoint('xs', 's', 'm') { width: $euiSize * 6; } } diff --git a/src/plugins/discover/public/application/components/table/table_row.tsx b/src/plugins/discover/public/application/components/table/table_row.tsx index 731dbeed85cc8..5c6ae49770bc7 100644 --- a/src/plugins/discover/public/application/components/table/table_row.tsx +++ b/src/plugins/discover/public/application/components/table/table_row.tsx @@ -54,6 +54,26 @@ export function DocViewTableRow({ const key = field ? field : fieldMapping?.displayName; return ( + {typeof onFilter === 'function' && ( + + onFilter(fieldMapping, valueRaw, '+')} + /> + onFilter(fieldMapping, valueRaw, '-')} + /> + {typeof onToggleColumn === 'function' && ( + + )} + onFilter('_exists_', field, '+')} + scripted={fieldMapping && fieldMapping.scripted} + /> + + )} {field ? ( - {typeof onFilter === 'function' && ( - - onFilter(fieldMapping, valueRaw, '+')} - /> - onFilter(fieldMapping, valueRaw, '-')} - /> - {typeof onToggleColumn === 'function' && ( - - )} - onFilter('_exists_', field, '+')} - scripted={fieldMapping && fieldMapping.scripted} - /> - - )} ); } From e6f477021334e468770c3a3876041e448543d1a9 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 24 Mar 2021 13:24:31 +0100 Subject: [PATCH 21/35] [Lens] Add telemetry for popovers (#94903) --- .../public/indexpattern_datasource/help_popover.tsx | 8 +++++++- .../definitions/calculations/moving_average.tsx | 6 +++++- .../operations/definitions/date_histogram.tsx | 6 +++++- .../operations/definitions/ranges/range_editor.tsx | 6 +++++- x-pack/plugins/lens/server/usage/schema.ts | 4 ++++ .../schema/xpack_plugins.json | 12 ++++++++++++ 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/help_popover.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/help_popover.tsx index ca126ff4e40bf..0e4c1897743b4 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/help_popover.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/help_popover.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { ReactNode } from 'react'; +import React, { ReactNode, useEffect } from 'react'; import { EuiIcon, EuiLink, @@ -15,6 +15,7 @@ import { EuiPopoverTitle, EuiText, } from '@elastic/eui'; +import { trackUiEvent } from '../lens_ui_telemetry'; import './help_popover.scss'; export const HelpPopoverButton = ({ @@ -50,6 +51,11 @@ export const HelpPopover = ({ isOpen: EuiPopoverProps['isOpen']; title?: string; }) => { + useEffect(() => { + if (isOpen) { + trackUiEvent('open_help_popover'); + } + }, [isOpen]); return ( { setIsPopoverOpen(!isPopoverOpen)}> + { + setIsPopoverOpen(!isPopoverOpen); + }} + > {i18n.translate('xpack.lens.indexPattern.movingAverage.helpText', { defaultMessage: 'How it works', })} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx index 8d40ed9b7f066..bd7a270fd7ad8 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/date_histogram.tsx @@ -355,7 +355,11 @@ const AutoDateHistogramPopover = ({ data }: { data: DataPublicPluginStart }) => setIsPopoverOpen(!isPopoverOpen)}> + { + setIsPopoverOpen(!isPopoverOpen); + }} + > {i18n.translate('xpack.lens.indexPattern.dateHistogram.autoHelpText', { defaultMessage: 'How it works', })} diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx index 269c59822fefc..4851b6ff3ec97 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/ranges/range_editor.tsx @@ -33,7 +33,11 @@ const GranularityHelpPopover = () => { setIsPopoverOpen(!isPopoverOpen)}> + { + setIsPopoverOpen(!isPopoverOpen); + }} + > {i18n.translate('xpack.lens.indexPattern.ranges.granularityHelpText', { defaultMessage: 'How it works', })} diff --git a/x-pack/plugins/lens/server/usage/schema.ts b/x-pack/plugins/lens/server/usage/schema.ts index 5c15855aca48a..ab3945a0162a6 100644 --- a/x-pack/plugins/lens/server/usage/schema.ts +++ b/x-pack/plugins/lens/server/usage/schema.ts @@ -10,6 +10,10 @@ import { LensUsage } from './types'; const eventsSchema: MakeSchemaFrom = { app_query_change: { type: 'long' }, + open_help_popover: { + type: 'long', + _meta: { description: 'Number of times the user opened one of the in-product help popovers.' }, + }, indexpattern_field_info_click: { type: 'long' }, loaded: { type: 'long' }, app_filters_updated: { type: 'long' }, diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 6bb152433f2fb..36488fceb2a1d 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -1876,6 +1876,12 @@ "app_query_change": { "type": "long" }, + "open_help_popover": { + "type": "long", + "_meta": { + "description": "Number of times the user opened one of the in-product help popovers." + } + }, "indexpattern_field_info_click": { "type": "long" }, @@ -2077,6 +2083,12 @@ "app_query_change": { "type": "long" }, + "open_help_popover": { + "type": "long", + "_meta": { + "description": "Number of times the user opened one of the in-product help popovers." + } + }, "indexpattern_field_info_click": { "type": "long" }, From ad1004519afb7b2f236b1eb393bacd9f68207d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ester=20Mart=C3=AD=20Vilaseca?= Date: Wed, 24 Mar 2021 13:45:56 +0100 Subject: [PATCH 22/35] [Metrics UI] Fix preview charts for inventory alerts when using a filter (#94561) * Pass filterQuery instead of filterQueryText to invertory alerts preview chart * Add test to verify that filterQuery is sent to the expression chart * Improve test description Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../inventory/components/expression.test.tsx | 40 ++++++++++++++++++- .../inventory/components/expression.tsx | 3 +- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.test.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.test.tsx index 891e98606264e..88d72300c2d6d 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.test.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.test.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { mountWithIntl, nextTick } from '@kbn/test/jest'; +import { mountWithIntl, shallowWithIntl, nextTick } from '@kbn/test/jest'; // We are using this inside a `jest.mock` call. Jest requires dynamic dependencies to be prefixed with `mock` import { coreMock as mockCoreMock } from 'src/core/public/mocks'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths @@ -89,6 +89,44 @@ describe('Expression', () => { }, ]); }); + + it('should pass the elasticsearch query to the expression chart', async () => { + const FILTER_QUERY = + '{"bool":{"should":[{"match_phrase":{"host.name":"testHostName"}}],"minimum_should_match":1}}'; + + const alertParams = { + criteria: [ + { + metric: 'cpu', + timeSize: 1, + timeUnit: 'm', + threshold: [10], + comparator: Comparator.GT, + }, + ], + nodeType: undefined, + filterQueryText: 'host.name: "testHostName"', + filterQuery: FILTER_QUERY, + }; + + const wrapper = shallowWithIntl( + Reflect.set(alertParams, key, value)} + setAlertProperty={() => {}} + metadata={{}} + /> + ); + + const chart = wrapper.find('[data-test-subj="preview-chart"]'); + + expect(chart.prop('filterQuery')).toBe(FILTER_QUERY); + }); + describe('using custom metrics', () => { it('should prefill the alert using the context metadata', async () => { const currentOptions = { diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index 9ce7162933f2d..b28c76d1cb374 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -319,9 +319,10 @@ export const Expressions: React.FC = (props) => { > ); From 326abc2a9472df5712497affa62d157b46946b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ester=20Mart=C3=AD=20Vilaseca?= Date: Wed, 24 Mar 2021 13:51:20 +0100 Subject: [PATCH 23/35] Add filters to query total groupings (#94792) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../lib/query_total_grouping.test.ts | 127 ++++++++++++++++++ .../lib/query_total_groupings.ts | 30 +++-- 2 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_grouping.test.ts diff --git a/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_grouping.test.ts b/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_grouping.test.ts new file mode 100644 index 0000000000000..cc5631ffcec9c --- /dev/null +++ b/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_grouping.test.ts @@ -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 { queryTotalGroupings } from './query_total_groupings'; + +describe('queryTotalGroupings', () => { + const ESSearchClientMock = jest.fn().mockReturnValue({}); + const defaultOptions = { + timerange: { + from: 1615972672011, + interval: '>=10s', + to: 1615976272012, + field: '@timestamp', + }, + indexPattern: 'testIndexPattern', + metrics: [], + dropLastBucket: true, + groupBy: ['testField'], + }; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return 0 when there is no groupBy', async () => { + const { groupBy, ...options } = defaultOptions; + + const response = await queryTotalGroupings(ESSearchClientMock, options); + expect(response).toBe(0); + }); + + it('should return 0 when there is groupBy is empty', async () => { + const options = { + ...defaultOptions, + groupBy: [], + }; + + const response = await queryTotalGroupings(ESSearchClientMock, options); + expect(response).toBe(0); + }); + + it('should query ES with a timerange', async () => { + await queryTotalGroupings(ESSearchClientMock, defaultOptions); + + expect(ESSearchClientMock.mock.calls[0][0].body.query.bool.filter).toContainEqual({ + range: { + '@timestamp': { + gte: 1615972672011, + lte: 1615976272012, + format: 'epoch_millis', + }, + }, + }); + }); + + it('should query ES with a exist fields', async () => { + const options = { + ...defaultOptions, + groupBy: ['testField1', 'testField2'], + }; + + await queryTotalGroupings(ESSearchClientMock, options); + + expect(ESSearchClientMock.mock.calls[0][0].body.query.bool.filter).toContainEqual({ + exists: { field: 'testField1' }, + }); + + expect(ESSearchClientMock.mock.calls[0][0].body.query.bool.filter).toContainEqual({ + exists: { field: 'testField2' }, + }); + }); + + it('should query ES with a query filter', async () => { + const options = { + ...defaultOptions, + filters: [ + { + bool: { + should: [{ match_phrase: { field1: 'value1' } }], + minimum_should_match: 1, + }, + }, + ], + }; + + await queryTotalGroupings(ESSearchClientMock, options); + + expect(ESSearchClientMock.mock.calls[0][0].body.query.bool.filter).toContainEqual({ + bool: { + should: [ + { + match_phrase: { + field1: 'value1', + }, + }, + ], + minimum_should_match: 1, + }, + }); + }); + + it('should return 0 when there are no aggregations in the response', async () => { + const clientMock = jest.fn().mockReturnValue({}); + + const response = await queryTotalGroupings(clientMock, defaultOptions); + + expect(response).toBe(0); + }); + + it('should return the value of the aggregation in the response', async () => { + const clientMock = jest.fn().mockReturnValue({ + aggregations: { + count: { + value: 10, + }, + }, + }); + + const response = await queryTotalGroupings(clientMock, defaultOptions); + + expect(response).toBe(10); + }); +}); diff --git a/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_groupings.ts b/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_groupings.ts index 92aa39d3bf820..b871fa21c111d 100644 --- a/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_groupings.ts +++ b/x-pack/plugins/infra/server/routes/metrics_explorer/lib/query_total_groupings.ts @@ -23,6 +23,23 @@ export const queryTotalGroupings = async ( return Promise.resolve(0); } + let filters: Array> = [ + { + range: { + [options.timerange.field]: { + gte: options.timerange.from, + lte: options.timerange.to, + format: 'epoch_millis', + }, + }, + }, + ...options.groupBy.map((field) => ({ exists: { field } })), + ]; + + if (options.filters) { + filters = [...filters, ...options.filters]; + } + const params = { allowNoIndices: true, ignoreUnavailable: true, @@ -31,18 +48,7 @@ export const queryTotalGroupings = async ( size: 0, query: { bool: { - filter: [ - { - range: { - [options.timerange.field]: { - gte: options.timerange.from, - lte: options.timerange.to, - format: 'epoch_millis', - }, - }, - }, - ...options.groupBy.map((field) => ({ exists: { field } })), - ], + filter: filters, }, }, aggs: { From 6295ae71b5d3a2810767968780be7c7eaccc60d7 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 24 Mar 2021 14:04:19 +0100 Subject: [PATCH 24/35] [Lens] Cache avilable operations meta data (#95034) --- .../dimension_panel/operation_support.ts | 4 ++-- .../plugins/lens/public/indexpattern_datasource/loader.ts | 6 ++++++ .../indexpattern_datasource/operations/__mocks__/index.ts | 1 + .../public/indexpattern_datasource/operations/operations.ts | 4 +++- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/operation_support.ts b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/operation_support.ts index d462d73740aaa..801b1b17a1831 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/operation_support.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/operation_support.ts @@ -8,7 +8,7 @@ import _ from 'lodash'; import { DatasourceDimensionDropProps } from '../../types'; import { OperationType } from '../indexpattern'; -import { getAvailableOperationsByMetadata } from '../operations'; +import { memoizedGetAvailableOperationsByMetadata } from '../operations'; import { IndexPatternPrivateState } from '../types'; export interface OperationSupportMatrix { @@ -30,7 +30,7 @@ export const getOperationSupportMatrix = (props: Props): OperationSupportMatrix const layerId = props.layerId; const currentIndexPattern = props.state.indexPatterns[props.state.layers[layerId].indexPatternId]; - const filteredOperationsByMetadata = getAvailableOperationsByMetadata( + const filteredOperationsByMetadata = memoizedGetAvailableOperationsByMetadata( currentIndexPattern ).filter((operation) => props.filterOperations(operation.operationMetaData)); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts index 7a50b1e60d13f..7052a69ee6fb7 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/loader.ts @@ -29,6 +29,7 @@ import { VisualizeFieldContext } from '../../../../../src/plugins/ui_actions/pub import { documentField } from './document_field'; import { readFromStorage, writeToStorage } from '../settings_storage'; import { getFieldByNameFactory } from './pure_helpers'; +import { memoizedGetAvailableOperationsByMetadata } from './operations'; type SetState = StateSetter; type IndexPatternsService = Pick; @@ -49,6 +50,11 @@ export async function loadIndexPatterns({ return cache; } + if (memoizedGetAvailableOperationsByMetadata.cache.clear) { + // clear operations meta data cache because index pattern reference may change + memoizedGetAvailableOperationsByMetadata.cache.clear(); + } + const allIndexPatterns = await Promise.allSettled( missingIds.map((id) => indexPatternsService.get(id)) ); diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts index dfb86ec16da30..6ac208913af2e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/__mocks__/index.ts @@ -19,6 +19,7 @@ jest.spyOn(actualHelpers, 'getErrorMessages'); export const { getAvailableOperationsByMetadata, + memoizedGetAvailableOperationsByMetadata, getOperations, getOperationDisplay, getOperationTypesForField, diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.ts index 63671fe35e99e..140ebc813f6c1 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/operations.ts @@ -5,7 +5,7 @@ * 2.0. */ -import _ from 'lodash'; +import { memoize } from 'lodash'; import { OperationMetadata } from '../../types'; import { operationDefinitionMap, @@ -187,3 +187,5 @@ export function getAvailableOperationsByMetadata(indexPattern: IndexPattern) { return Object.values(operationByMetadata); } + +export const memoizedGetAvailableOperationsByMetadata = memoize(getAvailableOperationsByMetadata); From edfdb7895773120d6ffb2b8670f85e10f6955a8c Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Wed, 24 Mar 2021 14:05:08 +0100 Subject: [PATCH 25/35] [Console] Clean up use of `any` (#95065) * cleaned up autocomplete.ts and get_endpoint_from_postition.ts of anys * general clean up of lowering hanging fruit * cleaned up remaining anys, still need to test * fix remaining TS compilation issues * also tidy up use of "as any" and some more ": any" * addressed type issues and introduced the default editor settings object * clean up @ts-ignore * added comments to interface Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../application/components/console_menu.tsx | 5 +- .../application/components/settings_modal.tsx | 4 +- .../console_history/console_history.tsx | 2 +- .../console_history/history_viewer.tsx | 2 +- .../console_editor/apply_editor_settings.ts | 2 +- .../legacy/console_editor/editor.test.tsx | 4 +- .../editor/legacy/console_editor/editor.tsx | 2 +- .../editor/legacy/console_menu_actions.ts | 2 +- .../application/containers/settings.tsx | 22 ++- .../editor_context/editor_context.tsx | 8 +- .../application/contexts/request_context.tsx | 4 +- .../contexts/services_context.mock.ts | 5 +- .../application/contexts/services_context.tsx | 8 +- .../restore_request_from_history.ts | 8 +- .../use_restore_request_from_history.ts | 3 +- .../send_request_to_es.ts | 17 +- .../use_send_current_request_to_es/track.ts | 6 +- .../use_send_current_request_to_es.test.tsx | 4 +- .../application/hooks/use_set_input_editor.ts | 3 +- .../console/public/application/index.tsx | 4 +- .../legacy_core_editor/create_readonly.ts | 8 +- .../legacy_core_editor.test.mocks.ts | 2 +- .../legacy_core_editor/legacy_core_editor.ts | 47 +++--- .../models/legacy_core_editor/smart_resize.ts | 3 +- .../application/models/sense_editor/curl.ts | 4 +- .../models/sense_editor/sense_editor.ts | 27 +-- .../public/application/stores/editor.ts | 9 +- .../lib/ace_token_provider/token_provider.ts | 4 +- .../public/lib/autocomplete/autocomplete.ts | 154 +++++++++++------- .../components/full_request_component.ts | 2 +- .../get_endpoint_from_position.ts | 3 +- .../console/public/lib/autocomplete/types.ts | 61 +++++++ src/plugins/console/public/lib/es/es.ts | 8 +- src/plugins/console/public/lib/row_parser.ts | 2 +- .../lib/token_iterator/token_iterator.test.ts | 2 +- src/plugins/console/public/lib/utils/index.ts | 4 +- .../console/public/services/history.ts | 6 +- src/plugins/console/public/services/index.ts | 2 +- .../console/public/services/settings.ts | 32 ++-- .../console/public/services/storage.ts | 6 +- src/plugins/console/public/types/common.ts | 6 + .../console/public/types/core_editor.ts | 10 +- .../server/lib/elasticsearch_proxy_config.ts | 4 +- .../console/server/lib/proxy_config.ts | 19 ++- .../server/lib/proxy_config_collection.ts | 10 +- .../console/server/lib/proxy_request.test.ts | 2 +- .../console/server/lib/proxy_request.ts | 6 +- .../routes/api/console/proxy/body.test.ts | 10 +- .../api/console/proxy/create_handler.ts | 8 +- .../api/console/proxy/query_string.test.ts | 3 +- .../server/routes/api/console/proxy/stubs.ts | 8 +- .../services/spec_definitions_service.ts | 34 +++- 52 files changed, 402 insertions(+), 219 deletions(-) create mode 100644 src/plugins/console/public/lib/autocomplete/types.ts diff --git a/src/plugins/console/public/application/components/console_menu.tsx b/src/plugins/console/public/application/components/console_menu.tsx index 40e3ce9c44e26..6c5eb8646c58d 100644 --- a/src/plugins/console/public/application/components/console_menu.tsx +++ b/src/plugins/console/public/application/components/console_menu.tsx @@ -16,7 +16,7 @@ import { i18n } from '@kbn/i18n'; interface Props { getCurl: () => Promise; getDocumentation: () => Promise; - autoIndent: (ev?: React.MouseEvent) => void; + autoIndent: (ev: React.MouseEvent) => void; addNotification?: (opts: { title: string }) => void; } @@ -84,8 +84,7 @@ export class ConsoleMenu extends Component { window.open(documentation, '_blank'); }; - // Using `any` here per this issue: https://github.com/elastic/eui/issues/2265 - autoIndent: any = (event: React.MouseEvent) => { + autoIndent = (event: React.MouseEvent) => { this.closePopover(); this.props.autoIndent(event); }; diff --git a/src/plugins/console/public/application/components/settings_modal.tsx b/src/plugins/console/public/application/components/settings_modal.tsx index 161b67500b47c..033bce42177be 100644 --- a/src/plugins/console/public/application/components/settings_modal.tsx +++ b/src/plugins/console/public/application/components/settings_modal.tsx @@ -32,7 +32,7 @@ export type AutocompleteOptions = 'fields' | 'indices' | 'templates'; interface Props { onSaveSettings: (newSettings: DevToolsSettings) => void; onClose: () => void; - refreshAutocompleteSettings: (selectedSettings: any) => void; + refreshAutocompleteSettings: (selectedSettings: DevToolsSettings['autocomplete']) => void; settings: DevToolsSettings; } @@ -233,7 +233,7 @@ export function DevToolsSettingsModal(props: Props) { return rest; })} idToSelectedMap={checkboxIdToSelectedMap} - onChange={(e: any) => { + onChange={(e: unknown) => { onAutocompleteChange(e as AutocompleteOptions); }} /> diff --git a/src/plugins/console/public/application/containers/console_history/console_history.tsx b/src/plugins/console/public/application/containers/console_history/console_history.tsx index 4d5c08705e0d5..7fbef6de80eef 100644 --- a/src/plugins/console/public/application/containers/console_history/console_history.tsx +++ b/src/plugins/console/public/application/containers/console_history/console_history.tsx @@ -53,7 +53,7 @@ export function ConsoleHistory({ close }: Props) { const selectedReq = useRef(null); const describeReq = useMemo(() => { - const _describeReq = (req: any) => { + const _describeReq = (req: { endpoint: string; time: string }) => { const endpoint = req.endpoint; const date = moment(req.time); diff --git a/src/plugins/console/public/application/containers/console_history/history_viewer.tsx b/src/plugins/console/public/application/containers/console_history/history_viewer.tsx index 00a7cf8afa2c0..605f9a254f228 100644 --- a/src/plugins/console/public/application/containers/console_history/history_viewer.tsx +++ b/src/plugins/console/public/application/containers/console_history/history_viewer.tsx @@ -20,7 +20,7 @@ import { applyCurrentSettings } from '../editor/legacy/console_editor/apply_edit interface Props { settings: DevToolsSettings; - req: any | null; + req: { method: string; endpoint: string; data: string; time: string } | null; } export function HistoryViewer({ settings, req }: Props) { diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/apply_editor_settings.ts b/src/plugins/console/public/application/containers/editor/legacy/console_editor/apply_editor_settings.ts index 678ea1c387096..f84999b294742 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/apply_editor_settings.ts +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/apply_editor_settings.ts @@ -14,7 +14,7 @@ export function applyCurrentSettings( editor: CoreEditor | CustomAceEditor, settings: DevToolsSettings ) { - if ((editor as any).setStyles) { + if ((editor as { setStyles?: Function }).setStyles) { (editor as CoreEditor).setStyles({ wrapLines: settings.wrapMode, fontSize: settings.fontSize + 'px', diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx index c4da04dfbf5a6..1732dd9572b90 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx @@ -27,7 +27,7 @@ import { // Mocked functions import { sendRequestToES } from '../../../../hooks/use_send_current_request_to_es/send_request_to_es'; import { getEndpointFromPosition } from '../../../../../lib/autocomplete/get_endpoint_from_position'; - +import type { DevToolsSettings } from '../../../../../services'; import * as consoleMenuActions from '../console_menu_actions'; import { Editor } from './editor'; @@ -40,7 +40,7 @@ describe('Legacy (Ace) Console Editor Component Smoke Test', () => { - + diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx index 8b965480d077b..541ad8b0563a4 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx @@ -229,7 +229,7 @@ function EditorUI({ initialTextValue }: EditorProps) { getDocumentation={() => { return getDocumentation(editorInstanceRef.current!, docLinkVersion); }} - autoIndent={(event: any) => { + autoIndent={(event) => { autoIndent(editorInstanceRef.current!, event); }} addNotification={({ title }) => notifications.toasts.add({ title })} diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_menu_actions.ts b/src/plugins/console/public/application/containers/editor/legacy/console_menu_actions.ts index 7aa3e96464800..f1bacd62289fb 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_menu_actions.ts +++ b/src/plugins/console/public/application/containers/editor/legacy/console_menu_actions.ts @@ -9,7 +9,7 @@ import { getEndpointFromPosition } from '../../../../lib/autocomplete/get_endpoint_from_position'; import { SenseEditor } from '../../../models/sense_editor'; -export async function autoIndent(editor: SenseEditor, event: Event) { +export async function autoIndent(editor: SenseEditor, event: React.MouseEvent) { event.preventDefault(); await editor.autoIndent(); editor.getCoreEditor().getContainer().focus(); diff --git a/src/plugins/console/public/application/containers/settings.tsx b/src/plugins/console/public/application/containers/settings.tsx index 7028a479635f4..1282a0b389902 100644 --- a/src/plugins/console/public/application/containers/settings.tsx +++ b/src/plugins/console/public/application/containers/settings.tsx @@ -15,14 +15,20 @@ import { retrieveAutoCompleteInfo } from '../../lib/mappings/mappings'; import { useServicesContext, useEditorActionContext } from '../contexts'; import { DevToolsSettings, Settings as SettingsService } from '../../services'; -const getAutocompleteDiff = (newSettings: DevToolsSettings, prevSettings: DevToolsSettings) => { +const getAutocompleteDiff = ( + newSettings: DevToolsSettings, + prevSettings: DevToolsSettings +): AutocompleteOptions[] => { return Object.keys(newSettings.autocomplete).filter((key) => { // @ts-ignore return prevSettings.autocomplete[key] !== newSettings.autocomplete[key]; - }); + }) as AutocompleteOptions[]; }; -const refreshAutocompleteSettings = (settings: SettingsService, selectedSettings: any) => { +const refreshAutocompleteSettings = ( + settings: SettingsService, + selectedSettings: DevToolsSettings['autocomplete'] +) => { retrieveAutoCompleteInfo(settings, selectedSettings); }; @@ -44,12 +50,12 @@ const fetchAutocompleteSettingsIfNeeded = ( if (isSettingsChanged) { // If the user has changed one of the autocomplete settings, then we'll fetch just the // ones which have changed. - const changedSettings: any = autocompleteDiff.reduce( - (changedSettingsAccum: any, setting: string): any => { - changedSettingsAccum[setting] = newSettings.autocomplete[setting as AutocompleteOptions]; + const changedSettings: DevToolsSettings['autocomplete'] = autocompleteDiff.reduce( + (changedSettingsAccum, setting) => { + changedSettingsAccum[setting] = newSettings.autocomplete[setting]; return changedSettingsAccum; }, - {} + {} as DevToolsSettings['autocomplete'] ); retrieveAutoCompleteInfo(settings, changedSettings); } else if (isPollingChanged && newSettings.polling) { @@ -89,7 +95,7 @@ export function Settings({ onClose }: Props) { + refreshAutocompleteSettings={(selectedSettings) => refreshAutocompleteSettings(settings, selectedSettings) } settings={settings.toJSON()} diff --git a/src/plugins/console/public/application/contexts/editor_context/editor_context.tsx b/src/plugins/console/public/application/contexts/editor_context/editor_context.tsx index 32e5216a85d7e..d4f809b5fbfb3 100644 --- a/src/plugins/console/public/application/contexts/editor_context/editor_context.tsx +++ b/src/plugins/console/public/application/contexts/editor_context/editor_context.tsx @@ -11,11 +11,11 @@ import * as editor from '../../stores/editor'; import { DevToolsSettings } from '../../../services'; import { createUseContext } from '../create_use_context'; -const EditorReadContext = createContext(null as any); -const EditorActionContext = createContext>(null as any); +const EditorReadContext = createContext(editor.initialValue); +const EditorActionContext = createContext>(() => {}); export interface EditorContextArgs { - children: any; + children: JSX.Element; settings: DevToolsSettings; } @@ -25,7 +25,7 @@ export function EditorContextProvider({ children, settings }: EditorContextArgs) settings, })); return ( - + {children} ); diff --git a/src/plugins/console/public/application/contexts/request_context.tsx b/src/plugins/console/public/application/contexts/request_context.tsx index 38ac5c7163add..96ba1f69212b4 100644 --- a/src/plugins/console/public/application/contexts/request_context.tsx +++ b/src/plugins/console/public/application/contexts/request_context.tsx @@ -10,8 +10,8 @@ import React, { createContext, useReducer, Dispatch } from 'react'; import { createUseContext } from './create_use_context'; import * as store from '../stores/request'; -const RequestReadContext = createContext(null as any); -const RequestActionContext = createContext>(null as any); +const RequestReadContext = createContext(store.initialValue); +const RequestActionContext = createContext>(() => {}); export function RequestContextProvider({ children }: { children: React.ReactNode }) { const [state, dispatch] = useReducer(store.reducer, store.initialValue); diff --git a/src/plugins/console/public/application/contexts/services_context.mock.ts b/src/plugins/console/public/application/contexts/services_context.mock.ts index 6c67aa37727b2..c4ac8ca25378b 100644 --- a/src/plugins/console/public/application/contexts/services_context.mock.ts +++ b/src/plugins/console/public/application/contexts/services_context.mock.ts @@ -9,6 +9,7 @@ import { notificationServiceMock } from '../../../../../core/public/mocks'; import { httpServiceMock } from '../../../../../core/public/mocks'; +import type { ObjectStorageClient } from '../../../common/types'; import { HistoryMock } from '../../services/history.mock'; import { SettingsMock } from '../../services/settings.mock'; import { StorageMock } from '../../services/storage.mock'; @@ -18,7 +19,7 @@ import { ContextValue } from './services_context'; export const serviceContextMock = { create: (): ContextValue => { - const storage = new StorageMock({} as any, 'test'); + const storage = new StorageMock(({} as unknown) as Storage, 'test'); const http = httpServiceMock.createSetupContract(); const api = createApi({ http }); const esHostService = createEsHostService({ api }); @@ -31,7 +32,7 @@ export const serviceContextMock = { settings: new SettingsMock(storage), history: new HistoryMock(storage), notifications: notificationServiceMock.createSetupContract(), - objectStorageClient: {} as any, + objectStorageClient: ({} as unknown) as ObjectStorageClient, }, docLinkVersion: 'NA', }; diff --git a/src/plugins/console/public/application/contexts/services_context.tsx b/src/plugins/console/public/application/contexts/services_context.tsx index 58587bf3030e2..53c021d4d0982 100644 --- a/src/plugins/console/public/application/contexts/services_context.tsx +++ b/src/plugins/console/public/application/contexts/services_context.tsx @@ -30,10 +30,10 @@ export interface ContextValue { interface ContextProps { value: ContextValue; - children: any; + children: JSX.Element; } -const ServicesContext = createContext(null as any); +const ServicesContext = createContext(null); export function ServicesContextProvider({ children, value }: ContextProps) { useEffect(() => { @@ -46,8 +46,8 @@ export function ServicesContextProvider({ children, value }: ContextProps) { export const useServicesContext = () => { const context = useContext(ServicesContext); - if (context === undefined) { + if (context == null) { throw new Error('useServicesContext must be used inside the ServicesContextProvider.'); } - return context; + return context!; }; diff --git a/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history.ts b/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history.ts index f8537f9d0b3c4..85c9cf6b9f014 100644 --- a/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history.ts +++ b/src/plugins/console/public/application/hooks/use_restore_request_from_history/restore_request_from_history.ts @@ -7,12 +7,10 @@ */ import RowParser from '../../../lib/row_parser'; +import { ESRequest } from '../../../types'; import { SenseEditor } from '../../models/sense_editor'; -/** - * This function is considered legacy and should not be changed or updated before we have editor - * interfaces in place (it's using a customized version of Ace directly). - */ -export function restoreRequestFromHistory(editor: SenseEditor, req: any) { + +export function restoreRequestFromHistory(editor: SenseEditor, req: ESRequest) { const coreEditor = editor.getCoreEditor(); let pos = coreEditor.getCurrentPosition(); let prefix = ''; diff --git a/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts b/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts index 310d6c67b90bc..7c140e2b18975 100644 --- a/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts +++ b/src/plugins/console/public/application/hooks/use_restore_request_from_history/use_restore_request_from_history.ts @@ -8,10 +8,11 @@ import { useCallback } from 'react'; import { instance as registry } from '../../contexts/editor_context/editor_registry'; +import { ESRequest } from '../../../types'; import { restoreRequestFromHistory } from './restore_request_from_history'; export const useRestoreRequestFromHistory = () => { - return useCallback((req: any) => { + return useCallback((req: ESRequest) => { const editor = registry.getInputEditor(); restoreRequestFromHistory(editor, req); }, []); diff --git a/src/plugins/console/public/application/hooks/use_send_current_request_to_es/send_request_to_es.ts b/src/plugins/console/public/application/hooks/use_send_current_request_to_es/send_request_to_es.ts index aeaa2f76816e4..a86cfd8890a5b 100644 --- a/src/plugins/console/public/application/hooks/use_send_current_request_to_es/send_request_to_es.ts +++ b/src/plugins/console/public/application/hooks/use_send_current_request_to_es/send_request_to_es.ts @@ -8,19 +8,14 @@ import { extractWarningMessages } from '../../../lib/utils'; import { XJson } from '../../../../../es_ui_shared/public'; -const { collapseLiteralStrings } = XJson; // @ts-ignore import * as es from '../../../lib/es/es'; import { BaseResponseType } from '../../../types'; -export interface EsRequestArgs { - requests: any; -} +const { collapseLiteralStrings } = XJson; -export interface ESRequestObject { - path: string; - data: any; - method: string; +export interface EsRequestArgs { + requests: Array<{ url: string; method: string; data: string[] }>; } export interface ESResponseObject { @@ -32,7 +27,7 @@ export interface ESResponseObject { } export interface ESRequestResult { - request: ESRequestObject; + request: { data: string; method: string; path: string }; response: ESResponseObject; } @@ -61,7 +56,7 @@ export function sendRequestToES(args: EsRequestArgs): Promise resolve(results); return; } - const req = requests.shift(); + const req = requests.shift()!; const esPath = req.url; const esMethod = req.method; let esData = collapseLiteralStrings(req.data.join('\n')); @@ -71,7 +66,7 @@ export function sendRequestToES(args: EsRequestArgs): Promise const startTime = Date.now(); es.send(esMethod, esPath, esData).always( - (dataOrjqXHR: any, textStatus: string, jqXhrORerrorThrown: any) => { + (dataOrjqXHR, textStatus: string, jqXhrORerrorThrown) => { if (reqId !== CURRENT_REQ_ID) { return; } diff --git a/src/plugins/console/public/application/hooks/use_send_current_request_to_es/track.ts b/src/plugins/console/public/application/hooks/use_send_current_request_to_es/track.ts index c9b8cdec66a96..f5deefd627187 100644 --- a/src/plugins/console/public/application/hooks/use_send_current_request_to_es/track.ts +++ b/src/plugins/console/public/application/hooks/use_send_current_request_to_es/track.ts @@ -10,7 +10,11 @@ import { SenseEditor } from '../../models/sense_editor'; import { getEndpointFromPosition } from '../../../lib/autocomplete/get_endpoint_from_position'; import { MetricsTracker } from '../../../types'; -export const track = (requests: any[], editor: SenseEditor, trackUiMetric: MetricsTracker) => { +export const track = ( + requests: Array<{ method: string }>, + editor: SenseEditor, + trackUiMetric: MetricsTracker +) => { const coreEditor = editor.getCoreEditor(); // `getEndpointFromPosition` gets values from the server-side generated JSON files which // are a combination of JS, automatically generated JSON and manual overrides. That means diff --git a/src/plugins/console/public/application/hooks/use_send_current_request_to_es/use_send_current_request_to_es.test.tsx b/src/plugins/console/public/application/hooks/use_send_current_request_to_es/use_send_current_request_to_es.test.tsx index e1fc323cd2d9d..63b5788316956 100644 --- a/src/plugins/console/public/application/hooks/use_send_current_request_to_es/use_send_current_request_to_es.test.tsx +++ b/src/plugins/console/public/application/hooks/use_send_current_request_to_es/use_send_current_request_to_es.test.tsx @@ -26,8 +26,8 @@ import { useSendCurrentRequestToES } from './use_send_current_request_to_es'; describe('useSendCurrentRequestToES', () => { let mockContextValue: ContextValue; - let dispatch: (...args: any[]) => void; - const contexts = ({ children }: { children?: any }) => ( + let dispatch: (...args: unknown[]) => void; + const contexts = ({ children }: { children: JSX.Element }) => ( {children} ); diff --git a/src/plugins/console/public/application/hooks/use_set_input_editor.ts b/src/plugins/console/public/application/hooks/use_set_input_editor.ts index 2c6dc101bee0e..c01dbbb0d2798 100644 --- a/src/plugins/console/public/application/hooks/use_set_input_editor.ts +++ b/src/plugins/console/public/application/hooks/use_set_input_editor.ts @@ -9,12 +9,13 @@ import { useCallback } from 'react'; import { useEditorActionContext } from '../contexts/editor_context'; import { instance as registry } from '../contexts/editor_context/editor_registry'; +import { SenseEditor } from '../models'; export const useSetInputEditor = () => { const dispatch = useEditorActionContext(); return useCallback( - (editor: any) => { + (editor: SenseEditor) => { dispatch({ type: 'setInputEditor', payload: editor }); registry.setInputEditor(editor); }, diff --git a/src/plugins/console/public/application/index.tsx b/src/plugins/console/public/application/index.tsx index 1237348af215c..0b41095f8cc19 100644 --- a/src/plugins/console/public/application/index.tsx +++ b/src/plugins/console/public/application/index.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { HttpSetup, NotificationsSetup } from 'src/core/public'; +import { HttpSetup, NotificationsSetup, I18nStart } from 'src/core/public'; import { ServicesContextProvider, EditorContextProvider, RequestContextProvider } from './contexts'; import { Main } from './containers'; import { createStorage, createHistory, createSettings } from '../services'; @@ -20,7 +20,7 @@ import { createApi, createEsHostService } from './lib'; export interface BootDependencies { http: HttpSetup; docLinkVersion: string; - I18nContext: any; + I18nContext: I18nStart['Context']; notifications: NotificationsSetup; usageCollection?: UsageCollectionSetup; element: HTMLElement; diff --git a/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts b/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts index 43da86773d294..dc63f0dcd480c 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts @@ -13,7 +13,7 @@ import * as OutputMode from './mode/output'; import smartResize from './smart_resize'; export interface CustomAceEditor extends ace.Editor { - update: (text: string, mode?: any, cb?: () => void) => void; + update: (text: string, mode?: unknown, cb?: () => void) => void; append: (text: string, foldPrevious?: boolean, cb?: () => void) => void; } @@ -28,9 +28,9 @@ export function createReadOnlyAceEditor(element: HTMLElement): CustomAceEditor { output.$blockScrolling = Infinity; output.resize = smartResize(output); - output.update = (val: string, mode?: any, cb?: () => void) => { + output.update = (val: string, mode?: unknown, cb?: () => void) => { if (typeof mode === 'function') { - cb = mode; + cb = mode as () => void; mode = void 0; } @@ -65,7 +65,7 @@ export function createReadOnlyAceEditor(element: HTMLElement): CustomAceEditor { (function setupSession(session) { session.setMode('ace/mode/text'); - (session as any).setFoldStyle('markbeginend'); + ((session as unknown) as { setFoldStyle: (v: string) => void }).setFoldStyle('markbeginend'); session.setTabSize(2); session.setUseWrapMode(true); })(output.getSession()); diff --git a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts index c39d4549de0b6..0ee15f7a559ae 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts @@ -13,7 +13,7 @@ jest.mock('./mode/worker', () => { // @ts-ignore window.Worker = function () { this.postMessage = () => {}; - (this as any).terminate = () => {}; + ((this as unknown) as { terminate: () => void }).terminate = () => {}; }; // @ts-ignore diff --git a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts index eab5ac16d17db..fa118532aa52d 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts @@ -31,8 +31,8 @@ const rangeToAceRange = ({ start, end }: Range) => new _AceRange(start.lineNumber - 1, start.column - 1, end.lineNumber - 1, end.column - 1); export class LegacyCoreEditor implements CoreEditor { - private _aceOnPaste: any; - $actions: any; + private _aceOnPaste: Function; + $actions: JQuery; resize: () => void; constructor(private readonly editor: IAceEditor, actions: HTMLElement) { @@ -41,7 +41,9 @@ export class LegacyCoreEditor implements CoreEditor { const session = this.editor.getSession(); session.setMode(new InputMode.Mode()); - (session as any).setFoldStyle('markbeginend'); + ((session as unknown) as { setFoldStyle: (style: string) => void }).setFoldStyle( + 'markbeginend' + ); session.setTabSize(2); session.setUseWrapMode(true); @@ -72,7 +74,7 @@ export class LegacyCoreEditor implements CoreEditor { // torn down, e.g. by closing the History tab, and we don't need to do anything further. if (session.bgTokenizer) { // Wait until the bgTokenizer is done running before executing the callback. - if ((session.bgTokenizer as any).running) { + if (((session.bgTokenizer as unknown) as { running: boolean }).running) { setTimeout(check, checkInterval); } else { resolve(); @@ -197,7 +199,7 @@ export class LegacyCoreEditor implements CoreEditor { .addMarker(rangeToAceRange(range), 'ace_snippet-marker', 'fullLine', false); } - removeMarker(ref: any) { + removeMarker(ref: number) { this.editor.getSession().removeMarker(ref); } @@ -222,8 +224,10 @@ export class LegacyCoreEditor implements CoreEditor { } isCompleterActive() { - // Secrets of the arcane here. - return Boolean((this.editor as any).completer && (this.editor as any).completer.activated); + return Boolean( + ((this.editor as unknown) as { completer: { activated: unknown } }).completer && + ((this.editor as unknown) as { completer: { activated: unknown } }).completer.activated + ); } private forceRetokenize() { @@ -250,7 +254,7 @@ export class LegacyCoreEditor implements CoreEditor { this._aceOnPaste.call(this.editor, text); } - private setActionsBar = (value?: any, topOrBottom: 'top' | 'bottom' = 'top') => { + private setActionsBar = (value: number | null, topOrBottom: 'top' | 'bottom' = 'top') => { if (value === null) { this.$actions.css('visibility', 'hidden'); } else { @@ -271,7 +275,7 @@ export class LegacyCoreEditor implements CoreEditor { }; private hideActionsBar = () => { - this.setActionsBar(); + this.setActionsBar(null); }; execCommand(cmd: string) { @@ -295,7 +299,7 @@ export class LegacyCoreEditor implements CoreEditor { }); } - legacyUpdateUI(range: any) { + legacyUpdateUI(range: Range) { if (!this.$actions) { return; } @@ -360,14 +364,19 @@ export class LegacyCoreEditor implements CoreEditor { ace.define( 'ace/autocomplete/text_completer', ['require', 'exports', 'module'], - function (require: any, exports: any) { - exports.getCompletions = function ( - innerEditor: any, - session: any, - pos: any, - prefix: any, - callback: any - ) { + function ( + require: unknown, + exports: { + getCompletions: ( + innerEditor: unknown, + session: unknown, + pos: unknown, + prefix: unknown, + callback: (e: null | Error, values: string[]) => void + ) => void; + } + ) { + exports.getCompletions = function (innerEditor, session, pos, prefix, callback) { callback(null, []); }; } @@ -387,7 +396,7 @@ export class LegacyCoreEditor implements CoreEditor { DO_NOT_USE_2: IAceEditSession, pos: { row: number; column: number }, prefix: string, - callback: (...args: any[]) => void + callback: (...args: unknown[]) => void ) => { const position: Position = { lineNumber: pos.row + 1, diff --git a/src/plugins/console/public/application/models/legacy_core_editor/smart_resize.ts b/src/plugins/console/public/application/models/legacy_core_editor/smart_resize.ts index fdbaedce09187..83d7cd15e60eb 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/smart_resize.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/smart_resize.ts @@ -7,9 +7,10 @@ */ import { get, throttle } from 'lodash'; +import type { Editor } from 'brace'; // eslint-disable-next-line import/no-default-export -export default function (editor: any) { +export default function (editor: Editor) { const resize = editor.resize; const throttledResize = throttle(() => { diff --git a/src/plugins/console/public/application/models/sense_editor/curl.ts b/src/plugins/console/public/application/models/sense_editor/curl.ts index 299ccd0a1f6a6..74cbebf051d03 100644 --- a/src/plugins/console/public/application/models/sense_editor/curl.ts +++ b/src/plugins/console/public/application/models/sense_editor/curl.ts @@ -25,7 +25,7 @@ export function detectCURL(text: string) { export function parseCURL(text: string) { let state = 'NONE'; const out = []; - let body: any[] = []; + let body: string[] = []; let line = ''; const lines = text.trim().split('\n'); let matches; @@ -62,7 +62,7 @@ export function parseCURL(text: string) { } function unescapeLastBodyEl() { - const str = body.pop().replace(/\\([\\"'])/g, '$1'); + const str = body.pop()!.replace(/\\([\\"'])/g, '$1'); body.push(str); } diff --git a/src/plugins/console/public/application/models/sense_editor/sense_editor.ts b/src/plugins/console/public/application/models/sense_editor/sense_editor.ts index d6dd74f0fefe3..0f65d3f1e33e2 100644 --- a/src/plugins/console/public/application/models/sense_editor/sense_editor.ts +++ b/src/plugins/console/public/application/models/sense_editor/sense_editor.ts @@ -7,8 +7,10 @@ */ import _ from 'lodash'; -import RowParser from '../../../lib/row_parser'; + import { XJson } from '../../../../../es_ui_shared/public'; + +import RowParser from '../../../lib/row_parser'; import * as utils from '../../../lib/utils'; // @ts-ignore @@ -16,22 +18,20 @@ import * as es from '../../../lib/es/es'; import { CoreEditor, Position, Range } from '../../../types'; import { createTokenIterator } from '../../factories'; - -import Autocomplete from '../../../lib/autocomplete/autocomplete'; +import createAutocompleter from '../../../lib/autocomplete/autocomplete'; const { collapseLiteralStrings } = XJson; export class SenseEditor { - currentReqRange: (Range & { markerRef: any }) | null; - parser: any; + currentReqRange: (Range & { markerRef: unknown }) | null; + parser: RowParser; - // @ts-ignore - private readonly autocomplete: any; + private readonly autocomplete: ReturnType; constructor(private readonly coreEditor: CoreEditor) { this.currentReqRange = null; this.parser = new RowParser(this.coreEditor); - this.autocomplete = new (Autocomplete as any)({ + this.autocomplete = createAutocompleter({ coreEditor, parser: this.parser, }); @@ -114,7 +114,10 @@ export class SenseEditor { return this.coreEditor.setValue(data, reTokenizeAll); }; - replaceRequestRange = (newRequest: any, requestRange: Range) => { + replaceRequestRange = ( + newRequest: { method: string; url: string; data: string | string[] }, + requestRange: Range + ) => { const text = utils.textFromRequest(newRequest); if (requestRange) { this.coreEditor.replaceRange(requestRange, text); @@ -207,12 +210,12 @@ export class SenseEditor { const request: { method: string; data: string[]; - url: string | null; + url: string; range: Range; } = { method: '', data: [], - url: null, + url: '', range, }; @@ -284,7 +287,7 @@ export class SenseEditor { return []; } - const requests: any = []; + const requests: unknown[] = []; let rangeStartCursor = expandedRange.start.lineNumber; const endLineNumber = expandedRange.end.lineNumber; diff --git a/src/plugins/console/public/application/stores/editor.ts b/src/plugins/console/public/application/stores/editor.ts index 1de4712d9640f..3fdb0c3fd3422 100644 --- a/src/plugins/console/public/application/stores/editor.ts +++ b/src/plugins/console/public/application/stores/editor.ts @@ -9,8 +9,9 @@ import { Reducer } from 'react'; import { produce } from 'immer'; import { identity } from 'fp-ts/lib/function'; -import { DevToolsSettings } from '../../services'; +import { DevToolsSettings, DEFAULT_SETTINGS } from '../../services'; import { TextObject } from '../../../common/text_object'; +import { SenseEditor } from '../models'; export interface Store { ready: boolean; @@ -21,15 +22,15 @@ export interface Store { export const initialValue: Store = produce( { ready: false, - settings: null as any, + settings: DEFAULT_SETTINGS, currentTextObject: null, }, identity ); export type Action = - | { type: 'setInputEditor'; payload: any } - | { type: 'setCurrentTextObject'; payload: any } + | { type: 'setInputEditor'; payload: SenseEditor } + | { type: 'setCurrentTextObject'; payload: TextObject } | { type: 'updateSettings'; payload: DevToolsSettings }; export const reducer: Reducer = (state, action) => diff --git a/src/plugins/console/public/lib/ace_token_provider/token_provider.ts b/src/plugins/console/public/lib/ace_token_provider/token_provider.ts index ac518d43ddf25..692528fb8bced 100644 --- a/src/plugins/console/public/lib/ace_token_provider/token_provider.ts +++ b/src/plugins/console/public/lib/ace_token_provider/token_provider.ts @@ -63,7 +63,7 @@ export class AceTokensProvider implements TokensProvider { return null; } - const tokens: TokenInfo[] = this.session.getTokens(lineNumber - 1) as any; + const tokens = (this.session.getTokens(lineNumber - 1) as unknown) as TokenInfo[]; if (!tokens || !tokens.length) { // We are inside of the document but have no tokens for this line. Return an empty // array to represent this empty line. @@ -74,7 +74,7 @@ export class AceTokensProvider implements TokensProvider { } getTokenAt(pos: Position): Token | null { - const tokens: TokenInfo[] = this.session.getTokens(pos.lineNumber - 1) as any; + const tokens = (this.session.getTokens(pos.lineNumber - 1) as unknown) as TokenInfo[]; if (tokens) { return extractTokenFromAceTokenRow(pos.lineNumber, pos.column, tokens); } diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index e46b5cda3c3a9..d89a9f3d2e5e2 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -18,19 +18,21 @@ import { // @ts-ignore } from '../kb/kb'; +import { createTokenIterator } from '../../application/factories'; +import { Position, Token, Range, CoreEditor } from '../../types'; +import type RowParser from '../row_parser'; + import * as utils from '../utils'; // @ts-ignore import { populateContext } from './engine'; +import { AutoCompleteContext, ResultTerm } from './types'; // @ts-ignore import { URL_PATH_END_MARKER } from './components/index'; -import { createTokenIterator } from '../../application/factories'; -import { Position, Token, Range, CoreEditor } from '../../types'; +let lastEvaluatedToken: Token | null = null; -let lastEvaluatedToken: any = null; - -function isUrlParamsToken(token: any) { +function isUrlParamsToken(token: { type: string } | null) { switch ((token || {}).type) { case 'url.param': case 'url.equal': @@ -54,7 +56,7 @@ function isUrlParamsToken(token: any) { export function getCurrentMethodAndTokenPaths( editor: CoreEditor, pos: Position, - parser: any, + parser: RowParser, forceEndOfUrl?: boolean /* Flag for indicating whether we want to avoid early escape optimization. */ ) { const tokenIter = createTokenIterator({ @@ -62,8 +64,8 @@ export function getCurrentMethodAndTokenPaths( position: pos, }); const startPos = pos; - let bodyTokenPath: any = []; - const ret: any = {}; + let bodyTokenPath: string[] | null = []; + const ret: AutoCompleteContext = {}; const STATES = { looking_for_key: 0, // looking for a key but without jumping over anything but white space and colon. @@ -210,7 +212,12 @@ export function getCurrentMethodAndTokenPaths( ret.urlParamsTokenPath = null; ret.requestStartRow = tokenIter.getCurrentPosition().lineNumber; - let curUrlPart: any; + let curUrlPart: + | null + | string + | Array> + | undefined + | Record; while (t && isUrlParamsToken(t)) { switch (t.type) { @@ -240,7 +247,7 @@ export function getCurrentMethodAndTokenPaths( if (!ret.urlParamsTokenPath) { ret.urlParamsTokenPath = []; } - ret.urlParamsTokenPath.unshift(curUrlPart || {}); + ret.urlParamsTokenPath.unshift((curUrlPart as Record) || {}); curUrlPart = null; break; } @@ -268,7 +275,7 @@ export function getCurrentMethodAndTokenPaths( break; case 'url.slash': if (curUrlPart) { - ret.urlTokenPath.unshift(curUrlPart); + ret.urlTokenPath.unshift(curUrlPart as string); curUrlPart = null; } break; @@ -277,7 +284,7 @@ export function getCurrentMethodAndTokenPaths( } if (curUrlPart) { - ret.urlTokenPath.unshift(curUrlPart); + ret.urlTokenPath.unshift(curUrlPart as string); } if (!ret.bodyTokenPath && !ret.urlParamsTokenPath) { @@ -297,9 +304,15 @@ export function getCurrentMethodAndTokenPaths( } // eslint-disable-next-line -export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEditor; parser: any }) { +export default function ({ + coreEditor: editor, + parser, +}: { + coreEditor: CoreEditor; + parser: RowParser; +}) { function isUrlPathToken(token: Token | null) { - switch ((token || ({} as any)).type) { + switch ((token || ({} as Token)).type) { case 'url.slash': case 'url.comma': case 'url.part': @@ -309,8 +322,12 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } } - function addMetaToTermsList(list: any, meta: any, template?: string) { - return _.map(list, function (t: any) { + function addMetaToTermsList( + list: unknown[], + meta: unknown, + template?: string + ): Array<{ meta: unknown; template: unknown; name?: string }> { + return _.map(list, function (t) { if (typeof t !== 'object') { t = { name: t }; } @@ -318,8 +335,13 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito }); } - function applyTerm(term: any) { - const context = term.context; + function applyTerm(term: { + value?: string; + context?: AutoCompleteContext; + template?: { __raw: boolean; value: string }; + insertValue?: string; + }) { + const context = term.context!; // make sure we get up to date replacement info. addReplacementInfoToContext(context, editor.getCurrentPosition(), term.insertValue); @@ -346,7 +368,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } else { indentedTemplateLines = utils.jsonToString(term.template, true).split('\n'); } - let currentIndentation = editor.getLineValue(context.rangeToReplace.start.lineNumber); + let currentIndentation = editor.getLineValue(context.rangeToReplace!.start.lineNumber); currentIndentation = currentIndentation.match(/^\s*/)![0]; for ( let i = 1; @@ -374,8 +396,8 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito // disable listening to the changes we are making. editor.off('changeSelection', editorChangeListener); - if (context.rangeToReplace.start.column !== context.rangeToReplace.end.column) { - editor.replace(context.rangeToReplace, valueToInsert); + if (context.rangeToReplace!.start.column !== context.rangeToReplace!.end.column) { + editor.replace(context.rangeToReplace!, valueToInsert); } else { editor.insert(valueToInsert); } @@ -384,12 +406,12 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito // go back to see whether we have one of ( : { & [ do not require a comma. All the rest do. let newPos = { - lineNumber: context.rangeToReplace.start.lineNumber, + lineNumber: context.rangeToReplace!.start.lineNumber, column: - context.rangeToReplace.start.column + + context.rangeToReplace!.start.column + termAsString.length + - context.prefixToAdd.length + - (templateInserted ? 0 : context.suffixToAdd.length), + context.prefixToAdd!.length + + (templateInserted ? 0 : context.suffixToAdd!.length), }; const tokenIter = createTokenIterator({ @@ -406,7 +428,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito break; case 'punctuation.colon': nonEmptyToken = parser.nextNonEmptyToken(tokenIter); - if ((nonEmptyToken || ({} as any)).type === 'paren.lparen') { + if ((nonEmptyToken || ({} as Token)).type === 'paren.lparen') { nonEmptyToken = parser.nextNonEmptyToken(tokenIter); newPos = tokenIter.getCurrentPosition(); if (nonEmptyToken && nonEmptyToken.value.indexOf('"') === 0) { @@ -429,7 +451,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito function getAutoCompleteContext(ctxEditor: CoreEditor, pos: Position) { // deduces all the parameters need to position and insert the auto complete - const context: any = { + const context: AutoCompleteContext = { autoCompleteSet: null, // instructions for what can be here endpoint: null, urlPath: null, @@ -501,7 +523,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito case 'whitespace': t = parser.prevNonEmptyToken(tokenIter); - switch ((t || ({} as any)).type) { + switch ((t || ({} as Token)).type) { case 'method': // we moved one back return 'path'; @@ -552,7 +574,11 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito return null; } - function addReplacementInfoToContext(context: any, pos: Position, replacingTerm?: any) { + function addReplacementInfoToContext( + context: AutoCompleteContext, + pos: Position, + replacingTerm?: unknown + ) { // extract the initial value, rangeToReplace & textBoxPosition // Scenarios for current token: @@ -605,7 +631,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito default: if (replacingTerm && context.updatedForToken.value === replacingTerm) { context.rangeToReplace = { - start: { lineNumber: pos.lineNumber, column: anchorToken.column }, + start: { lineNumber: pos.lineNumber, column: anchorToken.position.column }, end: { lineNumber: pos.lineNumber, column: @@ -645,7 +671,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } } - function addBodyPrefixSuffixToContext(context: any) { + function addBodyPrefixSuffixToContext(context: AutoCompleteContext) { // Figure out what happens next to the token to see whether it needs trailing commas etc. // Templates will be used if not destroying existing structure. @@ -680,9 +706,9 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } context.addTemplate = true; // extend range to replace to include all up to token - context.rangeToReplace.end.lineNumber = tokenIter.getCurrentTokenLineNumber(); - context.rangeToReplace.end.column = - tokenIter.getCurrentTokenColumn() + nonEmptyToken.value.length; + context.rangeToReplace!.end.lineNumber = tokenIter.getCurrentTokenLineNumber() as number; + context.rangeToReplace!.end.column = + (tokenIter.getCurrentTokenColumn() as number) + nonEmptyToken.value.length; // move one more time to check if we need a trailing comma nonEmptyToken = parser.nextNonEmptyToken(tokenIter); @@ -711,11 +737,11 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito insertingRelativeToToken = 0; } else { const pos = editor.getCurrentPosition(); - if (pos.column === context.updatedForToken.position.column) { + if (pos.column === context.updatedForToken!.position.column) { insertingRelativeToToken = -1; } else if ( pos.column < - context.updatedForToken.position.column + context.updatedForToken.value.length + context.updatedForToken!.position.column + context.updatedForToken!.value.length ) { insertingRelativeToToken = 0; } else { @@ -743,12 +769,12 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito return context; } - function addUrlParamsPrefixSuffixToContext(context: any) { + function addUrlParamsPrefixSuffixToContext(context: AutoCompleteContext) { context.prefixToAdd = ''; context.suffixToAdd = ''; } - function addMethodPrefixSuffixToContext(context: any) { + function addMethodPrefixSuffixToContext(context: AutoCompleteContext) { context.prefixToAdd = ''; context.suffixToAdd = ''; const tokenIter = createTokenIterator({ editor, position: editor.getCurrentPosition() }); @@ -761,12 +787,12 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } } - function addPathPrefixSuffixToContext(context: any) { + function addPathPrefixSuffixToContext(context: AutoCompleteContext) { context.prefixToAdd = ''; context.suffixToAdd = ''; } - function addMethodAutoCompleteSetToContext(context: any) { + function addMethodAutoCompleteSetToContext(context: AutoCompleteContext) { context.autoCompleteSet = ['GET', 'PUT', 'POST', 'DELETE', 'HEAD'].map((m, i) => ({ name: m, score: -i, @@ -774,7 +800,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito })); } - function addPathAutoCompleteSetToContext(context: any, pos: Position) { + function addPathAutoCompleteSetToContext(context: AutoCompleteContext, pos: Position) { const ret = getCurrentMethodAndTokenPaths(editor, pos, parser); context.method = ret.method; context.token = ret.token; @@ -783,10 +809,10 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito const components = getTopLevelUrlCompleteComponents(context.method); populateContext(ret.urlTokenPath, context, editor, true, components); - context.autoCompleteSet = addMetaToTermsList(context.autoCompleteSet, 'endpoint'); + context.autoCompleteSet = addMetaToTermsList(context.autoCompleteSet!, 'endpoint'); } - function addUrlParamsAutoCompleteSetToContext(context: any, pos: Position) { + function addUrlParamsAutoCompleteSetToContext(context: AutoCompleteContext, pos: Position) { const ret = getCurrentMethodAndTokenPaths(editor, pos, parser); context.method = ret.method; context.otherTokenValues = ret.otherTokenValues; @@ -813,7 +839,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito // zero length tokenPath is true return context; } - let tokenPath: any[] = []; + let tokenPath: string[] = []; const currentParam = ret.urlParamsTokenPath.pop(); if (currentParam) { tokenPath = Object.keys(currentParam); // single key object @@ -830,7 +856,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito return context; } - function addBodyAutoCompleteSetToContext(context: any, pos: Position) { + function addBodyAutoCompleteSetToContext(context: AutoCompleteContext, pos: Position) { const ret = getCurrentMethodAndTokenPaths(editor, pos, parser); context.method = ret.method; context.otherTokenValues = ret.otherTokenValues; @@ -859,7 +885,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito // needed for scope linking + global term resolving context.endpointComponentResolver = getEndpointBodyCompleteComponents; context.globalComponentResolver = getGlobalAutocompleteComponents; - let components; + let components: unknown; if (context.endpoint) { components = context.endpoint.bodyAutocompleteRootComponents; } else { @@ -935,15 +961,19 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } } - function getCompletions(position: Position, prefix: string, callback: (...args: any[]) => void) { + function getCompletions( + position: Position, + prefix: string, + callback: (e: Error | null, result: ResultTerm[] | null) => void + ) { try { const context = getAutoCompleteContext(editor, position); if (!context) { callback(null, []); } else { const terms = _.map( - context.autoCompleteSet.filter((term: any) => Boolean(term) && term.name != null), - function (term: any) { + context.autoCompleteSet!.filter((term) => Boolean(term) && term.name != null), + function (term) { if (typeof term !== 'object') { term = { name: term, @@ -951,7 +981,13 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } else { term = _.clone(term); } - const defaults: any = { + const defaults: { + value?: string; + meta: string; + score: number; + context: AutoCompleteContext; + completer?: { insertMatch: (v: unknown) => void }; + } = { value: term.name, meta: 'API', score: 0, @@ -969,7 +1005,10 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito } ); - terms.sort(function (t1: any, t2: any) { + terms.sort(function ( + t1: { score: number; name?: string }, + t2: { score: number; name?: string } + ) { /* score sorts from high to low */ if (t1.score > t2.score) { return -1; @@ -978,7 +1017,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito return 1; } /* names sort from low to high */ - if (t1.name < t2.name) { + if (t1.name! < t2.name!) { return -1; } if (t1.name === t2.name) { @@ -989,7 +1028,7 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito callback( null, - _.map(terms, function (t: any, i: any) { + _.map(terms, function (t, i) { t.insertValue = t.insertValue || t.value; t.value = '' + t.value; // normalize to strings t.score = -i; @@ -1010,8 +1049,13 @@ export default function ({ coreEditor: editor, parser }: { coreEditor: CoreEdito getCompletions, // TODO: This needs to be cleaned up _test: { - getCompletions: (_editor: any, _editSession: any, pos: any, prefix: any, callback: any) => - getCompletions(pos, prefix, callback), + getCompletions: ( + _editor: unknown, + _editSession: unknown, + pos: Position, + prefix: string, + callback: (e: Error | null, result: ResultTerm[] | null) => void + ) => getCompletions(pos, prefix, callback), addReplacementInfoToContext, addChangeListener: () => editor.on('changeSelection', editorChangeListener), removeChangeListener: () => editor.off('changeSelection', editorChangeListener), diff --git a/src/plugins/console/public/lib/autocomplete/components/full_request_component.ts b/src/plugins/console/public/lib/autocomplete/components/full_request_component.ts index 935e3622bde04..64aefa7b4a121 100644 --- a/src/plugins/console/public/lib/autocomplete/components/full_request_component.ts +++ b/src/plugins/console/public/lib/autocomplete/components/full_request_component.ts @@ -11,7 +11,7 @@ import { ConstantComponent } from './constant_component'; export class FullRequestComponent extends ConstantComponent { private readonly name: string; - constructor(name: string, parent: any, private readonly template: string) { + constructor(name: string, parent: unknown, private readonly template: string) { super(name, parent); this.name = name; } diff --git a/src/plugins/console/public/lib/autocomplete/get_endpoint_from_position.ts b/src/plugins/console/public/lib/autocomplete/get_endpoint_from_position.ts index 849123bc68a71..fe24492df0e7b 100644 --- a/src/plugins/console/public/lib/autocomplete/get_endpoint_from_position.ts +++ b/src/plugins/console/public/lib/autocomplete/get_endpoint_from_position.ts @@ -8,13 +8,14 @@ import { CoreEditor, Position } from '../../types'; import { getCurrentMethodAndTokenPaths } from './autocomplete'; +import type RowParser from '../row_parser'; // @ts-ignore import { getTopLevelUrlCompleteComponents } from '../kb/kb'; // @ts-ignore import { populateContext } from './engine'; -export function getEndpointFromPosition(editor: CoreEditor, pos: Position, parser: any) { +export function getEndpointFromPosition(editor: CoreEditor, pos: Position, parser: RowParser) { const lineValue = editor.getLineValue(pos.lineNumber); const context = { ...getCurrentMethodAndTokenPaths( diff --git a/src/plugins/console/public/lib/autocomplete/types.ts b/src/plugins/console/public/lib/autocomplete/types.ts new file mode 100644 index 0000000000000..33c543f43be9e --- /dev/null +++ b/src/plugins/console/public/lib/autocomplete/types.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CoreEditor, Range, Token } from '../../types'; + +export interface ResultTerm { + context?: AutoCompleteContext; + insertValue?: string; + name?: string; + value?: string; +} + +export interface AutoCompleteContext { + autoCompleteSet?: null | ResultTerm[]; + endpoint?: null | { + paramsAutocomplete: { + getTopLevelComponents: (method?: string | null) => unknown; + }; + bodyAutocompleteRootComponents: unknown; + id?: string; + documentation?: string; + }; + urlPath?: null | unknown; + urlParamsTokenPath?: Array> | null; + method?: string | null; + token?: Token; + activeScheme?: unknown; + replacingToken?: boolean; + rangeToReplace?: Range; + autoCompleteType?: null | string; + editor?: CoreEditor; + + /** + * The tokenized user input that prompted the current autocomplete at the cursor. This can be out of sync with + * the input that is currently being displayed in the editor. + */ + createdWithToken?: Token | null; + + /** + * The tokenized user input that is currently being displayed at the cursor in the editor when the user accepted + * the autocomplete suggestion. + */ + updatedForToken?: Token | null; + + addTemplate?: unknown; + prefixToAdd?: string; + suffixToAdd?: string; + textBoxPosition?: { lineNumber: number; column: number }; + urlTokenPath?: string[]; + otherTokenValues?: string; + requestStartRow?: number | null; + bodyTokenPath?: string[] | null; + endpointComponentResolver?: unknown; + globalComponentResolver?: unknown; + documentation?: string; +} diff --git a/src/plugins/console/public/lib/es/es.ts b/src/plugins/console/public/lib/es/es.ts index 03ee218fa2e1d..dffc2c9682cf2 100644 --- a/src/plugins/console/public/lib/es/es.ts +++ b/src/plugins/console/public/lib/es/es.ts @@ -19,7 +19,7 @@ export function getVersion() { return esVersion; } -export function getContentType(body: any) { +export function getContentType(body: unknown) { if (!body) return; return 'application/json'; } @@ -27,7 +27,7 @@ export function getContentType(body: any) { export function send( method: string, path: string, - data: any, + data: string | object, { asSystemRequest }: SendOptions = {} ) { const wrappedDfd = $.Deferred(); @@ -47,10 +47,10 @@ export function send( }; $.ajax(options).then( - (responseData: any, textStatus: string, jqXHR: any) => { + (responseData, textStatus: string, jqXHR: unknown) => { wrappedDfd.resolveWith({}, [responseData, textStatus, jqXHR]); }, - ((jqXHR: any, textStatus: string, errorThrown: Error) => { + ((jqXHR: { status: number; responseText: string }, textStatus: string, errorThrown: Error) => { if (jqXHR.status === 0) { jqXHR.responseText = "\n\nFailed to connect to Console's backend.\nPlease check the Kibana server is up and running"; diff --git a/src/plugins/console/public/lib/row_parser.ts b/src/plugins/console/public/lib/row_parser.ts index 5f8fb08ca1d6f..e18bf6ac6446b 100644 --- a/src/plugins/console/public/lib/row_parser.ts +++ b/src/plugins/console/public/lib/row_parser.ts @@ -75,7 +75,7 @@ export default class RowParser { return MODE.REQUEST_START; } - rowPredicate(lineNumber: number | undefined, editor: CoreEditor, value: any) { + rowPredicate(lineNumber: number | undefined, editor: CoreEditor, value: number) { const mode = this.getRowParseMode(lineNumber); // eslint-disable-next-line no-bitwise return (mode & value) > 0; diff --git a/src/plugins/console/public/lib/token_iterator/token_iterator.test.ts b/src/plugins/console/public/lib/token_iterator/token_iterator.test.ts index bc28e1d9e1a03..6b2f556f82a0e 100644 --- a/src/plugins/console/public/lib/token_iterator/token_iterator.test.ts +++ b/src/plugins/console/public/lib/token_iterator/token_iterator.test.ts @@ -15,7 +15,7 @@ const mockTokensProviderFactory = (tokenMtx: Token[][]): TokensProvider => { return tokenMtx[lineNumber - 1] || null; }, getTokenAt(pos: Position): Token | null { - return null as any; + return null; }, }; }; diff --git a/src/plugins/console/public/lib/utils/index.ts b/src/plugins/console/public/lib/utils/index.ts index 71b305807e61d..8b8974f4e2f0d 100644 --- a/src/plugins/console/public/lib/utils/index.ts +++ b/src/plugins/console/public/lib/utils/index.ts @@ -11,7 +11,7 @@ import { XJson } from '../../../../es_ui_shared/public'; const { collapseLiteralStrings, expandLiteralStrings } = XJson; -export function textFromRequest(request: any) { +export function textFromRequest(request: { method: string; url: string; data: string | string[] }) { let data = request.data; if (typeof data !== 'string') { data = data.join('\n'); @@ -19,7 +19,7 @@ export function textFromRequest(request: any) { return request.method + ' ' + request.url + '\n' + data; } -export function jsonToString(data: any, indent: boolean) { +export function jsonToString(data: object, indent: boolean) { return JSON.stringify(data, null, indent ? 2 : 0); } diff --git a/src/plugins/console/public/services/history.ts b/src/plugins/console/public/services/history.ts index 1dd18f8672a4b..ee1e97ceb386e 100644 --- a/src/plugins/console/public/services/history.ts +++ b/src/plugins/console/public/services/history.ts @@ -35,12 +35,12 @@ export class History { // be triggered from different places in the app. The alternative would be to store // this in state so that we hook into the React model, but it would require loading history // every time the application starts even if a user is not going to view history. - change(listener: (reqs: any[]) => void) { + change(listener: (reqs: unknown[]) => void) { const subscription = this.changeEmitter.subscribe(listener); return () => subscription.unsubscribe(); } - addToHistory(endpoint: string, method: string, data: any) { + addToHistory(endpoint: string, method: string, data?: string) { const keys = this.getHistoryKeys(); keys.splice(0, MAX_NUMBER_OF_HISTORY_ITEMS); // only maintain most recent X; keys.forEach((key) => { @@ -59,7 +59,7 @@ export class History { this.changeEmitter.next(this.getHistory()); } - updateCurrentState(content: any) { + updateCurrentState(content: string) { const timestamp = new Date().getTime(); this.storage.set('editor_state', { time: timestamp, diff --git a/src/plugins/console/public/services/index.ts b/src/plugins/console/public/services/index.ts index b6bcafc974b93..2b1e64525d0f9 100644 --- a/src/plugins/console/public/services/index.ts +++ b/src/plugins/console/public/services/index.ts @@ -8,4 +8,4 @@ export { createHistory, History } from './history'; export { createStorage, Storage, StorageKeys } from './storage'; -export { createSettings, Settings, DevToolsSettings } from './settings'; +export { createSettings, Settings, DevToolsSettings, DEFAULT_SETTINGS } from './settings'; diff --git a/src/plugins/console/public/services/settings.ts b/src/plugins/console/public/services/settings.ts index 8f142e876293e..647ac1e0ad09f 100644 --- a/src/plugins/console/public/services/settings.ts +++ b/src/plugins/console/public/services/settings.ts @@ -8,6 +8,14 @@ import { Storage } from './index'; +export const DEFAULT_SETTINGS = Object.freeze({ + fontSize: 14, + polling: true, + tripleQuotes: true, + wrapMode: true, + autocomplete: Object.freeze({ fields: true, indices: true, templates: true }), +}); + export interface DevToolsSettings { fontSize: number; wrapMode: boolean; @@ -24,50 +32,46 @@ export class Settings { constructor(private readonly storage: Storage) {} getFontSize() { - return this.storage.get('font_size', 14); + return this.storage.get('font_size', DEFAULT_SETTINGS.fontSize); } - setFontSize(size: any) { + setFontSize(size: number) { this.storage.set('font_size', size); return true; } getWrapMode() { - return this.storage.get('wrap_mode', true); + return this.storage.get('wrap_mode', DEFAULT_SETTINGS.wrapMode); } - setWrapMode(mode: any) { + setWrapMode(mode: boolean) { this.storage.set('wrap_mode', mode); return true; } - setTripleQuotes(tripleQuotes: any) { + setTripleQuotes(tripleQuotes: boolean) { this.storage.set('triple_quotes', tripleQuotes); return true; } getTripleQuotes() { - return this.storage.get('triple_quotes', true); + return this.storage.get('triple_quotes', DEFAULT_SETTINGS.tripleQuotes); } getAutocomplete() { - return this.storage.get('autocomplete_settings', { - fields: true, - indices: true, - templates: true, - }); + return this.storage.get('autocomplete_settings', DEFAULT_SETTINGS.autocomplete); } - setAutocomplete(settings: any) { + setAutocomplete(settings: object) { this.storage.set('autocomplete_settings', settings); return true; } getPolling() { - return this.storage.get('console_polling', true); + return this.storage.get('console_polling', DEFAULT_SETTINGS.polling); } - setPolling(polling: any) { + setPolling(polling: boolean) { this.storage.set('console_polling', polling); return true; } diff --git a/src/plugins/console/public/services/storage.ts b/src/plugins/console/public/services/storage.ts index d933024625e77..221020e496fec 100644 --- a/src/plugins/console/public/services/storage.ts +++ b/src/plugins/console/public/services/storage.ts @@ -17,11 +17,11 @@ export enum StorageKeys { export class Storage { constructor(private readonly engine: IStorageEngine, private readonly prefix: string) {} - encode(val: any) { + encode(val: unknown) { return JSON.stringify(val); } - decode(val: any) { + decode(val: string | null) { if (typeof val === 'string') { return JSON.parse(val); } @@ -37,7 +37,7 @@ export class Storage { } } - set(key: string, val: any) { + set(key: string, val: unknown) { this.engine.setItem(this.encodeKey(key), this.encode(val)); return val; } diff --git a/src/plugins/console/public/types/common.ts b/src/plugins/console/public/types/common.ts index 77b3d7c4477fc..53d896ad01d2f 100644 --- a/src/plugins/console/public/types/common.ts +++ b/src/plugins/console/public/types/common.ts @@ -11,6 +11,12 @@ export interface MetricsTracker { load: (eventName: string) => void; } +export interface ESRequest { + method: string; + endpoint: string; + data?: string; +} + export type BaseResponseType = | 'application/json' | 'text/csv' diff --git a/src/plugins/console/public/types/core_editor.ts b/src/plugins/console/public/types/core_editor.ts index f5e81f413d5c5..cc344d6bcc881 100644 --- a/src/plugins/console/public/types/core_editor.ts +++ b/src/plugins/console/public/types/core_editor.ts @@ -21,7 +21,7 @@ export type EditorEvent = export type AutoCompleterFunction = ( pos: Position, prefix: string, - callback: (...args: any[]) => void + callback: (...args: unknown[]) => void ) => void; export interface Position { @@ -235,7 +235,7 @@ export interface CoreEditor { * have this backdoor to update UI in response to request range changes, for example, as the user * moves the cursor around */ - legacyUpdateUI(opts: any): void; + legacyUpdateUI(opts: unknown): void; /** * A method to for the editor to resize, useful when, for instance, window size changes. @@ -250,7 +250,11 @@ export interface CoreEditor { /** * Register a keyboard shortcut and provide a function to be called. */ - registerKeyboardShortcut(opts: { keys: any; fn: () => void; name: string }): void; + registerKeyboardShortcut(opts: { + keys: string | { win?: string; mac?: string }; + fn: () => void; + name: string; + }): void; /** * Register a completions function that will be called when the editor diff --git a/src/plugins/console/server/lib/elasticsearch_proxy_config.ts b/src/plugins/console/server/lib/elasticsearch_proxy_config.ts index 757142c87a119..bad6942d0c9af 100644 --- a/src/plugins/console/server/lib/elasticsearch_proxy_config.ts +++ b/src/plugins/console/server/lib/elasticsearch_proxy_config.ts @@ -14,7 +14,7 @@ import url from 'url'; import { ESConfigForProxy } from '../types'; const createAgent = (legacyConfig: ESConfigForProxy) => { - const target = url.parse(_.head(legacyConfig.hosts) as any); + const target = url.parse(_.head(legacyConfig.hosts)!); if (!/^https/.test(target.protocol || '')) return new http.Agent(); const agentOptions: https.AgentOptions = {}; @@ -28,7 +28,7 @@ const createAgent = (legacyConfig: ESConfigForProxy) => { agentOptions.rejectUnauthorized = true; // by default, NodeJS is checking the server identify - agentOptions.checkServerIdentity = _.noop as any; + agentOptions.checkServerIdentity = (_.noop as unknown) as https.AgentOptions['checkServerIdentity']; break; case 'full': agentOptions.rejectUnauthorized = true; diff --git a/src/plugins/console/server/lib/proxy_config.ts b/src/plugins/console/server/lib/proxy_config.ts index 556f6affca91d..8e2633545799b 100644 --- a/src/plugins/console/server/lib/proxy_config.ts +++ b/src/plugins/console/server/lib/proxy_config.ts @@ -12,6 +12,17 @@ import { Agent as HttpsAgent, AgentOptions } from 'https'; import { WildcardMatcher } from './wildcard_matcher'; +interface Config { + match: { + protocol: string; + host: string; + port: string; + path: string; + }; + ssl?: { verify?: boolean; ca?: string; cert?: string; key?: string }; + timeout: number; +} + export class ProxyConfig { // @ts-ignore private id: string; @@ -26,9 +37,9 @@ export class ProxyConfig { private readonly sslAgent?: HttpsAgent; - private verifySsl: any; + private verifySsl: undefined | boolean; - constructor(config: { match: any; timeout: number }) { + constructor(config: Config) { config = { ...config, }; @@ -61,8 +72,8 @@ export class ProxyConfig { this.sslAgent = this._makeSslAgent(config); } - _makeSslAgent(config: any) { - const ssl = config.ssl || {}; + _makeSslAgent(config: Config) { + const ssl: Config['ssl'] = config.ssl || {}; this.verifySsl = ssl.verify; const sslAgentOpts: AgentOptions = { diff --git a/src/plugins/console/server/lib/proxy_config_collection.ts b/src/plugins/console/server/lib/proxy_config_collection.ts index 83900838332b5..f6c0b7c659de0 100644 --- a/src/plugins/console/server/lib/proxy_config_collection.ts +++ b/src/plugins/console/server/lib/proxy_config_collection.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { Agent } from 'http'; import { defaultsDeep } from 'lodash'; import { parse as parseUrl } from 'url'; @@ -14,7 +15,12 @@ import { ProxyConfig } from './proxy_config'; export class ProxyConfigCollection { private configs: ProxyConfig[]; - constructor(configs: Array<{ match: any; timeout: number }> = []) { + constructor( + configs: Array<{ + match: { protocol: string; host: string; port: string; path: string }; + timeout: number; + }> = [] + ) { this.configs = configs.map((settings) => new ProxyConfig(settings)); } @@ -22,7 +28,7 @@ export class ProxyConfigCollection { return Boolean(this.configs.length); } - configForUri(uri: string): object { + configForUri(uri: string): { agent: Agent; timeout: number } { const parsedUri = parseUrl(uri); const settings = this.configs.map((config) => config.getForParsedUri(parsedUri as any)); return defaultsDeep({}, ...settings); diff --git a/src/plugins/console/server/lib/proxy_request.test.ts b/src/plugins/console/server/lib/proxy_request.test.ts index 3fb915f0540b4..25257aa4c5579 100644 --- a/src/plugins/console/server/lib/proxy_request.test.ts +++ b/src/plugins/console/server/lib/proxy_request.test.ts @@ -55,7 +55,7 @@ describe(`Console's send request`, () => { fakeRequest = { abort: sinon.stub(), on() {}, - once(event: string, fn: any) { + once(event: string, fn: (v: string) => void) { if (event === 'response') { return fn('done'); } diff --git a/src/plugins/console/server/lib/proxy_request.ts b/src/plugins/console/server/lib/proxy_request.ts index d5914ab32bab7..46b4aa642a70e 100644 --- a/src/plugins/console/server/lib/proxy_request.ts +++ b/src/plugins/console/server/lib/proxy_request.ts @@ -46,9 +46,9 @@ export const proxyRequest = ({ const client = uri.protocol === 'https:' ? https : http; let resolved = false; - let resolve: any; - let reject: any; - const reqPromise = new Promise((res, rej) => { + let resolve: (res: http.IncomingMessage) => void; + let reject: (res: unknown) => void; + const reqPromise = new Promise((res, rej) => { resolve = res; reject = rej; }); diff --git a/src/plugins/console/server/routes/api/console/proxy/body.test.ts b/src/plugins/console/server/routes/api/console/proxy/body.test.ts index 64e2918764d00..80a2e075957de 100644 --- a/src/plugins/console/server/routes/api/console/proxy/body.test.ts +++ b/src/plugins/console/server/routes/api/console/proxy/body.test.ts @@ -5,7 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - +import { IKibanaResponse } from 'src/core/server'; import { getProxyRouteHandlerDeps } from './mocks'; import { Readable } from 'stream'; @@ -16,10 +16,14 @@ import * as requestModule from '../../../../lib/proxy_request'; import { createResponseStub } from './stubs'; describe('Console Proxy Route', () => { - let request: any; + let request: ( + method: string, + path: string, + response?: string + ) => Promise | IKibanaResponse; beforeEach(() => { - request = (method: string, path: string, response: string) => { + request = (method, path, response) => { (requestModule.proxyRequest as jest.Mock).mockResolvedValue(createResponseStub(response)); const handler = createHandler(getProxyRouteHandlerDeps({})); 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 290a2cdec7b76..6a514483d14f2 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 @@ -41,7 +41,7 @@ function toURL(base: string, path: string) { } function filterHeaders(originalHeaders: object, headersToKeep: string[]): object { - const normalizeHeader = function (header: any) { + const normalizeHeader = function (header: string) { if (!header) { return ''; } @@ -68,7 +68,7 @@ function getRequestConfig( return { ...proxyConfigCollection.configForUri(uri), headers: newHeaders, - } as any; + }; } return { @@ -81,7 +81,7 @@ function getProxyHeaders(req: KibanaRequest) { const headers = Object.create(null); // Scope this proto-unsafe functionality to where it is being used. - function extendCommaList(obj: Record, property: string, value: any) { + function extendCommaList(obj: Record, property: string, value: string) { obj[property] = (obj[property] ? obj[property] + ',' : '') + value; } @@ -142,7 +142,7 @@ export const createHandler = ({ }; esIncomingMessage = await proxyRequest({ - method: method.toLowerCase() as any, + method: method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head', headers: requestHeaders, uri, timeout, 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 19b5070236872..be4f1dbab942f 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 @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import type { IKibanaResponse } from 'src/core/server'; import { kibanaResponseFactory } from '../../../../../../../core/server'; import { getProxyRouteHandlerDeps } from './mocks'; import { createResponseStub } from './stubs'; @@ -14,7 +15,7 @@ import * as requestModule from '../../../../lib/proxy_request'; import { createHandler } from './create_handler'; describe('Console Proxy Route', () => { - let request: any; + let request: (method: string, path: string) => Promise | IKibanaResponse; beforeEach(() => { (requestModule.proxyRequest as jest.Mock).mockResolvedValue(createResponseStub('foo')); diff --git a/src/plugins/console/server/routes/api/console/proxy/stubs.ts b/src/plugins/console/server/routes/api/console/proxy/stubs.ts index 4aa23f99ea30e..3474d0c9b33b8 100644 --- a/src/plugins/console/server/routes/api/console/proxy/stubs.ts +++ b/src/plugins/console/server/routes/api/console/proxy/stubs.ts @@ -9,8 +9,12 @@ import { IncomingMessage } from 'http'; import { Readable } from 'stream'; -export function createResponseStub(response: any) { - const resp: any = new Readable({ +export function createResponseStub(response?: string) { + const resp: Readable & { + statusCode?: number; + statusMessage?: string; + headers?: Record; + } = new Readable({ read() { if (response) { this.push(response); diff --git a/src/plugins/console/server/services/spec_definitions_service.ts b/src/plugins/console/server/services/spec_definitions_service.ts index 8b0f4c04ae0bd..e0af9422666af 100644 --- a/src/plugins/console/server/services/spec_definitions_service.ts +++ b/src/plugins/console/server/services/spec_definitions_service.ts @@ -15,6 +15,15 @@ import { jsSpecLoaders } from '../lib'; const PATH_TO_OSS_JSON_SPEC = resolve(__dirname, '../lib/spec_definitions/json'); +interface EndpointDescription { + methods?: string[]; + patterns?: string | string[]; + url_params?: Record; + data_autocomplete_rules?: Record; + url_components?: Record; + priority?: number; +} + export class SpecDefinitionsService { private readonly name = 'es'; @@ -24,16 +33,23 @@ export class SpecDefinitionsService { private hasLoadedSpec = false; - public addGlobalAutocompleteRules(parentNode: string, rules: any) { + public addGlobalAutocompleteRules(parentNode: string, rules: unknown) { this.globalRules[parentNode] = rules; } - public addEndpointDescription(endpoint: string, description: any = {}) { - let copiedDescription: any = {}; + public addEndpointDescription(endpoint: string, description: EndpointDescription = {}) { + let copiedDescription: { patterns?: string; url_params?: Record } = {}; if (this.endpoints[endpoint]) { copiedDescription = { ...this.endpoints[endpoint] }; } - let urlParamsDef: any; + let urlParamsDef: + | { + ignore_unavailable?: string; + allow_no_indices?: string; + expand_wildcards?: string[]; + } + | undefined; + _.each(description.patterns || [], function (p) { if (p.indexOf('{indices}') >= 0) { urlParamsDef = urlParamsDef || {}; @@ -70,7 +86,7 @@ export class SpecDefinitionsService { this.extensionSpecFilePaths.push(path); } - public addProcessorDefinition(processor: any) { + public addProcessorDefinition(processor: unknown) { if (!this.hasLoadedSpec) { throw new Error( 'Cannot add a processor definition because spec definitions have not loaded!' @@ -104,11 +120,13 @@ export class SpecDefinitionsService { return generatedFiles.reduce((acc, file) => { const overrideFile = overrideFiles.find((f) => basename(f) === basename(file)); - const loadedSpec = JSON.parse(readFileSync(file, 'utf8')); + const loadedSpec: Record = JSON.parse( + readFileSync(file, 'utf8') + ); if (overrideFile) { merge(loadedSpec, JSON.parse(readFileSync(overrideFile, 'utf8'))); } - const spec: any = {}; + const spec: Record = {}; Object.entries(loadedSpec).forEach(([key, value]) => { if (acc[key]) { // add time to remove key collision @@ -119,7 +137,7 @@ export class SpecDefinitionsService { }); return { ...acc, ...spec }; - }, {} as any); + }, {} as Record); } private loadJsonSpec() { From 2dea06f5a43c63d6ed63b1f537e70b07c19168b8 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Mar 2021 13:43:00 +0000 Subject: [PATCH 26/35] skip flaky suite (#94545) --- test/functional/apps/discover/_data_grid_context.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/functional/apps/discover/_data_grid_context.ts b/test/functional/apps/discover/_data_grid_context.ts index 896cd4ad595c9..326fba9e6c087 100644 --- a/test/functional/apps/discover/_data_grid_context.ts +++ b/test/functional/apps/discover/_data_grid_context.ts @@ -34,7 +34,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dashboardAddPanel = getService('dashboardAddPanel'); const browser = getService('browser'); - describe('discover data grid context tests', () => { + // FLAKY: https://github.com/elastic/kibana/issues/94545 + describe.skip('discover data grid context tests', () => { before(async () => { await esArchiver.load('discover'); await esArchiver.loadIfNeeded('logstash_functional'); From 017a2b8413e01c210f1f0ece1957f3e301091d38 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 24 Mar 2021 13:46:38 +0000 Subject: [PATCH 27/35] skip flaky suite (#94535) --- .../apis/security_solution/uncommon_processes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts b/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts index ecff7da6147be..fff8b98c8fd1f 100644 --- a/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts +++ b/x-pack/test/api_integration/apis/security_solution/uncommon_processes.ts @@ -27,7 +27,8 @@ export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const supertest = getService('supertest'); - describe('uncommon_processes', () => { + // FLAKY: https://github.com/elastic/kibana/issues/94535 + describe.skip('uncommon_processes', () => { before(() => esArchiver.load('auditbeat/uncommon_processes')); after(() => esArchiver.unload('auditbeat/uncommon_processes')); From d5883beb25fd868fffcde73ea1a74c9e9b21c3ab Mon Sep 17 00:00:00 2001 From: ymao1 Date: Wed, 24 Mar 2021 10:19:35 -0400 Subject: [PATCH 28/35] Adding ES query rule type to stack alerts feature privilege (#95225) --- x-pack/plugins/stack_alerts/server/feature.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/stack_alerts/server/feature.ts b/x-pack/plugins/stack_alerts/server/feature.ts index d421832a4cd97..9f91398cc7d24 100644 --- a/x-pack/plugins/stack_alerts/server/feature.ts +++ b/x-pack/plugins/stack_alerts/server/feature.ts @@ -8,6 +8,7 @@ import { i18n } from '@kbn/i18n'; import { ID as IndexThreshold } from './alert_types/index_threshold/alert_type'; import { GEO_CONTAINMENT_ID as GeoContainment } from './alert_types/geo_containment/alert_type'; +import { ES_QUERY_ID as ElasticsearchQuery } from './alert_types/es_query/alert_type'; import { STACK_ALERTS_FEATURE_ID } from '../common'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/server'; @@ -21,7 +22,7 @@ export const BUILT_IN_ALERTS_FEATURE = { management: { insightsAndAlerting: ['triggersActions'], }, - alerting: [IndexThreshold, GeoContainment], + alerting: [IndexThreshold, GeoContainment, ElasticsearchQuery], privileges: { all: { app: [], @@ -30,7 +31,7 @@ export const BUILT_IN_ALERTS_FEATURE = { insightsAndAlerting: ['triggersActions'], }, alerting: { - all: [IndexThreshold, GeoContainment], + all: [IndexThreshold, GeoContainment, ElasticsearchQuery], read: [], }, savedObject: { @@ -48,7 +49,7 @@ export const BUILT_IN_ALERTS_FEATURE = { }, alerting: { all: [], - read: [IndexThreshold, GeoContainment], + read: [IndexThreshold, GeoContainment, ElasticsearchQuery], }, savedObject: { all: [], From edaa64f150d804123645778ea3de01e0c4b143d7 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 24 Mar 2021 15:38:58 +0100 Subject: [PATCH 29/35] [ML] Functional tests for Anomaly swim lane (#94723) * [ML] update @elastic/charts * [ML] swim lane service, axes tests * [ML] check single cell selection and current URL * [ML] clear selection * [ML] assert anomaly explorer charts * [ML] fix unit test * [ML] assert anomalies table and top influencers list * [ML] update apiDoc version * [ML] exclude host from the URL assertion * [ML] clicks view by swim lane * [ML] fix method for cell selection * [ML] brush action tests * [ML] use debug state flag * [ML] declare window interface * [ML] pagination tests * [ML] enable test * [ML] scroll into view for swim lane actions * [ML] rename URL assertion method * [ML] fix assertion for charts count * [ML] extend assertion * [ML] refactor test subjects selection * [ML] fix assertSelection * [ML] reduce timeout for charts assertion --- .../services/visualizations/elastic_chart.ts | 6 +- .../application/explorer/anomaly_timeline.tsx | 6 +- .../explorer_charts_container.js | 2 +- .../explorer_charts_container.test.js | 2 +- .../explorer/swimlane_container.tsx | 25 ++- .../explorer/swimlane_pagination.tsx | 17 +- x-pack/plugins/ml/server/routes/apidoc.json | 7 +- .../routes/apidoc_scripts/version_filter.ts | 2 +- .../ml/anomaly_detection/anomaly_explorer.ts | 188 ++++++++++++++++ .../functional/services/ml/anomalies_table.ts | 8 + .../services/ml/anomaly_explorer.ts | 25 +++ x-pack/test/functional/services/ml/index.ts | 3 + .../test/functional/services/ml/navigation.ts | 23 +- .../test/functional/services/ml/swim_lane.ts | 212 ++++++++++++++++++ 14 files changed, 504 insertions(+), 22 deletions(-) create mode 100644 x-pack/test/functional/services/ml/swim_lane.ts diff --git a/test/functional/services/visualizations/elastic_chart.ts b/test/functional/services/visualizations/elastic_chart.ts index 010394b275228..80483100a06dd 100644 --- a/test/functional/services/visualizations/elastic_chart.ts +++ b/test/functional/services/visualizations/elastic_chart.ts @@ -29,7 +29,11 @@ export function ElasticChartProvider({ getService }: FtrProviderContext) { const browser = getService('browser'); class ElasticChart { - public async getCanvas() { + public async getCanvas(dataTestSubj?: string) { + if (dataTestSubj) { + const chart = await this.getChart(dataTestSubj); + return await chart.findByClassName('echCanvasRenderer'); + } return await find.byCssSelector('.echChart canvas:last-of-type'); } diff --git a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx index 4289986bb6a59..7c63d4087ce1e 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomaly_timeline.tsx @@ -160,7 +160,11 @@ export const AnomalyTimeline: FC = React.memo( {selectedCells ? ( - + - + {seriesToUse.length > 0 && seriesToUse.map((series) => ( { ); expect(wrapper.html()).toBe( - '
' + '
' ); }); diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx index 8deffa15cd6bd..c108257094b6a 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_container.tsx @@ -26,6 +26,8 @@ import { HeatmapSpec, TooltipSettings, HeatmapBrushEvent, + Position, + ScaleType, } from '@elastic/charts'; import moment from 'moment'; @@ -44,6 +46,15 @@ import './_explorer.scss'; import { EMPTY_FIELD_VALUE_LABEL } from '../timeseriesexplorer/components/entity_control/entity_control'; import { useUiSettings } from '../contexts/kibana'; +declare global { + interface Window { + /** + * Flag used to enable debugState on elastic charts + */ + _echDebugStateFlag?: boolean; + } +} + /** * Ignore insignificant resize, e.g. browser scrollbar appearance. */ @@ -352,7 +363,7 @@ export const SwimlaneContainer: FC = ({ direction={'column'} style={{ width: '100%', height: '100%', overflow: 'hidden' }} ref={resizeRef} - data-test-subj="mlSwimLaneContainer" + data-test-subj={dataTestSubj} > = ({ }} grow={false} > -
+
{showSwimlane && !isLoading && ( = ({ valueAccessor="value" highlightedData={highlightedData} valueFormatter={getFormattedSeverityScore} - xScaleType="time" + xScaleType={ScaleType.Time} ySortPredicate="dataIndex" config={swimLaneConfig} /> diff --git a/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx b/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx index 8b205d2b8d5a1..18297d06dd6fe 100644 --- a/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx +++ b/x-pack/plugins/ml/public/application/explorer/swimlane_pagination.tsx @@ -57,6 +57,7 @@ export const SwimLanePagination: FC = ({ closePopover(); setPerPage(v); }} + data-test-subj={`${v} rows`} > = ({ iconType="arrowDown" iconSide="right" onClick={onButtonClick} + data-test-subj="mlSwimLanePageSizeControl" > - + + + } isOpen={isPopoverOpen} closePopover={closePopover} panelPaddingSize="none" > - + @@ -102,6 +106,7 @@ export const SwimLanePagination: FC = ({ pageCount={pageCount} activePage={componentFromPage} onPageClick={goToPage} + data-test-subj="mlSwimLanePagination" /> diff --git a/x-pack/plugins/ml/server/routes/apidoc.json b/x-pack/plugins/ml/server/routes/apidoc.json index 1a10046380658..ba61a987d69ef 100644 --- a/x-pack/plugins/ml/server/routes/apidoc.json +++ b/x-pack/plugins/ml/server/routes/apidoc.json @@ -1,6 +1,6 @@ { "name": "ml_kibana_api", - "version": "7.11.0", + "version": "7.13.0", "description": "This is the documentation of the REST API provided by the Machine Learning Kibana plugin. Each API is experimental and can include breaking changes in any version.", "title": "ML Kibana API", "order": [ @@ -159,6 +159,9 @@ "GetTrainedModel", "GetTrainedModelStats", "GetTrainedModelPipelines", - "DeleteTrainedModel" + "DeleteTrainedModel", + + "Alerting", + "PreviewAlert" ] } diff --git a/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts b/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts index ad00915f28d6d..430f105fb27d4 100644 --- a/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts +++ b/x-pack/plugins/ml/server/routes/apidoc_scripts/version_filter.ts @@ -7,7 +7,7 @@ import { Block } from './types'; -const API_VERSION = '7.8.0'; +const API_VERSION = '7.13.0'; /** * Post Filter parsed results. diff --git a/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts b/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts index 086b6c7e7f9d7..ff38544fa8c03 100644 --- a/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts +++ b/x-pack/test/functional/apps/ml/anomaly_detection/anomaly_explorer.ts @@ -5,6 +5,7 @@ * 2.0. */ +import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { Job, Datafeed } from '../../../../../plugins/ml/common/types/anomaly_detection_jobs'; @@ -51,9 +52,15 @@ const testDataList = [ }, ]; +const cellSize = 15; + +const overallSwimLaneTestSubj = 'mlAnomalyExplorerSwimlaneOverall'; +const viewBySwimLaneTestSubj = 'mlAnomalyExplorerSwimlaneViewBy'; + export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const ml = getService('ml'); + const elasticChart = getService('elasticChart'); describe('anomaly explorer', function () { this.tags(['mlqa']); @@ -76,12 +83,16 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { + await elasticChart.setNewChartUiDebugFlag(false); await ml.api.cleanMlIndices(); }); it('opens a job from job list link', async () => { await ml.testExecution.logTestStep('navigate to job list'); await ml.navigation.navigateToMl(); + // Set debug state has to happen at this point + // because page refresh happens after navigation to the ML app. + await elasticChart.setNewChartUiDebugFlag(true); await ml.navigation.navigateToJobManagement(); await ml.testExecution.logTestStep('open job in anomaly explorer'); @@ -126,6 +137,183 @@ export default function ({ getService }: FtrProviderContext) { await ml.anomaliesTable.assertTableNotEmpty(); }); + it('renders Overall swim lane', async () => { + await ml.testExecution.logTestStep('has correct axes labels'); + await ml.swimLane.assertAxisLabels(overallSwimLaneTestSubj, 'x', [ + '2016-02-07 00:00', + '2016-02-08 00:00', + '2016-02-09 00:00', + '2016-02-10 00:00', + '2016-02-11 00:00', + '2016-02-12 00:00', + ]); + await ml.swimLane.assertAxisLabels(overallSwimLaneTestSubj, 'y', ['Overall']); + }); + + it('renders View By swim lane', async () => { + await ml.testExecution.logTestStep('has correct axes labels'); + await ml.swimLane.assertAxisLabels(viewBySwimLaneTestSubj, 'x', [ + '2016-02-07 00:00', + '2016-02-08 00:00', + '2016-02-09 00:00', + '2016-02-10 00:00', + '2016-02-11 00:00', + '2016-02-12 00:00', + ]); + await ml.swimLane.assertAxisLabels(viewBySwimLaneTestSubj, 'y', [ + 'AAL', + 'VRD', + 'EGF', + 'SWR', + 'AMX', + 'JZA', + 'TRS', + 'ACA', + 'BAW', + 'ASA', + ]); + }); + + it('supports cell selection by click on Overall swim lane', async () => { + await ml.testExecution.logTestStep('checking page state before the cell selection'); + await ml.anomalyExplorer.assertClearSelectionButtonVisible(false); + await ml.anomaliesTable.assertTableRowsCount(25); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 10); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(0); + + await ml.testExecution.logTestStep('clicks on the Overall swim lane cell'); + const sampleCell = (await ml.swimLane.getCells(overallSwimLaneTestSubj))[0]; + await ml.swimLane.selectSingleCell(overallSwimLaneTestSubj, { + x: sampleCell.x + cellSize, + y: sampleCell.y + cellSize, + }); + // TODO extend cell data with X and Y values, and cell width + await ml.swimLane.assertSelection(overallSwimLaneTestSubj, { + x: [1454846400000, 1454860800000], + y: ['Overall'], + }); + await ml.anomalyExplorer.assertClearSelectionButtonVisible(true); + + await ml.testExecution.logTestStep('updates the View By swim lane'); + await ml.swimLane.assertAxisLabels(viewBySwimLaneTestSubj, 'y', ['EGF', 'DAL']); + + await ml.testExecution.logTestStep('renders anomaly explorer charts'); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(4); + + await ml.testExecution.logTestStep('updates top influencers list'); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 2); + + await ml.testExecution.logTestStep('updates anomalies table'); + await ml.anomaliesTable.assertTableRowsCount(4); + + await ml.testExecution.logTestStep('updates the URL state'); + await ml.navigation.assertCurrentURLContains( + 'selectedLanes%3A!(Overall)%2CselectedTimes%3A!(1454846400%2C1454860800)%2CselectedType%3Aoverall%2CshowTopFieldValues%3A!t%2CviewByFieldName%3Aairline%2CviewByFromPage%3A1%2CviewByPerPage%3A10' + ); + + await ml.testExecution.logTestStep('clears the selection'); + await ml.anomalyExplorer.clearSwimLaneSelection(); + await ml.navigation.assertCurrentURLNotContain( + 'selectedLanes%3A!(Overall)%2CselectedTimes%3A!(1454846400%2C1454860800)%2CselectedType%3Aoverall%2CshowTopFieldValues%3A!t%2CviewByFieldName%3Aairline%2CviewByFromPage%3A1%2CviewByPerPage%3A10' + ); + await ml.anomaliesTable.assertTableRowsCount(25); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 10); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(0); + }); + + it('allows to change the swim lane pagination', async () => { + await ml.testExecution.logTestStep('checks default pagination'); + await ml.swimLane.assertPageSize(viewBySwimLaneTestSubj, 10); + await ml.swimLane.assertActivePage(viewBySwimLaneTestSubj, 1); + + await ml.testExecution.logTestStep('updates pagination'); + await ml.swimLane.setPageSize(viewBySwimLaneTestSubj, 5); + + const axisLabels = await ml.swimLane.getAxisLabels(viewBySwimLaneTestSubj, 'y'); + expect(axisLabels.length).to.eql(5); + + await ml.swimLane.selectPage(viewBySwimLaneTestSubj, 3); + + await ml.testExecution.logTestStep('resets pagination'); + await ml.swimLane.setPageSize(viewBySwimLaneTestSubj, 10); + await ml.swimLane.assertActivePage(viewBySwimLaneTestSubj, 1); + }); + + it('supports cell selection by click on View By swim lane', async () => { + await ml.testExecution.logTestStep('checking page state before the cell selection'); + await ml.anomalyExplorer.assertClearSelectionButtonVisible(false); + await ml.anomaliesTable.assertTableRowsCount(25); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 10); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(0); + + await ml.testExecution.logTestStep('clicks on the View By swim lane cell'); + await ml.anomalyExplorer.assertSwimlaneViewByExists(); + const sampleCell = (await ml.swimLane.getCells(viewBySwimLaneTestSubj))[0]; + await ml.swimLane.selectSingleCell(viewBySwimLaneTestSubj, { + x: sampleCell.x + cellSize, + y: sampleCell.y + cellSize, + }); + + await ml.testExecution.logTestStep('check page content'); + await ml.swimLane.assertSelection(viewBySwimLaneTestSubj, { + x: [1454817600000, 1454832000000], + y: ['AAL'], + }); + + await ml.anomaliesTable.assertTableRowsCount(1); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 1); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(1); + + await ml.testExecution.logTestStep('highlights the Overall swim lane'); + await ml.swimLane.assertSelection(overallSwimLaneTestSubj, { + x: [1454817600000, 1454832000000], + y: ['Overall'], + }); + + await ml.testExecution.logTestStep('clears the selection'); + await ml.anomalyExplorer.clearSwimLaneSelection(); + await ml.anomaliesTable.assertTableRowsCount(25); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 10); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(0); + }); + + it('supports cell selection by brush action', async () => { + await ml.testExecution.logTestStep('checking page state before the cell selection'); + await ml.anomalyExplorer.assertClearSelectionButtonVisible(false); + await ml.anomaliesTable.assertTableRowsCount(25); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 10); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(0); + + await ml.anomalyExplorer.assertSwimlaneViewByExists(); + const cells = await ml.swimLane.getCells(viewBySwimLaneTestSubj); + + const sampleCell1 = cells[0]; + // Get cell from another row + const sampleCell2 = cells.find((c) => c.y !== sampleCell1.y); + + await ml.swimLane.selectCells(viewBySwimLaneTestSubj, { + x1: sampleCell1.x + cellSize, + y1: sampleCell1.y + cellSize, + x2: sampleCell2!.x + cellSize, + y2: sampleCell2!.y + cellSize, + }); + + await ml.swimLane.assertSelection(viewBySwimLaneTestSubj, { + x: [1454817600000, 1454846400000], + y: ['AAL', 'VRD'], + }); + + await ml.anomaliesTable.assertTableRowsCount(2); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 2); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(2); + + await ml.testExecution.logTestStep('clears the selection'); + await ml.anomalyExplorer.clearSwimLaneSelection(); + await ml.anomaliesTable.assertTableRowsCount(25); + await ml.anomalyExplorer.assertInfluencerFieldListLength('airline', 10); + await ml.anomalyExplorer.assertAnomalyExplorerChartsCount(0); + }); + it('adds swim lane embeddable to a dashboard', async () => { // should be the last step because it navigates away from the Anomaly Explorer page await ml.testExecution.logTestStep( diff --git a/x-pack/test/functional/services/ml/anomalies_table.ts b/x-pack/test/functional/services/ml/anomalies_table.ts index 54109e40a7526..30bb3e67bc862 100644 --- a/x-pack/test/functional/services/ml/anomalies_table.ts +++ b/x-pack/test/functional/services/ml/anomalies_table.ts @@ -22,6 +22,14 @@ export function MachineLearningAnomaliesTableProvider({ getService }: FtrProvide return await testSubjects.findAll('mlAnomaliesTable > ~mlAnomaliesListRow'); }, + async assertTableRowsCount(expectedCount: number) { + const actualCount = (await this.getTableRows()).length; + expect(actualCount).to.eql( + expectedCount, + `Expect anomaly table rows count to be ${expectedCount}, got ${actualCount}` + ); + }, + async getRowSubjByRowIndex(rowIndex: number) { const tableRows = await this.getTableRows(); expect(tableRows.length).to.be.greaterThan( diff --git a/x-pack/test/functional/services/ml/anomaly_explorer.ts b/x-pack/test/functional/services/ml/anomaly_explorer.ts index 7fe53b1e3773a..4b1992777b8a7 100644 --- a/x-pack/test/functional/services/ml/anomaly_explorer.ts +++ b/x-pack/test/functional/services/ml/anomaly_explorer.ts @@ -111,5 +111,30 @@ export function MachineLearningAnomalyExplorerProvider({ getService }: FtrProvid await searchBarInput.clearValueWithKeyboard(); await searchBarInput.type(filter); }, + + async assertClearSelectionButtonVisible(expectVisible: boolean) { + if (expectVisible) { + await testSubjects.existOrFail('mlAnomalyTimelineClearSelection'); + } else { + await testSubjects.missingOrFail('mlAnomalyTimelineClearSelection'); + } + }, + + async clearSwimLaneSelection() { + await this.assertClearSelectionButtonVisible(true); + await testSubjects.click('mlAnomalyTimelineClearSelection'); + await this.assertClearSelectionButtonVisible(false); + }, + + async assertAnomalyExplorerChartsCount(expectedChartsCount: number) { + const chartsContainer = await testSubjects.find('mlExplorerChartsContainer'); + const actualChartsCount = ( + await chartsContainer.findAllByClassName('ml-explorer-chart-container', 3000) + ).length; + expect(actualChartsCount).to.eql( + expectedChartsCount, + `Expect ${expectedChartsCount} charts to appear, got ${actualChartsCount}` + ); + }, }; } diff --git a/x-pack/test/functional/services/ml/index.ts b/x-pack/test/functional/services/ml/index.ts index 894ba3d6ef07d..83c0c5e416434 100644 --- a/x-pack/test/functional/services/ml/index.ts +++ b/x-pack/test/functional/services/ml/index.ts @@ -45,6 +45,7 @@ import { MachineLearningTestExecutionProvider } from './test_execution'; import { MachineLearningTestResourcesProvider } from './test_resources'; import { MachineLearningDataVisualizerTableProvider } from './data_visualizer_table'; import { MachineLearningAlertingProvider } from './alerting'; +import { SwimLaneProvider } from './swim_lane'; export function MachineLearningProvider(context: FtrProviderContext) { const commonAPI = MachineLearningCommonAPIProvider(context); @@ -96,6 +97,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { const testExecution = MachineLearningTestExecutionProvider(context); const testResources = MachineLearningTestResourcesProvider(context); const alerting = MachineLearningAlertingProvider(context, commonUI); + const swimLane = SwimLaneProvider(context); return { anomaliesTable, @@ -134,6 +136,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { settingsCalendar, settingsFilterList, singleMetricViewer, + swimLane, testExecution, testResources, }; diff --git a/x-pack/test/functional/services/ml/navigation.ts b/x-pack/test/functional/services/ml/navigation.ts index 93b8a5efecc07..075c788a86336 100644 --- a/x-pack/test/functional/services/ml/navigation.ts +++ b/x-pack/test/functional/services/ml/navigation.ts @@ -14,6 +14,7 @@ export function MachineLearningNavigationProvider({ getPageObjects, }: FtrProviderContext) { const retry = getService('retry'); + const browser = getService('browser'); const testSubjects = getService('testSubjects'); const PageObjects = getPageObjects(['common']); @@ -156,7 +157,7 @@ export function MachineLearningNavigationProvider({ }, async navigateToSingleMetricViewerViaAnomalyExplorer() { - // clicks the `Single Metric Viewere` icon on the button group to switch result views + // clicks the `Single Metric Viewer` icon on the button group to switch result views await testSubjects.click('mlAnomalyResultsViewSelectorSingleMetricViewer'); await retry.tryForTime(60 * 1000, async () => { // verify that the single metric viewer page is visible @@ -193,5 +194,25 @@ export function MachineLearningNavigationProvider({ await testSubjects.existOrFail('homeApp', { timeout: 2000 }); }); }, + + /** + * Assert the active URL. + * @param expectedUrlPart - URL component excluding host + */ + async assertCurrentURLContains(expectedUrlPart: string) { + const currentUrl = await browser.getCurrentUrl(); + expect(currentUrl).to.include.string( + expectedUrlPart, + `Expected the current URL "${currentUrl}" to include ${expectedUrlPart}` + ); + }, + + async assertCurrentURLNotContain(expectedUrlPart: string) { + const currentUrl = await browser.getCurrentUrl(); + expect(currentUrl).to.not.include.string( + expectedUrlPart, + `Expected the current URL "${currentUrl}" to not include ${expectedUrlPart}` + ); + }, }; } diff --git a/x-pack/test/functional/services/ml/swim_lane.ts b/x-pack/test/functional/services/ml/swim_lane.ts new file mode 100644 index 0000000000000..d659b24559a43 --- /dev/null +++ b/x-pack/test/functional/services/ml/swim_lane.ts @@ -0,0 +1,212 @@ +/* + * Copyright 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 { DebugState } from '@elastic/charts'; +import { DebugStateAxis } from '@elastic/charts/dist/state/types'; +import { FtrProviderContext } from '../../ftr_provider_context'; +import { WebElementWrapper } from '../../../../../test/functional/services/lib/web_element_wrapper'; + +type HeatmapDebugState = Required>; + +export function SwimLaneProvider({ getService }: FtrProviderContext) { + const elasticChart = getService('elasticChart'); + const browser = getService('browser'); + const testSubjects = getService('testSubjects'); + + /** + * Y axis labels width + padding + */ + const xOffset = 185; + + /** + * Get coordinates relative to the left top corner of the canvas + * and transpose them from the center point. + */ + async function getCoordinatesFromCenter( + el: WebElementWrapper, + coordinates: { x: number; y: number } + ) { + const { width, height } = await el.getSize(); + + const elCenter = { + x: Math.round(width / 2), + y: Math.round(height / 2), + }; + + /** + * Origin of the element uses the center point, hence we need ot adjust + * the click coordinated accordingly. + */ + const resultX = xOffset + Math.round(coordinates.x) - elCenter.x; + const resultY = Math.round(coordinates.y) - elCenter.y; + + return { + x: resultX, + y: resultY, + }; + } + + const getRenderTracker = async (testSubj: string) => { + const renderCount = await elasticChart.getVisualizationRenderingCount(testSubj); + + return { + async verify() { + if (testSubj === 'mlAnomalyExplorerSwimlaneViewBy') { + // We have a glitchy behaviour when clicking on the View By swim lane. + // The entire charts is re-rendered, hence it requires a different check + await testSubjects.existOrFail(testSubj); + await elasticChart.waitForRenderComplete(testSubj); + } else { + await elasticChart.waitForRenderingCount(renderCount + 1, testSubj); + } + }, + }; + }; + + return { + async getDebugState(testSubj: string): Promise { + const state = await elasticChart.getChartDebugData(testSubj); + if (!state) { + throw new Error('Swim lane debug state is not available'); + } + return state as HeatmapDebugState; + }, + + async getAxisLabels(testSubj: string, axis: 'x' | 'y'): Promise { + const state = await this.getDebugState(testSubj); + return state.axes[axis][0].labels; + }, + + async assertAxisLabels(testSubj: string, axis: 'x' | 'y', expectedValues: string[]) { + const actualValues = await this.getAxisLabels(testSubj, axis); + expect(actualValues).to.eql( + expectedValues, + `Expected swim lane ${axis} labels to be ${expectedValues}, got ${actualValues}` + ); + }, + + async getCells(testSubj: string): Promise { + const state = await this.getDebugState(testSubj); + return state.heatmap.cells; + }, + + async getHighlighted(testSubj: string): Promise { + const state = await this.getDebugState(testSubj); + return state.heatmap.selection; + }, + + async assertSelection( + testSubj: string, + expectedData: HeatmapDebugState['heatmap']['selection']['data'], + expectedArea?: HeatmapDebugState['heatmap']['selection']['area'] + ) { + const actualSelection = await this.getHighlighted(testSubj); + expect(actualSelection.data).to.eql( + expectedData, + `Expected swim lane to have ${ + expectedData + ? `selected X-axis values ${expectedData.x.join( + ',' + )} and Y-axis values ${expectedData.y.join(',')}` + : 'no data selected' + }, got ${ + actualSelection.data + ? `${actualSelection.data.x.join(',')} and ${actualSelection.data.y.join(',')}` + : 'null' + }` + ); + if (expectedArea) { + expect(actualSelection.area).to.eql(expectedArea); + } + }, + + /** + * Selects a single cell + * @param testSubj + * @param x - number of pixels from the Y-axis + * @param y - number of pixels from the top of the canvas element + */ + async selectSingleCell(testSubj: string, { x, y }: { x: number; y: number }) { + await testSubjects.existOrFail(testSubj); + await testSubjects.scrollIntoView(testSubj); + const renderTracker = await getRenderTracker(testSubj); + const el = await elasticChart.getCanvas(testSubj); + + const { x: resultX, y: resultY } = await getCoordinatesFromCenter(el, { x, y }); + + await browser + .getActions() + .move({ x: resultX, y: resultY, origin: el._webElement }) + .click() + .perform(); + + await renderTracker.verify(); + }, + + async selectCells( + testSubj: string, + coordinates: { x1: number; x2: number; y1: number; y2: number } + ) { + await testSubjects.existOrFail(testSubj); + await testSubjects.scrollIntoView(testSubj); + const renderTracker = await getRenderTracker(testSubj); + + const el = await elasticChart.getCanvas(testSubj); + + const { x: resultX1, y: resultY1 } = await getCoordinatesFromCenter(el, { + x: coordinates.x1, + y: coordinates.y1, + }); + const { x: resultX2, y: resultY2 } = await getCoordinatesFromCenter(el, { + x: coordinates.x2, + y: coordinates.y2, + }); + + await browser.dragAndDrop( + { + location: el, + offset: { x: resultX1, y: resultY1 }, + }, + { + location: el, + offset: { x: resultX2, y: resultY2 }, + } + ); + + await renderTracker.verify(); + }, + + async assertActivePage(testSubj: string, expectedPage: number) { + const pagination = await testSubjects.find(`${testSubj} > mlSwimLanePagination`); + const activePage = await pagination.findByCssSelector( + '.euiPaginationButton-isActive .euiButtonEmpty__text' + ); + const text = await activePage.getVisibleText(); + expect(text).to.eql(expectedPage); + }, + + async assertPageSize(testSubj: string, expectedPageSize: number) { + const actualPageSize = await testSubjects.find( + `${testSubj} > ${expectedPageSize.toString()}` + ); + expect(await actualPageSize.isDisplayed()).to.be(true); + }, + + async selectPage(testSubj: string, page: number) { + await testSubjects.click(`${testSubj} > pagination-button-${page - 1}`); + await this.assertActivePage(testSubj, page); + }, + + async setPageSize(testSubj: string, rowsCount: 5 | 10 | 20 | 50 | 100) { + await testSubjects.click(`${testSubj} > mlSwimLanePageSizeControl`); + await testSubjects.existOrFail('mlSwimLanePageSizePanel'); + await testSubjects.click(`mlSwimLanePageSizePanel > ${rowsCount} rows`); + await this.assertPageSize(testSubj, rowsCount); + }, + }; +} From cf33d72442d2bf330e937d17dca9750d8a4bb756 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Wed, 24 Mar 2021 15:52:41 +0100 Subject: [PATCH 30/35] [Logs UI] Tolerate log entries for which fields retrieval fails (#94972) --- .../log_entries/log_entries_search_strategy.ts | 10 +++++----- .../services/log_entries/log_entry_search_strategy.ts | 2 +- .../server/services/log_entries/queries/log_entries.ts | 2 +- .../server/services/log_entries/queries/log_entry.ts | 4 +++- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts index 190464ab6d5c1..161685aac29ad 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts @@ -203,13 +203,13 @@ const getLogEntryFromHit = ( } else if ('messageColumn' in column) { return { columnId: column.messageColumn.id, - message: messageFormattingRules.format(hit.fields, hit.highlight || {}), + message: messageFormattingRules.format(hit.fields ?? {}, hit.highlight || {}), }; } else { return { columnId: column.fieldColumn.id, field: column.fieldColumn.field, - value: hit.fields[column.fieldColumn.field] ?? [], + value: hit.fields?.[column.fieldColumn.field] ?? [], highlights: hit.highlight?.[column.fieldColumn.field] ?? [], }; } @@ -233,9 +233,9 @@ const pickRequestCursor = ( const getContextFromHit = (hit: LogEntryHit): LogEntryContext => { // Get all context fields, then test for the presence and type of the ones that go together - const containerId = hit.fields['container.id']?.[0]; - const hostName = hit.fields['host.name']?.[0]; - const logFilePath = hit.fields['log.file.path']?.[0]; + const containerId = hit.fields?.['container.id']?.[0]; + const hostName = hit.fields?.['host.name']?.[0]; + const logFilePath = hit.fields?.['log.file.path']?.[0]; if (typeof containerId === 'string') { return { 'container.id': containerId }; diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts b/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts index 2088761800cfe..85eacba823b2b 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entry_search_strategy.ts @@ -121,5 +121,5 @@ const createLogEntryFromHit = (hit: LogEntryHit) => ({ id: hit._id, index: hit._index, cursor: getLogEntryCursorFromHit(hit), - fields: Object.entries(hit.fields).map(([field, value]) => ({ field, value })), + fields: Object.entries(hit.fields ?? {}).map(([field, value]) => ({ field, value })), }); diff --git a/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts b/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts index 460703b22766f..aa640f106d1ee 100644 --- a/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts +++ b/x-pack/plugins/infra/server/services/log_entries/queries/log_entries.ts @@ -120,10 +120,10 @@ const createHighlightQuery = ( export const logEntryHitRT = rt.intersection([ commonHitFieldsRT, rt.type({ - fields: rt.record(rt.string, jsonArrayRT), sort: rt.tuple([rt.number, rt.number]), }), rt.partial({ + fields: rt.record(rt.string, jsonArrayRT), highlight: rt.record(rt.string, rt.array(rt.string)), }), ]); diff --git a/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts b/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts index 74a12f14adcaa..51714be775e97 100644 --- a/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts +++ b/x-pack/plugins/infra/server/services/log_entries/queries/log_entry.ts @@ -39,9 +39,11 @@ export const createGetLogEntryQuery = ( export const logEntryHitRT = rt.intersection([ commonHitFieldsRT, rt.type({ - fields: rt.record(rt.string, jsonArrayRT), sort: rt.tuple([rt.number, rt.number]), }), + rt.partial({ + fields: rt.record(rt.string, jsonArrayRT), + }), ]); export type LogEntryHit = rt.TypeOf; From 1527ab510b9d580b9f6f2b5dbbfa6f789118554c Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 24 Mar 2021 16:01:52 +0100 Subject: [PATCH 31/35] [Search Sessions] Improve search session name edit test (#95152) --- x-pack/test/functional/services/search_sessions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/services/search_sessions.ts b/x-pack/test/functional/services/search_sessions.ts index 3ecb056c06074..34bea998925e5 100644 --- a/x-pack/test/functional/services/search_sessions.ts +++ b/x-pack/test/functional/services/search_sessions.ts @@ -72,7 +72,9 @@ export function SearchSessionsProvider({ getService }: FtrProviderContext) { if (searchSessionName) { await testSubjects.click('searchSessionNameEdit'); - await testSubjects.setValue('searchSessionNameInput', searchSessionName); + await testSubjects.setValue('searchSessionNameInput', searchSessionName, { + clearWithKeyboard: true, + }); await testSubjects.click('searchSessionNameSave'); } From 759a52c74db62ac9d86416896f356b21eb8ec064 Mon Sep 17 00:00:00 2001 From: Constance Date: Wed, 24 Mar 2021 08:36:23 -0700 Subject: [PATCH 32/35] [App Search] Add describe('listeners') blocks to older logic tests (#95215) * Add describe('listener') blocks to older logic tests * [Misc] LogRetentionLogic - move 2 it() blocks not within a describe() to its parent listener --- .../credentials/credentials_logic.test.ts | 2 + .../document_creation_logic.test.ts | 2 + .../documents/document_detail_logic.test.ts | 2 + .../components/engine/engine_logic.test.ts | 2 + .../engine_overview_logic.test.ts | 2 + .../log_retention/log_retention_logic.test.ts | 64 ++++++++++--------- 6 files changed, 43 insertions(+), 31 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts index a178228f4996b..bf84b03e7603e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_logic.test.ts @@ -1025,7 +1025,9 @@ describe('CredentialsLogic', () => { }); }); }); + }); + describe('listeners', () => { describe('fetchCredentials', () => { const meta = { page: { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts index 37d3d1577767f..2c6cadf9a8ece 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts @@ -294,7 +294,9 @@ describe('DocumentCreationLogic', () => { }); }); }); + }); + describe('listeners', () => { describe('onSubmitFile', () => { describe('with a valid file', () => { beforeAll(() => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts index d2683fac649a0..add5e9414be13 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/documents/document_detail_logic.test.ts @@ -54,7 +54,9 @@ describe('DocumentDetailLogic', () => { }); }); }); + }); + describe('listeners', () => { describe('getDocumentDetails', () => { it('will call an API endpoint and then store the result', async () => { const fields = [{ name: 'name', value: 'python', type: 'string' }]; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts index bf2fba6344e7a..b9ec83db99f70 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_logic.test.ts @@ -172,7 +172,9 @@ describe('EngineLogic', () => { }); }); }); + }); + describe('listeners', () => { describe('initializeEngine', () => { it('fetches and sets engine data', async () => { mount({ engineName: 'some-engine' }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview_logic.test.ts index df8ed920e88df..decadba1092d3 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine_overview/engine_overview_logic.test.ts @@ -78,7 +78,9 @@ describe('EngineOverviewLogic', () => { }); }); }); + }); + describe('listeners', () => { describe('pollForOverviewMetrics', () => { it('fetches data and calls onPollingSuccess', async () => { mount(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/log_retention/log_retention_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/log_retention/log_retention_logic.test.ts index 19bd2af50aad9..7b63397ac6380 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/log_retention/log_retention_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/log_retention/log_retention_logic.test.ts @@ -177,7 +177,9 @@ describe('LogRetentionLogic', () => { }); }); }); + }); + describe('listeners', () => { describe('saveLogRetention', () => { beforeEach(() => { mount(); @@ -264,6 +266,37 @@ describe('LogRetentionLogic', () => { LogRetentionOptions.Analytics ); }); + + it('will call saveLogRetention if NOT already enabled', () => { + mount({ + logRetention: { + [LogRetentionOptions.Analytics]: { + enabled: false, + }, + }, + }); + jest.spyOn(LogRetentionLogic.actions, 'saveLogRetention'); + + LogRetentionLogic.actions.toggleLogRetention(LogRetentionOptions.Analytics); + + expect(LogRetentionLogic.actions.saveLogRetention).toHaveBeenCalledWith( + LogRetentionOptions.Analytics, + true + ); + }); + + it('will do nothing if logRetention option is not yet set', () => { + mount({ + logRetention: {}, + }); + jest.spyOn(LogRetentionLogic.actions, 'saveLogRetention'); + jest.spyOn(LogRetentionLogic.actions, 'setOpenedModal'); + + LogRetentionLogic.actions.toggleLogRetention(LogRetentionOptions.API); + + expect(LogRetentionLogic.actions.saveLogRetention).not.toHaveBeenCalled(); + expect(LogRetentionLogic.actions.setOpenedModal).not.toHaveBeenCalled(); + }); }); describe('fetchLogRetention', () => { @@ -306,36 +339,5 @@ describe('LogRetentionLogic', () => { expect(http.get).not.toHaveBeenCalled(); }); }); - - it('will call saveLogRetention if NOT already enabled', () => { - mount({ - logRetention: { - [LogRetentionOptions.Analytics]: { - enabled: false, - }, - }, - }); - jest.spyOn(LogRetentionLogic.actions, 'saveLogRetention'); - - LogRetentionLogic.actions.toggleLogRetention(LogRetentionOptions.Analytics); - - expect(LogRetentionLogic.actions.saveLogRetention).toHaveBeenCalledWith( - LogRetentionOptions.Analytics, - true - ); - }); - - it('will do nothing if logRetention option is not yet set', () => { - mount({ - logRetention: {}, - }); - jest.spyOn(LogRetentionLogic.actions, 'saveLogRetention'); - jest.spyOn(LogRetentionLogic.actions, 'setOpenedModal'); - - LogRetentionLogic.actions.toggleLogRetention(LogRetentionOptions.API); - - expect(LogRetentionLogic.actions.saveLogRetention).not.toHaveBeenCalled(); - expect(LogRetentionLogic.actions.setOpenedModal).not.toHaveBeenCalled(); - }); }); }); From 3639aa442283bdbdd9132860a77f267bc841e061 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Wed, 24 Mar 2021 11:44:22 -0400 Subject: [PATCH 33/35] [Fleet] Bulk reassign response should include all given ids (#95024) ## Summary `/agents/bulk_reassign` should return a response with a result for each agent given; including invalid or missing ids. It currently filters out missing or invalid before updating. This PR leaves them in and includes their error results in the response. [Added/updated tests](https://github.com/elastic/kibana/pull/95024/files#diff-7ec94bee3e2bae79e5d98b8c17c17b26fad14736143ffa144f3e035773d4cad1R113-R128) to confirm ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/common/types/rest_spec/agent.ts | 11 ++- .../fleet/server/routes/agent/handlers.ts | 20 ++-- .../fleet/server/services/agents/crud.ts | 44 +++++---- .../fleet/server/services/agents/reassign.ts | 95 ++++++++++++++----- x-pack/plugins/fleet/server/types/index.tsx | 6 ++ .../apis/agents/reassign.ts | 64 ++++++++++++- 6 files changed, 180 insertions(+), 60 deletions(-) diff --git a/x-pack/plugins/fleet/common/types/rest_spec/agent.ts b/x-pack/plugins/fleet/common/types/rest_spec/agent.ts index 93cbb8369a3b1..b654c513e0afb 100644 --- a/x-pack/plugins/fleet/common/types/rest_spec/agent.ts +++ b/x-pack/plugins/fleet/common/types/rest_spec/agent.ts @@ -164,12 +164,13 @@ export interface PostBulkAgentReassignRequest { }; } -export interface PostBulkAgentReassignResponse { - [key: string]: { +export type PostBulkAgentReassignResponse = Record< + Agent['id'], + { success: boolean; - error?: Error; - }; -} + error?: string; + } +>; export interface GetOneAgentEventsRequest { params: { diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.ts index e6188a83c49e9..5ac264e29f079 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.ts @@ -308,26 +308,26 @@ export const postBulkAgentsReassignHandler: RequestHandler< const soClient = context.core.savedObjects.client; const esClient = context.core.elasticsearch.client.asInternalUser; + const agentOptions = Array.isArray(request.body.agents) + ? { agentIds: request.body.agents } + : { kuery: request.body.agents }; try { const results = await AgentService.reassignAgents( soClient, esClient, - Array.isArray(request.body.agents) - ? { agentIds: request.body.agents } - : { kuery: request.body.agents }, + agentOptions, request.body.policy_id ); - const body: PostBulkAgentReassignResponse = results.items.reduce((acc, so) => { - return { - ...acc, - [so.id]: { - success: !so.error, - error: so.error || undefined, - }, + const body = results.items.reduce((acc, so) => { + acc[so.id] = { + success: !so.error, + error: so.error?.message, }; + return acc; }, {}); + return response.ok({ body }); } catch (error) { return defaultIngestErrorHandler({ error, response }); diff --git a/x-pack/plugins/fleet/server/services/agents/crud.ts b/x-pack/plugins/fleet/server/services/agents/crud.ts index 22e9f559c56b8..9aa7bbc9f2b18 100644 --- a/x-pack/plugins/fleet/server/services/agents/crud.ts +++ b/x-pack/plugins/fleet/server/services/agents/crud.ts @@ -9,8 +9,8 @@ import Boom from '@hapi/boom'; import type { SearchResponse, MGetResponse, GetResponse } from 'elasticsearch'; import type { SavedObjectsClientContract, ElasticsearchClient } from 'src/core/server'; +import type { AgentSOAttributes, Agent, BulkActionResult, ListWithKuery } from '../../types'; import type { ESSearchResponse } from '../../../../../../typings/elasticsearch'; -import type { AgentSOAttributes, Agent, ListWithKuery } from '../../types'; import { appContextService, agentPolicyService } from '../../services'; import type { FleetServerAgent } from '../../../common'; import { isAgentUpgradeable, SO_SEARCH_LIMIT } from '../../../common'; @@ -69,22 +69,23 @@ export type GetAgentsOptions = }; export async function getAgents(esClient: ElasticsearchClient, options: GetAgentsOptions) { - let initialResults = []; - + let agents: Agent[] = []; if ('agentIds' in options) { - initialResults = await getAgentsById(esClient, options.agentIds); + agents = await getAgentsById(esClient, options.agentIds); } else if ('kuery' in options) { - initialResults = ( + agents = ( await getAllAgentsByKuery(esClient, { kuery: options.kuery, showInactive: options.showInactive ?? false, }) ).agents; } else { - throw new IngestManagerError('Cannot get agents'); + throw new IngestManagerError( + 'Either options.agentIds or options.kuery are required to get agents' + ); } - return initialResults; + return agents; } export async function getAgentsByKuery( @@ -188,7 +189,7 @@ export async function countInactiveAgents( export async function getAgentById(esClient: ElasticsearchClient, agentId: string) { const agentNotFoundError = new AgentNotFoundError(`Agent ${agentId} not found`); try { - const agentHit = await esClient.get>({ + const agentHit = await esClient.get({ index: AGENTS_INDEX, id: agentId, }); @@ -207,10 +208,17 @@ export async function getAgentById(esClient: ElasticsearchClient, agentId: strin } } -async function getAgentDocuments( +export function isAgentDocument( + maybeDocument: any +): maybeDocument is GetResponse { + return '_id' in maybeDocument && '_source' in maybeDocument; +} + +export type ESAgentDocumentResult = GetResponse; +export async function getAgentDocuments( esClient: ElasticsearchClient, agentIds: string[] -): Promise>> { +): Promise { const res = await esClient.mget>({ index: AGENTS_INDEX, body: { docs: agentIds.map((_id) => ({ _id })) }, @@ -221,14 +229,16 @@ async function getAgentDocuments( export async function getAgentsById( esClient: ElasticsearchClient, - agentIds: string[], - options: { includeMissing?: boolean } = { includeMissing: false } + agentIds: string[] ): Promise { const allDocs = await getAgentDocuments(esClient, agentIds); - const agentDocs = options.includeMissing - ? allDocs - : allDocs.filter((res) => res._id && res._source); - const agents = agentDocs.map((doc) => searchHitToAgent(doc)); + const agents = allDocs.reduce((results, doc) => { + if (isAgentDocument(doc)) { + results.push(searchHitToAgent(doc)); + } + + return results; + }, []); return agents; } @@ -276,7 +286,7 @@ export async function bulkUpdateAgents( agentId: string; data: Partial; }> -) { +): Promise<{ items: BulkActionResult[] }> { if (updateData.length === 0) { return { items: [] }; } diff --git a/x-pack/plugins/fleet/server/services/agents/reassign.ts b/x-pack/plugins/fleet/server/services/agents/reassign.ts index 74e60c42b9973..5574c42ced053 100644 --- a/x-pack/plugins/fleet/server/services/agents/reassign.ts +++ b/x-pack/plugins/fleet/server/services/agents/reassign.ts @@ -8,13 +8,20 @@ import type { SavedObjectsClientContract, ElasticsearchClient } from 'kibana/server'; import Boom from '@hapi/boom'; -import type { Agent } from '../../types'; +import type { Agent, BulkActionResult } from '../../types'; import { agentPolicyService } from '../agent_policy'; import { AgentReassignmentError } from '../../errors'; -import { getAgents, getAgentPolicyForAgent, updateAgent, bulkUpdateAgents } from './crud'; +import { + getAgentDocuments, + getAgents, + getAgentPolicyForAgent, + updateAgent, + bulkUpdateAgents, +} from './crud'; import type { GetAgentsOptions } from './index'; import { createAgentAction, bulkCreateAgentActions } from './actions'; +import { searchHitToAgent } from './helpers'; export async function reassignAgent( soClient: SavedObjectsClientContract, @@ -67,39 +74,67 @@ export async function reassignAgentIsAllowed( export async function reassignAgents( soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, - options: { agents: Agent[] } | GetAgentsOptions, + options: ({ agents: Agent[] } | GetAgentsOptions) & { force?: boolean }, newAgentPolicyId: string -): Promise<{ items: Array<{ id: string; success: boolean; error?: Error }> }> { +): Promise<{ items: BulkActionResult[] }> { const agentPolicy = await agentPolicyService.get(soClient, newAgentPolicyId); if (!agentPolicy) { throw Boom.notFound(`Agent policy not found: ${newAgentPolicyId}`); } - const allResults = 'agents' in options ? options.agents : await getAgents(esClient, options); + const outgoingErrors: Record = {}; + let givenAgents: Agent[] = []; + if ('agents' in options) { + givenAgents = options.agents; + } else if ('agentIds' in options) { + const givenAgentsResults = await getAgentDocuments(esClient, options.agentIds); + for (const agentResult of givenAgentsResults) { + if (agentResult.found === false) { + outgoingErrors[agentResult._id] = new AgentReassignmentError( + `Cannot find agent ${agentResult._id}` + ); + } else { + givenAgents.push(searchHitToAgent(agentResult)); + } + } + } else if ('kuery' in options) { + givenAgents = await getAgents(esClient, options); + } + const givenOrder = + 'agentIds' in options ? options.agentIds : givenAgents.map((agent) => agent.id); + // which are allowed to unenroll - const settled = await Promise.allSettled( - allResults.map((agent) => - reassignAgentIsAllowed(soClient, esClient, agent.id, newAgentPolicyId).then((_) => agent) - ) + const agentResults = await Promise.allSettled( + givenAgents.map(async (agent, index) => { + if (agent.policy_id === newAgentPolicyId) { + throw new AgentReassignmentError(`${agent.id} is already assigned to ${newAgentPolicyId}`); + } + + const isAllowed = await reassignAgentIsAllowed( + soClient, + esClient, + agent.id, + newAgentPolicyId + ); + if (isAllowed) { + return agent; + } + throw new AgentReassignmentError(`${agent.id} may not be reassigned to ${newAgentPolicyId}`); + }) ); // Filter to agents that do not already use the new agent policy ID - const agentsToUpdate = allResults.filter((agent, index) => { - if (settled[index].status === 'fulfilled') { - if (agent.policy_id === newAgentPolicyId) { - settled[index] = { - status: 'rejected', - reason: new AgentReassignmentError( - `${agent.id} is already assigned to ${newAgentPolicyId}` - ), - }; - } else { - return true; - } + const agentsToUpdate = agentResults.reduce((agents, result, index) => { + if (result.status === 'fulfilled') { + agents.push(result.value); + } else { + const id = givenAgents[index].id; + outgoingErrors[id] = result.reason; } - }); + return agents; + }, []); - const res = await bulkUpdateAgents( + await bulkUpdateAgents( esClient, agentsToUpdate.map((agent) => ({ agentId: agent.id, @@ -110,6 +145,18 @@ export async function reassignAgents( })) ); + const orderedOut = givenOrder.map((agentId) => { + const hasError = agentId in outgoingErrors; + const result: BulkActionResult = { + id: agentId, + success: !hasError, + }; + if (hasError) { + result.error = outgoingErrors[agentId]; + } + return result; + }); + const now = new Date().toISOString(); await bulkCreateAgentActions( soClient, @@ -121,5 +168,5 @@ export async function reassignAgents( })) ); - return res; + return { items: orderedOut }; } diff --git a/x-pack/plugins/fleet/server/types/index.tsx b/x-pack/plugins/fleet/server/types/index.tsx index c25b047c0e1ad..2b46f7e76a719 100644 --- a/x-pack/plugins/fleet/server/types/index.tsx +++ b/x-pack/plugins/fleet/server/types/index.tsx @@ -90,5 +90,11 @@ export type AgentPolicyUpdateHandler = ( agentPolicyId: string ) => Promise; +export interface BulkActionResult { + id: string; + success: boolean; + error?: Error; +} + export * from './models'; export * from './rest_spec'; diff --git a/x-pack/test/fleet_api_integration/apis/agents/reassign.ts b/x-pack/test/fleet_api_integration/apis/agents/reassign.ts index 77da9ecce3294..627cb299f0909 100644 --- a/x-pack/test/fleet_api_integration/apis/agents/reassign.ts +++ b/x-pack/test/fleet_api_integration/apis/agents/reassign.ts @@ -101,15 +101,32 @@ export default function (providerContext: FtrProviderContext) { expect(agent3data.body.item.policy_id).to.eql('policy2'); }); - it('should allow to reassign multiple agents by id -- some invalid', async () => { - await supertest + it('should allow to reassign multiple agents by id -- mix valid & invalid', async () => { + const { body } = await supertest .post(`/api/fleet/agents/bulk_reassign`) .set('kbn-xsrf', 'xxx') .send({ agents: ['agent2', 'INVALID_ID', 'agent3', 'MISSING_ID', 'etc'], policy_id: 'policy2', - }) - .expect(200); + }); + + expect(body).to.eql({ + agent2: { success: true }, + INVALID_ID: { + success: false, + error: 'Cannot find agent INVALID_ID', + }, + agent3: { success: true }, + MISSING_ID: { + success: false, + error: 'Cannot find agent MISSING_ID', + }, + etc: { + success: false, + error: 'Cannot find agent etc', + }, + }); + const [agent2data, agent3data] = await Promise.all([ supertest.get(`/api/fleet/agents/agent2`), supertest.get(`/api/fleet/agents/agent3`), @@ -118,6 +135,45 @@ export default function (providerContext: FtrProviderContext) { expect(agent3data.body.item.policy_id).to.eql('policy2'); }); + it('should allow to reassign multiple agents by id -- mixed invalid, managed, etc', async () => { + // agent1 is enrolled in policy1. set policy1 to managed + await supertest + .put(`/api/fleet/agent_policies/policy1`) + .set('kbn-xsrf', 'xxx') + .send({ name: 'Test policy', namespace: 'default', is_managed: true }) + .expect(200); + + const { body } = await supertest + .post(`/api/fleet/agents/bulk_reassign`) + .set('kbn-xsrf', 'xxx') + .send({ + agents: ['agent2', 'INVALID_ID', 'agent3'], + policy_id: 'policy2', + }); + + expect(body).to.eql({ + agent2: { + success: false, + error: 'Cannot reassign an agent from managed agent policy policy1', + }, + INVALID_ID: { + success: false, + error: 'Cannot find agent INVALID_ID', + }, + agent3: { + success: false, + error: 'Cannot reassign an agent from managed agent policy policy1', + }, + }); + + const [agent2data, agent3data] = await Promise.all([ + supertest.get(`/api/fleet/agents/agent2`), + supertest.get(`/api/fleet/agents/agent3`), + ]); + expect(agent2data.body.item.policy_id).to.eql('policy1'); + expect(agent3data.body.item.policy_id).to.eql('policy1'); + }); + it('should allow to reassign multiple agents by kuery', async () => { await supertest .post(`/api/fleet/agents/bulk_reassign`) From de3a7d6f0d1091cd26ab29a49b138bb468a38ae1 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Wed, 24 Mar 2021 10:45:51 -0500 Subject: [PATCH 34/35] Use `es` instead of `legacyEs` in APM API integration test (#95303) References #83910. --- x-pack/test/apm_api_integration/tests/feature_controls.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/apm_api_integration/tests/feature_controls.ts b/x-pack/test/apm_api_integration/tests/feature_controls.ts index e82b14d6cb7e6..edeffe1e5c296 100644 --- a/x-pack/test/apm_api_integration/tests/feature_controls.ts +++ b/x-pack/test/apm_api_integration/tests/feature_controls.ts @@ -14,7 +14,7 @@ export default function featureControlsTests({ getService }: FtrProviderContext) const supertestWithoutAuth = getService('supertestWithoutAuth'); const security = getService('security'); const spaces = getService('spaces'); - const es = getService('legacyEs'); + const es = getService('es'); const log = getService('log'); const start = encodeURIComponent(new Date(Date.now() - 10000).toISOString()); From 0551472cd90c2b29919c44ccf1c492b85e0fdb62 Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 24 Mar 2021 08:47:10 -0700 Subject: [PATCH 35/35] [jest] switch to jest-environment-jsdom (#95125) Co-authored-by: spalger Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 1 + packages/kbn-test/jest-preset.js | 2 +- x-pack/plugins/global_search_bar/jest.config.js | 3 +++ x-pack/plugins/lens/jest.config.js | 3 +++ x-pack/plugins/security_solution/jest.config.js | 3 +++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 32cf8dc1aee0f..7cb6a505eeafe 100644 --- a/package.json +++ b/package.json @@ -697,6 +697,7 @@ "jest-cli": "^26.6.3", "jest-diff": "^26.6.2", "jest-environment-jsdom-thirteen": "^1.0.1", + "jest-environment-jsdom": "^26.6.2", "jest-raw-loader": "^1.0.1", "jest-silent-reporter": "^0.2.1", "jest-snapshot": "^26.6.2", diff --git a/packages/kbn-test/jest-preset.js b/packages/kbn-test/jest-preset.js index a1475985af8df..4949d6d1f9fad 100644 --- a/packages/kbn-test/jest-preset.js +++ b/packages/kbn-test/jest-preset.js @@ -68,7 +68,7 @@ module.exports = { ], // The test environment that will be used for testing - testEnvironment: 'jest-environment-jsdom-thirteen', + testEnvironment: 'jest-environment-jsdom', // The glob patterns Jest uses to detect test files testMatch: ['**/*.test.{js,mjs,ts,tsx}'], diff --git a/x-pack/plugins/global_search_bar/jest.config.js b/x-pack/plugins/global_search_bar/jest.config.js index 73cf5402a83a9..26a6934226ec4 100644 --- a/x-pack/plugins/global_search_bar/jest.config.js +++ b/x-pack/plugins/global_search_bar/jest.config.js @@ -9,4 +9,7 @@ module.exports = { preset: '@kbn/test', rootDir: '../../..', roots: ['/x-pack/plugins/global_search_bar'], + + // TODO: migrate to "jest-environment-jsdom" https://github.com/elastic/kibana/issues/95200 + testEnvironment: 'jest-environment-jsdom-thirteen', }; diff --git a/x-pack/plugins/lens/jest.config.js b/x-pack/plugins/lens/jest.config.js index 615e540eaedce..9a3f12e1ead32 100644 --- a/x-pack/plugins/lens/jest.config.js +++ b/x-pack/plugins/lens/jest.config.js @@ -9,4 +9,7 @@ module.exports = { preset: '@kbn/test', rootDir: '../../..', roots: ['/x-pack/plugins/lens'], + + // TODO: migrate to "jest-environment-jsdom" https://github.com/elastic/kibana/issues/95202 + testEnvironment: 'jest-environment-jsdom-thirteen', }; diff --git a/x-pack/plugins/security_solution/jest.config.js b/x-pack/plugins/security_solution/jest.config.js index 700eaebf6c202..b4dcedfcceeee 100644 --- a/x-pack/plugins/security_solution/jest.config.js +++ b/x-pack/plugins/security_solution/jest.config.js @@ -9,4 +9,7 @@ module.exports = { preset: '@kbn/test', rootDir: '../../..', roots: ['/x-pack/plugins/security_solution'], + + // TODO: migrate to "jest-environment-jsdom" https://github.com/elastic/kibana/issues/95201 + testEnvironment: 'jest-environment-jsdom-thirteen', };