From 160861e6e9f4740bc12093fa5ff97506d0ac1d08 Mon Sep 17 00:00:00 2001 From: Kevin Lacabane Date: Wed, 1 Dec 2021 11:29:40 +0100 Subject: [PATCH 001/126] disable update view button (#120041) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../infra/public/components/saved_views/toolbar_control.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx b/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx index bb9e7ced40c53b..b44f3ffa20df71 100644 --- a/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx +++ b/x-pack/plugins/infra/public/components/saved_views/toolbar_control.tsx @@ -176,7 +176,7 @@ export function SavedViewsToolbarControls(props: Props) { data-test-subj="savedViews-updateView" iconType={'refresh'} onClick={openUpdateModal} - disabled={!currentView || currentView.id === '0'} + isDisabled={!currentView || currentView.id === '0'} label={i18n.translate('xpack.infra.savedView.updateView', { defaultMessage: 'Update view', })} From 6b6244784f3f45ee6bcc85a9da6d89fdb926c7fd Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 1 Dec 2021 11:56:55 +0100 Subject: [PATCH 002/126] Remove deprecated imports (#119423) --- .../vis_types/timelion/public/async_services.ts | 11 +++++++++++ .../public/components/timelion_vis_component.tsx | 6 +----- .../public/helpers/timelion_request_handler.ts | 7 ++++--- .../vis_types/timelion/public/timelion_vis_fn.ts | 9 ++++----- .../timelion/public/timelion_vis_renderer.tsx | 6 ++++-- .../vis_types/timeseries/common/types/index.ts | 3 ++- .../vis_data/request_processors/annotations/query.ts | 11 +++++------ .../request_processors/series/filter_ratios.js | 6 +++--- .../lib/vis_data/request_processors/series/query.js | 8 ++++---- .../request_processors/series/split_by_filter.js | 4 ++-- .../request_processors/series/split_by_filters.js | 4 ++-- .../request_processors/table/filter_ratios.ts | 6 +++--- .../lib/vis_data/request_processors/table/query.ts | 6 +++--- .../request_processors/table/split_by_everything.ts | 4 ++-- .../request_processors/table/split_by_terms.ts | 4 ++-- src/plugins/vis_types/vega/public/async_services.ts | 11 +++++++++++ .../vega/public/components/vega_vis_component.tsx | 6 +----- src/plugins/vis_types/vega/public/vega_fn.ts | 2 +- .../vis_types/vega/public/vega_request_handler.ts | 7 ++++--- .../vis_types/vega/public/vega_vis_renderer.tsx | 6 ++++-- .../public/embeddable/visualize_embeddable.tsx | 2 +- src/plugins/visualize/common/locator.ts | 3 ++- src/plugins/visualize/public/application/types.ts | 3 ++- .../utils/use/use_linked_search_updates.ts | 2 +- .../visualize/public/application/utils/utils.ts | 2 +- .../lens/public/embeddable/embeddable.test.tsx | 3 ++- x-pack/plugins/lens/public/embeddable/embeddable.tsx | 2 +- .../lens/public/indexpattern_datasource/datapanel.tsx | 9 +++++---- .../public/indexpattern_datasource/field_item.tsx | 11 +++-------- .../indexpattern_datasource/fields_accordion.tsx | 3 ++- .../operations/definitions/formula/validation.ts | 6 +++--- .../operations/definitions/terms/index.tsx | 10 +++++++--- .../lens/public/persistence/filter_references.test.ts | 2 +- x-pack/plugins/lens/public/state_management/types.ts | 3 ++- x-pack/plugins/lens/public/types.ts | 3 ++- .../lens/server/migrations/saved_object_migrations.ts | 3 ++- x-pack/plugins/lens/server/migrations/types.ts | 3 ++- 37 files changed, 112 insertions(+), 85 deletions(-) create mode 100644 src/plugins/vis_types/timelion/public/async_services.ts create mode 100644 src/plugins/vis_types/vega/public/async_services.ts diff --git a/src/plugins/vis_types/timelion/public/async_services.ts b/src/plugins/vis_types/timelion/public/async_services.ts new file mode 100644 index 00000000000000..28e36d18d8df5d --- /dev/null +++ b/src/plugins/vis_types/timelion/public/async_services.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// re-export async parts from a single file to not create separate asyn bundles +export { getTimelionRequestHandler } from './helpers/timelion_request_handler'; +export { TimelionVisComponent } from './components/timelion_vis_component'; diff --git a/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx b/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx index e6d2638bedf480..cb2ba498a06647 100644 --- a/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx +++ b/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx @@ -93,7 +93,7 @@ const renderYAxis = (series: Series[]) => { return yAxis.length ? yAxis : ; }; -const TimelionVisComponent = ({ +export const TimelionVisComponent = ({ interval, seriesList, renderComplete, @@ -238,7 +238,3 @@ const TimelionVisComponent = ({ ); }; - -// default export required for React.Lazy -// eslint-disable-next-line import/no-default-export -export { TimelionVisComponent as default }; diff --git a/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts b/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts index 69a818b4ae16e5..b613379d4d7c45 100644 --- a/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts +++ b/src/plugins/vis_types/timelion/public/helpers/timelion_request_handler.ts @@ -9,7 +9,8 @@ import { i18n } from '@kbn/i18n'; import type { KibanaExecutionContext } from 'kibana/public'; import { DataView } from 'src/plugins/data/common'; -import { KibanaContext, TimeRange, Filter, esQuery, Query } from '../../../../data/public'; +import { Filter, buildEsQuery } from '@kbn/es-query'; +import { KibanaContext, TimeRange, Query, getEsQueryConfig } from '../../../../data/public'; import { TimelionVisDependencies } from '../plugin'; import { getTimezone } from './get_timezone'; import { TimelionVisParams } from '../timelion_vis_fn'; @@ -90,7 +91,7 @@ export function getTimelionRequestHandler({ .catch(() => undefined); } - const esQueryConfigs = esQuery.getEsQueryConfig(uiSettings); + const esQueryConfigs = getEsQueryConfig(uiSettings); // parse the time range client side to make sure it behaves like other charts const timeRangeBounds = timefilter.calculateBounds(timeRange); @@ -109,7 +110,7 @@ export function getTimelionRequestHandler({ sheet: [expression], extended: { es: { - filter: esQuery.buildEsQuery(dataView, query, filters, esQueryConfigs), + filter: buildEsQuery(dataView, query, filters, esQueryConfigs), }, }, time: { diff --git a/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts b/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts index dd3dfd5cd60a0a..2ace7af163042e 100644 --- a/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts +++ b/src/plugins/vis_types/timelion/public/timelion_vis_fn.ts @@ -8,14 +8,12 @@ import { get } from 'lodash'; import { i18n } from '@kbn/i18n'; +import { Filter } from '@kbn/es-query'; import { ExpressionFunctionDefinition, Render } from 'src/plugins/expressions/public'; -import { - getTimelionRequestHandler, - TimelionSuccessResponse, -} from './helpers/timelion_request_handler'; +import { TimelionSuccessResponse } from './helpers/timelion_request_handler'; import { TIMELION_VIS_NAME } from './timelion_vis_type'; import { TimelionVisDependencies } from './plugin'; -import { KibanaContext, Filter, Query, TimeRange } from '../../../data/public'; +import { KibanaContext, Query, TimeRange } from '../../../data/public'; type Input = KibanaContext | null; type Output = Promise>; @@ -60,6 +58,7 @@ export const getTimelionVisualizationConfig = ( }, }, async fn(input, args, { getSearchSessionId, getExecutionContext }) { + const { getTimelionRequestHandler } = await import('./async_services'); const timelionRequestHandler = getTimelionRequestHandler(dependencies); const visParams = { expression: args.expression, interval: args.interval }; diff --git a/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx b/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx index 1ee88e06bad8b4..3c9fb1b1b268fe 100644 --- a/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx +++ b/src/plugins/vis_types/timelion/public/timelion_vis_renderer.tsx @@ -17,7 +17,9 @@ import { TimelionRenderValue } from './timelion_vis_fn'; import { UI_SETTINGS } from '../common/constants'; import { RangeFilterParams } from '../../../data/public'; -const TimelionVisComponent = lazy(() => import('./components/timelion_vis_component')); +const LazyTimelionVisComponent = lazy(() => + import('./async_services').then(({ TimelionVisComponent }) => ({ default: TimelionVisComponent })) +); const TimelionVisLegacyComponent = lazy(() => import('./legacy/timelion_vis_component')); export const getTimelionVisRenderer: ( @@ -36,7 +38,7 @@ export const getTimelionVisRenderer: ( const VisComponent = deps.uiSettings.get(UI_SETTINGS.LEGACY_CHARTS_LIBRARY, false) ? TimelionVisLegacyComponent - : TimelionVisComponent; + : LazyTimelionVisComponent; const onBrushEvent = (rangeFilterParams: RangeFilterParams) => { handlers.event({ diff --git a/src/plugins/vis_types/timeseries/common/types/index.ts b/src/plugins/vis_types/timeseries/common/types/index.ts index 5e04fee0d015ce..7a355328026788 100644 --- a/src/plugins/vis_types/timeseries/common/types/index.ts +++ b/src/plugins/vis_types/timeseries/common/types/index.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { Filter, IndexPattern, Query } from '../../../../data/common'; +import { Filter } from '@kbn/es-query'; +import { IndexPattern, Query } from '../../../../data/common'; import { Panel } from './panel_model'; export type { Metric, Series, Panel, MetricType } from './panel_model'; diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/annotations/query.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/annotations/query.ts index f1b11a780fec82..1400702a47fd5a 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/annotations/query.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/annotations/query.ts @@ -6,9 +6,10 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { getBucketSize, getTimerange, overwrite } from '../../helpers'; import { validateField } from '../../../../../common/fields_utils'; -import { esQuery, UI_SETTINGS } from '../../../../../../../data/server'; +import { UI_SETTINGS } from '../../../../../../../data/server'; import type { AnnotationsRequestProcessorsFunction } from './types'; @@ -37,7 +38,7 @@ export const query: AnnotationsRequestProcessorsFunction = ({ const queries = !annotation.ignore_global_filters ? req.body.query : []; const filters = !annotation.ignore_global_filters ? req.body.filters : []; - doc.query = esQuery.buildEsQuery(indexPattern, queries, filters, esQueryConfig); + doc.query = buildEsQuery(indexPattern, queries, filters, esQueryConfig); const boolFilters: unknown[] = [ { @@ -52,13 +53,11 @@ export const query: AnnotationsRequestProcessorsFunction = ({ ]; if (annotation.query_string) { - boolFilters.push( - esQuery.buildEsQuery(indexPattern, [annotation.query_string], [], esQueryConfig) - ); + boolFilters.push(buildEsQuery(indexPattern, [annotation.query_string], [], esQueryConfig)); } if (!annotation.ignore_panel_filters && panel.filter) { - boolFilters.push(esQuery.buildEsQuery(indexPattern, [panel.filter], [], esQueryConfig)); + boolFilters.push(buildEsQuery(indexPattern, [panel.filter], [], esQueryConfig)); } if (annotation.fields) { diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js index 32e9a1ea0aa907..0aaf0110537188 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/filter_ratios.js @@ -6,9 +6,9 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { bucketTransform } from '../../helpers/bucket_transform'; import { overwrite } from '../../helpers'; -import { esQuery } from '../../../../../../../data/server'; const filter = (metric) => metric.type === 'filter_ratio'; @@ -19,12 +19,12 @@ export function ratios(req, panel, series, esQueryConfig, seriesIndex) { overwrite( doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-numerator.filter`, - esQuery.buildEsQuery(seriesIndex.indexPattern, metric.numerator, [], esQueryConfig) + buildEsQuery(seriesIndex.indexPattern, metric.numerator, [], esQueryConfig) ); overwrite( doc, `aggs.${series.id}.aggs.timeseries.aggs.${metric.id}-denominator.filter`, - esQuery.buildEsQuery(seriesIndex.indexPattern, metric.denominator, [], esQueryConfig) + buildEsQuery(seriesIndex.indexPattern, metric.denominator, [], esQueryConfig) ); let numeratorPath = `${metric.id}-numerator>_count`; diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/query.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/query.js index f745a7bf7ad745..0e700121bf9708 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/query.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/query.js @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { offsetTime } from '../../offset_time'; -import { esQuery } from '../../../../../../../data/server'; export function query( req, @@ -29,7 +29,7 @@ export function query( const queries = !ignoreGlobalFilter ? req.body.query : []; const filters = !ignoreGlobalFilter ? req.body.filters : []; - doc.query = esQuery.buildEsQuery(seriesIndex.indexPattern, queries, filters, esQueryConfig); + doc.query = buildEsQuery(seriesIndex.indexPattern, queries, filters, esQueryConfig); const timerange = { range: { @@ -44,13 +44,13 @@ export function query( if (panel.filter) { doc.query.bool.must.push( - esQuery.buildEsQuery(seriesIndex.indexPattern, [panel.filter], [], esQueryConfig) + buildEsQuery(seriesIndex.indexPattern, [panel.filter], [], esQueryConfig) ); } if (series.filter) { doc.query.bool.must.push( - esQuery.buildEsQuery(seriesIndex.indexPattern, [series.filter], [], esQueryConfig) + buildEsQuery(seriesIndex.indexPattern, [series.filter], [], esQueryConfig) ); } diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filter.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filter.js index b7e7754d05f81f..b6bb6d81c981a0 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filter.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filter.js @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { overwrite } from '../../helpers'; -import { esQuery } from '../../../../../../../data/server'; export function splitByFilter(req, panel, series, esQueryConfig, seriesIndex) { return (next) => (doc) => { @@ -18,7 +18,7 @@ export function splitByFilter(req, panel, series, esQueryConfig, seriesIndex) { overwrite( doc, `aggs.${series.id}.filter`, - esQuery.buildEsQuery(seriesIndex.indexPattern, [series.filter], [], esQueryConfig) + buildEsQuery(seriesIndex.indexPattern, [series.filter], [], esQueryConfig) ); return next(doc); diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filters.js b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filters.js index 5e8def5db771e9..0778afef34cd05 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filters.js +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/series/split_by_filters.js @@ -6,14 +6,14 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { overwrite } from '../../helpers'; -import { esQuery } from '../../../../../../../data/server'; export function splitByFilters(req, panel, series, esQueryConfig, seriesIndex) { return (next) => (doc) => { if (series.split_mode === 'filters' && series.split_filters) { series.split_filters.forEach((filter) => { - const builtEsQuery = esQuery.buildEsQuery( + const builtEsQuery = buildEsQuery( seriesIndex.indexPattern, [filter.filter], [], diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/filter_ratios.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/filter_ratios.ts index b6036a03ba464a..280195e94d07b8 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/filter_ratios.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/filter_ratios.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { esQuery } from '../../../../../../../data/server'; +import { buildEsQuery } from '@kbn/es-query'; import { overwrite, bucketTransform } from '../../helpers'; import { calculateAggRoot } from './calculate_agg_root'; @@ -30,12 +30,12 @@ export const filterRatios: TableRequestProcessorsFunction = ({ overwrite( doc, `${aggRoot}.timeseries.aggs.${metric.id}-numerator.filter`, - esQuery.buildEsQuery(indexPattern, metric.numerator!, [], esQueryConfig) + buildEsQuery(indexPattern, metric.numerator!, [], esQueryConfig) ); overwrite( doc, `${aggRoot}.timeseries.aggs.${metric.id}-denominator.filter`, - esQuery.buildEsQuery(indexPattern, metric.denominator!, [], esQueryConfig) + buildEsQuery(indexPattern, metric.denominator!, [], esQueryConfig) ); let numeratorPath = `${metric.id}-numerator>_count`; diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/query.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/query.ts index 76c4649ee57382..d92aa1317b9714 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/query.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/query.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { getTimerange, overwrite } from '../../helpers'; -import { esQuery } from '../../../../../../../data/server'; import type { TableRequestProcessorsFunction } from './types'; export const query: TableRequestProcessorsFunction = @@ -22,7 +22,7 @@ export const query: TableRequestProcessorsFunction = const queries = !panel.ignore_global_filter ? req.body.query : []; const filters = !panel.ignore_global_filter ? req.body.filters : []; - doc.query = esQuery.buildEsQuery(indexPattern, queries, filters, esQueryConfig); + doc.query = buildEsQuery(indexPattern, queries, filters, esQueryConfig); const boolFilters: unknown[] = []; @@ -40,7 +40,7 @@ export const query: TableRequestProcessorsFunction = boolFilters.push(timerange); } if (panel.filter) { - boolFilters.push(esQuery.buildEsQuery(indexPattern, [panel.filter], [], esQueryConfig)); + boolFilters.push(buildEsQuery(indexPattern, [panel.filter], [], esQueryConfig)); } overwrite(doc, 'query.bool.must', boolFilters); diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts index e0e1485f6a8ff4..91c13ed08f8a8a 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { overwrite } from '../../helpers'; -import { esQuery } from '../../../../../../../data/server'; import type { TableRequestProcessorsFunction } from './types'; @@ -24,7 +24,7 @@ export const splitByEverything: TableRequestProcessorsFunction = overwrite( doc, `aggs.pivot.aggs.${column.id}.filter`, - esQuery.buildEsQuery(indexPattern, [column.filter], [], esQueryConfig) + buildEsQuery(indexPattern, [column.filter], [], esQueryConfig) ); } else { overwrite(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {}); diff --git a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_terms.ts b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_terms.ts index 1a4e0f6ceb1b5d..0cc130ee45ebd1 100644 --- a/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_terms.ts +++ b/src/plugins/vis_types/timeseries/server/lib/vis_data/request_processors/table/split_by_terms.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ +import { buildEsQuery } from '@kbn/es-query'; import { overwrite } from '../../helpers'; -import { esQuery } from '../../../../../../../data/server'; import type { TableRequestProcessorsFunction } from './types'; @@ -29,7 +29,7 @@ export const splitByTerms: TableRequestProcessorsFunction = ({ overwrite( doc, `aggs.pivot.aggs.${column.id}.column_filter.filter`, - esQuery.buildEsQuery(indexPattern, [column.filter], [], esQueryConfig) + buildEsQuery(indexPattern, [column.filter], [], esQueryConfig) ); } }); diff --git a/src/plugins/vis_types/vega/public/async_services.ts b/src/plugins/vis_types/vega/public/async_services.ts new file mode 100644 index 00000000000000..fd9ed751c40a8c --- /dev/null +++ b/src/plugins/vis_types/vega/public/async_services.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// re-export async parts from a single file to not create separate asyn bundles +export { createVegaRequestHandler } from './vega_request_handler'; +export { VegaVisComponent } from './components/vega_vis_component'; diff --git a/src/plugins/vis_types/vega/public/components/vega_vis_component.tsx b/src/plugins/vis_types/vega/public/components/vega_vis_component.tsx index 2639f39abd0993..d01e6425aa24b7 100644 --- a/src/plugins/vis_types/vega/public/components/vega_vis_component.tsx +++ b/src/plugins/vis_types/vega/public/components/vega_vis_component.tsx @@ -27,7 +27,7 @@ interface VegaVisComponentProps { type VegaVisController = InstanceType>; -const VegaVisComponent = ({ +export const VegaVisComponent = ({ visData, fireEvent, renderComplete, @@ -75,7 +75,3 @@ const VegaVisComponent = ({ ); }; - -// default export required for React.Lazy -// eslint-disable-next-line import/no-default-export -export { VegaVisComponent as default }; diff --git a/src/plugins/vis_types/vega/public/vega_fn.ts b/src/plugins/vis_types/vega/public/vega_fn.ts index cbdc131ab7e2a4..36a534545f0784 100644 --- a/src/plugins/vis_types/vega/public/vega_fn.ts +++ b/src/plugins/vis_types/vega/public/vega_fn.ts @@ -15,7 +15,6 @@ import { Render, } from '../../../expressions/public'; import { VegaVisualizationDependencies } from './plugin'; -import { createVegaRequestHandler } from './vega_request_handler'; import { VegaInspectorAdapters } from './vega_inspector/index'; import { KibanaContext, TimeRange, Query } from '../../../data/public'; import { VegaParser } from './data_model/vega_parser'; @@ -60,6 +59,7 @@ export const createVegaFn = ( }, }, async fn(input, args, context) { + const { createVegaRequestHandler } = await import('./async_services'); const vegaRequestHandler = createVegaRequestHandler(dependencies, context); const response = await vegaRequestHandler({ diff --git a/src/plugins/vis_types/vega/public/vega_request_handler.ts b/src/plugins/vis_types/vega/public/vega_request_handler.ts index 78552ea2a170ac..bf4aeb790c9f1e 100644 --- a/src/plugins/vis_types/vega/public/vega_request_handler.ts +++ b/src/plugins/vis_types/vega/public/vega_request_handler.ts @@ -7,7 +7,8 @@ */ import type { KibanaExecutionContext } from 'src/core/public'; import { DataView } from 'src/plugins/data/common'; -import { Filter, esQuery, TimeRange, Query } from '../../../data/public'; +import { Filter, buildEsQuery } from '@kbn/es-query'; +import { getEsQueryConfig, TimeRange, Query } from '../../../data/public'; import { SearchAPI } from './data_model/search_api'; import { TimeCache } from './data_model/time_cache'; @@ -72,8 +73,8 @@ export function createVegaRequestHandler( dataView = await dataViews.get(firstFilterIndex).catch(() => undefined); } - const esQueryConfigs = esQuery.getEsQueryConfig(uiSettings); - const filtersDsl = esQuery.buildEsQuery(dataView, query, filters, esQueryConfigs); + const esQueryConfigs = getEsQueryConfig(uiSettings); + const filtersDsl = buildEsQuery(dataView, query, filters, esQueryConfigs); const { VegaParser } = await import('./data_model/vega_parser'); const vp = new VegaParser(visParams.spec, searchAPI, timeCache, filtersDsl, getServiceSettings); diff --git a/src/plugins/vis_types/vega/public/vega_vis_renderer.tsx b/src/plugins/vis_types/vega/public/vega_vis_renderer.tsx index b2f10c37c79053..a7bab7f0f08609 100644 --- a/src/plugins/vis_types/vega/public/vega_vis_renderer.tsx +++ b/src/plugins/vis_types/vega/public/vega_vis_renderer.tsx @@ -14,7 +14,9 @@ import { KibanaThemeProvider } from '../../../kibana_react/public'; import { VisualizationContainer } from '../../../visualizations/public'; import { VegaVisualizationDependencies } from './plugin'; import { RenderValue } from './vega_fn'; -const VegaVisComponent = lazy(() => import('./components/vega_vis_component')); +const LazyVegaVisComponent = lazy(() => + import('./async_services').then(({ VegaVisComponent }) => ({ default: VegaVisComponent })) +); export const getVegaVisRenderer: ( deps: VegaVisualizationDependencies @@ -29,7 +31,7 @@ export const getVegaVisRenderer: ( render( - = { geo_shape: i18n.translate('xpack.lens.datatypes.geoShape', { defaultMessage: 'geo_shape' }), }; -// Wrapper around esQuery.buildEsQuery, handling errors (e.g. because a query can't be parsed) by +// Wrapper around buildEsQuery, handling errors (e.g. because a query can't be parsed) by // returning a query dsl object not matching anything function buildSafeEsQuery( indexPattern: IndexPattern, @@ -102,7 +103,7 @@ function buildSafeEsQuery( queryConfig: EsQueryConfig ) { try { - return esQuery.buildEsQuery(indexPattern, query, filters, queryConfig); + return buildEsQuery(indexPattern, query, filters, queryConfig); } catch (e) { return { bool: { @@ -170,7 +171,7 @@ export function IndexPatternDataPanel({ indexPatterns[currentIndexPatternId], query, filters, - esQuery.getEsQueryConfig(core.uiSettings) + getEsQueryConfig(core.uiSettings) ); return ( 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 f84650a183f318..4555a990d1b271 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/field_item.tsx @@ -39,12 +39,12 @@ import { i18n } from '@kbn/i18n'; import { FieldButton } from '@kbn/react-field/field_button'; import type { FieldFormatsStart } from 'src/plugins/field_formats/public'; import { EuiHighlight } from '@elastic/eui'; +import { Filter, buildEsQuery } from '@kbn/es-query'; import { Query, KBN_FIELD_TYPES, ES_FIELD_TYPES, - Filter, - esQuery, + getEsQueryConfig, } from '../../../../../src/plugins/data/public'; import { ChartsPluginSetup } from '../../../../../src/plugins/charts/public'; import { DragDrop, DragDropIdentifier } from '../drag_drop'; @@ -167,12 +167,7 @@ export const InnerFieldItem = function InnerFieldItem(props: FieldItemProps) { core.http .post>(`/api/lens/index_stats/${indexPattern.id}/field`, { body: JSON.stringify({ - dslQuery: esQuery.buildEsQuery( - indexPattern, - query, - filters, - esQuery.getEsQueryConfig(core.uiSettings) - ), + dslQuery: buildEsQuery(indexPattern, query, filters, getEsQueryConfig(core.uiSettings)), fromDate: dateRange.fromDate, toDate: dateRange.toDate, fieldName: field.name, 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 6a89d1770743cc..d2c5801908f6ff 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/fields_accordion.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/fields_accordion.tsx @@ -18,9 +18,10 @@ import { } from '@elastic/eui'; import classNames from 'classnames'; import { FieldFormatsStart } from 'src/plugins/field_formats/public'; +import { Filter } from '@kbn/es-query'; import { IndexPatternField } from './types'; import { FieldItem } from './field_item'; -import { Query, Filter } from '../../../../../src/plugins/data/public'; +import { Query } from '../../../../../src/plugins/data/public'; import { DatasourceDataPanelProps } from '../types'; import { IndexPattern } from './types'; import { ChartsPluginSetup } from '../../../../../src/plugins/charts/public'; diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts index d6b9a1fff8e9d2..559e03c4fe9eaa 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/formula/validation.ts @@ -9,7 +9,7 @@ import { isObject, partition } from 'lodash'; import { i18n } from '@kbn/i18n'; import { parse, TinymathLocation, TinymathVariable } from '@kbn/tinymath'; import type { TinymathAST, TinymathFunction, TinymathNamedArgument } from '@kbn/tinymath'; -import { esKuery, esQuery } from '../../../../../../../../src/plugins/data/public'; +import { luceneStringToDsl, toElasticsearchQuery, fromKueryExpression } from '@kbn/es-query'; import { findMathNodes, findVariables, @@ -190,9 +190,9 @@ export const getQueryValidationError = ( } try { if (language === 'kql') { - esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(query), indexPattern); + toElasticsearchQuery(fromKueryExpression(query), indexPattern); } else { - esQuery.luceneStringToDsl(query); + luceneStringToDsl(query); } return; } catch (e) { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx index 6489a43cf2f85c..78894274db168e 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/operations/definitions/terms/index.tsx @@ -18,8 +18,12 @@ import { } from '@elastic/eui'; import { uniq } from 'lodash'; import { CoreStart } from 'kibana/public'; +import { buildEsQuery } from '@kbn/es-query'; import { FieldStatsResponse } from '../../../../../common'; -import { AggFunctionsMapping, esQuery } from '../../../../../../../../src/plugins/data/public'; +import { + AggFunctionsMapping, + getEsQueryConfig, +} from '../../../../../../../../src/plugins/data/public'; import { buildExpressionFunction } from '../../../../../../../../src/plugins/expressions/public'; import { updateColumnParam, isReferenced } from '../../layer_helpers'; import { DataType, FrameDatasourceAPI } from '../../../../types'; @@ -94,11 +98,11 @@ function getDisallowedTermsMessage( { body: JSON.stringify({ fieldName, - dslQuery: esQuery.buildEsQuery( + dslQuery: buildEsQuery( indexPattern, frame.query, frame.filters, - esQuery.getEsQueryConfig(core.uiSettings) + getEsQueryConfig(core.uiSettings) ), fromDate: frame.dateRange.fromDate, toDate: frame.dateRange.toDate, diff --git a/x-pack/plugins/lens/public/persistence/filter_references.test.ts b/x-pack/plugins/lens/public/persistence/filter_references.test.ts index 9f31460a9b836d..8a86c6fdc96645 100644 --- a/x-pack/plugins/lens/public/persistence/filter_references.test.ts +++ b/x-pack/plugins/lens/public/persistence/filter_references.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Filter } from 'src/plugins/data/public'; +import { Filter } from '@kbn/es-query'; import { extractFilterReferences, injectFilterReferences } from './filter_references'; import { FilterStateStore } from 'src/plugins/data/common'; diff --git a/x-pack/plugins/lens/public/state_management/types.ts b/x-pack/plugins/lens/public/state_management/types.ts index e46c685925b20c..8c18a2a6082b55 100644 --- a/x-pack/plugins/lens/public/state_management/types.ts +++ b/x-pack/plugins/lens/public/state_management/types.ts @@ -7,7 +7,8 @@ import { VisualizeFieldContext } from 'src/plugins/ui_actions/public'; import { EmbeddableEditorState } from 'src/plugins/embeddable/public'; -import { Filter, Query, SavedQuery } from '../../../../../src/plugins/data/public'; +import { Filter } from '@kbn/es-query'; +import { Query, SavedQuery } from '../../../../../src/plugins/data/public'; import { Document } from '../persistence'; import { TableInspectorAdapter } from '../editor_frame_service/types'; diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 35620982447a57..da1db7727aff7e 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -9,6 +9,7 @@ import type { IconType } from '@elastic/eui/src/components/icon/icon'; import type { CoreSetup, SavedObjectReference } from 'kibana/public'; import type { PaletteOutput } from 'src/plugins/charts/public'; import type { MutableRefObject } from 'react'; +import { Filter } from '@kbn/es-query'; import type { ExpressionAstExpression, ExpressionRendererEvent, @@ -17,7 +18,7 @@ import type { } from '../../../../src/plugins/expressions/public'; import { DraggingIdentifier, DragDropIdentifier, DragContextState } from './drag_drop'; import type { DateRange, LayerType } from '../common'; -import type { Query, Filter } from '../../../../src/plugins/data/public'; +import type { Query } from '../../../../src/plugins/data/public'; import type { RangeSelectContext, ValueClickContext, diff --git a/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts b/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts index 5982d9ea1e9b51..fb3718cf2d2131 100644 --- a/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts +++ b/x-pack/plugins/lens/server/migrations/saved_object_migrations.ts @@ -13,7 +13,8 @@ import { SavedObjectReference, SavedObjectUnsanitizedDoc, } from 'src/core/server'; -import { Query, Filter } from 'src/plugins/data/public'; +import { Filter } from '@kbn/es-query'; +import { Query } from 'src/plugins/data/public'; import { PersistableFilter } from '../../common'; import { LensDocShapePost712, diff --git a/x-pack/plugins/lens/server/migrations/types.ts b/x-pack/plugins/lens/server/migrations/types.ts index 2e6e66aed9949e..43a0f5524f6195 100644 --- a/x-pack/plugins/lens/server/migrations/types.ts +++ b/x-pack/plugins/lens/server/migrations/types.ts @@ -6,7 +6,8 @@ */ import type { PaletteOutput } from 'src/plugins/charts/common'; -import { Query, Filter } from 'src/plugins/data/public'; +import { Filter } from '@kbn/es-query'; +import { Query } from 'src/plugins/data/public'; import type { CustomPaletteParams, LayerType } from '../../common'; export type OperationTypePre712 = From 8cf76a32b50c7a724fed79669d875c2a60506d1d Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Wed, 1 Dec 2021 03:17:41 -0800 Subject: [PATCH 003/126] [ci] Include ciBuildJobId in APM globalLabels (#120008) --- packages/kbn-apm-config-loader/src/config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/kbn-apm-config-loader/src/config.ts b/packages/kbn-apm-config-loader/src/config.ts index 6cc0bcdb3f84a3..303ec931eeda0e 100644 --- a/packages/kbn-apm-config-loader/src/config.ts +++ b/packages/kbn-apm-config-loader/src/config.ts @@ -228,6 +228,7 @@ export class ApmConfiguration { targetBranch: process.env.GITHUB_PR_TARGET_BRANCH || '', ciBuildNumber: process.env.BUILDKITE_BUILD_NUMBER || '', ciBuildId: process.env.BUILDKITE_BUILD_ID || '', + ciBuildJobId: process.env.BUILDKITE_JOB_ID || '', isPr: process.env.BUILDKITE_PULL_REQUEST ? true : false, prId: process.env.BUILDKITE_PULL_REQUEST || '', }, From 048aec5137f502075e581293cd767ee9adfea16c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20St=C3=BCrmer?= Date: Wed, 1 Dec 2021 12:27:40 +0100 Subject: [PATCH 004/126] [Metrics UI] Stabilize home page tests (#120010) --- .../waffle/waffle_time_controls.tsx | 1 + .../test/functional/apps/infra/home_page.ts | 6 ++--- .../page_objects/infra_home_page.ts | 25 ++++++++++++++++--- .../page_objects/infra_saved_views.ts | 7 ++++-- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx index d6be501ec8f241..eda92f8dfb0ea0 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx @@ -58,6 +58,7 @@ export const WaffleTimeControls = withTheme(({ interval }: Props) => { delay="long" display="inlineBlock" position="top" + data-test-subj="waffleDatePickerIntervalTooltip" > { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/119763 - describe.skip('with metrics present', () => { + describe('with metrics present', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await pageObjects.common.navigateToApp('infraOps'); @@ -168,8 +167,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/106650 - describe.skip('Saved Views', () => { + describe('Saved Views', () => { before(() => esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs')); after(() => esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs')); it('should have save and load controls', async () => { diff --git a/x-pack/test/functional/page_objects/infra_home_page.ts b/x-pack/test/functional/page_objects/infra_home_page.ts index 4ab0cf61b7a174..84dc39ae13b46c 100644 --- a/x-pack/test/functional/page_objects/infra_home_page.ts +++ b/x-pack/test/functional/page_objects/infra_home_page.ts @@ -23,8 +23,16 @@ export function InfraHomePageProvider({ getService, getPageObjects }: FtrProvide const datePickerInput = await find.byCssSelector( `${testSubjSelector('waffleDatePicker')} .euiDatePicker.euiFieldText` ); - await datePickerInput.clearValueWithKeyboard({ charByChar: true }); - await datePickerInput.type([time, browser.keys.RETURN]); + + // explicitly focus to trigger tooltip + await datePickerInput.focus(); + + await datePickerInput.clearValueWithKeyboard(); + await datePickerInput.type(time); + + // dismiss the tooltip, which won't be hidden because blur doesn't happen reliably + await testSubjects.click('waffleDatePickerIntervalTooltip'); + await this.waitForLoading(); }, @@ -105,13 +113,22 @@ export function InfraHomePageProvider({ getService, getPageObjects }: FtrProvide async enterSearchTerm(query: string) { const input = await this.clearSearchTerm(); - await input.type([query, browser.keys.RETURN]); + await input.type(query); + + // wait for input value to echo the input before submitting + // this ensures the React state has caught up with the events + await retry.try(async () => { + const value = await input.getAttribute('value'); + expect(value).to.eql(query); + }); + + await input.type(browser.keys.RETURN); await this.waitForLoading(); }, async clearSearchTerm() { const input = await testSubjects.find('infraSearchField'); - await input.clearValueWithKeyboard({ charByChar: true }); + await input.clearValueWithKeyboard(); return input; }, diff --git a/x-pack/test/functional/page_objects/infra_saved_views.ts b/x-pack/test/functional/page_objects/infra_saved_views.ts index 9437dd05d644c7..70516cd10aab38 100644 --- a/x-pack/test/functional/page_objects/infra_saved_views.ts +++ b/x-pack/test/functional/page_objects/infra_saved_views.ts @@ -10,6 +10,7 @@ import { Key } from 'selenium-webdriver'; import { FtrProviderContext } from '../ftr_provider_context'; export function InfraSavedViewsProvider({ getService }: FtrProviderContext) { + const retry = getService('retry'); const testSubjects = getService('testSubjects'); const browser = getService('browser'); @@ -74,8 +75,10 @@ export function InfraSavedViewsProvider({ getService }: FtrProviderContext) { }, async ensureViewIsLoaded(name: string) { - const subject = await testSubjects.find('savedViews-openPopover'); - expect(await subject.getVisibleText()).to.be(name); + await retry.try(async () => { + const subject = await testSubjects.find('savedViews-openPopover'); + expect(await subject.getVisibleText()).to.be(name); + }); }, async ensureViewIsLoadable(name: string) { From 79079a7bab5be1047f4fac331dbce1a556b9c013 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+Dmitriynj@users.noreply.github.com> Date: Wed, 1 Dec 2021 14:28:47 +0300 Subject: [PATCH 005/126] [Discover] Fix csv report for filtered discover result on dashboard (#119583) * [Discover] fix csv report for filtered discover result on dashboard * [Discover] fix tests * [Discover] add functional test * [Discover] fix the case when timeFilter was not applied, but others filters were applied for non time based data views Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../discover/public/utils/get_sharing_data.ts | 17 ++++++-- .../reporting/__snapshots__/download_csv.snap | 31 ++++++++++++++ .../apps/dashboard/reporting/download_csv.ts | 42 ++++++++++++++++++- 3 files changed, 86 insertions(+), 4 deletions(-) diff --git a/src/plugins/discover/public/utils/get_sharing_data.ts b/src/plugins/discover/public/utils/get_sharing_data.ts index a8e210c9808108..b4006a691afca0 100644 --- a/src/plugins/discover/public/utils/get_sharing_data.ts +++ b/src/plugins/discover/public/utils/get_sharing_data.ts @@ -9,7 +9,7 @@ import type { Capabilities } from 'kibana/public'; import type { IUiSettingsClient } from 'kibana/public'; import type { DataPublicPluginStart } from 'src/plugins/data/public'; -import type { ISearchSource, SearchSourceFields } from 'src/plugins/data/common'; +import type { Filter, ISearchSource, SearchSourceFields } from 'src/plugins/data/common'; import { DOC_HIDE_TIME_COLUMN_SETTING, SORT_DEFAULT_ORDER_SETTING } from '../../common'; import type { SavedSearch, SortOrder } from '../services/saved_searches'; import { getSortForSearchSource } from '../components/doc_table'; @@ -26,6 +26,7 @@ export async function getSharingData( const { uiSettings: config, data } = services; const searchSource = currentSearchSource.createCopy(); const index = searchSource.getField('index')!; + const existingFilter = searchSource.getField('filter'); searchSource.setField( 'sort', @@ -55,11 +56,21 @@ export async function getSharingData( return { getSearchSource: (absoluteTime?: boolean): SearchSourceFields => { - const filter = absoluteTime + const timeFilter = absoluteTime ? data.query.timefilter.timefilter.createFilter(index) : data.query.timefilter.timefilter.createRelativeFilter(index); - searchSource.setField('filter', filter); + if (existingFilter && timeFilter) { + searchSource.setField( + 'filter', + Array.isArray(existingFilter) + ? [timeFilter, ...existingFilter] + : ([timeFilter, existingFilter] as Filter[]) + ); + } else { + const filter = timeFilter || existingFilter; + searchSource.setField('filter', filter); + } return searchSource.getSerializedFields(true); }, diff --git a/x-pack/test/functional/apps/dashboard/reporting/__snapshots__/download_csv.snap b/x-pack/test/functional/apps/dashboard/reporting/__snapshots__/download_csv.snap index 466f41f7d4abf7..7376ce68bec129 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/__snapshots__/download_csv.snap +++ b/x-pack/test/functional/apps/dashboard/reporting/__snapshots__/download_csv.snap @@ -562,6 +562,37 @@ exports[`dashboard Reporting Download CSV E-Commerce Data Downloads a filtered C " `; +exports[`dashboard Reporting Download CSV E-Commerce Data Downloads filtered Discover saved search report 1`] = ` +"\\"order_date\\",\\"customer_first_name\\",\\"customer_last_name\\",\\"customer_full_name\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",Betty,Reese,\\"Betty Reese\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",Betty,Brewer,\\"Betty Brewer\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",Betty,Bryant,\\"Betty Bryant\\" +\\"Jun 25, 2019 @ 00:00:00.000\\",Betty,Perkins,\\"Betty Perkins\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",Betty,Stokes,\\"Betty Stokes\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",Betty,Jackson,\\"Betty Jackson\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",Betty,Farmer,\\"Betty Farmer\\" +\\"Jun 24, 2019 @ 00:00:00.000\\",Betty,Rivera,\\"Betty Rivera\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",Betty,King,\\"Betty King\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",Betty,Graham,\\"Betty Graham\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",Betty,Allison,\\"Betty Allison\\" +\\"Jun 23, 2019 @ 00:00:00.000\\",Betty,Gilbert,\\"Betty Gilbert\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Jimenez,\\"Betty Jimenez\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Fletcher,\\"Betty Fletcher\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Mccarthy,\\"Betty Mccarthy\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Bryant,\\"Betty Bryant\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Maldonado,\\"Betty Maldonado\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Ruiz,\\"Betty Ruiz\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Morrison,\\"Betty Morrison\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Cross,\\"Betty Cross\\" +\\"Jun 22, 2019 @ 00:00:00.000\\",Betty,Swanson,\\"Betty Swanson\\" +\\"Jun 21, 2019 @ 00:00:00.000\\",Betty,Bryan,\\"Betty Bryan\\" +\\"Jun 21, 2019 @ 00:00:00.000\\",Betty,Thompson,\\"Betty Thompson\\" +\\"Jun 21, 2019 @ 00:00:00.000\\",Betty,Ramsey,\\"Betty Ramsey\\" +\\"Jun 21, 2019 @ 00:00:00.000\\",Betty,Webb,\\"Betty Webb\\" +\\"Jun 21, 2019 @ 00:00:00.000\\",Betty,Massey,\\"Betty Massey\\" +" +`; + exports[`dashboard Reporting Download CSV Field Formatters and Scripted Fields Download CSV export of a saved search panel 1`] = ` "date,\\"_id\\",name,gender,value,year,\\"years_ago\\",\\"date_informal\\" \\"Jan 1, 1982 @ 00:00:00.000\\",\\"1982-Fethany-F\\",Fethany,F,780,1982,\\"37.00000000000000000000\\",\\"Jan 1st 82\\" diff --git a/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts b/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts index 4ee61811e5f850..67f7d80deba805 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts @@ -22,7 +22,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const filterBar = getService('filterBar'); const find = getService('find'); const retry = getService('retry'); - const PageObjects = getPageObjects(['reporting', 'common', 'dashboard', 'timePicker']); + const PageObjects = getPageObjects([ + 'reporting', + 'common', + 'dashboard', + 'timePicker', + 'discover', + ]); + const dashboardAddPanel = getService('dashboardAddPanel'); const ecommerceSOPath = 'x-pack/test/functional/fixtures/kbn_archiver/reporting/ecommerce.json'; const ecommerceDataPath = 'x-pack/test/functional/es_archives/reporting/ecommerce'; @@ -121,6 +128,39 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const csvFile = await getDownload(getCsvPath('Ecommerce Data')); // file exists with proper name expect(csvFile).to.not.be(null); }); + + it('Downloads filtered Discover saved search report', async () => { + const setTimeRange = async () => { + const fromTime = 'Jun 20, 2019 @ 23:56:51.374'; + const toTime = 'Jun 25, 2019 @ 16:18:51.821'; + await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); + }; + + PageObjects.common.navigateToApp('discover'); + await setTimeRange(); + await PageObjects.discover.selectIndexPattern('ecommerce'); + await PageObjects.discover.clickNewSearchButton(); + + await PageObjects.discover.clickFieldListItemAdd('customer_first_name'); + await PageObjects.discover.clickFieldListItemAdd('customer_last_name'); + await PageObjects.discover.clickFieldListItemAdd('customer_full_name'); + await filterBar.addFilter('customer_first_name', 'is', 'Betty'); + await PageObjects.discover.saveSearch('search-by-name'); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + await setTimeRange(); + await dashboardAddPanel.addSavedSearch('search-by-name'); + await PageObjects.dashboard.saveDashboard('filtered-result'); + + await PageObjects.dashboard.clickCancelOutOfEditMode(); + await clickActionsMenu('search-by-name'); + await clickDownloadCsv(); + + const csvFile = await getDownload(getCsvPath('search-by-name')); + expectSnapshot(csvFile).toMatch(); + }); }); describe('Field Formatters and Scripted Fields', () => { From c47899fe833a514fef4ca0ffa1ca32531ddaffe0 Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Wed, 1 Dec 2021 11:51:08 +0000 Subject: [PATCH 006/126] [ML] Removes APM NodeJS and RUM Javascript modules (#119945) * [ML] Removes APM NodeJS and RUM Javascript modules * [ML] Delete unnecessary module_apm archive * [ML] Fix get_module API test --- .../modules/apm_jsbase/logo.json | 3 - .../modules/apm_jsbase/manifest.json | 53 --- .../ml/abnormal_span_durations_jsbase.json | 41 -- ...ous_error_rate_for_user_agents_jsbase.json | 40 -- ...tafeed_abnormal_span_durations_jsbase.json | 15 - ...ous_error_rate_for_user_agents_jsbase.json | 15 - .../datafeed_decreased_throughput_jsbase.json | 27 -- ...afeed_high_count_by_user_agent_jsbase.json | 16 - .../ml/decreased_throughput_jsbase.json | 37 -- .../ml/high_count_by_user_agent_jsbase.json | 38 -- .../modules/apm_nodejs/logo.json | 3 - .../modules/apm_nodejs/manifest.json | 42 -- .../ml/abnormal_span_durations_nodejs.json | 41 -- .../ml/abnormal_trace_durations_nodejs.json | 40 -- ...tafeed_abnormal_span_durations_nodejs.json | 15 - ...afeed_abnormal_trace_durations_nodejs.json | 13 - .../datafeed_decreased_throughput_nodejs.json | 27 -- .../ml/decreased_throughput_nodejs.json | 38 -- x-pack/test/api_integration/apis/ml/index.ts | 4 +- .../apis/ml/modules/get_module.ts | 2 - .../apis/ml/modules/recognize_module.ts | 10 - .../apis/ml/modules/setup_module.ts | 37 -- .../es_archives/ml/module_apm/data.json.gz | Bin 503392 -> 0 bytes .../es_archives/ml/module_apm/mappings.json | 379 ------------------ 24 files changed, 2 insertions(+), 934 deletions(-) delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/logo.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/manifest.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/abnormal_span_durations_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/anomalous_error_rate_for_user_agents_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_abnormal_span_durations_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_anomalous_error_rate_for_user_agents_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_decreased_throughput_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_high_count_by_user_agent_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/decreased_throughput_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/high_count_by_user_agent_jsbase.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/logo.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/manifest.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_span_durations_nodejs.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_trace_durations_nodejs.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_span_durations_nodejs.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_trace_durations_nodejs.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_decreased_throughput_nodejs.json delete mode 100644 x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/decreased_throughput_nodejs.json delete mode 100644 x-pack/test/functional/es_archives/ml/module_apm/data.json.gz delete mode 100644 x-pack/test/functional/es_archives/ml/module_apm/mappings.json diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/logo.json deleted file mode 100644 index 3905c809fbd7a8..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/logo.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "icon": "apmApp" -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/manifest.json deleted file mode 100644 index e463b34be0fc27..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/manifest.json +++ /dev/null @@ -1,53 +0,0 @@ -{ - "id": "apm_jsbase", - "title": "APM: RUM Javascript", - "description": "Detect problematic spans and identify user agents that are potentially causing issues.", - "type": "APM data", - "logoFile": "logo.json", - "defaultIndexPattern": "apm-*", - "query": { - "bool": { - "filter": [{ "term": { "agent.name": "js-base" } }] - } - }, - "jobs": [ - { - "id": "abnormal_span_durations_jsbase", - "file": "abnormal_span_durations_jsbase.json" - }, - { - "id": "anomalous_error_rate_for_user_agents_jsbase", - "file": "anomalous_error_rate_for_user_agents_jsbase.json" - }, - { - "id": "decreased_throughput_jsbase", - "file": "decreased_throughput_jsbase.json" - }, - { - "id": "high_count_by_user_agent_jsbase", - "file": "high_count_by_user_agent_jsbase.json" - } - ], - "datafeeds": [ - { - "id": "datafeed-abnormal_span_durations_jsbase", - "file": "datafeed_abnormal_span_durations_jsbase.json", - "job_id": "abnormal_span_durations_jsbase" - }, - { - "id": "datafeed-anomalous_error_rate_for_user_agents_jsbase", - "file": "datafeed_anomalous_error_rate_for_user_agents_jsbase.json", - "job_id": "anomalous_error_rate_for_user_agents_jsbase" - }, - { - "id": "datafeed-decreased_throughput_jsbase", - "file": "datafeed_decreased_throughput_jsbase.json", - "job_id": "decreased_throughput_jsbase" - }, - { - "id": "datafeed-high_count_by_user_agent_jsbase", - "file": "datafeed_high_count_by_user_agent_jsbase.json", - "job_id": "high_count_by_user_agent_jsbase" - } - ] -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/abnormal_span_durations_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/abnormal_span_durations_jsbase.json deleted file mode 100644 index e0b51a4dcd05e9..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/abnormal_span_durations_jsbase.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM JSBase: Looks for spans that are taking longer than usual to process.", - "analysis_config": { - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "increased span duration", - "function": "high_mean", - "field_name": "span.duration.us", - "partition_field_name": "span.type" - } - ], - "influencers": [ - "span.type", - "trace.id", - "span.name", - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "128mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-jsbase", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/traces?rangeFrom=$earliest$&rangeTo=$latest$&kuery=trace.id:\"$trace.id$\"&_g=()" - } - ] - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/anomalous_error_rate_for_user_agents_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/anomalous_error_rate_for_user_agents_jsbase.json deleted file mode 100644 index 66fd9858c6885a..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/anomalous_error_rate_for_user_agents_jsbase.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM JSBase: Detects user agents that are encountering errors at an above normal rate. This can help detect browser compatibility issues.", - "analysis_config": { - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "high error rate for user agent", - "function": "high_non_zero_count", - "partition_field_name": "user_agent.name" - } - ], - "influencers": [ - "user_agent.name", - "error.exception.message.keyword", - "error.page.url", - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "32mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-jsbase", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/services/$service.name$/errors?rangeFrom=$earliest$&rangeTo=$latest$&refreshPaused=true&refreshInterval=0&kuery=user_agent.name:\"$user_agent.name$\"&_g=()" - } - ] - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_abnormal_span_durations_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_abnormal_span_durations_jsbase.json deleted file mode 100644 index 7ecbe2890b826c..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_abnormal_span_durations_jsbase.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "must": [ - { "bool": { "filter": { "term": { "agent.name": "js-base" } } } }, - { "bool": { "filter": { "term": { "processor.event": "span" } } } } - ] - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_anomalous_error_rate_for_user_agents_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_anomalous_error_rate_for_user_agents_jsbase.json deleted file mode 100644 index fbfedcbf47561b..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_anomalous_error_rate_for_user_agents_jsbase.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "must": [ - { "bool": { "filter": { "term": { "agent.name": "js-base" } } } }, - { "exists": { "field": "user_agent.name" } } - ] - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_decreased_throughput_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_decreased_throughput_jsbase.json deleted file mode 100644 index 48cba1f1578154..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_decreased_throughput_jsbase.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "filter": { "term": { "agent.name": "js-base" } } - } - }, - "aggregations": { - "buckets": { - "date_histogram": { - "field": "@timestamp", - "fixed_interval": "900000ms" - }, - "aggregations": { - "@timestamp": { - "max": { - "field": "@timestamp" - } - } - } - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_high_count_by_user_agent_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_high_count_by_user_agent_jsbase.json deleted file mode 100644 index 18ca6b13892871..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/datafeed_high_count_by_user_agent_jsbase.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "must": [ - { "bool": { "filter": { "term": { "agent.name": "js-base" } } } }, - { "bool": { "filter": [{ "exists": { "field": "user_agent.name" } }] } }, - { "bool": { "filter": { "term": { "processor.event": "transaction" } } } } - ] - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/decreased_throughput_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/decreased_throughput_jsbase.json deleted file mode 100644 index 4bc8757f19dc96..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/decreased_throughput_jsbase.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM JSBase: Identifies periods during which the application is processing fewer requests than normal.", - "analysis_config": { - "summary_count_field_name": "doc_count", - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "low throughput", - "function": "low_count" - } - ], - "influencers": [ - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "10mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-jsbase", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/services?rangeFrom=$earliest$&rangeTo=$latest$&refreshPaused=true&refreshInterval=0&kuery=&transactionType=request" - } - ] - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/high_count_by_user_agent_jsbase.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/high_count_by_user_agent_jsbase.json deleted file mode 100644 index 7e1316359eabbd..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_jsbase/ml/high_count_by_user_agent_jsbase.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM JSBase: Detects user agents that are making requests at a suspiciously high rate. This is useful in identifying bots.", - "analysis_config": { - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "high request rate for user agent", - "function": "high_non_zero_count", - "partition_field_name": "user_agent.name" - } - ], - "influencers": [ - "user_agent.name", - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "32mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-jsbase", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/services/$service.name$/transactions?rangeFrom=$earliest$&rangeTo=$latest$&refreshPaused=true&refreshInterval=0&kuery=user_agent.name:\"$user_agent.name$\"&_g=()" - } - ] - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/logo.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/logo.json deleted file mode 100644 index 3905c809fbd7a8..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/logo.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "icon": "apmApp" -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/manifest.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/manifest.json deleted file mode 100644 index 1865a33a1d3011..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/manifest.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "id": "apm_nodejs", - "title": "APM: NodeJS", - "description": "Detect abnormal traces, anomalous spans, and identify periods of decreased throughput.", - "type": "APM data", - "logoFile": "logo.json", - "defaultIndexPattern": "apm-*", - "query": { - "bool": { "filter": [{ "term": { "agent.name": "nodejs" } }] } - }, - "jobs": [ - { - "id": "abnormal_span_durations_nodejs", - "file": "abnormal_span_durations_nodejs.json" - }, - { - "id": "abnormal_trace_durations_nodejs", - "file": "abnormal_trace_durations_nodejs.json" - }, - { - "id": "decreased_throughput_nodejs", - "file": "decreased_throughput_nodejs.json" - } - ], - "datafeeds": [ - { - "id": "datafeed-abnormal_span_durations_nodejs", - "file": "datafeed_abnormal_span_durations_nodejs.json", - "job_id": "abnormal_span_durations_nodejs" - }, - { - "id": "datafeed-abnormal_trace_durations_nodejs", - "file": "datafeed_abnormal_trace_durations_nodejs.json", - "job_id": "abnormal_trace_durations_nodejs" - }, - { - "id": "datafeed-decreased_throughput_nodejs", - "file": "datafeed_decreased_throughput_nodejs.json", - "job_id": "decreased_throughput_nodejs" - } - ] -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_span_durations_nodejs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_span_durations_nodejs.json deleted file mode 100644 index 1a8318437790ef..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_span_durations_nodejs.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM NodeJS: Looks for spans that are taking longer than usual to process.", - "analysis_config": { - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "increased span duration", - "function": "high_mean", - "field_name": "span.duration.us", - "partition_field_name": "span.type" - } - ], - "influencers": [ - "span.type", - "trace.id", - "span.name", - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "128mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-nodejs", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/traces?rangeFrom=$earliest$&rangeTo=$latest$&kuery=trace.id:\"$trace.id$\"&_g=()" - } - ] - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_trace_durations_nodejs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_trace_durations_nodejs.json deleted file mode 100644 index 875b49e895a008..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/abnormal_trace_durations_nodejs.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM NodeJS: Identifies trace transactions that are processing more slowly than usual.", - "analysis_config": { - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "increased trace duration", - "function": "high_mean", - "field_name": "transaction.duration.us", - "by_field_name": "transaction.name" - } - ], - "influencers": [ - "transaction.name", - "trace.id", - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "256mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-nodejs", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/traces?rangeFrom=$earliest$&rangeTo=$latest$&kuery=trace.id:\"$trace.id$\" and transaction.name:\"$transaction.name$\"&_g=()" - } - ] - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_span_durations_nodejs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_span_durations_nodejs.json deleted file mode 100644 index 3e4f4877bd0424..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_span_durations_nodejs.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "must": [ - { "bool": { "filter": { "term": { "agent.name": "nodejs" } } } }, - { "bool": { "filter": { "term": { "processor.event": "span" } } } } - ] - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_trace_durations_nodejs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_trace_durations_nodejs.json deleted file mode 100644 index d87f809a499406..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_abnormal_trace_durations_nodejs.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "must_not": [{ "exists": { "field": "parent.id" } }], - "must": [{ "bool": { "filter": { "term": { "agent.name": "nodejs" } } } }] - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_decreased_throughput_nodejs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_decreased_throughput_nodejs.json deleted file mode 100644 index 451957c327dd04..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/datafeed_decreased_throughput_nodejs.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "job_id": "JOB_ID", - "indices": [ - "INDEX_PATTERN_NAME" - ], - "max_empty_searches": 10, - "query": { - "bool": { - "filter": { "term": { "agent.name": "nodejs" } } - } - }, - "aggregations": { - "buckets": { - "date_histogram": { - "field": "@timestamp", - "fixed_interval": "900000ms" - }, - "aggregations": { - "@timestamp": { - "max": { - "field": "@timestamp" - } - } - } - } - } -} diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/decreased_throughput_nodejs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/decreased_throughput_nodejs.json deleted file mode 100644 index f63c6289a5cd90..00000000000000 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/apm_nodejs/ml/decreased_throughput_nodejs.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "job_type": "anomaly_detector", - "groups": [ - "apm" - ], - "description": "APM NodeJS: Identifies periods during which the application is processing fewer requests than normal.", - "analysis_config": { - "summary_count_field_name": "doc_count", - "bucket_span": "15m", - "detectors": [ - { - "detector_description": "low throughput", - "function": "low_count" - } - ], - "influencers": [ - "transaction.name", - "service.name" - ] - }, - "allow_lazy_open": true, - "analysis_limits": { - "model_memory_limit": "10mb" - }, - "data_description": { - "time_field": "@timestamp" - }, - "custom_settings": { - "created_by": "ml-module-apm-nodejs", - "custom_urls": [ - { - "url_name": "APM", - "time_range": "2h", - "url_value": "apm#/services?rangeFrom=$earliest$&rangeTo=$latest$&refreshPaused=true&refreshInterval=0&kuery=&transactionType=request" - } - ] - } -} diff --git a/x-pack/test/api_integration/apis/ml/index.ts b/x-pack/test/api_integration/apis/ml/index.ts index f276cbe5355ca1..4a42b590c072a7 100644 --- a/x-pack/test/api_integration/apis/ml/index.ts +++ b/x-pack/test/api_integration/apis/ml/index.ts @@ -25,7 +25,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await ml.testResources.deleteIndexPatternByTitle('ft_module_apache'); await ml.testResources.deleteIndexPatternByTitle('ft_module_auditbeat'); - await ml.testResources.deleteIndexPatternByTitle('ft_module_apm'); + await ml.testResources.deleteIndexPatternByTitle('ft_module_apm_transaction'); await ml.testResources.deleteIndexPatternByTitle('ft_module_heartbeat'); await ml.testResources.deleteIndexPatternByTitle('ft_module_logs'); await ml.testResources.deleteIndexPatternByTitle('ft_module_nginx'); @@ -47,7 +47,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { await esArchiver.unload('x-pack/test/functional/es_archives/ml/categorization_small'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_apache'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_auditbeat'); - await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_apm'); + await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_apm_transaction'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_heartbeat'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_logs'); await esArchiver.unload('x-pack/test/functional/es_archives/ml/module_nginx'); diff --git a/x-pack/test/api_integration/apis/ml/modules/get_module.ts b/x-pack/test/api_integration/apis/ml/modules/get_module.ts index 0a3e2dbed570bf..b36b67bbb813b3 100644 --- a/x-pack/test/api_integration/apis/ml/modules/get_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/get_module.ts @@ -16,8 +16,6 @@ import { isPopulatedObject } from '../../../../../plugins/ml/common/util/object_ const moduleIds = [ 'apache_data_stream', 'apache_ecs', - 'apm_jsbase', - 'apm_nodejs', 'apm_transaction', 'auditbeat_process_docker_ecs', 'auditbeat_process_hosts_ecs', diff --git a/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts b/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts index 2a7266e50d2c7a..0cfa90a8c3a882 100644 --- a/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/recognize_module.ts @@ -37,16 +37,6 @@ export default ({ getService }: FtrProviderContext) => { moduleIds: ['apache_ecs'], }, }, - { - testTitleSuffix: 'for apm dataset', - sourceDataArchive: 'x-pack/test/functional/es_archives/ml/module_apm', - indexPattern: 'ft_module_apm', - user: USER.ML_POWERUSER, - expected: { - responseCode: 200, - moduleIds: ['apm_jsbase', 'apm_nodejs'], - }, - }, { testTitleSuffix: 'for logs dataset', sourceDataArchive: 'x-pack/test/functional/es_archives/ml/module_logs', diff --git a/x-pack/test/api_integration/apis/ml/modules/setup_module.ts b/x-pack/test/api_integration/apis/ml/modules/setup_module.ts index 7c9c2ff185ea89..5f727730cf8a3a 100644 --- a/x-pack/test/api_integration/apis/ml/modules/setup_module.ts +++ b/x-pack/test/api_integration/apis/ml/modules/setup_module.ts @@ -150,43 +150,6 @@ export default ({ getService }: FtrProviderContext) => { dashboards: ['ml_http_access_explorer_ecs'] as string[], }, }, - { - testTitleSuffix: - 'for apm_nodejs with prefix, startDatafeed true and estimateModelMemory true', - sourceDataArchive: 'x-pack/test/functional/es_archives/ml/module_apm', - indexPattern: { name: 'ft_module_apm', timeField: '@timestamp' }, - module: 'apm_nodejs', - user: USER.ML_POWERUSER, - requestBody: { - prefix: 'pf4_', - indexPatternName: 'ft_module_apm', - startDatafeed: true, - end: Date.now(), - }, - expected: { - responseCode: 200, - jobs: [ - { - jobId: 'pf4_abnormal_span_durations_nodejs', - jobState: JOB_STATE.CLOSED, - datafeedState: DATAFEED_STATE.STOPPED, - }, - { - jobId: 'pf4_abnormal_trace_durations_nodejs', - jobState: JOB_STATE.CLOSED, - datafeedState: DATAFEED_STATE.STOPPED, - }, - { - jobId: 'pf4_decreased_throughput_nodejs', - jobState: JOB_STATE.CLOSED, - datafeedState: DATAFEED_STATE.STOPPED, - }, - ], - searches: [] as string[], - visualizations: [] as string[], - dashboards: [] as string[], - }, - }, { testTitleSuffix: 'for apm_transaction with prefix, startDatafeed true and estimateModelMemory true', diff --git a/x-pack/test/functional/es_archives/ml/module_apm/data.json.gz b/x-pack/test/functional/es_archives/ml/module_apm/data.json.gz deleted file mode 100644 index 72edb0e071e1ca1e3176fab54f74231cd5c89d33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 503392 zcmV+SKnTAdiwFP!000021MI!omYm0tBz)gb!K170K0iyoyN9lRQ9GKVL{Uo%H$1V5 zq$r{q0JRP0-6xVG6g4f58a@2JU{)v(i2_g?swyol%st%A{>MMP@y0h^{^`Dd<6Cch zqdlwN`2Q}i_xb>~){oks+fRNVZ@v9?!S5FR=-d9iKYsr1m-qOj z^*>(TX}o;@chB0VANTk3{qJ7A^~JMKpVu!w-+ayg|MJ7%^%pPm@9r-jM1bi{#5X~I z4)Cq{Kl>djKmE(c&-c&2>7Ts(t4}ar^-2ES=U?mKIZ=Uv)W(0 zc=r7N{J8%6|NW`H@$z~8AzC0Lr6|Fa1;xU+Mqx3EQX7^WVI7 zzW&n}^EJv~K;1p;5Pj!^=g)rk#Uu1jfA!H1pZ@&|`2Okg*8llW|MWjzAC>Q~LnTdAMtVI| ze)6pKk6wHUDD(5b`I!Ixjf^6_nNd!oYVr7b0R7*aw4X#nC@1pnz-~0I+->jcM5nq1uTYve(`=8_IOMv{m|Hr5EQU344_$Mzv=+DnV@wZ?8 zXB7YFL=>y}StuscoV?S>n0f}gdK4$Bkc&+opo62+#v*U25J&w{7BT8Um@xMdQm zANhuzA%U3~~Lf z9`o!m59j7KcyOweEH@r${=JRTjskAj*H-Dg`|cZWJ%9Fx`Cf1Q_*wbzd$-FcMUDX?8VhG`f(1|%;=no2LFc@uD8pDI8PYga-9Y+m&I;N?mbyYN;r zU=B0V#tL-r0WFv?TIZ`rvDboQD%f6`9cICwdhfZI)Y2(IJMPBP zQ`#NHX(ftT_G&<_LL!EO>P8aaNm~g!b2@L_qx3|r8=0_5zy3?3lDTT0jIV7f7v`o3 zQ)Ev(zma}e&y*ph-7k%vEG5rbrk{mk%n5SMh0!BR%Gck5t%%y7l3!&u;$jx z8h{>$;t<^&#cwYZvUCUNTS)*7NkBTE*@51SrAR(H7^e;k-JDn0j%iNO3f*cu4$G)c-ZGjg&z5p$$Z4&1PikO>8NphEbp10U zbyjDYGL_t1kdKv-Ak5+R>?N8`nQG0+VsW z0;Fk?kbxlKxeQbzkbcZD}ft&+PrgImeaspN>EXe>j&;=ttK=tiKl!} z4=ANTK}-%k9Y??FzPpHcZz28aU8K`c?0~Gbdyw`4aQ#iw(XmkK0u#T64wtSKYPz_M zq`}FK8$4y$9mPLiSkT!Wr_(M@ORbZ|P|8Gd&UF2|Cq+lYk^zUAd!GL}LHL-eSYW6e zICTQMk5B)iEk!ZxwSsEgvXzV+eU@cLmx=y7E3^3ur*a&hq6EQCgQvfIXC>@radDcE z^zC`FIsrpN>D+r&G6hzyH3T!ouzH-k6NPL~p1)d(V)@D|)YpYXp3sY~ zDieAMr}UVxysW^a)*JPH+!mB0r=2da{(b409k$oLsPrPiHB_+8%55MKz?F74pWxL-2?KLGbE=#JZ&oX65>(wB#in^CpLMbcWi#%%$eqYMg;wS_cKfYAM8QGMl7S8vtfL47dQcd(Y_COYM~{_A;hjg+xZ5 zl5wMx`)OO*aOV?m?Q8W}tab~=?(_&2U7~N3(s+T1iwmXW`QWVE|<=AD+N2O(~ z(ejsVyZ@tdv9a!My!YPIk3L87x4%99^oRF9cBkxRck-YxX zvl>kE8_mN*bQ0kdIz)#_TA`_G|NcF}H~;WKe);Bymn_lWo{}T_{STk_@$8T1Ao5dP zhDeG#J+I9LwU-VuAraEG--4X}dNgYH6|3JrU5R3$y>|OoArUzxv4a`}$Kq!x3%Z_G z>1Run&8Eam!&S;HMC`$q40ZP!=?_a;Fe#lE%4nkucb7Cu!hFjldzcjv+j0tfnK2 zM!{UIXtEoOA8b<*cfUJ;Co56Re4ZPNvRYO2)P_mDeiXBkb8j7*OHgQPmS-jAsvRp+ zJI)NtVR!RiSjxqMrwxa5%bKdxfq|K*+)(@q#g?{L6rd|nY@4lOH)t2%U~7Fq0s?NW zl>w4!q9J_P?X9IPmlJ8J5C}g_&eC9)LbkTwqr6 zk?VwDE!=wtZO8RgU3tgqNfrtLzQgm3REJ{~<01{D*8B*JR4=y{)G0%*Dc2fP7I3$w z-O!8sVHBDqb{7KrbR~*sIl2{vu0kT(te|Y8jaXeuo&u-MwRD88&C=)nK7i=ZsAxDH>tRN2(>Nc;uH6}hZTl-PO_BM1jt7;z=LZyUtIvdr!X z_PQ2uz)7amdo2`W%<>B6iI8e4p1D^&P73_jl63yy=hy$nxJ-~73BLF8$j?7K2Yqke zuSB2Hc})RG&Rt~^(GY6wmdx@Bxn#8a)#{tN62)wrl~aqN{)k;(XL<0^+zY(_WF_om zvx&ZCA!!U#_3Q+@rEF*CO+q81_v}p>p_t{{nfz?-A6H%P}v`bYc zjZ46kH!`au-NM-(uA_o???HWA*P+<&7|-(xU|@zKx#R|l*PoYxmtxP<{(i719br=%Ec&B{ox0Z6} ziA&MowIf?LV8QYTdQa=P)6?!t(cf8$VwKafh9(3;sFqfIEsG#~cBI_hXu3-?ykZ{+!~mXfx=e)``1N)&tOc@jWFIs$jRG>7EsQCtbMwp>Wk zlr2>;Kq|N?HP%dgpwpV~K3V`{L9KJOxBA zy|Yy=y{0%2#oK2M{ou(`6vuf@1@zh(Yj47nmB%A+TANQftJ)e->S-#9-qKXWd6M(g z!-rifC?f5?AMk^xD^W~e`HJ@+6N#7%;;6}jL-F&&b!Yh{6NB}<)@oD$NoFvLT6qLp zQe8!J_o<_M4i< z+G!HfOE>MU&muWjrhJQH`3q!Id~J(;i=tS5q$@GZ=fw#HUmPoXqnISdcKvs&Nry#H zV**B-F9a~AgsHP^fi#Y@tT5%>i}@!{R-*W;hhkk>a};z^XAPkXn>L*PJB|ugFe)Dx za2c|t;q<>PtifT{;G6mNfhx4YjXAN`!GV|f_u{3xag^iKCn4=L-T!a*D`97`*Dh1e zM$8wRU6T2S+>@n&T9rxww*##qXh+U_`^if1B{*%EsoQ|w`#hSEJMi_FKCM8|(2_k- zs)kLY1CW*it)+6@O1;7MS*kx?cyi;N>0T6?yl9u4uQ|@C z7{oxDcpI9A*IdGoK?Elq9yb?158<>^&GOFuO4OO1HacXKj5K#;CdvK!yNyv=)b0S2 zCdWXjnP;8DjVz;nY0Llr^}5k<_bs@eEaXnUV>|8Ayq1DI57G!y%l-Nj#!6`wyh}E$ zvsi<`NNu1sq|U7!=aJ9uyKf}_^yx|zTby|FLoH#-ZXyAXz#umqhP86}f{E2AOoD-t zs*~z*El-A&cHc+(sjft^roC={Rv{5Dc56E&J-oY+Jmn6~+egZy0nNg>4~kaf`um?! z+B}>K7!FDUqC=_3Tr~$=rkIYi6ou_KIo`criDJ>cVse5S&F9S}Xi_4#lAJw{WT`ZA z$b8Fb{=4A&*}^JH@9?~3I3I{C*3#upku=HAHgzQb07-A8WX3F@N9X?3V00H3%QNK?Gp9`;xtC5Y)%T2$yM>VmX^uxWc>4`WSrG3e z!rqfM5ks#$Rk5NF2-6hGLC2w3eRoCii>1C(m`-a_M4FX7^u(=H;(Yy0ik1`55X3Yx zPd<(TwM%%)+R+ZQPzRUY=UjiWl#7{8TT~6h!MU_rF>IdB*WYTZoH$pPbP4qBE>W{+ z2brQsObrQ#$R=P0Y*X>cDy6D0uw|Eb}?%5IB-_wTdD!WYDbk$g{WO zbn%oFyW0T&YORwcoQC4z9&OflF%?BNz5a%=RhF95s41v)=!4Q_*Gs$U{QBE*L%U(y z>*8OnwPg3b#%_dC_fFk%)k}Dq<(5ZW`oN8w(s4*s;n$hQeKcb?|Gw0HdaBLy$a4Z< zNDu01jCB1oi_oFaWXZ0X8r4gVRmsf+3eZ%zhYdTBN7}tL_V2pVv=8yL<=LDmI=NCA zo`tTzH3rhHr!tC5_aV6!ZaqzsY#}MJA2@lty_xmXr3R|{mCLa!O9HT%)gNV5$dMY8 zWvU|V9ej+@kDI)8+RAk8>C#?Siqpumc=GC(1ji)VYrp<`g((22kAb-Xa*$)L34>ZK zi5nm0Jirp$_pTfUwK3xTrKxsrXaDk_pjqJnB^RG31PU9jaOs;SvHY?A?rw%oxfOAm1I z(}uKwpdbU4F}z{i9IPJ>|F6$~aFK&`(Un$&45y7~Y0(_jiV;dDcLM#%QXkhiZ7iT_ z_G-}@*AQd9dBDEP@*~#WyQzJt8*%tvZXB&TK*kC_S@go2)`qE8ckkKauo+dO^!0WE zPA#U!T7%B>W~|9`Cy#=e%V?Z#2A!{DsMGeoM!#8VZfvlZulp(_&QE5THj<&gxnJo; zD1hgYXJ<(j5;XLj<>m|fu<{DqU+RCb)ZN(VG>`7u!Udctqu5CG=EnKOf=cWz0X|sl zZoFAB6JEF}no1hZCCPl`QIb4@X8tmF z*reN2=!Z{MqS$4xh?vYN`o)4p0<8ej#U*q|j-DC49d^O*fL|Ade*eSgeLVZ)N$9&@ zX%9~_0<$VZ()^&G@&jDy;$JQ9`*}I!tJ^Ew@bO$IZjg)jfa`{iUkK`zq!MHp(to~ z=at_s<>I90-O%Qol#@CRtdq=c?yz6@YTE9x2_G+Y!2&sri>aiPCJZ=ZE{6T)4*Lql z0o(g(e!SF+V3sqd#n}!mJ;SW}hp|Jyxx+pfxy1Hyw!d5Jt7&kasTNDSa2t=>DV3W$ z>_d+Nad$5M-BKR5rrG zZ|<iQ?F7wPLbo(b_UzTw!29ndiDE;FNogMsXMt1;jSmPk;V&9qRB7 zVJ~+s)@C`2SaCEV7&*7{ zZ7G$^+#&%;3?$F!++8Hx?6CU9Y|Hce#lpgy?@0E_dhsDD9Yu2QSn+Zs*DOs^Pc;(Z zap2pM`CdL*2|nS|Jc-8T(XTWgcjancZq8bN0q!idW%sVn%cT@*dRp(YHM2$~fh4Z{ z7|b=7Ico*(o?iUv)0HUpIE{-HP&D`h}iV+QWpNsl*AsJshy7s!olt$rn z87$;FpF_19`f$GNU#9};ID>pZX2UngI9{po%t!~SV0!@8ZeC+)eGG%Mf&BLu%JG4&tS1GtjAfr*66G)GcDU#j|)hZx*cf%jiCP zg*NaJ-0`N|X=KejIDlJ&?AcOGRbMEj!>lgY()KRG_GBfBlk7F>&0%%QS;`f#27_8F zwP0$l)qxM=Q=_kKoc7cdWm~8O(p|#W)UzMGc(ddeUsKG`o8$TCJktIWcd=&G5_91IV{clQeq|eFRmKCIe$v+)B5toH~;cYz3BOQ{ou<`c|RY7H$Q%s z+kYRI@4oxSThE{UVZPTJKYms|{P?7K#P^@BbdyYeo+s*PX;v^}gqNb@`g^!)s2J8{ z>eD{5jgFTE8Wc-XGaR?7kRo=Upn;y+I?zjJDlIw?OULC+` zlU%6})t1QnWoxEfe~AR6fl4)yOP30Sb4RZ-ize%3zC3IJR+)Au&$pf~MRA-KwBm(G zrRSWbOeDt*#jjB8w0*q%cb=?6@f5Oj8j4$Jv&o!4~LItB(_JX*~iZe09Oj*;!o#ov9hQc(o&wSc<{ ziJSGNxX8wJBhxcmeGqithoMhLGG>0r=6l(N2gi#HRwHatrv$aKhBmoaQ9o;Pu8ON zJT7LYpj-{miW<`m#jn}`liXj&U;9zR_*q*CVSL(>cq)j@W6&l2ueEw(<5$xK>9vyM9yN-;_n$7v zzTdw0@rm)7eA>KXzig*o?m`hRzBAXKfaE#l@Z6+VWSj>`G}BZI=aANpLvdhiKV9(s z`*kR$JCM`3I5M^}QWfTwP~nE+SM{AF+TD5X2TxXVacq_bzY2-$LS!4Ycz?JMc5#Pv z-i(ZC=2?1pF7x+v{lngrQZ?2}Zde?Fbu_nXIgbkJhxx>qi0&?Af2d1QoK9=;=3JLGDipiL_8Evjx?hQ6^3!}`da9&h>?pxKl@wsGm6BZr zMF9-+jg;(@bs9kMfS|wj@Kdewb_sED$NcEDWU_4Mr1f|RptRClF z0EW8{EBxF2N)#tK?S4$hghE3NU?+fbL-7NOY5QB=x1X$R$HUWHcIfn9Ejro%8?kh1S0PbS3zb@6|~a(uy^CtIbf;REZrj<4C>h#a!z^8=@`2 zx3Ck%cMzxbQ`^uGAw%=tDqg<|b!oknkzAyi_{FSfWNcLDw*W-PdA%ls-G>c-{B$LX z@w`YnGo27fWme9k54iqLRLRu}b;^)y%C$zCa%~_sL?cE)Vf4r27`MiGW zr3lF^QoD?agX|nj^a$>@SaZ&^?y9w+`YgyUJ`CAAHo-cMGv4r|yL0hR?pLDNe6ve|MM%Wtk#@Qi z_~}~mJkQIp6esaQH5rasqCbK-@K#c$e2MUq9wl4kVDp?i=k#SBHvg{@K)1Iu{^>&U zlsnh+mS&pOY~34Ltr+<+cyCR~g61Xhq+IoYQVJBDObI<5hGJ#q-RA<{UC70H7ra+r z_EJxkf!MfL4lMMvxTGMMr0AH9DM1d! z!xV)9?{1&*i=`+QI?W-uQ{kLv-Je?tzt;cCwQ`srE_E%4ql4qPI z0UFdq-3FxLAocn~62vJSon-VL&0JbB@1W^o{f*F%8!>d>eNgsSOUcveG>2p?tvYv( zoa%78{z2JFlU-XbB&pS06=Od6z)h*KX5!;!y;yfQf%)~*mF^ky=Xn~6nW@v~I37LH zxc)2SQFCMLMgkEApwgxB2r2Wx_X8Keb^E5muh&``ePu5G$3!9#rZ~#Y@KF3bUCM%# z_9}!lsDx&jIugm9O`w;{eOu+yYl`F61z2IHVZpoGZ zN-pY$B@DRIj>Cdwsc)K@?=`7Ph@G2?&04oR=q1*`3g$oylH*pS)H%sUoL81gwK(rC ze##?HG&Rk|K)t8ypHbB@F`FnA&m0INVt)0&IjlyRI6H9HpLU-psSC+7-Az6@Z$+v$ zOKQ!h_E)}sAL~H5w10p`X$A@AnO~D=w}cWy4Xd(L$tKm1Cu}3f?6fR^SYQk=mF{iqyHa z!vjFxc7aB&$8X{gmfR!I#o$ z69ME}y4Gg-QiHU1{Voxuv3r3_^h+8LmzF;=SIq&U`8bydB;9>8`Nh&K6-cL5QC_9# ztf+Nzm^AA*6hG|OW7=JRzFeAXrLot3{W2tCg7g~K`rrEaSoZ{6pYAN=#b{>!1z{PqXW`*`uzvy;~MU*4~5xT2osQjN)HiIVGR zQ`E&HNDN5gAw>&tuN`}~S|ztEC5=W|^Kq>zm)-ANKV9llP3MINb~3HCL}Bi|kLw?S zZ4N{sSYyJsTCxddfM`wfFgb3Ig&np}Z~6V&0Iamx9?K#mq6GU+wgP`x8nXR3?ybMa0c(m$?EmN>7xuayn67n93XIbZ)JX$GI9XhUIm z83N59U<4ZzHju+suXxJv-Ay3>wDio5uiR?=$3)_+?%i!8^8E8s2VJzi&g_;G&=ABl zGEeBmfZ8QIW$kFk1w^6nUa-TZ*$tddtFw)~a`?dLb?~@;*OOG|S(>X$YN*~_qGr(! z0@TC~OoKv0-~G_Wr9nCrX)E?z1w|IIt=N;6vZujm19h!d@zSmIQmEPW=QjzZ?wz{j zs+TNN%Po&^Y1FtWrNfeM67lZ&O}sRMM0~FJ=Dj* z+yFVqG1r7at(L@%58DnxbHTVq{FtsZUk2Z6jt8V$Ph}LB?n81d+9TuN9+O$n{q*DR&xKGmpz6ZEF{^ zZA)QOkWxx;+&-=G?)waHF13s|->VP99fnJaf+cFEfjE+Pj#_d@faB^QX62oP?E6bC zHIn*izgXek_}=TUSjS{a%!7zXtQlTGokjy0>m?ibJR>q-=dZZ_e) z2#KhYXr~G9Z~qN>{^-P{f<))JYBkUVg|)klSwvkuWTzs;KuB3Nk8b*T&~}1Z1}byy z$6fa+ZNKF8?fYdYzW5Pswn^KxUv8OE)2N)?xQI;RoG{d$m5 zr`c;pp6XMoPywn4*Ke=s(t0VgOcH4(E|z3uY*Y;mhz@L|dhD)0-@0FkVx-fuH=EA_ z3NPbUX_n6A`mX~@u2$yZpCQ+jYmEfN-P(nck8Grp3GE)T@tvhy%yQZk`p7vcJ5-91 zCMK@`8eb)H7s)7q6@6m5<}{V9CT)brZH~eGx$KVOrz=scxYy>Gy2>O|5=kwvRZBRF zDoG>JWjKkCvnZk+MNzW-q1S*v%6PFwq$k4wpJ*?aN9a{WuQ^K34Zy1)eMEVJR# zMY=RV2hA6p4h$2b?ThXo=t>j^?NzR?pOr1WNN^36d4j}c zgg-ikaO3I<$Jrmv=SS?m*!OP>QS5ijr=hqtg+5DfnQT<#2-^XN5C z(oFM((EzQ7p;!cWukPM{vJ}N}-gq@7qWOTS&vL11+)(^5kD{^rdg|M{62%mI8B}0b zNu~}{lXqy%>-=@OA_Ff}@xVcUH`>Y9>&N#iVW;P1Wi!WU)rKW2QPcHHfRSNTbTkc2 zVFJNJ35>0i`#5ZbiZ1z`o0I1|ONFd_<#O!GN-C#tbdu3~G;?XiE>;=ICygQ;))*jQ zrJWpQf3lQ3ZL{=&N>d`XTrSo^HCM#|so*+sV&V?7gDT&jxmU#F6{d-SVqS$$_rK(j(#7We=Qw!?7g)OLbM|j#e6-Uj+rKHPnzSZj=rwWuy z0}E)BW-!0(C^d<8ODHk)Ku>hh-OI6`KUs-l!_!7v`+Tg3Ybnp%UY zWv6^~NHsyN9og$~-n_JZIrfW%K7VjPYwXId@DVbGrButsyFaCiOSGg;nl7Vwbli>> zi0mW*esRANb{>00D+Ph~A(h-zdy&?A0W1#w4EZsI1^B0(!9*E}$5;yP7;Wjm~j3L)Pf#Y=sC;Jjt+=+w$AN;1}pGUSHhzo6Jf zVfUq!e}B4?i+!`C$5luaFz20|E`I%F`X>% zG|RS9q88{QH5<**Zzz7%gav`^SNigkwN@8{|lhL`1jC5lh9ZS7ckEe+`svYaU2 zQ2fx$^6fp_-nsv%{xym}tsj5?Bou?+Ic^r3hRkLIC^~^^q=BV*hwLizZT+~B0LR$L z^ZFfK3A?Wz*L!8KvlgI239?-LVzolWoQFU*>*X-3bw~ZWMgo5PtbF)!f8)J8^79W* z+ERVG4uh8!tJ7|ybg=0tX3^M2s*k`7rA9;^A*7h{B)3VOG$K-o$(`-6$pDep8ESdd z2l!8PC5r9D$$$`sT!XO2h~6K8XS;`vNxj`hq^6@QFrp02-SxN?D`Jb?i>aS34H#wQ4CFH-k|CB_HSa=V{CE-k&{P3BK^tim5ScYS2iQ6BYIApRq!k z#d>w}95#!;VHvw2HR6G-=HphbReX09`m==;ig$p1o@+V^)E81!o^%f9`=^FCg@_3Y(I09@CTLcT*dEzc^POJvB} zpeAhBzW__U*kwAaOt50X(o@e(fxHaz7Wu$1i-7%YgchQh^|VbyaIvWeN3;UP)gFNu zs4YtNOsTh!CR2L$nl-m1h+h^|`~R9&oVG8_e)(i2iiP)@d=(Voq*^bzhL?N{0`?qT za@Oc}m@H+M*eM$0S4&Z+e4Zor@J=`;f68RfN3g|hJVr;J#0Fg~ap7ntBXb_vi4VKc z3Xbg^v46Ex0pMnZ6h}7I%Vm~%%OxdHhaNC#6HBd!AyHi6b+!h+_3^WsKkolLo`2T* zXCK{v_S@&5)lWX_FFw0}`7htP&o4jt=YRc|M|1o2D_x0AhtqDqL_j-u?V}QEx_+yy zkysJEDRq=Ef?kFt|Za`333;F8j8^{)H6`YY^7d*{tM}R${FQU zs5xHjUP+s3s@98|9CnAx3foT-{`!6;id|r@8LUM}L}8S)QIYj@p#-oy#J%zdBS&%` z^Q|olXF`hF0Re}KCQrvjT`2laKG)^RO4#XUuyd=PM5!S7aL>k`Vpi#Z4PoGM*Gn8B zI~fDkg~hnvq3l(R12Ob@uuh_@O2RZ%SsO)bt*!>g?LR4|w9^WIyI%=Ah0}t4EMsPA z!o9VQbp7*rIN2~s89pLK?qC+9cH$-}Ft_6dn^0tTGvB@x#hgydSyd4pc)5+|oToOp zq4-r=Fb3^Dp4W9HiYYcT@+-jJ=W|oNjNDqvV>q@tD)p&H4@+3V%hix?Bmu_LrRGuR zIjE40J~)OZ0PzZsAX_DZ1PUrm@me)VbIni`O9#S!oSCoT?%967S&HH~Z_$JlXEBp6 zZlQ`+`G(?GC}!GzDDQ(OOHmxB*-;M3ow2DD_dw`36u%O(DQ)ja{lQW@O507yErH26634A|X$ z>Z2zsQ7q?mWHn6;lSXe2IBLJ4_?3`Fv)wzgAL&vQ`)OPZYD(x61)>EQZYX|*VmIDh z$o_VzqM+Ez;CdAj89{ib5tNUgth@*~u_N0@MPx`UWAbOce(SyrN@EsU0aQj!81rQ5 z9q=;9GFmwma7hwM5Bzq?}tX4H6BE>T;YJ zFmJym{mD`;j`L8AJRkc3gtZSTc>N2jq9YB$M4lVuXyiV%Q0-0Ir07--TN5<&-CJXy zEHwj$^H8iFmmbiV*rztYq_<{T(?dLi%M-tFUti*T9@ODSCVf(toUqcya1=Y znhL@0eP9{QDSOnegEN=Xt&9NHj$o zg{P37VpKBwK(tXCYk|YeQk=ImQ~!^pc@zm`EAUyZp4cx@7_9`hft;vj>2)9k#c^At z7_rlI>whfeJW8jT_06)k>VPtfU*HzkuNie{8#0m>Q|A~sj1180s9v$dfn6xty_foY zX&3<8X+{ztBRWHC03}zw{u_Y`p%nnBQ*q2aYib#ZMk6+Bhv`kej7sc|;`@~-_RT7v zI*KKr(J$*QpzKf^h!~A@u|P}5Z3}FvKVLjqX?|{gnr9zMZ>33CXA%A~L#AshoC;Jx zZPsfUF-bGeqDe2#y;b^1>A*(*_7wW!ex><2o|g*L3tobqX99O3H1p zC?QpDsNz!}P~qdovM*+-o1^&US_}X4in4*VNtV>xtZ@prM-X@2YwwLAx|UMXNIlvt zDmzc1TZ4|{V%$F4>gCgwC=T4qdzw-SzO1yciAW*ot}%5%6fOwquy(2?+)>WHTxyWY z=dB3{85yh9rrAci{=Qa_RYW4-QpVKZNW+3sQt8?|$8mkFu-&JtK3!@-ed4l<)j>Hd zRZij{*FTqnT&M8HoOtwzJilm?h7-;}wd82W4QI3M?mh77TC-|8ZP}%UWF{U(JXezI z_a3->k!sGY3}dPYY(2E+TBI8ervp)(cArc6{ZcNTXWMBFGB3GEmFVuXvbp}E3?!mW z5e#L%Y?FPl;!yC**f}LTtU)$a-1a^&zh7%s?R)uXw$>|*NujLnBcdb;pL(}Ir7Xv_ z2mE!yRUTha_J^gr+Z=IP!0LR!rD-jSq%QdpoXa{o z#qQezf4E->H80f~=9V)IZa~LXR)DW_QSfLcwf?Zy@89<_UT>H7 zX-(Z}*6`kI_i;&=nCEvNuH&#h6SFN(?ms?V>-v9M@ss%T-KbiO9N-b$s}@LuJC1%? z@0&lXR(Q%!?)?&t?uZAbp>FRT^vC;^C^p&a;8s&KkY17_M8h5)WL!!XHXGxxY)O%? zi$cHu;qyM8{qY?1{prbC|LXHRf3Re344JIgOxK^;hiIl9YBL@=W}$9ei%c-rK~oGI zw<;ZzkvHeiKdsFYkl3vFp?Q>-k^&|G2SCwO96YJlgESobapQQ3zWXf6pLMBIPnJJfg#XROM`DtJ+DwaHN@`sm+*8Y ziW8mY{pVcFQFQ{LrurC+Qx`e)Fgfz>C|>Gu0_R4$+7|RsJI3_UIa(M&}ma9x#_);%! zj$(eY)ByueQxs}7X{!R6vm}t41I8;92g2@L%u5|Gi1(UKUF9f*rt~_q0*}f2PuB8h zIxkZ|qD9Qwyy_(*({B9v#g2;Zt^#B!e}?WgBbbYK8&EI-fRm<3YJn3mRbi1oi?k$%rs?TjnIfhe6tRE*lUT{eaO(4?phPUWyo;(&iFmVHc}1Q|Y4<^|^kk{^6>l~xy9kM>VXzZ0acy3W@V)8NnNo=lf4q+VX_$X3Nt^J7CuE zmQ%~c_4EBcNnF?t8?g4+()$1Xrz`zTWVhTi=)Go@CfX}qqR;~_SDIugaM)oB`tkL7 zLjB@9Z@l&V*&kk<#eU!Zo4Wh{RBMydTJJ?dN_ZG1EBpvHqpKxMO^R6XxTs!^d1iZa z=ggz%ado$C?=JDyla(k2--||9ArVy*@3b2I)>86RIdAflHG4G_MUrlCv*vlQm7wkK zEx)srJng*fa$`4x7=V5jaxA%zt?vte`PN&U~L{&*rhzAc$@q`g|ISzAsl7oSw5#2nD48YsQ>nk(~hPUpU3 zOZB_D5`27~*I(yi7O9brY@mFz40@2WXuGeIeDBFh6#MJiRDAT}&5~dAuLp{6j_030 zlI_1WrjJlO;Brk>W*t;nOPcDmYBVJ{Y{dy78T=PZqTig4!Sk12hQRyzBY*SbXSrP$ zmHzOZKYtFwx8E-K-J&1;{@)(R?hKa+J#90ub}A|AD5Geb`s?O0@x^wD@7@{s;megM zPIlTA7b06NiD#uUrbeWj%fv&Zuk!Arr9WE7#h3m3^SC%gAYA4-Njv4Hx842+SsSo> zy!ww`u0%1@d3O!nFfK6`jVA^w-cbDDTcz8_tN$piM6t?VyZ$$?O>TY@58YX}-4lJ^UdY9KCKq3v$|fQZN0h`)H?N8>vN2-!zSi3> zSE6`o*V9r3a+cDespe{<(9Ja9!TZN-_f&x&rHf?z+@Xo@MTkqg2_X4i$Mye+))Jm!&0anl{fx|fw zY4UvB#I?Q7*y`g0-%r{~@acIb)T4Q$&Sf;1Q24UTplchj;%3#GBq$@ohStO>7Znn) zZpV2Dp!n`3{7)8AsNEr+=0NGG(1gLLiM)?7ZvF#bEOW!|#m~F%tVFSVOj`j| zcr91|M^pU#tgVEdB{(ltH7xZ(Em5P?^UXuxl?1RUhBqhApDmRDx>*&q3W*ruv{UEk zy@llIcYL1r`B3H**%`r@9zk%#GV6+9+C5nPy|fa=LU`VqRTKq>J1K3;VxZ%Atu*8$+6hUxAnk%v#4U&0zQkMKOiQ?j~rzOiOJiP7F1T zo_ZTaAR+W|{j1KsvZqq5H;If9eS)otfMkF?3;V-VL_*#DR`l0PEr3!wO;Lo2MCX** zdUzc-6u&|-y;h#jqek)5r4~TGS;o&QBnpe*PPu&Los})ogr`XWr&)#z7Y|3Re*GJI z1u3{Tg47bBb)1-$`3sy#RP4A|Dx=-4D9h5ueoE=I>#0#MeyS*qp_uy(#joXMiS&qw|GC;XFY5%V^DQ1n)86cpe-l9b+#3jzc=2{k&Hvfyn@I>$DynQx6M)WMzSVWKGIY2$o?ImHk z7`hwnl$x_Y`egHXvAY`|KV+HxN{}WhI5{;rSuYk$!l+e#MvL%D=y%?0XXRlL`SQ^n zv|=!a2lsKi$=Dju1}pQ4^$K3jX*A^Y{9P=z{~#yzde_dY@sCl$qrLC0@}%DNWaB<8 zfY0ybG8RT6S+yRAmGxe~(F~16q9m^XM`@g2mfzlOB-!MSqP#-7Hg}#*Y?8NIMhwsk zeH)7U?wzmnNETa_I&~4Cd)iW?+S*e)h=3pQ>@4^*yJoMpPc@d^$9z{lWqWm#L)BXx zk#R95&aX|YvJ%9gSijpRO=OyU$neaXLAYs0@O2h~l*av4N4-Fp{pcOT3qk*n6+P8u zRm=qIYSJSOxvX=gU)dQIHsmK5jweFMSn+Jg5_-Qu>et8X1T`EOvc|ER5p8Z|ho;H0 zY4iw>CVOfT$=-LTr})e!S@#W&nyQM@Y9a4f)lVn})>*+cYX-v)68PJ1R+?bttpasl zc6lrKK*?x2hpX*#uB*}u76g}F<3`y*HwEQpZpv{L>-L`w z=`M1QW?U`rM{JPt-&r2Sv1&~xR|SQI>CEC@vdgRXxz#LuL z(@!`~rOHl#47BkHj0O$THefNNh?n|^oN>@jraP5?%9h}!`UBi!)g3N z_e*+OdyJ5cBbBin1&=YT5!F#zB<}GC+%~FI-QAX1(F;hp+BpQy!pAr3wDb1ea0s{> zixFb8os65CPf*iuZR5Pk;f=zL_|Kpn8&47+g5tA9@yv0pq3ZQuOo2Bc=!(->U&n4}VJt{nKsC@fqMT z&t5rmaKbp{LO+JtbOU-a-gH}V+{1R)Jrw>^2a4kP5W0@&ba3*^duMbw$C-|%n*5z} ziFF}g#SOtyApH(9T-qBlvv>YcMUC7h>MP5@Lj0CFPZ-0;4nE{!`>egp>M#B?h?0U6 zn^{fkjxWwsgvF%7=Zd(-_@v?%1b-Q}A0QfbZ*8?_7z)OF<(UWlUt?MFwRs+cy=L0l z+mFJV;a)lOeMT%XHkp39P+Fr`F#bEq>O!?|>a-?EVZ2fEx=AEt3-PXAi)8(jth=W2 ze&m@|TWZ`(%$4Wc=*%Yj-n#sB*N3?dM1-6bRSWC=Ba$sKOo?QEe|Dxg-nDC!r{cyO znXF|CiRwg{c9{sCnlJZ#BeB?aP*ZwNLxst>~$}YNq|+o3>#Xz$RP(GJe2-J*eQk8^|C6mX@ktY_4K7 zdX8mpw8T}&opkC!of!!Qvph|td1B*!${;nWbRm=efa2M@_bk$Ok8_%UGzW}br3B98 z#NK)4#tG|>^q&=HwHX9%R;?z7cLZx{D9+PBNg#vH2Sr8J;_W@GTTZ?Xzw)0jPuhDTrQ^}PqIA9b zsc@v`W1}w-IKMf+2YlFK!ZH(i;nCgZEaDbboS2{=J#%fUC{X@E3MkI^<|G1!DmNz1 zRt3rMmhzS>ywRgk>Fm}iZn7}R?p;0L>qAgnVfRZ3XI44s)Vctf0)JK zQp2z>8;Ox8Y$!*kfCV0ANM!YniD2AvuQg+Ns0>OQR(!`Qvtcwcs@T%K(JA*FWw zssb-nWQga`q^i=g;dx@=Jk60UG1oI}6x?J#0d`hYIiToY-^14TkMoqhoEAoonMt-! zWKrK^-a{2MZHIgI85Hx{^=t#%-1o8V*{R@SWWoaP!r0IgD_qScMCIEITj@9&@?w9- zkX@wMkvAHNcA(yH$k>KOEy33x5K4+Fg{sBTfPfprN7{G)+EZ0crS8z`-S@E!pIc}? zZKkyafCX#xNYWF%*^isJQJE}%a!~$I)OA&@m(XBKCk2sx?OUJzdU2_`ZY1FJz$h|n zeDK9OL9ZQ|zfALe>+5P2Jp3oy{+%Ui zdc1ZzuA5sq=gpU%gHS!ygXtUm=ov*o224s^o;F-yHH?P=PZKyMko)=>RnP0RmEiCv z^^{BTeC@OR@IH`n_OO9^PFX!lb*hqo5Q>iQz2)osV9qWFT0u=Rtojzqyc%Ry{W&kA zPcZ*d^mcoKyi~xrYwLt0re}XCuswRBuCr~A&z|cQBr$!S^Uk|Y8RH-}Du?%aQ%5u! z&HO8RD{^MxYDEzpqD9NfKN7Oml7#P2%C<6zx`4g51ta!RFvTMoQ`y?F&P zyo{2H20W)M1YX_SjK@EU##$LQzd)^;jb1mG7NElm&#;AN_7@m^GpxV(^=ADAHeu{m zDk+$gmXK4@tkd@0&b2h~xvJY^K6|P#f*&_Ob*WfUft7YbXvC#uFRjiLJcHxc&dn-0 zaojqgC4$Cf!n9Uz5TtAo47>Cs6E?cyq0hs%vpUP3d5Y&_Gss45Zngp&WTm=feAT0` zHBm{55vTC##w{_YR+{TDy`7~h!2bKyt9&yoeun5<2Y*y9YvTwVq}=5D|BLS|)wj5? z{y_6k20YjN<24Vj)Kti+euMUJ#uAP3P9IQaP6l~;NXsJsXlJJ@z{56VGc=^y{#7l) zGhOl#e`IB_QpD)kfz>b80KQ3wP{ZIN1=B;#t64FtU&UcAnbnHaWLcLF=UGuM@tb1l z@?1S7Wkbk_HZ&)LZ}bf;?j8>Nr|pDe!Kqn5giL9GrfsP>nKkT>(Dt;mu;VcQR4PTF z5sPr$wR^_Pn1v?T3?l{m*A`UiF-bX2s#N^c{nEZY`6?}6+~vDrT)QLPcS!t6r#2wp zq&R;uyYWj>OqBkI^@95qCZ+^WO1RFw^mlcRm9GRjwwPTd&gV|#fg^e2bT6%OA&bg( zo3~hs#7z8@gmZsdo?kX7ozfmkw`?9m(((w(yJLMX3LDC0IV2mp^;NkxL{zn`f4O%e zBCg8vvw3QJ-%0)ug_~CFvIt!{_=a~lYbL68AG})O&T8}24{p#Y$q0b#&TN)KT)nan z@rOn(>^7}6A6*Jzkrq8K?q+o!q2 z+*dKi^<3dc=CJ^c$J4GZ)7NvO4$~mm(fB&AXv6-sQ^(UG<*Ze_qfy7zc&^8F&~v}j zBjtL)>+56m!ujp`OXF+APpkMY7bf4!ty`Fqq2K8!dshd{Yh!J;xO(^MCYrDs?lHOE zuTCk3={)8J4Zq%t1~Nad1YNB^(D`}@J?^QjzD%0jMaxb;ct6aQj$A6?YEBzsEuDmt z{1x;m8v8UQc*O!fz|%HpYwWY0G_*_zn&7%y@4g#B_t~+ESKJZQqk-GdPUlmmQmmM~pMOsL}JGxudPtLJzAs;m4GRO7#+)()StVcL{t^Q#B zm$U~cm$=7}8LHtDbH>v%n*eh)UvM4Qsq{Sz9rSQIIWMAlB@f-tI|p}_6?%DCGmB0t_ac{o8xWTp@(^!wp+TLS0E&K9=>DlfZ1pHy+GYp^9$; zZeXX<*?-BCv5Cn!_ZT!yKA(`70+GW;UL#+%cEsk6A^DbkZP3(!|x^7M)xBvH}EM z+g7RXbO&!C@8C2kakx~?naH`1Xy;_>q~i8!%WqLHhwB`!^m@^tO5x|L;qBs9;hw=gg?FCE}~h8B6RSxib;@cAa4;q5(@w&DW$~{P9^4yDi@4 zd5}`Bpz8dazd_eaIt-mS(PwrKeytD91u3Z`8iE{uOaPq}A66#vew)txc>a_P@w+q^hZX`s>k8oF5lZotwnQei zMV%{m6ddZyNM5q3s`dFC?m5Tg0%f4}`;>-KnMT7|Dct1Zj&>@(z<4*&nD|SUiAGYt zCG;2a^_9+j&wbg4bJ4ILe*zJ0* z(DQcr1DwBs8jWnPJ_Nn`zw{Pp9Y;SIi9ByzQoi`T3W@r{4_^CF=4W69qQWf!$MwbW zBCz}Cto81AicZ*EU;O%gy6DsRDf(_mb50j@2Q1s=d$Zy4d;-Z8ed=cqyq=;AWIum` zsg2#A9Ya4m-KR9J0(9nF_8eZfuy>Z+?fz=~l3^@FAR82M*1*Lu+d|gn zu7_yR=B^Xnj?3GS`lc?FGtfO4|J6m^r=6RAT=5t`ngg>%o@b*4`PXcYFkU>Y{67Ny z>VE{fj6jU#$L^-dy-1I&=&ur9fw&}gKk!SfZe4~% zGL{4hqs2DMAzZ+BnS%kY?|*RLwv7qj)P@!R?H$BRdQ+ zGeVO(9GL)Oa6?pI^{ZtnkuPobasw0Q2ZjcfhWU)yjT#L!Jf(K*+3@oh+2DtjX3@u8 z9k6MaC}#WqDrK0a0g1;*Suqc4o-B1DfW;wk5qf8c?R-R5QVOTlcR29=N2>?MW1oaA ziU>VVK2Um`^;tXR{4jmm!y!EPI1}D~!I&^8bE6%$349vv0ow2-N_0c-2%Pi!XLsSf zRwq&ILrHdvJm21Y{I)(M(89~#={_Y_7`CmGTulBC?$$x9FITO!^^+rPc(QeQevilr2 zT@CR#fuJq)U8f4f!&v)tKZ%EA zl7~>{+Ylw01}z$uh{2CIr|C8ehIwu4)pKiVyYcw|13=22)$mNB-c~U6(BJN= z^&ckIX;?p{8>Af$6RoTnRoGG)=K5re#_*b2g#s>wC!S}zij1=RTki_0;meteb%0x` zkU}8IJ|K!Qkd!pukoNA_sZWB)&XfgIq}mhiMm@XC;q_yC{ta1^Q(xz!@C3-Hs9ury zfb*fwZvwo(+Li5=cBG#+qe%R@Fi&cCeqbZ<9ATdT<+uMRwL&ksTCC?#(YIN*L#SBx zaU1`BAXIq5BD($u>Cm~7=Q;nKY(CV8Ag*%@EwJJ7J|&wP-{dC;o|Y1|sW~EHp<=q; zX}Auz?iKk;jZ;AN(8I#Rqt;}7XIJrvU)hri{A)~P8s2CqueMhFZR$O)y8EzF^NUIi zt>(|34nEpvn}z|4PctU0i0^Mtt2;Zrf-g?eCMmPROu>`^5Vx~3jB$Tf-O({Z+ zbULv$1oFx3C}kr2irRK0GO(6zJ%ua0Xrw{3wU>vfr1j?F+}D%CXdc0eF5f$_*ThwD zs}Wv{)d(fOVL(eFW3~@-k$QRs#ykB=9WTw3X^_kzYWkpyUkTa|QreI%D0rppZp5jJ zFPfVD<5R%Ng0Sq%srB=28&=N6Kuput5EH7Hz(j^1$qttHaB=0AJ*DKV6%*S;aefD> z#ID(t8n;zuhY6uPdK=K43iD*OBPLHBFM47hOAyY*`HET4Zg%nR)OJ$I`DxfVuC zbse&GYU673j-_t3sGzZ2m-^b+UMwC~WV5B?97`Hi_{U9xsP?by>pm^;v?{-k{P2uA z{695Q$WP?({4SSeQ`Jq5(t2Jgw>XY7sz-;5sJ6kq9auRCPYlYvFrwq_Y)-?J{70?z zzos?rh7$s6Ki#W;*Y8Ug_1lhU`};|Xd=+JXuNl7mYHLF}R13SJ0DA?+AkJNzs;Ee& z{joqu|34`xzVy)$BVpu)^@}8_(`yOC+vPQvtv>YsT$qB1Wg3Z5ZoDLaK#+oaL4$9# zkH2Qafgi*E8Z!Tb-)uxrr;6HUY|{yaZ>kxEXU3G#Upaywk}^o0FB=52+@Cu3ms^~f zjzF3XSpcS#`x^07>_W)6M$qLM03HS9HT`C~gy-((bV&GG!F|xg$6MLUXgI-TQ{CFj zL{mqTlugr}iEU!_^|oM8=atb%cV|rdw~Z>p6?ET%GZ8o1F(;IHwraj!uGp3$aYQ8{ zyDZ{Akxg0?UjLyGev+D8wXI3%2rjC|YsjBP7KdE1`}uY_0^)Bf+w_ej&N&%Dx()v1 z{KDkQ+HncibeR~rZtDfzJ{JFScq1i7bhv>9R7T2I7z{;U?Uh3!nuapedp|% zOO(pCb}Sl0<(gj6tWtt06bYJs0MChts*3PwL0@dipj6f-v0myfw>+{Lz^$S$u z&OlW`jkUQajR&n1>?6O|PZKw)*S`pkdgzzHf-<7GGh;!gx$}+tD*9#5wuaq`EqS!) z`Ao%bMPrE>Hi}ANG-&s7yl>M=mBv-FAG;ZYJ66f*RAFY;|nz zZ={YD;*%_g>%U&8x&KY);RdaKGJ0D+ZJdMa;6ODs;-W{7xPmL1CQ=u`MR))gIU^Ki z$EZ-S&`h?73&aZ1l7e(Wav&DZ=U`lhawx-E8gSL;WcXEA03=Vh?PP5F83 zYVIDpA$*ZZAGvP0v7Q3(wLv5Db*t9NyP3Gj-UG9)i z^$Gw#Gu!fAAqG`k{r9(ja-QHoQBJ|TsWXPXbH=FRNm1CL4#NPW`Q%E8rW;Y@V!e67 zar`Ov0we8g`yR|ia97jxo6c;0nONPn>0`3zdEV720AH!(G$pnZE7Ckv5L#!>c(NrF zFJ?@%n$)W4q*rNk7(@-1M@z4KIC1QDg-X`%$N z&$ML1@AZSIsVrzOt<|KY#`{`T26U0;9>4bizKH*WteAAQ8$_9kIB+BWYxE|0lld|9 zxS8sL@mSboW?*Ob{UVGT#eQGIOAf(9Bw_!9Z-dJ-`F5GZyc_4oP#L$K z0Rd5e@CWJ8?GHlNVL^ zgQsgq=B_V6l}ECn1b~A{Ga+B#jd?WO;Zu9Bx4r8>IDQf2Q-kLpfcFvlbFLX_eMlP_FWL-^Nev6D@WcUc-8p&t2hWFd zjLv39tsm^uhEyc8jWOyW*T!dJBcY(AA6`~h+b8C8!aXv!=RFdQR$ozy`lFfMP4-3Y7H2tQ~u~yRRK(bv2LXr1cX_II2reJ+7fW^R^lu2eV;lQZ;%%+hgj(xe5nKd@uiq zJ}&71CC^zcl#8$Dqr;2rv(@@(R;#*<0?;6At{NU^=|?E`k_)`_(NJgwX>o@xBb^jN_L|D4eBf{ zr*jWKvhu%8`CckY7N9A+_2D5G$TNp;&Rm{1Nj(35NTB?I-U6>!%X>gEEK6O|^Zjw@ z9%k^d>{%GF^7tuBPE!>|7pv9)f+<_Fpc}3XpJlS-3Ta1f@v&!N(3Z*aeRqzhbPeuk z+9Q0gr;uDn`V)6_@lEM_Tzj5l7l1~y(eTTTCtMMKtBO>f5P^gzcxv`+nUB&O?se#LTO`S2W)m%V_!R$iGR5EWc-q^G?v$82Ps=KEV1WZw z?T0?F-m)oA7p?L1$tkvu|6nBbC}C1drMUe^PzRx0?wU(sXu8fQ{D-y=i?T4bs5lgn zd|5#P6j7{077jO6IXy)yaW}v_LiXIjL-4!977SFO{3c@et+-G5q^y0vJ_V$I;%XTG z&8_*LD%|WGu~5wbFeMwB^V>C@X9vGW=d6;!Dj@gDG;Z<}(bFR-`r(ps2oy_AIH87` zi?$fJS}>eBh{+@Wt5qh6%a-PPkX~21P2Ls&*9Fih>yg-_wxv1sFwx)@7TOeCo@g_f zQ}eE1MGP;jj=54rC6{^)Zkl8O;aZb!B>fyYpBDkdYP-fgI<_0+*7uxz{U1 z7CHEpHZ^6oTq!A`kngEJe(x`qmP3vBDj9h`lHykVrV^j@GTyfMNLo*N5?JuOq{^9k zJr*4!gNRo!Vrp{`Abp!Xhj4VeSrVj;wf&*l8rb*#UqZ`6VS|g(zS9}@( zYi5Qf41Y%mgd)Zi0ek3sQKxs~Fn($;-7^C^g+LI}`V#(yuz*z};3|20jF( ze|glNehrLszk<%(W3|uUr9qzUBf`;Wy(6eBr;;)GIO0tFqY-f`1CcP%o(VOsK)Jqw z)|t>#2P$J$eW8%^$?hYApLfO|Z~X*?C($mgap zJ_Tl>RzTYCONL*+^dBZR4!3>}okVZ(aj17*;C?mQ`cl8i=;k#G2YD+{)+1w;hX1`W z8zUr_(y5|ok>IyslBQ<-LMpgLRPSmUKH;3FqWSM^dy)_cEq3DNvlYv8aoIb1t6Z*V z?1@OaMoTYp5#x+R!RzZ9bZKm1$Z_rC$TU^s3G7bWi!}_IW>(1ZjmcwC0IE;JEHrP} zKA1F;-Od&puLX?WM6aYUXbL&RPij27T8F0judSVmu)ehSeUx5(cHV_Mo)>o-U`Zbv z?2{72Yj@YqO`b%Nqh0P|#zfg@w`q#!%;*HlaK!7nVbBMSFB6}~&=T$#!#&EdSy(;N zO||!`q1$7eNhcz>_XSnod}#~8S#=LAJuQldhy1Q~;zBGud*5u6ka2<2C~LJK=x$%i z#opz4jN|KFtvz1<4TiN|D&d(E`?4ou| zOi$zMT)n`KBBLbIh&}7rx4o5E(H+6beOI_Sh>5r=g0=@Iq-1Q9HhsuB!6&@CKTY0P zuLdidsVbnwCL1H@-igRy%2ZxwYvW3~aIOb%Y$(CSFfmOFn73!R!BC407CA^H$D$ zl~vt+OXR2&S78w-@uTn#CDP7fYzmFOHv=~_a{P{G`i#-}#n|TWlg|gvqk|MMbm|9w zwdk+<ouN?V9yr>Nh+@BvIA)x4= z`>X+i8jb~rEjx9-;1|&O=Jb{;MG^JzyJ`j0R*j(nk-u@wLo}XRbzORGwGr-XsbjlG zT~aozTnmE#G_}J`uOYJL|6RgpT8Oa!h&N1SNcXZkA@@D^MFVkel153CU6@VhE4eW3 zWGN(gwbEjzG|@8+K~yiov_sxg7bh59$@Z+^8%}cfF<~96DzgF>u*!xY^{=Gc6s+Cv zy@x=I_x^sEC*}3a)20B?jCx%$DzlbLs}w4&OdMqvy8&@bqY8VN?2S+^Mb`1ta?N=2 z=7px82+lxLkkTy_#87ly5mR7SUl^SKrfweIVma!FyWd%a{b!KV`KqVG5(bDRdQ--k zlAwt#{tMschH8*?^2f=J<^6!_EaEv2hIL^`X1b=c)7U(@=UoBHH1CorufPrvh{HfZw=lU*^7S{p>Ho(3}Z9Y|$wxf~7(t&en9X;JRx6Ts$$t zd;#m2p@pE0vQ})FKK(p>9OFt_{6bA4_LqflmE9*vanELQ-x~Y@mg2e758%yZJ9|d5uX-OUd(@xk)+(d$u)|sbuew!~Fn*bv0Qwxy8Rs~pGC0oFqV5`vs zDumZCl~3l$m}g%%16TimO4Ni{pG}D}E#-1pq-T#Q*PB)92=-2_k(7~2V&pS9=p3mi z2}8$g1K!=Pz=M8Vm%}u1dhq6$KMmN6Zb@cN{LT_~MuZh;lfBEV-`pQD4}x4A9E_3wAHl52q1Aqtae zHO&I23E@ydp}rM)NhDHFD-9{qK)Av$77Rnnw4?u9xCA$B58X(FgneX&kUrmyaahs9 zYk3?%P3!@mb)Y8S#oAuIkMMR_Pvc` z=s7BcC+_uLv>Z_XO^8?No@nXz-Bn}EOAp)E}m4V7Ue9N{bF;vxH;SrRnYZ3N7XtRzeGxsPNK#oVJLLVMCm+D z9=pSj(SefH-}N~5$i@L!_(Mj)R5_Va2&au#&yGS_j!ls@GN5e2JXUXBCxN-V)ixRHVU(8)OO8Buue&2P zh!lWLMNeq)+Ey&)Z_maI2-y>?`V3XX_?4r!EW6Bkb|l-KWd}q0!f=<|k&E_O#~Xpi zPMt4l_O|fKVuUL6_g~A#31o#R%Ws(6I@}|3JGMo5 zF4m()_J=mIOecfUttUpu_t@3}&N6&T^uB{Wbf|liI5kbyMkpyTg2zCEwRjucldq!ICuzs;5DuzfEuV$mA3aqJ$`ElB z^|JOQu61;W{4gfY4ZG0NDVgvm{4-`6aGz+)3r5K{PW3}L;+8s{5PV6C?U ze=!z}z?l+nF(s4;yO}~%v3Zr!$P=gE`neVqLfF?H;BT<$TIj9;;3R)l5=DLgkPZ0H zxXNmCnRp%XpKJ;AYPUG>$7|8t?jSMQ56xQ(AbakFK?ey0tEJ?DIt^ih%eMK%-JC{MX zZCW}TWkxzA&I7DQ?ir3BZB$tSJ3qK*drG(b#vQI~uuHbrQLWBHE$6(#a5VUB+pUfo zt`kWhWl(v+bp_HVVcmT9gqRb*e4y&0Ax58}>a9UnZ{} zTe32~rwylpxw7uUS5hd3Tn#Ibv~D#&w<-f;Hy@N%bZFkk=z~7aM;cA`vl!7;jctF4 zEqT8pJ1t~*w8I*>T&KUQuX?0bYSQ~QFn-HP<%FVvKT0$RUV$(bd&CtrNFOMFkHGf% zUyZ=q4Iz{jF)CwN^k(nNl$JA>`IF5in!C!@*j77Jl%tRtlGs>=`EVgv1IqerRYj;L zY;`_tH6_|5>akC>hE;OmJri_Zwgf7AW-;er*toKHVtu%S?OvmG7Xx5?3yCCMcqiZts%oOUn7 z8;A$P0BQL6w_`#omzSQuZNC!cw9y5-dak$j@ZOdg(8}glfgr(r|6s&SkWW0JbShkO zb~vq?l%>}$cnCgTRCer|f6^yD)Pa+0ij)T|`qD?>s1(@SGz3DJucjBZtR8ze}rH9P}lIR%v-r_+MlT`h~3YfCjeijHWC95yswu%+f=_60uLf2_u^Oz7sDS= zxZd)!JqGVs(3yCV^misl_c+&=Jo5Pawo=4o?_t5IwJUegSfSQkbtK@X+*12$(th)f zjbpo)xtW2Q_#xUUZFpU-a8TpU{_{C$dCB0Qe{>v^1{rL~31!Qm8;;bD#Z0(HazzdrJ9N6+hRjGB?j_OWsE9 zOyf<5?4=h2?;^P4)tZs89G;N)&P>}$irOv7C4TFCtN*QbNhdW9p*m+)m9ZkCK7LivbaRZVuPmQnY3;hy6?l*uI6SC zmjf8Va_regbDhx^_b?XN{39Ob>a=3o)5RHJ5$5ytUjg@#=P-M8269ypo;tlTmnJiK%*rEGwQ-@4 z43aoE8y`LOejS2_N}%{-hYoItCB~r@hr;F$TYnKZrFN^HSpY`dR|Dnji3^a~HGi=4 zBInwAmZ-O>%<9mE#E$5+aMN4EYJ`$#Y-HgTO#saT7$@&b(gI%6Gm!wmfJI8h^VOGi6Ow(N7QBE%P4&>3SByu&@GL2tov}V>3()5myh-;V8 ztZU)gR{KIYA#Lr)`c7w*(Sn4(hv75N2lNCp55?fsc;MSyBoBVSmz&#LI0T;kbZ{xZ zs5g>FZ}>OAk#md-CzBS%NHm0i0yOGu5i0Ir{?!4;IB%k!M%3P%NW9&P)rTsih%|0y zSr%kPmYyUVE#vyUXO`AsA)_#xhfC2K;yn_^Mt`fD9;dgC01Y1eYzL zk~jm^&&5)`CAgWemO;p3h|w;LUFkF3+Z_NR^T&2YosoXT;!|3qpL}WD(pM$mqGK=a z!DR0-T<%P?!dZ7I2TcZ2SuxRyaA|QHKiTUrh`Q*;x0{hRWJc?&18eDCHsLv@FTi@4 zD3FN=TV7hys3K5~gxMs`zZ%k9`nAR{nq{mJH|leM`e9CtOA6dk7#xV06SO* zhFt#V9tRaZfDsb2RB>vPV$5!lwo#WuU-p^EHoy4ShKoER$4{q?Vp~}CEOEL*UeXy4 zGZ|%XzL_OZe0`_TLVs^qfs&hRHLBi`E%t<%u~w6nx^1i?p4|F%9N()uRsOI2yuS{q>?sMkeZuc=D6+UhCxKGk0e9KoBT^WO z%=Lzs-~`MkjHQy0S6e;IcAcmk>72@7AH0^D;y&^O1S;xdf6CMWYt8R)U}Md#jJ1dF z+fZWpnPN_t9us0>_RlSe#&5I-pLi7Hy`N=Z%3w8Hk!a2lWfkoqft}Q(xz)H2b&<_p zcrb`6=7#&S*r@8cs_t2cz(n22Lz*7XBHguV|GaJs_a#d~6J7s`ixz0>q&>bq@IkAx zHeOMx*1>bJ87p!p-Eg1=Hi5B}3vS2rbjhKm2-nuS5Gsscs|t!bqEP7*kWrvbkN7uY z{%kL1IPJoQXWQZ@duxR~e4V)Gy{y>Cp)qD4+!u;s7?kG*f;IJJ6(UM4T7v~cT+YiP z2VLM2lE=7{$#r;{`}6ul{#T_%Mb<@Pt>3fYT+FmvqhVQL294jHw zoN7NOV!r>RBd3^Mo(4!I-HjaDmH-}DBzRl-VmbX)opsn_J5;8d*Hx-onqt1`jY)u) z3)Gai__8XfD;Sr7&G+& zR7I`JtX}n+L)lUnw4ED&w1|}Xi#AJCc1k!d2|>~34qA+kUCz)Re637|raYX5)))=$ zgMO$s4_WrL%5mzz7!w)rM=vw{2HAlp-=I9)m34~@QH%Py<2jqrI%6s!SG{K*7m(@y zrPdX=VfeYX#I>|+$b-N@`_X#4j=>Zh@3Mn5cXsnQ3c49}S$+$(HV5mrqHvYQ9}~W3 zSac<&lm8|Uv`bB*Pndt2Hs!M)+CgmBGIr|Hjx-${kI`5x%iK)RrKeb#MPNYDm1XUZ z!|oUyUTK-xILr>i`vl25<*}IT579fd8OsnIeL@tQ4E>WF93L$${yTRp+fg|P3g6Z+ zvn{_Dfp<%V>x)YWyo{$NrY*SK%OpNww52OjDGw9Vd1V~)o&C=C_S%J&6T)X=W>zx5 zXA?8=o#IPB9D{a#Puo0ZN4_s(lrv_0zhHEsEZd-Sb`x4EK9SO^I!b<;IdaPP>bl?X z7`X3;J?h!@>l&>XESnHLG8_2iOpK&e^RyIn0P-tFip;-G=J;3XrYd@JLmcVFzOoM2 zU|Fs*6Fb1?DM!uISPxTOvmve?3lL8>mlgr&!~TSC-%_aJ_- zF8JV-Yp8%jdj_fY7LCQc1tTPQuI!)UdmVHA4(4*XMmgHZgqFf>wm%8xUS>BP`2D8E z5U7H3!>WXa3B~}_3Ei5VB%sWveJrGQUKIdvu-;EbZ`f8oSz*W614T)E9hIpaE>La@ zEu6^U^9Mi-iOZ}Ah6fu7tOw_N_iJY-g%s^rZ#I)c7wzJ7)sM)vKa4Fi;GoK4?Bv&H zBr_0w>7uY!+!b%1B+6;{Pr@@+3XgI~qFG@yJQ`LF0$j`p=%&{cvw5KK-uE=NFo)RJ z(ee0|o#N3k2m!k&G$Z`-Cq)0g1QooX1VbL{l+tvc6ic$hOqF|?sKbC1v{1N1F?{PE zBpx-FZP%1XWRm@Ri{ZtWQJYE6XZq^O7>E0Zp7`*$Z|%^U;o8X) zZno5Pjn@3;pZ^ff#X8h6EGsm9e|Liy>+P!L`5(Sgqz{G_{&o~Sd|m+c2wDDz^(90E zGkUs$?-#o0CWC}0nYEp(fr#I1)RD=ANgJ7#eu8Kk+o+lnym^a9p!D4S8%d(ri( zad@rZ4pIf7Lgx4tBN1^{Ua>(F`K8(hzFD2#Y-BQq{SS9{b&t{;2bAhn;LE_`~X4zsmk-8*hVz&F!QD_P>^*cdNp z`NxnQj!hLaE903WgMhUaN~|BOqA z@EnB5oOL_47S58&<-6zDeOW$RSTgD~j5J-g4{U=^JBpDY9arj#N~yU%{;6$XYg_;I zJV%Y9bRD_CPD(*qOu!3)A&*1dmcA}{T#;L^58{N_gU}^N7+ef{w)u#mry+U{nX2K4x1$Rg3{vWR1 zIx3DX+Tz3l2^!qpT>=DmcN&7by9IBY5FCQLLvVL#+zIZkfgp`T<4k|=&3bFr{9P=% zpzGE>cc0(cyL=G^A4OhRto+HJLr1YuEl!KC$z3@mxSb4L+tQ403fQshNX2x1H}9yb zRmfM9RqPhRYphJ3AgkWx54Q%CH~9d(saXZhC!7l2QRO`XsVFSvtP?qwW54_rX~<&(q)66urR0Pw*EF} zc9^;PH#D;KlSuz*w!6>)N2g=sn^XsqZD${~A{T3{S~JYpuJ9(XWes)MM{8av5S=%$ zoxC}P;c(K(NnKg;l(W;_vl7)R9|0so2Fm6Q^?I1Hx+E83pB6dY?rcbW^JPRl`tH7p z`UT}nfH|%m0|8{`_bRaAkk@KATtJkM9{fw6x4M1Tr=VoC)0o2lz4oEEHUL;4N@Hk+ zQo<&|twyO&A{DsblS-xpY@@+f6z*@zB7;l+@0X_wy2OiIAAIjB|3f*Rr zA-zc~@aE~?lYZv^X*cn#=Y0RlaHGqBN5Ab~@f4~PzUOY;vMS<^iDk{hvtdjAG!Rxd zFPJi+1=y6SZg%}f-G!m$Es5-6a@@EdzGhCaY>`PHR;_;7wPN&b(@^WZXc@W|-d%!j z10&5!v2-*%l^WA61H`U~@N-`kEC_c=oYPE%;wT91prAAER;UN! zq7j+e3s{cV{drU_S+z&}3eqDQ@P1b->H{gd|K5!}%3#48jB8UMCw9dqyE2=tjA;zs z+AHkPcB(1u>ZbVhEA;IR)3BInf{S$&*!iH+5S%y6werd6Bw%T{*lvoe3g4{FAFU;3 zu3@k0QD+23*2?u1@1yi|657Z4d$IsgAP8s3cQsRtI!(P~|FgYM3=&RH0Srv1Mi9ob zdXVHxB3tLiISnIFL7K&${4eZKpoA+--#PO-Mj97#8i=h`n=%2b@k&PO{s@J!7upaq zw4zIfk6*wiOwLS-0Sahq7uZ&N)j4-j_q2 zO5_DUl1t(IhgeVE)pMrvcr)6l43BvpZS;f$6bsq}vm|+q7R(#do#33Q^*+S$ZR5Ux z$CJC8>E{XUi;W_*FcWt1_7 z%?u;YOKq8N7sbf1-^RhyMKo=&qzk%hqga`XZY5F%I7lZxHw^Kcf{*M_9v#>b6N9By zB2a(!fl?Z}K;Ef~)~AcQeW3>J0U0r$`=V|UgnH~5W&Opjviih&&xvblQ@N01K~!2= zl$_EbD@-PC$3jteT*yJ{GUMfp8R&>@NEv0iYWmXO_swuI`j{nK3l)6sPIC_6dmj6Ju<@AY4nGsfV{^VoCfhex6wzbD(*@0+Qh5MN9ijSfZI z#{DxTt`qfRVP6tPb`bv~#i$Lf3UgkCv${}i6Ybkppu`mw>bL?bmqF^4nSb#D_TR*f zq^-9bj4(0M`Ga&Zv_#J{Wgy&GNwdh5;)vSXCi1>^{BlA1xyzS~=pzCJLd+)ykUNHb zO+t|`chk*1+;xuhhaSk8CHZuq7ur*9w@#!8?$#+uzP`Me9OZ12Y3U$Mq%5{2tRR>q z4A7s`wbHGFEU2-`Y?%V2p9r-Z-lE@9<4#DW(#(+-;^@#{Zp9M{ivp<>=k3rZ7pnn= zA3O@gj50Ot5j-gZSL;*r68nC4U!Apc*;xyIrb)y3eEBm@JDrx?vDq!D06=0552y<| zW$Dz6;{OGw81d}WT1wM7ypv=gBxD!+4Q^y3T*K-@5r1aezxA>_)lg`B0!IbC7v$I|)?Su`QxIX+^Ow z-6}9XEHYw}K?0W}A^%+${adOTLv*L*VS>&xx9TTdGxt$_DoG-=WYhl0*^)MD^+AFR z1r|h3r#e=+DHLU$u{gsylSPjixl8&7>rfyw#ntF*s)-j)k6#zo&~IS*<0wlj0k0Vq z*KvV~#BsVfBjTJ7e08h*?~XwD>NJ$_2hX%yuBATFGGl%CUm2#m7_ap)#w{~JE#Q9Ui@jkxhImE4+3j+0pL4LC9@sCcEl`5AriU&M%lTZP3SgavLr7mOeqnlDg|=yv{no`+`}Y}elb2P3ic5d(xP`I0xh-j8NnXeo zk{!|(zcdWSSEb`}3WM`?fuL_YB>U1{?nYTN<=8^@9*cVHMjj+eNiR>ca|?bg0W#Me zhR4D2O$x1a?G?{g35t$lpnIBpTGML!in~Pcxxm#H)Hm2_;dH^5%m}+w0(a3VusM(3 zJg6}IxO&DW65)oxW=|PV{n}L!a(dqU04izLIS?2CAT4J;Rk{3(bTa0zHetnYswoF# zMUaKhkq7-i8jh6w5Di|h57gC*<}v)b^NqEtTETmF%Q>(&>v^yiF0-7|oy4wsazp_& ztMo?2NaM%(In3=o{;Ap@uSWi@2|;NS&u6;<&0fv+LAjAJ@YQsA^36}=B=78I8bN%~ z1}ssM`sG9(dZutoKH@RIFS77ATwNKdOY1(mXdNZjZ^rl{eQroD8P_7^U(rttulbbD zoXFc6-*@Ni70P20Lq9~3Fl(KC_^6U}hFNeHQ2SnsqFA;CYs{O;^h-XOD*Grp{owu^ zJ!=Gjb*ZDo0zRJR+i(bVFpyu}qd_#m@4v)F%)JiJ2p2O-*ze!>)>{*s{xqVT2>Tuj zkjM9Pa#<;}mQuB6FQW&a1u$MdKvhn~wF%KeK(L!Zse9`n*V^S&4dW5r*0U`NbJ2xB z*umV*X`YbLCy9ZHkK(fMB5bkGruN!SqBG^vS(;js&s8smsGU>LuyKnou}pbKV@PqG z^J{r5EG3>Jo~t#;*hTt|fSb#ZSF*t?RC7(%zr?TGrfFn}dN>#(Yx6!+iOJoh`(Iw zO86{bwsQ;A|LC{~5PRtB$0G9b&cPb)Y$hq;y(lZ%3cYM5$VMbR{T>JZ$@a2b)!9PEAtAikP1AyV$z5y_jq~lQjTuG`fZT*9t(rV|eGZq30sW76 zQEyD_x>@9)ff78}49g#TFEu;i+YxfCxFUMVwiCv7q}!5G+8R%(=oMis*_Os%elHia zZhz5Dm>L)#{Q)m~SBOii&vs*f$#=y;;o0N$`q)9Zup1){lvdG-;PYkh+LhvdJW8+j zJEun07gpsfaV{cj3v^tV#*d4eBPBHQ)Ta&4+yb(zVBOuvR~LLPGtX@MVE3zOzhGN| zqVZ=-fSKLJOWvg7KiT+Y-v)ygzz20Fbf50pWGmQCe{z^=SdmB=b@}8qIj$^v7ZZY+ z2c<_ma5v!9rW_;apQTp~t>Opbl%yEWv->pl!#S({Fv<{%=2YEO&X~-xvd1n25C5!* zif36W5k0#BGe2E&x|tMK*t`CHkpqN9r@uP->Le{|Xo9qK@KT!t?&>p95p>j2_d6zs3X z)61=uJjXF>t1wj?wZu51o>QrE6UiKO zu=HK$bc<^F7_I^RPqlurd8x~@B#XjOnY#1c!%l(B$<0N(0<{$XG)UV0ne9Y0wWIaY zs=QAZbAXv-b&(ONQ4gbNR)5CS*)J0~vCgNvHGtKzFs%Gl@JJT>EDRpBB*JL%+o(ef zw#mIsCmT^@`M~nA@jJg+60U+m&y2<^KAEMv!WFn?HCb|H^)d!O5}8{2Y~a z|Bz>WMpj3igTX1MzPdfKN#**uW;*V#Q#FUMr0hVn3(r;)_WZb6eE=BT25 z{RFhao$R2K%%_>!*t=I3DyFq+jgw^`TVq!1BamQ(yW_^W@yqh89eO+l>@#oJmy?gi ztb!)#DgYNF%oG`oR;bmUxn2~3t!Ycs-7hax53F}j?P@f=v>eBBjU3H-m-ip^?N*-F|O(FRg5`v<&gu9Y!l2HTWsPpPD%D zW7@a63xGrlKhaI4F-o-9OLWaSD6$sBrtHUQz$(@g(Is1~e!8?GTc$GzR_z`&PzB?w zZ*bFViK2hkoFsfrXA@%X^cBnCCOyG{Goz~WWNcg6VvG{Eo<}&7d60H2w8T=q@yB%C zFl1LVX7Qltm_n;DGl6dJJ=TmR>lh*Q89WXDl}_2@6v_P*gYOd&VeZzBe z=@#9{`EYfu)XQ4alAMmBMFfhZSo0nXo_73ysr%9aa^0^v;W{Vj-hSo-uskSnqjrYr)imH%a4n{96A|t{6D##wSIyF68 z0h-E05pFmbw ztaK}X@d4{^dD9Faze$Tq&KsH1)M2=z;EG17@)t+Ir_}Z6U&vT(FE$iB7q{9pR2&0n zjZ|qG){Pyn0Q8ru+eV&1zER*+@7yndFH~qmF)-WmFQb4S7FMnrKoa(YJA}PHVu*fX zS9xkA7VG4rqjT$$J?BmNc(Dxr4WB$3U7xLugun7yI+D#OjPYRn;bOdeQQ$tcwL?sk zuk(_<0+{3E5_U7@*1Ag?_Qt=^hm}n)c+6)3)NQQ9ax~E zYL-G(P$zkpNW2G!idViLVNB<+++ze9xe5*j$D8LAk9b!n;AIG)V48KORryP9*tW6} zyv=q16A*sP^;*!vF>D$s13`uKUPnARynO%mg$_Vig?zXZO4;8{)jo-il3*(`2)?j06yX`d--rI_@;r)AXFRQHQL@ZER!e(_nf%6-K zVCzrMOc-?!AZ+35P`hH=%fE`fF|S4hgWmUPACWpTUIer{{wI*FYEqI8+cevpvLbmvzw_2+KFqV4f-C6SS1QoQgx-)+T)G1_ z74azp%xsRK7c&DvDzcOU%bm!m4N8`k2V*c^P+cJY^?d+tNI?YSh zUWOm^-1pj32;)i_^;dw3xxdjM@=yeY@Zb%)A4qALK|IekM^4pPypA1X(Jpd+{+zMp zSWaHE`31lDomp2&&YPQmx?BhAC5N(4&=_)k7X5O)C`b-juFdnmx+;29_Id1Rl?{9% zGQN9h*rGR_Jni8N^0|G(5N)qn>R*rRJ||W99>p@?Z$nnRIvgZ~U_YBH7N)Xp>AJHm zeGK&<{9jS;>vpf~4aO;P+1oqClN@;;EywE?()2{*G@Hcfb70sKd7#^70L&Rz&%jx1 zu)>JQHH$U0!xziJQx~9V6PB; zY$OzTZ^0M^<|5^*)0n@W+|}f|g8q6%SU}V!WAC&XX;l2+aof5h9MywK((X$Nuc0>8?3x({(obR- zQkmEmJ6t7vC4KR440(Nd#Gf`24fHuP4on(xzAmcG1HB!vYt{GoXkFt!s=pNqGYR(u zc*F+@=CZ)E4dr}r9ukl&6z8n`m1Jwl$mdRx%D^+ZEj<0}A1lMr2zY2hmbGW9RAenJ zUf<*$JyiHlV7xDye zierUrL?(H@HLP#BIca9*oFZl4Rg)u8V?(^kVl>MPm5YRj|;D8)Bks*F&9d)a#~-FTnPLCN z9;!{_FR6eedsv3;QkBS+s~&a^?(X4rzr|>j0HlANIC$0F&kkckCs6a!E^|p*RLy+e zpxY56Tj!5G*lKBe+PONi*1%6Ze9Q|=g0n9xnCbp8kB`zU-*#^tR!Do8PoC7t9{)B@ zT-V{lX-~HL-pZ=z2+^uGs(y8H+^H%oA4p)aFUqsdLEOfD2v`s~PYcsw|6x=-aehv8 zG~X;wtK5pZX%Xj=Dx$sSc_Z96IwkA$M*=F1&qC~L*H;X_)kxtbhw#8nk*0s zY<*=N^;t^s;&TH`z!;&GhgRB`PL6Ful-KJ!sOkBLQJf8_dP+61UTC&Ga&xMn-JH?4 zDUJNX9TgcY_B23HpaG(Xd0ivX;$}AJ*J)XSz;N;JISliYn{4;bo*Tj-y$82v(g7nh zzd0@0vK4|7JDySAIE|{g;)N}h8xeZg%UFf2N}Wgnkkgj#M|*(z(wYo;Yu-{Qe7ias z^)#DE>~BjP&-gtpuDhGh!1PZ}Q~1WMDOzrs%#alAInNaeU9p3nkbe54-yxzk{n4-Z; zA5@meWJ>knmVy81;$B zO=9PZkn2SNJGoq%BMg%lQqXvW30!MlWFr5El>(s*VeK?To$m^?8~SvO^Y=O;j6>&M zI>sO)yOUC2tQoZ3DE-+}!0dHkZb+lo5=<~?gZ4C=Be*no-uJ{kds!u^tf)wkZ0V-! zoY0H-_Xe)yKCPgCjykArLM=v1nxv<_N45>g?8K6xYFWh< zsP|t(n#Z9lC4B8w<_aKFpG9B~-BCWbHfSm;(l<<{O*X(G(YDNnW_(Xwhm??6WCBzS z>SYy;vNsh;0B0oDz6EqEIdC&ji3+{z55Z?stQK`T*crXgchHV407ky)nI(E@bLHa( zEcAtOHKjgUtrj|X2`wi)2|8ZYcGK8JUJ-}3-`^fymwVn0HZhC>FApjrt2WCoJd!p) z_(plYTyiUbl(qDI=Td1H39n2tvlWRTuyYnIa?oC%dY9P1oSe-J!!Ro|{$~Nz;`}z?6^knLI8fW@V}DQ-ryxLK zH~C*_q3&SS>1-Jd9l3Bwy)T4`{v}88(Uuw+dU9sX_11kq@J|$8rn6+2w!VOE*e0{W z96!g&uPuT(@RCUbH^$5n@EmhkXYaJVx=;LADgVTr;gR(>!N#WVtSnb&in*%;v{pF* zz*+auUll<}0cdLzyFP={V?OQ6sk0{Dy6wy*enCYK?-PpNCf$#Ro|HD$RKwa^@2;o6rXAy%V z$BPlw;qAb3TGP=}3&j)b^~}PpBB?2DU!o^9e=d;V5G_*3mB|QHWSF(|xvmM;jCn%G zT`YEKaL@k33Uahz1F5tn4-WK`njxCL&tIMwfL(J@t+-heNoaXRJr52nZ%sTrt})4mT3f z5(FqOs359wSka62gxnAW?VekKdvv{*CA{R)u2u}Hyut^$DbzdtZZ0}c}cNIqRiF%!i9i&+jVc-V%6EI3QYixG~2B5 zmN}@Y)=>QqXRJGEWm#FNcA0_4v_C}4<8RwB^+wvNfWH?QNrRTj!2r_c= zjh6abPRfj;`A3n!dMy7p45%aK3S0p1PLLbww*C)*O2&64oeo6)Z2SR*BwhB4fSM0m z0O?~EWFV~Sq4r?kF~M_Fviz6NKb~JE4Ia36R&x{VjaeM@Z^u{ice#`}6`UB&8~nY&*FH&#Qd@=-w_z;Ot_G#d9~eD@fUokA-&rmPwC>hY$pZcS? z80aFr#=QGOBUHrZ0R1dgQ2{jR6*Tpo8?$ILT$Vj8>RNh7z?cjjJD+TGy?32F_}&Oh zr*Esv-tz*-g=DvttK;7`*6^EX)U~>Y7wi1Q&)=F7s;Ww?NFnad0 zt#2_xAM3Tp-*8B)HVGq;koKH(e@X7 zv**WrZi5L1sBzcL@P`5=sD9n8r!Q1%-vkY~iN!n4qR6>d6M}x01#f<5cxAUvxzJ)8 z3yIAE0%p><3K`$(nefNre;hFbD0sE}vGV%;0zRzm)Im9=$syo)m7V}-Ux*DD3Bjcj zG#Rk+znw)VY(o6~@0;djR~BxTXdW?VP;DODqTqzl;Jh9ivM^)JfM^|lWpg;XrRc(+ zqrXLnjy|Q3J3zDls3kr#FVp=Tr+6#N{{6ffo!+b~o^pav2XcvsBC-2t%8Db>WBUEp zc23YTJLDp@0*uBk>6+sov0{TxxeK9?DJ1$MTEKgFDr$1CQ4%|90BWGU@P`Jutd?Ct z(;_PbVSB2gPaH2@JB8liJi3t-wZp0XVHo|=dGoPMOTG__M`)1PgE4X2dHy=LY=Ew3)_bFJFZ<7qwEyxee8(rA}7@# z7&KM%CmV>)4vIq*KP+_Vig*x;$c)Jf`OX*GdM7@T1C=%N`SKoOMzrwe+BEqcmqDwz zOeiwbVU>%%&z%dw<%$;|QjsL}qk-`xXFyI5-+m-n0GqAXVMZ#RYTCq8X`fb-I|b3I zTMtrSx8_(+y`s3QL$GoZ(bTr$tgs63LLSyryZ?7dU$-65_T%OR<}WQMUTYR&jBWCT&$m zy>PYvA);T`>|p%@r1bwUpk0j;%P-G)weG#ku~E)wF&L_oXU>SKsYwbM?qrbgs$ zn@r2<&-g+bh7g%talbjc;_3V8NZ-a`eaKd!5W&G7iS zj_nLO(~w>rweR%lK-1ONr#ow7Niozt;{NHckbtBDE zPrGQCesEOKEEyz_`T1|jl|z1@!B2mrALClGpfyV5JGw{+)`>WXg6}zU!d2P zPOoHOJV#L&H zXM8AGy#WX4-Lb2t6%x#8(YmMXs`h{OLt&_ywgolxzfJTbGdC`FIC!JPt+^%f0$Hg$ zUW0=tk4&gKZKVq0*k+nasPigIf?f1-JD*Y)c1BPxKHQ@JZP?W1U%J!Nzl_l17S+K3 zWnk8UMQUIFb4jKHIn0F_Tn9-J+3=0+ha&wU28$JLR(}j&fj(_5_+YDt85N1MvDe9FAK$o|U@uUc8GssP7prMWgn5|?Y zLTs|=s8D4mTd@gAweV|F4NfOJ3YjRhT)!ARmX)0&i1!K--SjoC?MUC6YK0PKudDWw3!yXA0TKx1u z?4-qBB#eTuC(KHnUYDY}IufsOXIxKX*&jg@XT^e8t6II+Prjvgh+GJIr;8wfE_4_KZP3fj?9s&b z%Dr7>_(P%v!=GWRYst3P?~CgEq&awEn(`?e2_d&chyp4GFva^so;Q1sH$7rks(F47 zeI8Z>L=E4r9QZ;Mm23Q^{OX>&8`pTPyQ^8`)2( zi#~Ny)A*X2zD?#{mis^^rL$x(_bZhlmiy6~sxtgsl_{)c-l-BE3(ThX8Xxut`=Xcq z3pN5J`xX;Ud@><9^uP$4l6aOIdpFT6<=LpY^i2-uz(Vj&wMS1D)}jS`%!S+=iCBt9 z>Y?+~_4%Cn!vy9x7*p1Gg90-J5Mjr+Y0pg5A;VV4=cg2C^Eb)x>xX}M2IaARBW6&_ z*LhHrt`mE;^nd;qc4TNK6P%qsEv%5Co=_}1bFLj|na%09KbKfQ&{@{rrk3Kl=4|G`ft>ig08Gy)32K8pT>ANZc2ttfeGDuy4=#(Oz$O4@Q4P z!LoV6)8Ll4iucPWjJw|L=L`H7(*#xdziIfp?5jDp4pE|ttOX>;0U$-E#EFlHcoY4H zU~cJ8fEWLlNr{J(38)~tQs%_%a1mP&NILPbj_;#;YreQBZrzJ-x~1$CSW z=7sw+RWW4_GXq|#u47hvh;mnnfjeN@H#Zsmv!}7;o4YM*%c-5KWSoHhuTOuM=t!LM zx+MOP+flQW=#}pb9RJ(1AKAdp{%Mx0JbzyK2O|&q5Xg4?`4%p}PB0}|wB-4`rM7<= zb3R4F1$-;yH&w2V5g)@;ZCXZY-h>Yj^@HNuZQ3%lV&Xfxinc2(ze6Pj52&el?hJf| z9SJ@=v}|Y{SxFvxc)qta`x|r2qhhEFu_S+~e3-u{+Yw-L;>nSui2m5uNP8VoQ> zJ%0dq^HpJr9`Wm>=pB@p>0zgVJB~Z%lDCc{`e#%?)@l>*oXV$Wb>*SNhPpsuJF?Y8 z|I0w{^r+;RsP|lI2Oo+erhBtfK^GFkVWD8V08259d$@N-ZV|~?tXY1akOJrxZSL#| z-cN^;DH1>|U&z46fokKo^*ZLN*wLB04;9WUjp>wXgnP9mi|C4jBM|Bf7K@7=$s z`<*0w7hB-8%M{fCA$qwiYqHvlfV;V8pwYg-muQpLrUSwO%aLLcrbr-JndTjt(8fu= zWnm+}i=)W#cTOaLN#tW#w%6cv8xZ?$sDF>q%PprFK3`u&=MWxW=scJq_k<-P#jQ<~ zWbMe_nJcRo07Y$Ve_D_rcakRs)VmPpdx-(V)-AotJ}m~-+hIljA;w)FIu^+|b+AbMRtvC5)Ot_&{t4 zQ1-+4=TPihRzwiT+{Y=CD6ttFZ~SXL!_=ouI11{zpbim0`BgYc`~?xWazLW+K2iq1 z#tC;S`*(+fJKp8`GP9{{S4MvE%0X_DU{RyFLMVJtwczwq?7mQe$nm;T$vN7I5u1O5 zG+UO~Zj}K1h~FzsBjrY@+VeT`>N<-B|MF+mopQ*T6qL)kxA@{f?gZh|%1n6l=ub8U z(Z?(S*x0}1@kRSW|8x(*pNdyYp;x1n-{+KC=vIj`1U1y zVa98?g=%ql?a%h`MxwfQsK@ooye61fkwY!W<36O!+U4#!?5ZS`kq&f8BvVG2PTSOI zg%;yC^LRCg%{bU7iHNb%6Sn zUa(=06WDxP6}B%xl@--@HmNUDl6VVMDwoW*0x>QZ0Wt}GjcujUay0U$f?*VtAaiLFSf5YI9xTgM#jfmD9gCZgOcqHG|B4DfeJ1<_hfM? z{0tMA7P0agj3r)l(xS@Dqmecc#y)3D#wgcXX{d#6A=j`vP7;Fvmh?v_;hJITJtNmu1=5ag(H^g55fKR~7Tnr*kah-@bjp;tQ6% zYXUv4tv!vj5qRm*JReR5I>ex~8fmY8^34<~;4HxJ;p7;~7o4ShS`qfZp+Vsok#Q_u zh}K(Xke?#f)^)HQds9dax#*xEubrbJSaSvCT!{aQPXJO1+pw6}%iJW%5`VLkR|?Qe zg-N)+{~8Ld?YAb~z7t}~4TBB_FgF)Qz|JUQZQsR_%c?bg4g#3n$x#7rg44L`{=lzk z%g{Q{E^W-XbCNt^cZZ=W-RV7m*nYAx)}gmOiae{sbYHGHv7hC*>o=+&P~dqHN`|6u zMNd5?R4cRxH_yn!cO>gRa_qmXt?$h1z^cp@O#H14B(nEUmJN73BYNoT7}HYl8U<#2 z;!JR5zTv;<+Z2Q%@u0bc)CzB-noJ*>4IAd51}snH2HdkIUJ{eWq~%o{+hG;|I&3OU zSw7a>ac=O+;CeqjL=ItQ0t?m*hFDW&|8lhl2{N~tc_5&^zTumJn&=Cb7gNkEzE;Ah z1b<&VgHpoN!v_tO?_70Ew`{YRP%`nV9ZOst*R)_3>(e3U%wSfr-gG0Dn0%*k$-|r; z%W`BL@V5vo=d2iL67p~_KX{hmCVra9)ExN_)^$)V;j&jucsf$q%nKaFUOjZOZ1@oo z^>(hegkG^Vk2CrI!(m^YEuv+WV#}(xiAI^5vK|UHO{irjPX26HaDn>0JbTsX(#5OV zB@LjYGpSnT>1hhR@u%FJ!&6vz0ncQiN;#hkyQp}kMXF*gV+of6Ivzuz=YbI}1>dyl zuh==2DW`Zm08ECIXYI{N#kcsfJI(7CV4e^t5)A-PQl4jRZd+&h=dKpNd&3vWGvmeC zqcShwPBr|GbYxyQ81j)mhMV z?3k@4=?k6n0`(48h3?2e?r2y4!(lsWS&Y$NPp_ss#_e6aFWQ}+qNuZUS~W46g8j9GE^uK}ajYFi%(it-h7BSEGX= zmz8842PxvfhRfq&!P^Pmjj)`7M)RwamsZ5Z_u^p`8iY>8r9diXb=3Oh3TT;q^p3Qb z6Ls_q)!cV2O_gPPW2G@B46t@Xw@31FN}cnTAKvEn2t5g-(D=|PX-Z(F)yTUfw!GQv z!ECrsCZ?<^+6rON@Z(vv$;s>O4)+)OW)jMKuy(#Go>9UK>C3=X{Cl<)x*WP~sm5g9 zxWbD1S#zVo-)wAscVeg}H&)evJf5_tn zis^{gry7)!JVTE@13j^%w^kMAH(N(OF;CTERz-CZKf!y%%n0wU!Mz%veIXd6#dka-<`4SyN~A@`ZEpjUg1CfG_vcC(+pB7sRVUWEL3g}lpCL5o7+0bwLzKkoP*6Iht>%ZSbwyy z_w6)7OV6#Z!6iR}N(;@w24$ppWL~F^f4Y3}7Jr|&PXtsBX9zX{kl;g6c=<@gjUcO& zT6rxO-|-JETWu3&XlWU$2!}OvUv<(09j{p@wzEz(%%D+66=rWoF6YP_&>fX=&CEG0L)oy zc$mmK?~TdiW){tlZp!tG{zW@(sje9h&ug71SW%NJ^Z0!>uvc0Y|76bzp82kv|JhDC zJ;gk-E~mMxJ92q0SGlb9&6CZO98olhcm7p(l;A$W&Vb6~M=(Q~z4qgA@r79nL_IHSg{<@@yKEbNrLJUH9rcM97yXcv(p4Y+8D;%Yn*qx!) z>7PkqL@Eh>!%Q3uM;khAIGZty9#P3A67-O@7GvB3w`IYws1pxuQcLfiEcz&4dXa zQgtlp_1J^yUo~*Ju!a{qak#u-{pzoVbZH9Fhw2k!Q-5Tv%$hB+mgL5XFY7fCxH{D4 z?ocfvg)%O*Z7#4>^U-4GDtVAcbUJp$kyND2w=mcgS%p9MY6~>Bba*I!)YwF_`1-o4 z;pMzQs}TDE0}@d)ojEO>s1@P%w-c2m}c7{erHWa~bSjHu&f2)8q{y_FQN zlTUa8X}@Xbl8#|3i)FlD^EB1Qe)Eag7U-2K}-!`E9z#nA;_qd*`8g1Zyk z-QC?KxI+l;?(Po3-Q6X)OK<{%5AHs=^G%-j{qfy<*Sh~^);ZnNQ{AVl_O4y0HaEk? z^2)!x1yNtP-S8vBRq(JDubv2`D?wh0=E&??KD5M-x```!tcL6pz_hJlp=kMzj}OX6 zJ=~&UAPX$a>q9QR)VFg8>I>B5ut65Z5r4Kp6^1889B6YMBG`-pq!|+PgI6`@7qeu=csaMu6j&l1gu0L}fIMom}mTNTt;M0!eqYV0w)x(jlv`tQ93Rge`|Zltnsw1Uftj+olZ*5Qc^SqQA%{_4B83XkUldDk~iytQSCtQKqyD z-Y4l5ks;p7=O;P!e5r})h$`qSQNu=}W1k7QoSPz4((2s0Kfs0yT*~y!kT8MxWO!_` z_M%1+aAW5hME>T&G$>|8<9#OvwH|Ak(`uqo*Z6KnI^qEd|8i&BtXh|^01 z#A|SOjPe)y{t2hX_4Wr=B;+RvL+MYif|J!sFb{7r3sKFfCCyRU6Hi<^a-_QmpDM5+<6!|qQwQNw^7`tjtScU3qa)$cpUia1{lJ?g*f8eB+(mD^G(Oy)0K z^wW`FraP_M^x_xw3)y(S-8HtRaUpZrxhSk&zE2cciZ|+gJLi-Yo^_fD`vFbe>hP|~ zp1^&FQH1OgouY~<78=k^)e^L}|0B@jj(5p$Ks^fFw+=|gx3nM?HI28WdnnUWhCw%f zeX{lZM?MO2vC%e1f;9NAs-Py<4SB#;=)4_fQ2Jcfr`Gu-&A^*FXVl=K1B{5m*pzxB zNlJPxe#^dQAbY{i$pH?RG3~Hp8|H8vSy{ijsF$npFQll;6FsQL=id|O0RE_O=!i}R zcM9a7k|1=461R6TT?OY)3d%83^|w|$CS&>~zaZUc*V-|pwYrVH`B<>#VV3PAV8VtH zLmDNmo`^6o&4*3Ibp0eiyHsqL5(w7X4%4KGV&uA(5};DQclgeSjfqD)q#3`&&B3=y zh<=;iH@gKbi>_s{FIwCm84Qrj1F}OIV!RnccgjVu-!FI`&BF~RV>Ei<{CC-C%nhyW zys;wp5*;Xt3fDZB;S9BwYv7fY-W-0+qj&{*y!SWB*^||`h}f92N1{m=ls6US51p@S zUsNe|`uOlA??iN}==C*)>=nSMO!_JNP(fM@-4D~eTj$6&TrQ^U7bcA9wCFL52vYkI zMsw6&w1Ac>qC|ZeM!}t}lP09uu+bXx~fkmMl)ftvZ+ePnxj=&TXkN zY`@6mCCWK3rr7LT*{pYWYZ=XiYS?IyUKFr{EN`|VSV|C-k)jOc0)G4Ooi>fC(QMdv zI6xbtmSqR01;P?zY-;24Y@b|=<|(LSY(u#KfS>3KOclBh)jOPazI5ZcqR54rtZ}qr zqU759-Y3y5p~hd&Hj@?Se&~Df1G%U%T3lz;`CP`&y3K_b zI#yto`{1kMas94aj8~-IsV^lO48)TqipnKULQTID&w#>MgaNY97r%Jzeik2-@qZM- z)b?*rjn3FJ8S?us8}Jiu?t5c={~#y@jk)!AI|k z)~q#022$cLz!Vf;XRbQ=dvQ-Av4ET7TXycJ)yAmNFqsSjRfIMD^Us>vmQJTR75&cA zl|YT()?*t!(js^<u!Ai!;3 zKfzFn9q!m1?pXX|M1IczZSRGA!H6YlqZdq_)dFfKb6$#}DU?jA*QS@$_bb}|7vUb; zF*cWsNk>+C!y7v!f)_va;!zdx=a-cs^DM(Hlb+A0`|6euC+)OdPGn4s1r2iPZ88F`ARJ}0J6<2cH|;~K9UO_iNLY5qgv9SyYMdBvq8&Y zMoXS1szUcqs>se$JpEz-5kr{Kvbu~~gtE8j9A$B{v4ouE9ZQBGe})W5*~>ciPkC$K z0mtD9uX-Q`R6!ijbw~p!4_0fcOuw5HqU1-T(xwL0eYf2xWGAJ|pA~MnRbPuZKtX6_ zqd&mh_GSk?O<~s;afkp=opequREo2EIUv1HNYXZxfaO|6y6(s+Cn%(d*I~JtCRI#M z0v+Jc=dWGMYi`9{g8i>#Pm4pLYFnL>Vv7=0{7q~-^C=GWHqb8wl6u_XxQR`P*Zl=8 z0wb=d3`^ncdYu`D&0x>LOz+EfXUv4@%0H);Clq_hsHjJ7?ds}!ZzugsWg{jfKw2nN z7-pAHJd=d#L&Kb@lOT%VHUsDK21=$4fD*6_glU5n&2x3)3wS6UG5NH538fH}kHXPR zDhkSfWW<6scu(2!Rx(#T!$_lL$e!LnfuuuJh)$oqQRXP5mDX#v)mT#1YiPdO5GVPD zU23f_JXxboKNM2Y^tELX5t=r)w9BVc-|p=J(Bh|>cM)ok9&Yd(MbC!6Q`6AL<4wX7B+>b_b8;Up z)FInO{JJIN=V9-ZwJ9H4Z``{rU>jB|U`jt*mG?nvc#xZQi-S|3c1~kej*yQ+YC3=z zkMek8s??j2Ua%J0bF7l)edy0~HL=QUgl|u}fHD6^EZu~&q1d(Q9u?{B1sRc9$nxo0 zqNB(2u^E_a!%Q55z5m<_fc5{tv)AchBtF}TYWEhrd!d>c*9;6b1R7jG(~pCl>O3t& z3_+<1z9okPc()RU@`hsGq=p0&ITr6P5Da7`FasYz{oDrB_lr)cpC- zCTDGUl>MAxN#quSt@zUZl`J8Z`#Pz>41XiIrNWIjC$W2IZ&9^egoYX(0d?Ma?QAES zbl?Q-o1sDp_eE-4gV`9G2@;kRV;(a2ZF2vmDqcU$Q#ADm%7rUZ1*vsN{zpTZzOtZ5*&-nEm)9{yx5pv1~A$5mR6&NVzgLMqp;`p zLg!c8^5b zVy?VhbXS;Nu{Yw7%RapZ|5U)mYnyJzmQE0Xp)e&VU?gvxV*C+`vU9@Lcq#P$iaC7Q zodyCD3a&X>lFf7pB z({TI2{!qmRyBvINfyJ(46{+;!*Pf8aAXu731JQp84?sg&%@m}Vi1c%IefwH9y0a;e zD+BVVaFZL=nbl)m&HKFw;f@2r3hS8gc7p>ry)i#$bk%;w&EEAPV@Z;U##Hms#LTkv}Yz{xJOd6d* zUu{!SW$5?w*tx$#%rGd(rwwszL2AUX;5&hhc%ipL`1JT#r|2|}%GxoSuf_Lv822OF z!5xPXK$fk4IU7xCeY(O=uBq%wYRYftxdNybw!90mKQWqx$W{Jdz!~57i)58&be7 zA8RCbw(eR|dX`)<$9R!;^#u*$^U$=46YodzFz~B&H0$5n#1k`xkWj@3gLKk3CiA8p zbog2WQH3@(n$}BxovSx;$DwTyHa!Oa&BD)C)Ah>{W(?wXD_IH+hKH>}6fzu3n(c4NWgGLOw1$I4!Z=~%sph6!Go@LPUbrUj|#@>-;D+l zh<0`wZY* zZYch>=Ki68Un|N}L&Tp4oG#|Rw(B`(NfAb+2m__1XMgC>%2?Y}ILm+uZ0uk(>kATu zu&=gMIwG2vyZ-zvSQ9Wec5>tf`pYfBGOm3$hG2M&D8Pm_BgW^UM6qu~)l_>X7H^Lg zJ?wY~dgHK0?J zuRi2`nQLWRW0^urQ1cT$v;@+|T`E+gdeEO0gi64OanE)VP4@K~t%E%U?(`9PzBt*0$(^lxdau2g3bi~(*p{kXX8d#kjr@HvA5-0p5xzjfKa z@Qmn{IMDo!(wGzzY@3ozCz#a86Z6|rqiF?}9_J|43A%;j@MPrq!!;R8k;Te0SWMA4 zLmWdZmSAnxhR9e|r7?ei;ho7Xuo42p+p%$xUdB}DBk%yj^z<(~l%#}d7={SnFiJ}M z!Fef&yp||>^ZoPij9c-td-JJ1TCuY^pjv&}zqI*B7|1OdgkUMA5OWwoU9vhB<%NXr zb@$oOSLkw7Fy5pK0;r&pGQXeV)?xamMW*gh$&tmF6rRO1DL2~aN0FKwBp=15L%Z42 zagTec>SU{~HSxrliPe!xQ}MS$;%Ej}X3{zoW=OJPtVRjEOA&=fTPcJOz~Vc;K1$CL z#>X>AULx@KTKe~kIa+Z$PyT}LJF?EsqGit~mMX&+Fz)wZsH>16M?;ZG*WdEx&~Bt3Axr*jvVyF>q73)Hyi0y* zbG4F)-cT$}H29f=`SvtwL!ji(1?20mTx!+p=DCnE?oPN{|HBvwHTM)IqLL$7Axcbc6rgkGNsVFmWZI0oPU8-* z8i4k~{Tfv^ZoyPDHYq&}^6{~*l zhe`CGCj%<5qt0Jp0v!%)w3Nbg&~z4)*3+j7(e4A*{^;}psMMa%5AUil3_nhQ$nFI= zh8Yjn_=<3Xot_EvQ*Fg7=g-ghIDR^-fK9`pk3%}99Zkbo(CA2+8{7McW;ml^$}MOf z*>3Y0_(=4&cZ=$OyU2Gu9G%u?uivJ=iPvS=a=JFN@od<}RQJB5%k-j49B(ht>oaE{ zwA1TDq4@FIYv|ch_kN%D>YiPjm-oJbY-e9*=XZOxO_k^41aiM-8lMQ?t*atVTgwV3 zE~(05`Uv{C%=06DKhL_U>-j`{d#VYsbhG;B!Vkp@#cMi5(AVeRhsBV^;Mw5WCd%8{ z0@#8>g`)y7WYL+-S!5(a@aRSe5%2A{+b%c(mm`rQPjs)N|CxLJe^1Vu6$>W{$>k~t zM-uoVU@e+Q`2RiT=6}xrQ{gE5zghO8$p6m27}E2ADC*xsR)Bishx*(Me81SY^?En( z2HoBVN7f&t+9B)oikzPF>wtnb7A`#vbvBun(lp!byPvhNy@fRm_$Ox!1$`f1ukY_Y zy_x-ZdKkEf`91u0PKT$0t6Y3vwsx~7u$74UyZxTFgX0Bz6xz=Fk11Z(3SWJPZk3LQ zCgLBQI6L2U^tvN^AAttN*D#-m9q%HlKAwFm>V^SQPb#aHhXw=6kgzqdHJitHtMWRV z3rBlnl}MtOj5z{=U;g{Yry^kMXrp_1|BprgvspEq?+ZTfE$H7652_Bb=znHi`yXR3 z{P#6umYDee&s2Q>x2gW0w?Z5J`QpDj_5U{hY4XpyFTOA5?<-XP?^~n29dCf$?k};U zNJkCd+bkDv&oceG=0{iuV7~b?xt-?ezuC6Em;Q>cW3m_WR-XTfY_}?v#`O0t_|)z0 z`uV=U>Js_!@#*8DoxivGV~I)7^QFzm-{%@cY!HSl^o;w_`Z2KavX}98F__og^)x?~ z_rxSLnziY(>PNikd%FXyRLUIyFo}IQ)4_~)lfP&(-R$4oFTPZiolf{dd;piA2g5Io zH;}KsIECzz5qwNETfOntAaAThFD3^<6EzbxzfUy3A1)0IhWC2?l+q~*yA1WP;6gr~ zPy$!RXPit8R)N;USorOCzjk;&J_xza|8;%Z3KZOeb%`(VIkk`f@Ldk6`p6CA=nctP z4k1J2BRy^{`YYgn|76e{7A@^I>oxn#G*4?7T{B}Zv|3|<5|@3Ff5$iXJbJZh>FfF8 z#6%H5Md6U1L)2`iS@(Q8RhN7DgTyoany}fAOGoHg$L8(!ety(@&TD8fc=1xJt}-vJ zZe)?}?U9PF#ax6@c$0a;3)I;9lWX%;L%-zI{?-4TvClekdYuNJ`SYvL`|;AlJ#Y7K znSIQMkCUp`sgK>qa>I|_w{99FOCw~RD6U#y2`Q_3N;dUSZttB~_dE2*8f-POVVV8w z1zr8fWjV=8+VV%<=IgEhee!1aU42*K&HZ-#`+Kxd@6I8e|8rc~>3v%KXw~bC>Fenl z^6H%+#>YKKJ}S|dDT*#EE`W;FYH$4?8k0=<%{wfZY~nSKHz1_MlEn7Qih}Fwh@0}O zdsOU-M*Q&Q%y$fw9q=5R38yL93n4y5zA?`sJAj7ZHT%I$3yU8QZ^Ev;$aqYu~_Q{0(6EsNAGep$oJ!UN2J$w-vdM&JPXq+emA?k16ls!R5oXOaYeu| zd(`OH4?fb$PDmMUPtm+Tf-?hzj!aSLg~?&e@1rdMaAHh~MO?po^koSQj9Ycl8^E$ z#qeo7mJc2nt-GJnrRZg~36d&Z{-OZ?uIpqP-8p6|DB@+o;fkX>sVq@^Ttd$$%0CNd`?ApKhoeFNC8mzM2nIbYO=GfQ7h z|3O^pcVsuq4_(SnvRfzxX5;+>kD_AXV1aMDcGPd&WMc^A4`&-+Zo%9AXb{Rrrid@t zsa;E0FCky89r3TM32?Ws`%8U1wlVs@y$e>qzgp*19rixEt}|_q{-&)mD={@LAJ!!_ z?p;g-nI#pAu=-@hJS}NSNW6wu_uNbSyk8%C2-pcOhfethyiO#03J)YebRt5F*Wu8H ztT#6k3_i&Pgb~KFv$o`O}eWHVm>(;yA`^axS;+~Px0trcon z%(E1q&QK6_)#*-FMT3?_8&sVxD=5$r60|-ogr$38BreFRD&O~|BGjhLz0hLdZ)>5J zu($OmKOZ!Ya&)7QqkXF5rWS>VAFyQo7P>qgZ6bgzX^ zyG%DM`ud-ISUGUQ->OkuUfG4l7!cbik#H+@7qXRZICl$zvi42! zpy-9T?vDYJMw5+;t58<=<7D|^i=#{w%CfOLV|>0LIzSs+$WNmv*h!6f3IGU^MZCvF zv~Vv)3|I#;7dqV(0uv!u4Jl3~d=sgTB!5)?%t&DEfqey1?62s`GM(v&Ml*^XSYclpl8C6G zH11)?jASf?O;*95bc7luK$F{Bd?WxZ@iSzk6b3!YBuv#>v@&Wf<6GPoNI;itGh^p% z5+ys?l%_DLt6yNbhlP`hhQZOUVRVrmwXn*iSae`bU+PPvm%T=rDt+@>iZL_woD}8! zV+t^*w|LA?$HS&w84;#a!a-b&K1LsYXo?(WwEnf9B1^~mYpbr`6240aL1S z=R8J$cvTvWkKKo&L&XNDS~VEg%O|)$i&(&4`|r(tu-}`6ts#Hs^UmNY(|9z~>J+wS zo6zgr_l~zM*bmU4!ko`X@`PX3!wKWdx(+j=Tb`$CzWV2dOOhPq(p1bHzvw-V`~Y+5 z!d1~O*m=|GgvMf{8W-@kwgpSs$$JUvT)O1$2(8c0Q^6IYoF};$hiJO9kYb50?@O1G zNE%Jh!j@;HltwBQn3#*y;9^rOr9gkjsE=2LC~&~B59Pqs)TuKnro;a^tX$&eX)Q#X zMzDtjLyF*nVOVxxBYWlK&#`HzTNZn@j$y2p>k?Kat1Bv6 zQT?un^r~e*W^_ve`+Ak0q{Z_E%1H%@N+Q<)L_z;oGxIMTaMl17j`%H}d^wfj z=$1^<2k7;j;yLrT@4m_U_1-w5bqD>}jFXFAe(w3p20Ta{?)ZrbBTB{X&`eXZdJsJi zYD!CKFMSWw3x`}Gz!)a!qQhJ^qd&#_uWa^KB<^(674che7>_P9!B9h389Q!EJ-7~c zoi~?&4?oL;LBpQMT?35Kub%UtwjM6L!pUg`mUtTr6sNoIK)F%NQP0PmJLZzZ{qpC; zT9`uBOhTTH;68yjS5`g>$hB)XoIM#_$fH#cTekuhOUSp7g88uEGK)Te`3a&KU!rP< zKt3!!xTw3RWu*xNk9RWlvQK$Bd?pt}a`_~v1eMtE3-x#Binb{*@$$O4%RII8#S1fqx3b}==a!aFnZ_)XVsS)({$uaV&76d$&4 z^~x8V4lZnmUdAh8{KI9(#swDta-QzxjkFA&)KpZhdE(6Hx(k2ZW6gbM70uw*s`G| zt7u5KY4eE@yAicj78Z26^LCh8tT~{~pumiV7!oKZ7|FBK7G1x}tYPeBbr9gdl3G^9ZcS9@)lF7fE4ASp{hC~=uY`W|QG(*|@q`Bb9_TA&TxiW{AFAeX@V`q|9t zSb4-fDTtI|GvwXOiW#Zd5Pel{u@>)Bvlc@9$mnSj%h<^$kvv7rk;+bv0?b6ZW;Fsf z+4I+ETlKSM#*j*FdQD>F%5pL6yjo>s$8}D+)<`Cy#ru^7Et{7brw$Ltma$d#V!eNm zNuvpnHJdk6qU9!c38A)tr)HOgaoO*1P<_kzg=~jqZK>W@0NFa`jpeR$1sd;5Zbb0 z(6~a-6B({uk&^rjQ_x*7D|Q_zKP298Pvjq=F50^E=cS`+aQ7v54u#f<;W;fVygF6^ zu4bT$uhDHftPU%a9;x&rfJ2$Vb8xP22pGd&T!I(td|Bee|8X3zCyQL8)rT5L)=FR4 zO-422Ln~p+wQm1Wd-W2XcLshcCkr38Ry zl5Af}Yb`s2gvc2D@3nj>hpVmIXLPL+nqszA$V}+AQnF)0O|X!&+AZPY!^cH4dKF6I zu&P$%D8G?S4ynkpklK`CszF$=6i+p}vnT#m?WbAHScX}#EfOlr>?$Q#=~J26tY`Qs z+l~Ums~>^c=CNu(qb7_ zfAP3PMAgxWU12xJ+?;k(PRsk{p6A7cx=5R46|lDxGKV&Cyr`RhQa!gL9pwa^K7tk1 zJ0>3uUaMGcKX;!Qi?Kc`D~ZG+BOL27(AUrcW}fsfY~jLS32;{72I<6GLQw0=g-GL= zus^64*l~rIjfH$T6Zm@kN8S+WC%(OLQFm>C-YIQ-!=`s>V=rv$4gc_EeH&2eD_ARlBdfwf|vwxrctWy=w zbK2L^&^vdr9-rGwf9&}p()(W6%9N|`3);TJ-XF$3KZvecBYr=k1^QhDe>`rten!sI zyI*^~b|dD!+09@{eaNb2;sGQ9WRdJ5yre^yg1G1}xeO>(C$Z}d=LG={yp6K$VoU_* z+$vA|k>mSvhWl=`!!LyXTLf10mPe!XzR{?gKk>c>s6RgbT#T!?km6W#uX_k2k zCF#B3M#2wlHzsg_t_43Df2ytZbece)#|c%f^<0}qxp|p9{q_ed;_ZM+0ip=$3A#3_rZrAqX89mb`l^%` ze7L#7PV8j+WRgWW67{0x1moWQ;#WVmFhZyKlz z4PX?SxSJCvL17$n&#HzI!nNtke&wPX)kR{JsU$<)O{Y!QsHJH}n%<3Grl$$U z(GDcVXLRU(uKADX?rCbLG1 zeVD;eR22M%u~#SklBzz%b!%g0paS2UogRJ+bEH!Q)1Wdvv>~TVyKCso)6R$&Qzi_W z3JI{(L+jy17t}suZn#fWxP#UkqTu{RlA9qV2(GesW%IWC`q4_-XOPBX_$+@Fbfy6j z5$Uz0R~4G8mb^<10y1Ms=yub+q*Y*yzAYNfM%}F|^sA`yUv&EIvx-={y(^D^n+G>pN)Evc;! zmpPN|)y|we!7m#Xf-H&<1d1PWNlwTMUZtuECWQQ@h}aOf#5?JE;0{yu#cTJs`*%N) z*P_ePm~=XOd_cEEgltjh{moy)fp{M~4Q>{y{0aLS)Bc9DSx$fdvLxRccu(vq!OKEe z8H~GSU@?3&$Nwklm90>@9XS%sMvwq&Op%8=ss&|_G;gTmuK%|f zG@7W1+K;ZMw~$N0qIK(>jtq%H6x=_e-l50?lL&Nw{S0)J=g?U(`e zkAyR|A=Qu&Mgxnk*5I^90fgJ{{B<^=4v-TD+;J44l`Imff7%zm1xv#bqU2;fyCL6x zc||_s>{V^*kO~bm4b-0h7KPZe`tXqKNy_CpkkeT#wzlgp0jVp_h;0PupkYe5Q{Ax)%@i|9~| z68fIB>i3ZF$PPe-UK=A4??*Pf{7d6pJPfV?*i3-voqJ=X8mV7QvXcA$yEHpX>|95I z4}a+|EKg+XO{*EF;kf&G4i#I2^ZFE9gleqfm&*1`41s?vw~Ec(*3*R^m}K6i?S|dM zl2saxlHdi)u~b_2k-gu+ET2+fm5jQQs(xr$?pZXndIASMYOJzAIbb;dY_j*6t#rNjQva`Dz{JivgsMOl) z`d+>6&x0nikU8yeyYjp`de)EOAB*fEo^9%wzhYB%%4|@wi>mMIiN?|t-)xf7D>q1e z=~fZJ=2+i0u8#;GAPcTSgaT)$i_NI9dycA)O20S1TCL!Pz=?X8Lwk??UOba1|#gakpX?|`UgBss9pyb_RL=?Zss_D4O+ zw(Ut1(_-1xK?Uvi5LllzOdklSf?%T5fIJ!)w0m2dk8Mh@I-C#OTz+{{(}N)&0YS6S z^ykNm=SAm_9Okic5!0j0O3m?A#2YuZ zl`#8*1E;4sz{IJhZ=KW4672DCRnHRL*8$ixCObpH$CoAV|6-edsi7cjgs`>uZ`S(b+Jo;kW7&`4Ef{?qq8;v+|ngCX6ZuG^>rP((P|g z{`b@CUQ<^;nZQZU4L82Bw`hBmM;9rm@C4ly;R2oLyLkzEqDFF@0t`|-uTDy&W_|Y9 z5AICAYmp9L2hW?UUf4-wRo|y;tF)uX#X5rn)W`>sX8-ftKG)~RC%;@QGJ|T~lb{tD zR_#e``tPW%)CDc+jcv_2UkE>5(IfmkGM#9MH;U#`g@kfp$@Ky*G!Tt&k6Wlc>x>|e zi3t4czbl%bk&LPl7yXZXqrhv8e%#4H`^{i&Z8QI|i4aWm#_!O!*Q?OyIwKzn!Dg8d zK(*w=1QZpm1s_wU{zHzR0|0H!e!RbS@;g!zhBK{xE#}ij zBM6`umq#3EgkPjuVxe`6sRyCqQBQ+6&x40`rkr)!WK>@(%9%P`HYitY*26xofcS z{SAJONVWpqso`1>tvu&{M&vZhEXR%%;dm{LXF|NV#)H-cxwO_w_nsdWv^{9uNbw+JiSkVH+ zq(7@7pfrrr6SdV#h1lWAPL=A0j>FaYv3cviH||8ra)F9Jx=HA|iiz4)2a*WIYzSTW zb_;Pd!THvy*x{F7o@z5KPI11}@?k#jgRCP5c(xw==A1i;xa{#Kv&WBp4KYF@JDg2S(r7{dr9iy`WmZMv`E{3MQ0E-el8 z1D$FLUM6(?fB|{V$Ez(-o+BvrD?qtk7g~yaXkfWS7~JNRVd7-qaY^m#$XWg7FX+o3 z%!w&*UL|6x>oV{opaTPf-A(yntpPhafm9_b!TgjBlM280n%ysAZ#av}8KfN08m*G> zw5YOc@~YnuqtZq_taiz$&wnOp@&5`8Z857EE1L%~8tNzP#}01h(Z(>0`(Zm+T}dh{ zNK(JFCJtR%(rZBJ`}SVHRWxw_wd;6v0r7-d2;2@$T?TIF{MreSWodXwH6est&SKLQ z;EA_!AB{{Sw)XbF&{}i16ZKbOYX%w9_Wl%SoKGeZshN%KFut{pVQ_tV*pumfCg1i~@bUX6_uH8>HFF`} zQNjJ>DVQ-~!kCjDJ>iy?*l#Bx5Y>`J{mQ58 zRP}iO-#KuG2|!Mre6eGJP<7g(t0ykE-&AR&1&tyztWLyXT52**m1TT(4-jqpnvn0@ z93dlb@_WS=R#bFG$PHj!y<34Yp0?L?KLbRQllWP8f@8?YENAnMfnV5jJh(<>!tP$T zA<%`W!G@d+bN4AvqMTV(XtcCMB0zN@paae#ULgr&&eyn?2-Yb0XMzzTDgC0EP~?hH z((WUTNmCe(DYohn$?!tkDI9}#yca8`;5JaSJmW{;Dr#W~!l6*F5}BRkrJ{`0m;rT+ ze|ac%f4+@-KvwV&z#S@YeY!Z^xCVtcT0DlNgNYqZwahI^%MJh91{X&SSKAdWe*4uL zQhgoYh@m1IDbiSq6p$GzYtdq7@ipN0bD!^B2FAR})FW6_pBMp_^RB6%xw#ZkYp`O~ z!OWopgRLE!5;%}Lyx=O8&JX3*ZJjZ+oS4n%$qm#5so$M+EuUVGiz=wLjeB$Wg7MH6 zE8C$f-(IJv`(V3T$PO+XeWv@P#RT?^7V2GBrbDte%u;R*)Lsk0m;AuTvZ*JsuBf0e zE!LjxZ;i##0NXlGlMU^{dR2h#^pCLz+WZQyf1U-A;g&eonW!@J{K8Ekx~S8NLmSIpYeELoh?b19f=lSjKq`pPX;=QyuR~fH zEyMHM+H~?*Xm*@kC?Sy=b)PonF}n^rjk8%{Q+;pM+i$OdXaSI3~0fh#ZK31jx4ltcH$3-O!t7C!=6|8uvkfQ z{D?)l{;R30e>Py$!faNws|vmWCetI#nzZOej9n!_OMj>&2K}a2`*ouF5_N3PUrilJ zkl=#$P{>ml&0>dRljDb!Ud*v1*ac6nIhvIY3{Gc(AuODnw+npt1ajrDBklu_d)qC% z!)oVx6c;}QO~nkYc%CY-u$pelxSNanN+_Z{eVQ6a3gW7&w0_!j=?jsqp6ItLm4P*= zS)V>-8BGf`7pfN@h~e}aU?ly1-Mjj!Mj^4x)Qc{oYO2_;GI*tHZBEL|mYh;>4C ziz)U(o44Vhg3IykTSNP5Jh5&g*7UreWA9j52%%+-px_k!=Nd&8QZcn{gs4EHesWjn zwnjR};+m4{r^b9I_X8C5WovAr<&p zU%{U&Nkjh1mLFy^(uIVtkGgAQNt^gSBK_WJd1`{6_mF~Jay`wb0F&*HM0ybVB^atf z&7G=!C0_13r;RM3w8qvO5`b_0=X9ZZ==j(vxoT1=MheBI$~R+FVaf1Rs|3T%?6{)y zKTP3I6Lll5XW6Cg^P&@BF_P9j;A3bO`fD5~R$-yJxLK0IZQU_$R!w;*b&rAHrL(>8 zGPvNwcUsxeA37Y$Wl)WIEzzw3vhTOmy*<>=C?c*64TC)Me`D|9D%= zT?*_N=tHEI8?ZoA$RT;_KwZ2H& z>ijnT=8oXqjult@Hfb>CZO_0mIo{dPyojrJV_6G>5%7@M{7@PbRg$CrcVbMfNUCX3 zM2d~J?NW~(uJEaPkX?@L2V**moV|VxBDZ~FmWbP>hy=Yrt2+?DW~YO`-`aM7n*P{OO(All=x?YFcfsp8sndPyea5% z(n^Q8*!^xcmI6AJLi$Yj71N^7UQCM&8O<*azq5m;f_XK#z%6x51SU^23lnmwpdCJ{ zRPyLCp+G&|0W*d|v`=?!E|uGJ9(VgxEALzrw2GNgj=QWbk3OsML6xNjxWD*vGv0Xo zU#iMq^LzgfQ(qa@Ru?skySr1|wb0^F9D=(`aVStUK+s~v-QC^Yy|}x(TWN5;dB5k{ z?|9BWd#^P!Yv$d=H*3xDJY$(s2y}D$Dr@9-@8<8#FB%{-ZFF!C^f381Qj={II69r} z{Z2pr@N4JnYYDoEFHBovWU35%~*?e#*ZRd$DD?mQHoT1$vc3d=9ED?yb> z|6{wPw_SSW{h+{3?B(`Geg?tdO9>sFERCRB_RyD&ck5i}00j36;XVzFbi)q+s0BK~ zbx)Y@AFgdBfU>XbjrQpKM)~#43YJe0yU=BG9uwgD(lKh=%Jm9+L@%O*hS{A%fn|>m z-h7ZlICf%@4L`=y)OM*Ij$5geG9K1Ctz4N_4iRqH-@2a8d}8nK1?5?1!}3P-Jj% z$}RQHv{*|IL!n^&lG53FPUr$bu;=DDL0(`J`?1I;FrG zxh815RWdN+VZ#7Zz{dnQcqc+Ia{Rt2e0q2qFt&zA=Fme3#aZF^)mlcz6G~6nClV)8 zuY^(9(Ky2FC2qw9Vp99Bi}m+tyR*vG0!)=FQ(#d8a3KD3=Dl;t1AiRogYkA~Kk53b z&;F+rQb6AsZ&Bi~Qy3vl#s0y~Q*jBzHlFKJXw@1@@Cn|C)u#>ppbGTB&Xo zq82-@D~;JD#$lsU=a066=kJ?=5kH5WR_T-E@EvK?_+6KUIV+$Z2Q{?Qm}yx~Swqwv z@+aL0gmk7NOlY>c?4SPK$m3;PCoM;F6DN>K@PtEzKEmX~%(1LCnaKvG^nz+9j!RwJ zzk&YCp6}z5y`Nm5xt7*NJ-^A>rWwb6It5n&tCP5fv7aS$z@Fo!Bc-?N`jf{VCED3@5C{isr8dXbj z6`hMSSUwFplufqxF>Sv$UFhCroTbL}c#hM-EaWkqgy`4`S0Va0B*$+m>%ZOK$P>B9 zFWb)sA7_(jU|gM2#5$D^$9YZTb~Q+HVkE0I#2d3NOfSf{jpxm4p$KHs3jMK&16 zvbt;oUs{!s#>~c9xgi^}w*IuGr*RQ^4L_Dbo|ZvzS2lm!R5PvI&7gy-qn>Jy6p-is zWfTJM98rrhsyw0AQY8-M_wirYYy<1vLP2C%4oK>1bJDJ=O#b_<`JWQ0N5T1LxDOU9 z)gI#!cjsgGv>N^))}lOUOp?Xd`^~39qmD_n8WopDKA}8C-txPAdM_hfN{@%fQ&AzK zu)W4r>aMXk+|>{!)Igf_+Qv1Hz3U16?+Z1KS9oOk~=K|T5^T-Ee|G8~5Bp^!D8=u19kEY3U ze_`=jBB8$59eD_9DAy#!icFjYyWY!n`)#yImu= zq$=IYe3F9#N${w~E!i~3Hl|Ro-PVOc*F)m$(Sq^g0##)2F~5k^NmflZU^~X@VjLHl zQ#I`;U<8T@LNk%Tp7W~E!*5aQsHzjLtC7Z5!SiOx#|^9;D%a425#shV+OA(x^&Usm zax~NBICuGKn87RE%%HaD2;{3Hh{2v4o%DG40-KMg;Pbs3S1ISjg9vsC%^Np2TryLn zorvp@%?mVNn;DSs+%dZ{h^wfTUHl)CWBl$}vfT`9v{XMpjsM#%S0=rPBFZ;gGb1SBQ@;FNI>iV<`aYpu{GPYC!pf7KS+q|%GeBD zXPp#+y*nu4bLG&f6%N;ckRrB&{vX=T-r z9n>HGCd1g^d%5>kwc1LCDuq6n9)B;w8>vufImK3g2yVur`E~!5hF$Uo&o+geI4Coc z6WM|or6nhL3QBgW>OP%T#$pU#V8XFqh3Qlh*}t{}?r~F`y;!ihi`@h`sbpr79P~+E z3UnWdQ<%&-8g|UiWnT#8`(RFYCi_s|W1f?!4RYy?SBtr~D9_6cOyBq9@8&ahT4xGA z1fqhJy@%mIZPhqvmeC4sXf?^|qfmqosdJjD4B@Q*svQ^b4K(aT`< zdaCwzzPax*a6r6L|F(Z(Enm^7G^tpVg&b|{QJT#?Vb8n9Ke>#5fA1T2H?K?FD*c^m za_s&hp`od~@txqg;mS%ZB0a9P8Rz0tNg5Wh{fnIlWw$}t-l#x|XLl#s4i^fc;?nKC zurZp9s|s@1%^_TcQ&}K_q@vciryDQ14D{^;Z6s{QdrIXR!`{%oXLoSOdg#wq>TgB#sN{N-X?)rh)l zaX#Ckq>&ZfNYzwHR{*WZbge~ht-8cLBI@YWl?wZMp(SzEZGb~uebPE%wyr0wo4xOW zwzCUYqFfrhI%(RuXTSRVRX-T99cL&nW}K_5!MxH#(26Jv{G7^R7*up1xWtdLX>oM+ZmhGkcu+Z@;snM-0^YE?j5 zunyE~`EtIYF?>mBb11u1O8ONxEOmS554Q!B8B5c67-M#0H-ETaYhuJE`#Oj9K$I0% zU>K@Zs}IP|ZfHPnY^Djp(wr|79WJgv_@vWB(SNh;Q3mz!M>}rMk7X9dn6-qZ-ERe3 zuu@#ck(mM-wu*p?f`Op=uju8-4LPBEPi%F9;r|(P4^`jP@;Q?V+cK*Y>cD37EaZ{r zPxyU01g{z9agKNQP+$u7$X>SGO`c;O)$ATdluU06d2OCM8Vmb?he3(BFXmbDeB2m5 zH6XSG5S&Oloq1AT~ zvuZzZSRe57B937KM+#KW7)_6t7y8v&e>V=q`<5`{=sRpKmaM$WoWzf{4%431D;r!N zrtr~+HEzRTNd*jOQhb%SL;005!=*%JNs(3;ZjG>aET~saqK@?|gp0aFq4{90r7m6! z(#>J(fnkZcZEY?Xn}^vsosl7rP!DoK7rc4-nNGWie^~Di?3MB!K&qEhh;QYWp31aE z7vi$12cpuYS<3#8Zd=Q;D~H~9*WJ{dt55f9U01;&1x1ouxJs%K>7N^^perZ;cpjsi zu9FlSc~$>aHw+W$W*^KiScDnA31NaS@00M~=}6Y<-z0n&(I3h4{(2r*q2f&jUCs0y zJJq%kxO*XsUXraiGi;(9{$ygpTI%)=ec~xE*4%<6w3x(rbRNl>nU9YOCA{}u3Gpdr z5oYOlAP_MQ-=hUxTG;@IROe1U(c>mpjm-3io2l5A+}UQ`tj{%2HYs!Hp})Q*Bno2wrjspJD3gn8>;4!O zwlQL2DK4Z~)qT94f|b`JIJzJ9CV5w03aSUQM~&8BE7V?pp1Fyjf{y7cI3~Z{H7<)F zvlQ{r*1L}Kre<(p$kVOEvfn4*t zi$jFE*gk|nmpg~dh6TNj@4uEx2W?LIk?M+|ii&1Ee{Mo`nF5+@A`}wBV<}-iZ3}NQ zc8G2^@;o5#w{I|1@j>O|jr8hLazAb*L4@2L8J_kCl>0_mrBeJ}jFQ*;xNToyG?xEF z^%~Ctbnc4h8^4%|gTN?Sy?XI0zhTX?&Ia_2phX8Vn zQu?7;54Qc+S+9==0H@4ZTITdE?6=ZP$<_1jK!v*FP4imB%)7H?{^&UzkpX0#)29e; zAg?`gb2U(0rMbQ&{F}?isDc?;t9N$>>tR>Uk2sgR7`g)iB6{i6I3BBuoJpX|mt-9yIGpMHk8=rBmK289VD=s=lAl)pG_v)45WfqsVXyWHf5mbTjU(8r?CB@5z*Y$q(3EV5>$92q37C8xl|-ApyX*&A{k+Nd84z% zY3nx>E#DVvNU%(NiScnJOGCaxX&VnMvG+@f$k68#KAdy;z&#~}_QU8mdHTjT)82tI7#bWMRN-7)YMY z8=gBc;c+@cKv8j~V%)gI>zrQ!U%Vqf;Bi*`JxNd@g-TnWmKmO<(VY4ey3J9${pU2( z%CvE{q(lCAI^y1xu;nWHFh61!qIzuzY@~BRoC@oqHL^dyrU)zBv0`7b(CTLE!+%k3 z7meD-ZumH=nG;`aDPF%*d7fn%0TDt|U3pL|rNrLu4W}2o9@d0tc>qA{FXD}}(k^@8 z{sIlp2aA5=6L~y_fG&ZWD(4Ws=wPz0SxF{mj9>?(%LU#_wtZ#aCv&<-YQry2h{DxQ z4+5TH=cO$@qa;r>cR=;Q)p@YKor z*frt|k@Mus-#U>D05$-W#iSjHO_nBeTcaBDs=^<%6l}k873g%2BJ|H}N(8BY$ozdf z8-*PA#stRno{~A&yQzzuO&AY5%njrzz^ZAO5ofV78H{gZA_{iz?Z&;^9e&K~967JH zOu_ZW%~JMs$bWv?fFIa|a~}<<96P&E-dc(bDxHbLQ8B0$(&!muuLBB-c*d~;P>Leb z%`Z%KyaYF*%8tP9x;o}SJdT6!J!Y*_v-wH-)op1N(rrGWUnZ}cb)7wzX!iJp=KB7O zsZz%!;tIk*cYvVZr~AV++7nvYkHT5WW!f3ydF48M*t5^d0fG~-1F>FL%woX;QnJim z*#+=N+CD(Mb9p@FO`z^n@2nOHdU>M34aG&1wWb`hg^5Nfr@X{DFWq0=Ts;wc`ifqn zjDpAQl>8M%j&+ty*N}LZ^VDxImn@B^5CiDtAlnQ`_+Yy4|GnCug1S~$5HA>>(1wRv9%9r86{}` z^UH8W7B}Lu{N+6@HG6f8W!&XAq`jJD3CfA-oyClrz@70YI=|bCp=ErlZKEIOj)dY^ zR~iojlYY=?oB^WOp$i5u>s#i|u6@pC=bV+saV7Sv> zyqTi*{%B4femdn;vv`s!;F7!|osK7EOBO2clPoSd2)+}sM@#JH1&(s~-h6mpFGg(l zbYFCW)u2c&7N2#K79)O@HmX7=5_E5Qhq|WK$rZGkuvuo(x%nU+y`4?z&P^I$-#XKU zBUcMP&kMIiwgGZ>a{pmXyxbo$#B9dA52~>rokzbDr69wN6wt?-pHeM6Y{DQp_CVnP z+H`7A<&?|Z22U)v>|%urE4rm_OhKD(Q0r>!&F2ctL0P@gyIA*egOE(2=!kDX<7>ah z#E7?cmL*ka#+1BNHru?=i92AOO=B1PyEzjfLwjU|mFa>{e(u0X5t<)Tk8cU1N{^it zT#aPiM!@Cbj)k=d?;|$EA>0KR`g_T4GA`++Q8%SWx#mJ78{4}L$EPqQ3mcCm8%EYz zff>i+_qz|_8!3odTbp|M>-ZZ>f1*pjyUEli&FM8Kv9UI6Od&7WYrL_LMHE7cjp5%HsU*&I|%eH3jtAG+4O$Uzo z_m=?5Gss2-u3~IN2V?i_M1@7mdb= zEuB!cJY0GKK3zJXzP+naVPS(-#a)u93}q7t-7+kcNxRY-VcdFc6cu=A)@{E2MdZ+q zXP6Jx*GyB_8Fs$VOj_SACn2}oovMaHH;gv9vcy}vqhlP1eLmUUUd(OB4kv?AuuPrr-3 z^=5w!ZtHctwxfkovU%IQMIUmDes(5x!%>-ZQ2a(g?X-P4(WPDSW^_J835j+vZhacX zw<|akkEc7aOnq68}h^!e;7?5J9GZs|&$v z8U%*3r>D}Ua?)b|CI~;W{MGLn$6fTzrjHWujcl%G-pw>}^j<)@gINU|9e2-mqmyzPYEw+c@kf`meob%I2o9&|yK*?_ zq8{ADZa-Z)BiQF`uM(&+Zmzmf+$=@xJBgyQ5VRqd#A!=$a0gvXC$3SY*irW;SYpWhxqvb_l7Bb9s@xO4^OU4=QnOLe0o*#WK|MO4P*VG zGn2q`5wVU8G7?735{TJJ;jzE0lpNF%r_@p7Tcc# z{jt6J#K8{Ro(SlOM2FHec{*dWI0~C-%rqfQ;H$p!OJA3rWmG1OYg$9?!DX%B@?shf zfqLOWg6?&Oy36YxA^q?@mG0_1TPj{k^z3T05s9B0`s`o+Y<683vyzpsksB=I$l6Z~ z^Jz!wAqxlvO?B<>CAw?lO^X_h4k6putZzg-y4EwjIIG{d*?gH!ac0=Fn5|1Jp~w_X z+(13fq-+JV431r8?-Bl&O}%Qd{?_IE`9KW|&TB`)c~74_gVueyjw9KbYuzFRO93=> z$_JfDN~nOz=o`A%*d=p#sK&0D(guvq-_+Oj`#YE}6|TrS zV~)6JwlW4f_LRKYQh62&){X0#wdKNb4J0-s$_v3I_~H}qbj08rwLp5?)=FN4;eYZw z-U<2?laEx#w}$G_-avNWuEdC}8vPczKZ>7*@$j;)29_SmPt>6{ea>Gd)!3DMH&2n6 zIB|4BljGJe3s(O3Ssr~NO+4&f<$PwUa9kzwe1F5{NZ{pAzx=^t+4~ugvq` zekh_Q$ggk>%5|#B3O)3CnXg;3Y}ZVW9oOj_Y-y`6Nb!wQ;d# z$p15g;~<%B%t|-yn7w(gt#pli)Q8@#`>QtepbF?7Jac)80vJuGX^3{S?Z&{jv_1B>!3?p!hYGrm5T9KFq07;$^#*0@UC#`T0K6V*^`4FenKo`a zn<@B|98x!ysN5C*8fDXjzTnhz7*_`w#*gcj4#{}igpJ9S5`d7no*hRJ5U;yW-!h7D zdfjR`_br_C68nK?Ft3(Wo)oLPorD)C%U(pV%xN|@`9jjD6q5;Bz2N$WW+BSIq=v{M zTNe(-zYG!wAr_N=PH^&uH7g2{X>tfbHaLR6t`{LG(k@+yXN|*GpL4cFbi=>*{D7}nFAb*0__;JgHzaYe_|f#MrK9E=2vD7Xq+39&53JGo z%-HVkRezY6Y3VOny;<<@Ai;Agt%ll68mFv10rUCD+_(Eb-XIVR{pydPMx-#J_${k+ zPe(849=|pm_jq=iX`%C4BG>@Br`Kr->BSByHO2LW<9_FfYpi=cqx4rIxpW;EioylD zGbee*7TpnmKvmK8HSVR$hk%}+M?H@BMMgjjTX`s*Osb~v9P4g6)Mp)eFh^Djy6HDk z;SE0nc~AGvD{uR%0TW`+iLaf*67>s$h(7-|fyW<>uIH(E&3jXEBy-*sc`<$2cwn(f z9hLJ}*cmW=ZeMG{!=p0l=;uvjV*=5Bo?evc7B&};lu)q-peE*zoI6a&x;qrWEp3$T zy5rX4Zbxha$*b3K4(~pZ8L^cJ=-KcUdtKU|c9Q$&ZicG-b*3Y%Ft*IeufUx6bF3@gOM_zz;9j{ZpgyD;t&jzlXP(PShiYAds$a$E zCd5uX#L=z}USBB8B9TyP6Tbly$ijLLcQXhZJ^d^>Kf0o3m#OHWj!)~A2-)wrh1j`H zXUwRf(EUSwP^IYygmO_%d%Y0TO4~q9QX;gHM()ce|A!P&mPMD~tKL-2USsBTpY0D( zR)1rMoPP$h=jl3qLYBf=Jjj6?-H7swxGkx3iAU3bvou7e!5OI-Su-EF3CVAM7Y_gJSE1Qo>U*7TU9$a=`C zCr{e66n_;!nQLw-+tA1X%NJ-Vzh+gXH?Bcgg70K0)`5xVYQwVRS)-V2G5TC-at%G? z=X;-jWc5b*r$V&l{dn5={b{-8-5}?qt>+y){`KQ=ngg6M{l1&?ezWCD>bg5}KeBc_ zsWzscWr2@0m+I&nHBe*Bh9~7xQF16u(jQ&L4(i15CTYcgL^)s$ZjzTmN-&iP-Uiea zkSmv9?}O4LuP7g1Z`ACOLA+1erxN`S9r++fOF%bICT;hPPYCIL=j?fqu1jt&-$@K; ztf5^1CuNw=o_E@N{AXR`LUPbDe?r=4uE;oBcgDSzo|qb;`1UD*5ZJahB6*Gi6I&Xv zC(uRC`oX(I=j=4{e8O$G%0MoYq<8~s_>v=$Pa;{>>+Y9`G=)^{7ZQ>FS0O)P_@Yfv zMojW^#>m6k>~tV}`Q2PFh_q>FAi}XacR{iLuy0*mL|{$(VT_J zW?X{_)S??{b;&>?nP^e4cbrg^Y2}*rJ~66~hC97lvEkc2|0=Iv;IM&4`z!IX749gq zYJvStG7#yyd;NA)?cZ(d4+&Zz{3R~YY@O~>hK$qy1G}+qq_LO`rtCb`;#Um)d>=*I z9%nr3Nw zF3OyJ-jeLk!mXTtN|C=qsSW!E33#GNoJ)sac4qmZYzVWTr9enFVC3>)w!kL>`sz5t ze;%@xk7r(2_ktxoUXT_Y2 zkJ2RDks^`9Q8ZKNq04PiFk64G0VfaZEq0@i_j&dTeQBD|xo$H5yz)d3%nQL?i!Qz|8*~NzX)ph_VObS?yunQu6kM>#>u@fhCQ!F zqddtms!eIwP~U7H6{lh5v$SeBN^C=IDdHx)hG-HQjuH_*jBdT=`c302j%2mcGmAX6 zQ0Q-p=CZj@!nK&}pQ+#+MRz{FGZ9Y5oYY%XZ272lF#t??p97J1$q7TRMAp1+JRsK1 zKio@glj5M5pgang&xX{N{hy2)7*jR0M{y3gLiC}yrDn(AaqfR%Hk9^Yh!`Sw$Brkf z#kvKVS4hRlP+}%00Rc>r9oniKIhBo-J8oK6VKCSEnoSbDv54bi9nA9Pz?U7$WcHUA zH`9+*^|*p`X{O%Odxmn!B|U0J9h?juC7TmY=sOWcrTJ=s9$|OP!RLL*QKsaf%i(V& zl|b6O1gIH0g{WXY>(I?z8N3b`-S;K3ucPuQUEWC=DAr<>LMp}aA$kj=-V=B?YWy+ym2 zBRFfsqG2KKb5Sub4$`kt2-}$Tgu2z05)7D}^D=xpFiwYIzTv~TOuqNuYhfgi?Qn#f zQA5sMmNHH9-k6P}B`e?({dpsZ_t}vWf*%e;`m3S;-Cw;fiw-$sheKZtvY*5FALx#u zNjeZMIEbRynH1tos>^ZRpwfAjnHw1h;^q(LZA;ZEnklFcywH6_Q7?>FRy=X!NP1!Mk3y0m}q4}Y8mCVY>Y zi-=O9Xp1h+{=>>dwQ7SGKG?y~{MK3}dGi{6L-S5WlRug`I2Jyl z*KarX{bxz{=-S|of47#QcxeYK-X1OctB@QtKYP%ai>mPHJE@xr<*@t;-QhS+;NeLg zX@-PKS&N@Ck}6!N7OKS9PqH}E{4x=Fis7c~hEFWNYe6?)4uG-4_C@D8BzH3ZQE9)# zPggeE`PetDL37v%%LNY#!%pqG547#gJXy=c8wD3adz}ocNo_gnYgC^zdqw&xYN!JN z$XARSK#VJNc4_`(XjQWLBD^CDnGF=_CqnjEXYck&!v9xwVu`>lGYw_8;%do-RG)}ie zVplaRsFX1WC`{*FVUUxj8v+ZqPwC+g1oT z+W&(G>n!Z-)83AOl8Wzx20)*(>ttA~yLrFq--_F=GtwG#8I>v}bMly*a1_lhx2svp zZ#IVu5{}(0P3mV4(o-_{UcWg&D-xZ=NRV(oRytb?qxgQ7xl3_-gNx%u!diqWs}-oW zXXK*9PbV-d{j0tM>v0*PH-l8ZNzsy_`;4?2h&^v1<#5Mpb7F+#4Fu=lrkWqBMUgbm z51mcc0h`PDe%-aq0AMcY4o0%C=)rmgiPm{Y1les2#t8vc;93KP@q#Dn*|Rc;eASI% zrVFjCOI6W4+hKc=1KhQ|@XbK&I=BLpykOc`CY|I+=p&o-+B)P}N*~$ae!N}B(8Y~9 z0cZGV_Htb|Jx!@=a|4!YnKli!p;d1x`fcztOSezs83$oL-xX9%1OoSLQyT6xoyFpH z>$RsZ^s&SF%Wo zm6zfe`m_F69IVRs9mp)zgUrVsKHVEE&Z0cT377Q88j6>$?^-#OC}w2ZygbG;)Zq*z zvuC7f4NDqHN+H1BA>#EUL0PZo+>Sz)^2%F1R(5_e4&E;VS#*fN(HOnP97rf;!=jq` zx1J1-Im=e^G^?cXv0bxMzri$Ml~q~rmb)KyxtOdf?RF{EC9{P$77mCh&IF(fcF>Bc zqSjEgDv3I)Yflv37eMznD%FhSX_ZIzFqv){fJKBbL+j#rlx(ZxmdL*sbYK85YVC+2 zOBRgLa(^Kx{=5ze!)S_qgU%!|zRS^ABA^`+w{EM%<5QA|U$?p8C-4FmcMl<89`|eA z{QWFJj!$QN#HmkAv)}u(>S#?5owyH=kF*t4W^zd5l>&_j`A#8d>xKZBIjWPVqM%%%DAw&0EBr+Gqd~D$RnI7Bf}(P*vc8*0d+)v}Ft?>KcZ8d$}}ZL%m~qq`tOwdo6U!EKoN9|464 zyCb5~M6hQWkwaLIOPu&}AJO$IX=sP{*SwL@6QAOShho&18}XGQ!NPNKHoA3h{Q#VJ z+(BU^XVpN{V6w7Xl!QB{_tl$WwzRBdrbPc1(a?V>oB2BAS1e?? zT=px8Z2PpFLo`iNb;cokVLR;jf{;KW8wizeSV}N(g#P-wySp z0zmK`RpQj@ME%m@_o5<3{L|@+e=NYP^3>T}hesr*_m~>`Q+mYZgy|Pc$P>0>YE@dK zv(xL0v}?Wve?_+-$dsddfjvHsZk%TcY|2O5Phv3!Pa{iaP9&=GSeVa)!m>jP0bRcn zG!(a3o02=!qA-3Jfo&oxNq%)KD}UTUbflz)mjANHV)Vd;1rd!P&MCd%@5c`~RS%>? zkXsKU#p&kv{+{yp3L6X_qneFO&s_z~asG6MB z>+sf1R7-PR%fHvR;fX9Ja!S7~%2RZ?(BVE{pcP6TG_pg5&jQ(x4?b`GA8?^fq!M`p%fNpHWM zSP8V9Iv!g4{C#fWFz)uaI|}6Zm!Ylv@iS&)y<3A=^5T#nRWlBFG?m&GFoslFKFa+` ztsm^o@=T!>@B&mGSQq$vLq2FUnlh$P;7g1W^j%T$^OupXS{o_5<0`;t@=iq3j#=lA z5y~z3ei4M{lYNTPQ5@U`oEdJbx=MRl(za54bW^h9&7a4Y*Cxe9c;&vjia}BxWNyON zBF;JvIlf)@mWzW3L9XO+aB?x~jRNT>HsnlnYd-qCY=_^KQ|Q`Ixzg;o(k4ROUkG=x zq<&gAaTcNp2XHCsQqf^fxn?UuVY&Alkw7q2r@uza2B0z={EWhHMQ~z63vr6HD>9!Rl5?FgMXOECC3**8UHEH? z@Ed)+hC=!hg7rGHye-8`%Qv z_x*r06~&F(kz&h6O+#^HvSKSG;y(+tP&%-DH?yXDfHwF$KF)0a`NjI`BMTOExff-% zou5PrNZl;7+g!3C?#*n>OrIAPlM}*rQ?m4ZP1?0!*kYNM!IBZLrNMeU3SjALOXQic z*jsjPkxXJMPn=Z~ahy!la5sju-Qp;Uz*u&{NZo;7b}4wtnylL*;rIq#F(FZ6)Y=!r zcRgBz#216o%&He#vj0>3tH)Obi8Va^i&^^rOOCD_V6h>Y`xw-#X=PBBAtCIBDfK7X zVSjo^LGv}MFoqGn*nN_wLu(4qE!@3jF({wd?i_fj!nIs3f3D$wk=lMwy^DdsRNuq9 z1ab`MFX~ln`BPt@MIG39%X@v|&urLAA9Vlr6vN-CzTD;`EW|8#ts?;;3ahx}5zDgR z#yI&H0XL&6f`Fvb(ikv?++g(PG^E=8`{cG-0yXrKXg4s!e{z4ET$X%+48U<{lNdEu z_fD3}Xo|=ra@sTP=-Cq0eej~$>a#41YtlT-9(H2xs#s(qU&q$i$|5$+eDLZ~hT48B zn91qXMHT^%ZzvF}IV0@-rl$3Mfmex_H(L_4@Ybyb$-^0DXeLE72ms=mOJ;^4ERJw> z$7#g~K2}4doR#|va;e@CZk4^HUDpCPynV=13ZE3q#*}(3Ew^#?rfH|j^c=aP)-b9& zbAm(>l-V~Y$EIApJ=KP&dCN4sdlC9$&^+v0N^ljhJ>r}es?S@QIJ1kKpat~v8#OvH ztUyd&gENc>+EcdOq__%Oj!d>Xf&En0M}2L=G|)N){`wzY2&`_{r;288%n;?G$R{C* zDmDg}QWQ6FcKz`z7eVEbwfhVeQG3W;=B+D(%0JBdGagyCONKIgPx4k-z4O1?c#s);sS@=j5LpR)Gq?qCL>A9eZwaS0u! zan4)(jCbVx*TxVjWH)L}8lbH3i&|u~?9;uvQWegwcZnUNw7Gkfge;6A4*b~Zpl;$7 z#PZ%aCH-_);Byyd(H=P#Jz4$6yF8N}E!AA#Am3ai(3ui1ux%VE89bq|(~3;J_)qLqT?682sHie6zvJubXehye0yBs9h@P$ek9p9IZD~^#{y+=`o*U zZn}91s1x$)u@uKjGsnn}UY+w&w6bLai{u+IMR+7DpWu?Hn}jFd^T!??66w94SqWPi z_+=LxhMKyN!_8$z3D0R-VW%!7Gn-;P9>-ot~mFji!>0Uhl^tzV)xu^`md@&J*EutRx z6-5R@lvCs7T)WP2w|52IyY4UR-c9b!vml!2xESkArwu-09(ef3(&HithOMr!XGcIA zUp3$ib1+k#reevi+#Qpf9+VR=o>e8gtJ=|2N{*C{(*l-;CTIu!dFo+Pe5Pte8!~hC zM_914iyym;u~7d@G`ePL$7mM$y}VxnpqB5NE$WZ+bTtnD(am!z^RtF!VaYbV-+k<7 zpHbPZZpvZxo{g;XQzHsGetc&r>*KK%hpq3@hiT`t%emkC>tT-H+u8KpQ_jn|Xpc8I z=Hr#S=jnp-{gm>0@_DJJC256c!wy(Gsm4MhvAa(nR9kWq+it7$&2{S)0^LQ!JpTuJ z3;DQXBYf;nj!EVYrnvQ#&pH7bQ<7&2H{a#DsEJzwOtpwY2a@Eo zEi>w^OP0xIEvho{r=Km99lIG$x{KPs8w0=#nYZn$-{xrb!d2K39sOXErT^$YqE)1x zu~z->}3^?n=GS z=lh_Yy1?Pwzps1$z-MU)R=a3I>0qWr;+=b8{gcUJ?)QHCRB|~)xDC2FBDpw>(Jof; zU$bPOTPl3crEkh&UGTIC!ZZZpq?;$Jtbr?Y!i!unL*Cm8C`%r{|GcmLg-<)4IL%K! z+FR13Vn5Dv*U8f)b5WngLcX)ni5ap13J$#}11|c>cUYAs7u{Aktr7rjk~8(PE#|R5 z?P9K~8{0drU%9D!HgJQ+Ollr;rh?^38_3LU=bGRf{>W;A%#=$O75~&1V3h(~blAyY z8$-l&e%Sh-ol>Zrly5MjY;1|oB-59MT}b6s-~`MROU6cxK~@hR{A<1Nyu(tN{<$V< zjGAMQ*Go5>5S*oM*|O_<9zzRXCJoP+svyySIX2k4Wd8*MW9Cd z+|_$UU1G#Bsb^X&`LKPjWJ97QTKiiD6#Sx-M#&euYK;YecF~fdJnqnV77k7g!s;ba7sKM_mYs|_Ee47q;>gQxn`UgW8pP8c{_vT ztf2_KG_e}g(w1LHQWSt$yH1&hz#L~1`ea+-#E}LHq%i)2h(81V#B#Pitn7PlX%mgV zZ{d*WkRCx0U*2Dg87A(i4PD#}VFW}BGb7v#@i;@FTigw3n9>geqPFw-Y}S0p{<_+; zYZ(+Xb(Ud9JG2cg5I_*sYv;NN_icx#yJ3J!-NJ(aY9k}Qb-8|B7EV=8RTPwbN)}!O*YNxr9XA2MwW??QqSZ*>#D-9j)yS#puRzix83aVU@A4q ztuOST>?5Sod*f$#|fG$_wA<@T8XrW zaeexMrn6%^3&o`vaP{++W!;B9Q)ZN9X<55l1`LVKIxD6u?@|vdGadmjwRhc0J!CN>=SyID+#wFNMVmu zd1seKP=ohjXB^v=3Z>55fT`pe-Dg126Y7BOD^KRnL}`br1J>iRU%7I#r0DRz4GUSe z%W_avV05=|@d7Q17Dq+7uw3&U4ZgZXNRv=zPR#kQGF_>n7fk|4SYMOOZVS=Rwrt6y z!DE;-FVF@<)RFd-efP%YUig4ZgrBz z&*^Y-&M5iCsHH-SDlUQapY*{Ky;eWF;j*|Cy!kf@GZXPZ#F1_~<>i$uA-|4W4Jm_V zc(E$$0XxE414Bp?w#}HmmkJamz3pgL8;S3>BHRHl$H@D>vC$z4k<@g*(yo74@&zx< zw3=M6g;VXsUg3u{R)XXBIC@cvl|IhbwJ2Y^Q%a`670Z;b4>hN5(=}&SG2O31l)@kZ zuQxNFB}$*ToavaIh<%m^UTYuzkF5eLj&29zSI6BuZO;R3jkPl|=c;*d{G0oKCUwg0|CzdVg&DuwJMo$K_x=DdC6K>AFi;)4!n`T%IEAHDXV8Zut_i_JP^yvcB<1p>(jBj~};i|o+01rqO5}F9({1sH7mloqq<505t zOlJvy_to-)GSP}d#0Pa+rY7f}gCdHshNA18S`>6&`g(sie+*`MWE6Fb5y|-L6%-?K z>9{52^L|?JwA$r0zdp*?%^rI>B=Gmw2DZ@(ClLZY=kN0N$d}l0dGgPBrGe_$tT+XS zm1x2~hQs^UWUVm!R|VxMkda;@lNtvINL^pLqa~;fDa~I!EON^A;LmM&L_bKpUpAMp z-Tp$2so9$U-jb%oQb>o!R}Q@JR%yO&ewR+k=VMQRVirbR(x@b?eE2kCiyzJ_&I!u z#$}Dr1%1^6XL%&p3r;Vvo)=NS=D|ws**wxD5^1())VqhqP+t*!{SrNv_*v))pDD zUiYEl!q)a%qw_7HhJAR6fRMIUmy^lXt-y6-CfmfJWE13~y53dxmjN=Bmp9Ih;_^k# zs69?Myk@-QIXZu3#`D3S&7%!($cdOxLamX80;)6aFondmdETZ)-R0st)JNWxcoP zJs=}O#HR9qQ(3-jx3*dzGwqbI0N)qesG{K72E_eyw7v9ZxTarGT7ui}Y~tfv{2*8Q zm}E}5(NL~?Sv_z6EW);-br}abh_bQe{0sg>XbTNOYsRwPHKT9%#@^*}r!^Cy@kzyO zcoFAF6$rr>;by%;rSeCoAmO|kd-mbGk?(LstgL@y(l@f2K=Lt(&g;mB)hwn1rO5BZ z=@sbt14m6*g(#u+m$|s$ZE~E>;k5qY8b9#f&0U0cjvtR7z45B!bWe`)V^59UmJc9% znrnsQU48rPZr`qz-6-OuKB+o<_x)PL?Toa|N6#hF}uu3FKFw8a$MB-Z@vHqCz&M%|68M=2o)8QAD@SyNUaR@{9| zfE6O$s$N%^KwxH8ht&u(8oLDbe-16l=M8(%wb89wvg=KKtnz&HRNCn5f@6d%qi|5s zV3qjybo`B%K?f1if0d9oIIP#~pNbcZ5!fC}<^2MgAL@x-IoQ-j{tq2?8U`^<3z@vf z{ryYkP~fUi#d-UU&6DclQpot>A@$if0TY-dC=F`B@fyj{HQ|sSm(E!8D#=RdPP}<+ zx9K7xSTYOFmR6oN(d%I)5gY_^cs&dJlk|`s19h!`H(#)8QSIb&ZJ~mNH=u$}Ho0%k{%L3rox!Dzu8xRkNS7p7T19 z`tNK;QfER20G(xa}xXh@=Uos$P2$Od!d6`RMHT+9&@v&3LIXF}_Nn>c}RR zko|%6ykzfK`I1-oBjsg37%!ayZr)A%)f0~=*@&EZU3mOi&QDe3 z1)_obC1nhJE_l^xmFYa%$s3>a?Qxv{7iCx36h{}Ov4r66!QB&rySqbhNeB|$-4ooM zK+xc>gAD^A1b5c~g1a+=v;A(>{(${DT~pO{yZhdAp7Tf^EydL-d?KGi?!v#U=}{o! zj*{~i9dDXyzynKvX%W`%gjWi76%4k^uL1=%&wX2G(pqr(?yq}GSo$GG80|{%2va7_ zsK2TzYz)8oN{R+tj1)$Q0?O3NH8NAmrkz9>Y$Z=uiEy@}UenqZ|KUx46PusG#BkQs z@%SiglwY&*EE`nsTrJ_ukups#k8y)Z!V!7p5R>AaImd`7S8DxW*R?nD`* zD+Lj%`s;60MVnJFQj&`H9#2?-C-FZMO9L3ae~q$8Loyp!KwHB6)@|f_znL+^=8%*z zTJD7O^;RNBxciuxJl74cf(HZIn$o+jjP!c;r8Ty-Q|c>5zu?A1zH7Dt zD*4C1Au*1aVQX=yA06aA#~DR@@v>ED?6X}xICF1&evCN@HdQJ7dBRomOUm-oYQ^I7 zLU>LYPL%6XoNKemOnHvyb#-g7ovoshr5j`1WSY^L`kbU7BSrF+?*o-Xu&q|oLQ2_z zRjM0vo!LsV`AX6g%q9*p#xsP0J37JtW1QLis)5fLsp!gA;B>qBp=*GIx^~;5gKLsk zPWgKu_WQ5V=Pjeyo^7k$22?;J{`ewllDJhGW-eR8YlE;sXr2^_!C`=jk9!F1}{y5P^_ zw<=M5JW`Ue1B;g#e!fL${f;Qb8WDp$0ChbZa^((y|2kO!Xp%p1TwZ*ptaatR;Ax=G ztKu<2e$;AxiWns1p2OGWl=!?#v+C|ow5iShN%wUN*>F?u&S9g{wYQo>%69yx{lVsE z-J7S58|EY0@R>#Xd_=kWkEg!^Q`olAdd<=?+9J<=YfKh6Gi`waG)jA;5rv8&P1v(~ zPC9%V8g+T3WORGVMci#@CtDE>`!y-$gz3vRO-hfANzNO2o>2vxIj+7A#MH{C4IkE~ zA0GQf9i>$0k>~95!@BHCZ>&zQ!}l3qGrQAz`r9DztOWkQ#sm8W-MD(g3Zf4;VEA^b z4T_UQ>pfIkL^&REil*0oPwCozmI{4z(Cc_n(=)nFKI7vuwd#%J2Mj`l#?E`R_XZcM zj1G{S?K7z+i}z-g?M+#gzL_v@+( zCyAp`!J>BLMh7k9Ovu~QhS*+OAN5vd=%G*V?`g5zClJQOQl4^AhGzsA?D2+#s z$yIIg<+h^OC4jlNM^NpdEb!@uswBZBUB|MwZie=DeVIxKDZJqYpTb4i56HcBs$L}X z!0Vy=sO(yzR=ZX#Txy09Xs_HY+gA`FG7SJE@x4|hURS$gbavR)1^IBgtvT$@srZsw z@4{O^yP>31@2X~9c`(CFm*()_q%e_`bSTH?p~6=ef;F@%Lu<_Xn@jr!#>2TOwZ`9_ z0>wT1wcJYIy1@y8cnXypAKr~DWH9yFh==c4ifanN;@wqg&LhBadTzxX z>{zrECV5n&@Bcc-P=$YBQZUNw!3NX<#y=k@~|mZ@mi!2Kd6E1(R!>_ti(u1GmFpo zuwAdr1mP+zvCMF@d^3UjcAe|hx)Yb6c1n0NUd@emna?QMZYGlkNIG~@2i}b;&M({c z?>s`~?!x~F-MtufaxBm0=(LEOa6!~CS*hLg6i+zT;h;=x0!h)f2yF)rlwsiJB?r`U z?;Gtd<6IsaqUE zZ0;Tozv~z<@S$Gm4txcserenAjt$Tbe!Oo|`Gguwe}H(~D7TR^OP+YxKAYhBK&0AF2X+9%%yE!$A0S{S?_75Df`Z}i4Z=)t%~#O*alpl zZ*c!3SkIR4TOCH%!DawL51O2vid7mm(VHVpy{asWg5s-Fo{!qgVpga5fIflcbZ*4x zZyDyHHAVWD7ee--nHwJah<|#^cyG8BwF%aSu5y#Y|AJEiKSqo3+f>CE7@3Ny0{-ruc^07`m5+-~r0RdFVRp`ZC{ujm=Ic}MTGQ8ALHks4W;IApy zBrz7RcA!7eUm87x<&}Su#Z^nuB}bg`>fiQBqtW2dWsVVHj|h2EuHqX#$(S{@w(y0I zrSfTuIP}r%@b0dM^(*G&s=JfArkybU=C)vrN#{}tR+d4VCM7oPyG_`v`!Yi6WzKnf z?#dX0#Vz7__!n_b1*Dx-3@o7fAf0nCkOInvzUBZ8Cc+=m`cihB(pgXclj>Hu`_Zi0 z%5gilSeLvNXDO!yU$s%=`QzbtyPMIE_H%eoqL(PqP|p03Ep5U9tDVIFSV^Dd9xum& zO+7srvroFqpSz0d#Olsd+UuM{1l^BXYz8ss=Q_YV&haT;1JjHOh~Lp9F5|ZE&eXm_ zi}T7)miV33IiM%CR-E-fBse)=&w~IMh^R!`G~ObfxGPSXg>kM~DMj`p~B|;YO@h(elW5 zE>2CQ%4Jxiw-dXvcfDt(D4pSSA=JE%#4%LU4(J+b874k-E~?~~lzDBuVkfluFW)Fl ztL2T+x|~mYUk3CsJ9jpwY<0znpPknw)A5gFs|b0Vrw2k!&>Vk*q=oCs!aD-vmZCtt zOCJ9M3WZwa1xZt&L6mdu3YWECStsCKdpRq=qYv?}@~?c8Q^r^PT>?5i`e^nWoqi`D zth(iI)|E_acLd(B6{*to3*&!_VQ7~Bq$FARSFk4G7w&Rytb|#|>CU$QoK|d7)VDOR zVfkQClIRWMjFlQos}{Yyh5-V_YEbF6VBEM(-%f=BJ{f5=+bFz)qD7+Z;A(wri*G%! z`esO*(B7owG`-uzTU5bk;JG`$w(IKgOBE9hl zYtY~OGvV8|IG77dF6lj7{c0-8#jV{|KXNFeXWf)c+N?-ebzPdjiQU=S+BN;?g?d{_ z*aP!5kE|py1`ZeYwFpfs-`B_utW*xT3+1{Bh{Kxi7!(dgF+f+l=oaA2FZq4S6kHJy z`KCc)+fOos+30o?mW-qRY#axj{RoV^xuY0Cb9%qj>sBTc=BMOrS)#r}pO*wIu2<1B z9n$W%AEt~oR-wYt^H;kFxE&8~H?G3nLwpqd3}rHC2VA1qP&qbXT5nTgO2pagEP;ds zTg?LqcG@S$GRDCqq_bKCvu=}Ui)~0_958dhGW6!z3}~9{Bc<9GzAUaT$uNPGM6Eh? z2hhcq7GlMR+3PEY$HcxfLjD~@<*R$XzhXmqHNFg0VNRJ1J8tGEf_F3r1!2qqXfCy8TlGbjT@|Jk&F8I0%m~d_?XQr0 z=*S4V&B#1suqN%iH}|#0rbjUOa~W4(ultvi#uRy;_ou z>G+Hu-{J*}j5kP&=r*I@SBs$c4-BN&Y9nSkaS}w=GPyJTewbti$8XiwU91^Tm>iS& zJh;l_gsJ=+cww+X_TsZTPkHL}Kqxr*f*jm5+bet9h%wFj7=`z3x&dlGu>s?%Og9-h zPne63)hvpd&jnX)UvVkw94Bn9bKSgq5A1sh5MR}X6s3eW-2k7zbT!pCJ6}9RSpmVZ zHgCA#*Vx3BM3!pj({2>ETm!1B7--!C`KUwtZ(j_96iCK*P)a&L3eHVeT`XJ zP7_Ko89Avd18_xc{gOQ5XRD~aq{Z^JU76Bh^sbRlhE(aKpjwmbszy=IyvNMUPh76r`nf~yF&*8dK2Co=;*9- zr6Buyql0-tsbRT)yo-31ck1=Ap7mF#laNo$yd!osJ}AeHVIC5114aBWZvxgXBLC#K z$G%8B2ex06V+J|1zP=GA5oJRZN+u}zns)&c$ZBpM%j7L{Fqu|Np+J|Kc)II6k(4zzprd;gM^EkdvbBnG{t>~fP#P|0~%YlrCXBLz(7l<2;=`1Zu zHpn3Tqvdll%d}m2XmN>dX~9ksjZ4BWtx~q~fV?6Uy3?Q>cy9}Se^e%@ndfKeENEW0 z9JXSvQdo=Z7dKt@*%67N@{1L2@FoQ#zB=B*}HIsF`?7Z$szMsvc~g5K+t|Cc7JH9;UXG zSINv;W>HHJ!hI1L2-=^%acIANoh&Zfo;9PtEhMLk5ki|a(UkSWdFb@GT@$$&^{Jnw zi<4m>IVZ*DmDGukguXg^YX5UJN}AOE znRLzO<6QpS-P7uVmqrx=cWWle9e$r63yBbtdEL^hE4o`1H?|V(t!DeB7XmP8FjGtg zpv>h$U^~PD80PM;5lpzI1swg6StU#Nm?xF_c!Q@v_lE??VaKTr9=2J$Qsl!*@(^x| zvzT(j^;c2yuXiuxC1evSP-DimvpMNus=F2D%0NGwR6YWAIWyH~gXPzCnGE(lCY|%h zX))#6md9m>yN7}e*L9rde7w1yAHu;aJf0V3khxL%=Cs3rw$e`(g`53d)>`Zj{yYGo_Zz{*6m6o99=y2 zjTV_wC`K>KzRu0~A#JvST_+^^l_|-)GQY30F+?cs>rrS+#HZ&myFeq-K=PC$vPhmP z)2A&qXD}5t7kKYWehsJ~4w9h@9H`%;EQ)|1IQin})<>MBMXwj_$C4ggKl@cv3q%^e zy7>$lGOTxBbQ3tV0h9m@5Y@}dLZUBT=Z2mKxFzBRQ3fQ#JI#$NCf+FP6Pd!iWfc?YR}3lD5P`^lrY#j;rwW>a#Dse zZ8qTfN}JMke=?_%@bHy#;+8Imw{(X8T1yMxQTOrD-53qbIt}{h{0pDtEa-LJWeO6>Iws%_q|?QdG&%HOQKV`zjEVptOQt!YPpAi+$lr)`?FHq41lUnIy7Y55BU=O0& z8p~}KM?O5+LNDQs)^|hS}COSYYi+n`ie( zlS2qT%TYz3$}kB0N0XxztP<0h78}n^v6HDz^^POe50JDftm*hEEsH~nMQd*c!N=&u zxTQg=v^wKc8!%(bErYJIw6HSa{=6b}gT!GYEDQsQIyvG-@J*1Zpp_zyb@LLDB3W|Q zoH5#W8gDx6ncZl6@d;ane-O)_CNd|`K>E>@A2dL!By;}5Mu4u)^@>I?@2s9StE$5! zdrLCk)T2?_U0J~ulJ^f6Z?wskX_-k6LuZGs;*T~~$e|FwQjwT-$ICAc&aV9Pc|8As zwkRqrP;a}!k}YN{VY4h1;X72IY5?HoHY{Y!voUBVF{~;MCWNcsT_gBpCEbt``*7^? zWrMCyC=Szb(YLd$wW5PeF61Uwr#ZTm#~t>Bq+FLx2ZNe<&w9ve-G$W9KFC_wf0^}D zxDY`@zy>p41a&skQ|RxWO>z7g{#>s(Kzu~mr{ToX5J-9$NgZ@a6x025asgg{yxcmw z_IX7@)nPW!N4k#!xlV~-Jc7$C)ag4r!qviY)~jV2B#OsO)N4L^p6d--f1FRpaPPf) zb<{T<9gkQ*Sx0h-%HG4gnMq`2mTHm9=Yw6ZciLK`f$@5~{-JR}8~tOK>UhgthTloD z>25ExD;(V?a18-{HLcORWqL zJpGtOl5kuEXPKKt!C3|*1ZGWn%LVzvi6B1ox;}gyK5+_mN(Bg4vsRmVg*jfW_BLuuZP&o5sKQ511D8%d6t^uL@gYt@j);ww{D z<{5AHZ2fJ@q^v4WT&qUOzqBIwNFHg*Cnfy{NC6qB)lgw21j8jH%#;gBxZYUc zWsNlbkc-wx$n_+QryXP099ZL6$QF{CyTZ027(5+WrUq=1{6aQHYO&*I2t(C*s%)=T z1VUZ8tllBdE;m+55tT>l%x8$~cu|qq12w8XFfMx=1oet#m{C7zOT}*sB;49I-A;ao zlQHi)Z;H~yfLsz$F%ZqN7WC_WC{jfW(?83jPMVHq^TDTA?5Ejpfa2g3V$W;yxr_weKMZ9r`cN2$f=EZvk+jYR~ z_nyiPbFXIu`B<^{52B$d!{FBy$FKTabX97U;dFYXupiS*-)H4Px#beBaLDWehKSK~ z$ZcK*dwyr2*5!)COw4ucMW4RJ5bQ;!bpDzhxnQy!gkLFLsPMEzEa)wL1TF&1|?)LG-vU9DF2>D}G#G&@jHZ8!!;OI@4KdAHQQ}o6u zNP_Fe?tM3AU+P|gW-S&c3A>kfyHDj)s5j28GIg~_d&p5h6MEEa!J4dmj|2n#i?k`% zV3yZH&p|KXwy`{l*5zU&KZH-oyMv~{R>@a(SIFi?j(-x!+jC{lSPUX&4>Dw@)h-d1 zLhnD?{Yk|{bfabY>nvMd#s>+{^ zn{#SZJ`Wu5pe5nivD#u@;97tqJ-Uxp=?+gRIgRa>iR&{*`q;XOh;)kQwtcM-tyGqD z>Q=sn|4Ccf*Aq$=M_xFx`ghLK2A)YD(eB0st0VKO4uRmTD6*1gL1bsVA(ybLkXx6E z9nIqsL_OLIgS+Y6$8TR)eIrb)m+Tl18_LjlmHgEmafp zhyf4Xy!k<%w1?J09YlwEzPbfW1Gx#BT~Gg%7sE~YVa2>r#xql|`~aDl2E=Y}dGy)D zm|34oE7*7*QJ)&$#2QU8#f=mgmMTSg z2wb#{&i(?wnduG$==ZP?pR6po*$T>6mLAud-A{-a6mMEp-y6jr>j)%$^vvT{7S=Y= z*xIZp^;Wp>mHI zWKlw}19X!q=pfx69I69*7Z$bo5f>6$T1ytI7n&?9SGJ?{(DM0Y^ z@o`1J{^24KBdB$dxhUYyS>N=01lhC|;Z3_PXN{tU)wa#MaXT5Y8O1Q)SxpPI7(B1YYJ}o|-x3E<9`Jb^2ag#Q%fD zh$G9yeqJs==$Oa=oHv+ZIWr z0sQ01*w3|n1EcC7N|UTtNco zf^Xt3IlHdR@5{O$T8|QpBm;Fq=2uOod;S~D=&EJ z(DKX~{cJWI{Ob35?J)I}uemVUI`h*2dSj9Xt_TM~vBkYIP>X&h%F2x27}=VP2535b}(2S|iSe zlBXA zZq=5#mc2f962HCMQYJ(`>C3H3iW0SFTZ|Gl=VsJM8OcT{TG(~EV%7*(xLolDzX|(; z$f;wU%Qw5h?}j%+PGGgw8EW_SxQnVSO|-lH{BesV0Z~oIR+gh={W+z|;6$ye5&O+4 z&mSP8p`DY5e8l&;mkC@12phOy9!nrSpTAMs%A7SR(5|b=YA|V}E>>S!p$JO}FI%Q4 zOBs+YE9C?Kcp`vdZ1^Y{YK*q@hRZ5OUwwFKW#6#0#ZhOt@jLt~!x+;m#}*O|I1zQk zNxwfRCo{h4C%`-*dlPDHX!q5rGWv5p^-*K!AG~+_o#nJ)0H|dSB!K<%b9i}HqyGjW(>@8@q zDd5Y7dt=R{z}`#(xEO9VGMp66=_Ymfa zri%SANgu;f*F>(o`}g&iMi;Q5HkCRB9*e79QtF2^lG2K?g};J@X;*s0P#`g+HBsfi zJ6#E9x{~OXr_>Z#)q1Q2?{)@CFKqp{HQhiS_w{$I6o>3p5(uC)8y(yB_9!7#huk*j32h*op4zzz-;YC zdU2x-y+_`(8t-3Zphl#uxBygnf$v9<`XLIv86oug$3uaK2;xZj<42d{NYdWx#*dc( z#)igybotG=r$D=jkhlGb%lYRCVr$<)WJwXEh< zwXVEjku4}=pL2%MT=bdeWNIN(xSkvS#vSW$MR=I^wT08r#L=u%JL=s}1G_}o%-kCk z8_S$&O^#S$s9IOoe3PwrYTbHEI*WD3X`=wxXyi~!rZ@vUv>-zJ+Zyce|L9dAgN5YC zh$3IZxXSt&fT*?L(oUOHWRy35xiZf@79YT%F2w+7r7A6(uX4y}<&?7oZv{=OB!UJ* zQS}PTAN~Qx?JM{~!ZMJ9}X2fFvAeJaCItYTDCUyg!ru!UC^V15L)oL>z z6myKN2hwRy))c~9rV~aixxJTg_vq;LtFene2`Q^P#swIRFWZK9Mw~5%els|-EigED0W#}zt(wG5yHt(NnE=t zT>4FX{<9zTq%XR{1YdH#d>%}^5IRv8vpJ9+BroqD-d}ggAg#S<=fj|)#w}ZG%%FC9 zTr|t38omq-**9IH{|5#G3E;?dkWox*~wc*55dmc!;D>~!()SjW+>`tK-% zoN)GvZb`RgH9OJZfW2pd5zX)nh(>8ZwZ!XuY81H1uYADW$-sZGciKqpYGg-x zf4J>_d4l&tSzXyy*MsYd_kYOig_V6CuQJugvK+A%G09VyhDIp6^#3B1N1pvcR+dwx zQIqL!FPvTgcLcPyht4Z!61R&In8ww|jQO96KZ)W26GMr>T+#gRH6d(7*;J@#~Zd7*iH zuHwG;d0Mgmbj$5XhS@`f#Kk^wuN!r@Kf=VJ==E@MT9YnMR4+4@SH(9_F~+FGX7(id z*`BWJ0ezO+j0-6APCHLrbY|=ELg%)Di989qiI+3aBi(%ABDEx!3O~Inj zP^+nU@~xOH2DRyG37&uoK8*IRrpGH$D&O z_Vgwv=k=U_0QYW>eET>Z&{Q}O^>>ud=+ZBH(NcC5;`4H$jZOsSV(R#syeUp&(27*l&=6gu6Rx7+YdG#HwDToBx-iFAwn z$IMV2#H75Wd3}ECisUg!Z^uejFyi}A+*a}&aQ9F7+|;McXo*#Br1z>|{|;6&i6lEz zIyo7N)u}h7YogdEl9##7LEQKdzCKby=vVkG%V8FBxq*h_gH6SrcO2zaijcFZ;~3Pt zYu@xoJy?-*Ko$bVxqSHt044lOqb`gfI!?^JGE{9X=QvNygbE}BjpmGE+%?wO3xJ1n zYCyXK`Ls|-Y%ytKFJHa3qFXQ|C}?A6pfQvGHkj+_?th1;Tpg&U#X#a zbUwTTtrl(JKyr@Wv-5q=OHVxR_Y(XdNW^JHc(P~ZL*|?%@z8{$|83%(sm(zc zqnkQ(sv`XnQ`xH4wtkkU>(ZSE&TF4q`mt>*dMG!l!M}HJ4?|_=8UY~q%w3Z9N?~lD zw>`a~U>&k(bZVYg;T%xF-OU^gmV_YDGj8@7V zozyv2dcw7^V(iCX{YW$3qbel)c<*bX+VHUWm@jS+ZSiO1k%ED7jPpbED`MZ*nG~~N zKURj(ze@__!(0P|)u@I-HFx3|U?@?a1i&rS1E0oV>txF^(U|~oY~i*n-%Cld!^uWsV+W3<4q%X#tAA+N{YsG@~iy!pdj*?ES7^^mgmfp)`C)h=(k$oYMIv! zx&3!9jTxeW+zKq>f9Mcc$6hXWv$Ce#JxY05;BITew#R~|x0&HZoIx(D7y;s1yWwoJ z@`u~W9Rf|sVINwrm{6X@o#-ZT0=j*gu7eD?KQJQyMEG&@9g|=`>9ln~gP5)sEbuF+ z0Y;YwONp;SC*?(LinrW~v`<`r?1TUk@$A# zMwlqivx>1vYK<%wB`O+$^CM)NIB#ss{8R>fmIU+hd365G$F-xZIUjVDPM&O$UIK7( z+i0?7*9)f9c8LJc#Rr&ssR$edz`y1IaPo<;knyAi&Fn^s@{U_~umA9RZujCTi`ih` zMM%Js=@r5dQffSeX{<=>yJX6b=>-(um^bgxDp(3vUmH4e=Kknb0dv2Z#{t}GLy(Ij5&wVfs~g8H>yGgcZ@K{d+qV>lg3^`@o2xkhHS7SX{wtbstvJtS2jVc2L^uB3qH=2deXWVV4|IxuDo%gri zO3le#Pab2v_E%w@-Q>ZEiT>v_%32~%3xU?Db)WV)aies#*0ZFdE*+mP<&^8tk9v}- zlbObxV8Sa0kwaGAI7{>%mp-{LNV`FC(84k5c<5$ zmG3^$hTr!xSK$1jS4uFN{tEh8uFcG^ue|q4nz4b?@hYhK z8gg@#LvMFArP^ThPnq&;VfajU>yh+0==Eh$_*-(E{e?n<3d_G0P{H@)(7N>e(E)5&l=D) zr;yEXh__GumtQnd4^kHR(0xo#Umna|vG)<-7&x2mdMS zwdP{!_=l5L30Di&_`>;eJe+G2PfQD^3jWj?x4|-|wKcCjD}cN=cckg?$|0(uA(QR~ zkW8&;)HZ{Yuh)UbtU)%n3y0kHcb=Rnxu z#YI!^m&W@2C6`aH)Ef z6HoG3${W>q0d97_8-9hMpGZew_YGW|;- za>I+YP=q!3!^H%Z{;%6Vfj=)k>i>JUC6pkY*OR`%M)*a0B}o0^3ZPT;WcK{Pt8C1| zx55UeUZf)OH=M3fJltt36^8m#QgBGqCBHwjq<+-E;6spzGUKPZGEvas3Q4brtxzYD zDY3p&X-zZm!zAMr+&weTExx&$Mwa%3QyjhA0FerY7d(tAsZDl7X?Z!->spU#p`ndp zF)PZ1Iu6!kfLF27ch9o#y}@S6dEWq%J9ch!R%3!*+~`?Spiw>FVxY`!KFPesL8wRF zmlG}dxMWEqBskH+E%B zKJ*GLkNovKuFxsQKHpeFf(Gz9M+UI*&3hO={hf2~7d3IyLGCWPt-zqMh2K}Sl(4`? z+}<_5ik8|Gz5l%Bu5d9!BWVSfk~FPk5riq@0!^#1U2}7ClH(DBq%uwbG{xb~rJ_6| z1xRY*w?n#Ito}$KPgiErAVR!<>FD%1ZxKiC`ZbhM(pg0-AlI?ybBC4|hP;~49x$6t zO)5EwuNwd$4r16yn_!y~f?HF{TfpJ+Mv%SbY%rlD#-cUh7#IgDJGCVzJ$*f(Bib;d zicptv%lLtQU-g}YT@#9m;;pK?-8`m?6hwU%YJ&_;%;eHZUGhw3$Fj&6ZVGC_bbT-` zU-W3Er+JN$FsrRJZQYkB{+4BY1YOv~$~(BpoD*7N-2nuxzQJSL5lv1;T@#O?5O&{X zG5KJ~XIsnBF4ZE;cWwI@a7{Tw3b+IwXzHDrI5Ob)zNtB?rxJ43eg7+Q0SJWjQIQK7 zv?5@!Un~;BamX|3euC*ZO$R=gGA84znFQ__GXK6&TzA;%M9`C3$rb-{Ky_$MM5uc% z&En~!QGiug!8T@N(&;VgSfQ~#P_%QG^*gx318w<&=N0*1AzAH;uk8hEK^`TbUQHUN zc!b3NI69`Vt6aqUuqMU&snVH$Z$jhx-v`sRUPtnZz)yC5CeD@b8 zDSz5`spvEPEbv7fs6%d+ro-75MoKHNIAVJX>P+VHr37fk>hz1Gp?8CSc7=!9Tl*a= zqq4_UENuQki!g&g^(-@}Nf6>nOx9>!hj-F8oO56uK3w%7`R#zbaEj8X_}57JfQjUZ zo*ZafrqQ0;6BBEAj6>VWh>1Wrf6u8eh6~`$-;AW!Z;kooL-BbNl_fbR4?nlpl$$|x zPuDcq*MPL}^#zQ4BY(w!C0q~55}qDSkXN!zy)62)0(nJDbapl#ezVuDuAjW%Sr*d{ zJoL1QIL`UME_%tzG$5}VmgZbU`nB1*m7CvP>CmJ<*#K%7=AQg{3E8N^&1|XY0Y_@R z8F<;2Ml|id)iI$so9_&iXbWRGeC^L_|Lv=C*HVJ(L%`l+<3Sdlk-!=8<=|;>By|PV z$zG?Nm_`!w9cM3}jBp&yXAc+w5Iy-o_1w)>q8U4)ne%qn#&TMZ|D^g3U^9FWkA;T+ zCc%j12}W2~d9!_5)XJ(Lg!5xUl66`!%Fke;J(pkO56#rh(?qb(&7H!@O&!+<CJOFuayAN3&Lxi>%W{ino+L`Ga|L$g!tD0loetjdRmq7qRNB}l7gIBm+HjcQ~Kkmvm#VAcu?g`3s$c8MuKAeW%6o}-ygDM9OnB2X+0 zgcFkE3~@IJs4TusZ=$#{9Fd6i_bYeYj!}rx^|r|2o6+1U2t%GAKsvJ;d8yWV+yOpo zrsyM0OhmPQODY6bH-(FZ1N;?c!{GKwA|$FPZk2{(q$YHdTG1)hCzyYwXPPbnJlb@G zHBowvDKA+l22)H!D`e~R=Tx_u-#+R>;Ubhy<@ax(7w)Fe6+N(6fZ{v_QL?uS-dV*+ z=diG=zYmopz-wKnLH_*h?=C?T8QZ{Tke0mIvDwFo)iWGuV9$$yBV!y97sX6VUR-P# zwePO@E%p|36>yf7H9UK<#*|q?R7t(-iJ5Zk`3hFx*eoD^5M~89-HXHbqvo}iZ_=Bb zJxUsRFviw8C&-Mpdt7qgpp2_R=WzIdEDVkF11`_fbHIZ)Mms4r=3@tw+~K@V%od*pneRX0cCnw$B#n`V*M zP`7Z*4B>_u&j=?o8k{ndb{!26^m(mjthF0v9nuF;i0%CtJ0&@bI}ZMWyDUyckW*{(tuUdU4hwR0yVX{0m?Yx=^X^1^N z6n>3!Wr+V?Whm}rQqf4j^n>sH2gml{SQY3yIXDtECOw8kqsA1|gKg@vyr=L+w#?`5(~JfKJ%Ql>!Rj3;Z}xd+b|g4dOVzQ0sLGsQpOgLuPbhlFWa$dp ze{+Cq^Wx59bac$-vSfOvZ_|*s=RW#lrVac@{G^Rx#gybqJC;j#tqN2>=uE&YQ{>D` zI9ZZsgqewEn8stS!%SGiDfT_8+G;mDqT`{lg^O`wyJJD~6CVDQBEExcUd#NU$(AxX(>wH^30T(aXr1$D#ix=Xen)%kG(o%ZiYUAPF!n*j?K1N#Xz6m zeuotQ&W@3_(DlfrUR2y;)mV2cK2(81bGeVCu-H_aZqE&!1SOC^ke*&;4d^OF^NYf# zQ(Kd@VrTFAT-Tf=AQSw*n|3wL578rivhaWS;k^2TkEVSRAQ1L+zdPrxk0f!+?FWk_ z`DO5jf8|7ApR-5tt_thG+B{cDYm9a0ZCScjj4^sB^1MJ`Scn-8NBE4qdr&tsIi;zwAgA8hpFw>k#gr_Ys!|1jQv#LzQiBQqx8A2W- z&^No>M z!u3Bh=#NSsgQ?rUZ0v?}jpQ&E@Cvt1^sC!F|LX z;gP*9VkZlWdYjOI2bCc^XrS)*&1`o>rk(kA1s1vVAPe~oSd}8c&SbG}b0|z;j`80z zbB+1}4lGkBSo4h0$G6@*rjM^kVlV=vYQw%Jqb(vNFAl6E?k4l8HhQ*KYPC68@y_|N zk>3s57l2;fqX<&)` zCg-+hW8C9y9f{m@bWPY7`x=<4jYF)!ROeXlVQXd8+WnUSgJXR)FxPz5H%`JLjIa{? z6=+#oV_%xI8@}um;b6$y)Ru*w7W09n<&TtD-E}uWEUtx-6S8QMdXSE;r~+CaB}-7b z){lSogu%mNL_pvYrT#IdA9vn+|MFK3$8Z z$+t~eq|~L}@|`ugRcp{U1<9-5BII&^jrC>5^L!oLhu$>%%_yEP%u>sAH8vh$Mn2;> zyF<0qD)A|K*K83p_v6+ zZLpzy={wl4Sx8&&HA!W|l#09}=vTJ%qUG;^R-^euF2uZ@uI~Vc;FE@kXLU4w^>nkI z4V+TH@imKTh#HujsRX5%%H7k%Ezg-_1T7(m`n=Kez!k0sRAPu=L|0R34 z4#>)~4d2K#{vQD9Ko!5OTC%S-5?KkLyHBx8YB-q^m8WYAEfK7zU|h(8k;8mF1!6|8 zXt~R-6zgJc)-^-`qd=v`$krbyzN46!VDwr5KIuuZm9Z|hdXea?vLDIK8aqk=UNJ5= z{Ot;*3?-D<9(B9>W3$nD_0y$RHDsx!U=(dr;z&s_nfV3|$s05JQcAk)NwJva_EK|D zt%w>$r#sFA#Se7^=SCN@{#jRw{bK1@LQH75_-rs14+n}Lgsj_UE9-t!+*MI{8EdmZ zFA}XfLK;ZO>a(8t6ZyqD0Rq-xIDed1_ixsEI2o#L-H59T_ z8NCW{)U^uWm+LXa8j~-P1ZxpU`9SeK#Uwhq1UTw?ufTROiZu!QM7G9YkUPsaG^ zt4+a+rGlFutCBXTn zC&dD~oCRFXxfJh|0_PMC6yKY@IHb{I@kLifK{{4Nwik(L$Pcwn>*{;KljSc9UIeIF ztVh;TOeI4KC9sjW`_6-YTKtBJK5;@e?F*M2F|qftlnArU6nG*xx@X&U?n*H)MlrD`TD%RG8TcJs6!#j-NX-HyfLHL;?#lG(aLEPkL^y&YZ1Zn`Q8af59v z?nI(%znx~J1)Vn?C4jDk7VD9f#MZP&oofy*?ZG+&LM6$VB#EuXH?Fkmv~1hPJk6WW z7Ca}jqQQgbjrOFNJq~69+lNGS*3w9QS+BYVPhHNbMT3+SG-?1YUeW>C`-=d8;i~}O zYlSM*2o@pRim`BwR{eqE`|iS~yGHjL`nGE=%Pn^)8;tte{*A~{gyMnXht>jhqt~*& z-Sn-4xjYS|+S#HVZ?lAT|2zWgrsq+sX0dA{Q<>saOpFpj4RAQ7zgv7o zqnlEk^gX$CvC5~2L_};DxEd0`;naWdsCF{?<>zm{7mNS$X??N?#pV~tD}=?C5MoS0 zrUkstwtvFz*Y8V-)^LQ9rT8FHoSJMDa;$~C_}R3p<@ReaIL047?TIlhw@Z`AQZDUW zmRM`{dcgQ$4YnQrGWEl*!I=GGhOI_|3$CC^3RLUvTeWxw@HUd6g2fmUjo0ca73a9Z ze6H`vIK0o*_baK(QvCjnEj!knV%hkXQ~Kx>qqXX={os>T z%R(0Oye{l~2-A{ZXBc$oX`P305?8p780AyB{>`?GQOieUn3xCKEB`1$Lr;1a08IxizRghEg7?VUXRi_BbF8KMzP{GLPHK^ZqjiI{S_7>B` zftXy`y38f+{^hJ~D!GMUUsFmh28@)WL2Ic%<&18=g+t7vH}wCuUm1X4Wo59jegzGo z(MU~;DyG_UZXng@f-UN2TgdLmtfW5a3ZL_fU8$O6Q?!9TDqtyhR?p2=z(si80A?PL%~swAg}L#_F;jFuuQ2_2XNvf6_G=ds)nE zEhHrLP%y>pec6L0E=h{zEKNt)VA3>zVtp|o2lgrC`LZ&?;ag@u?MkumVwM-)OzQ~I zu}zMn+5ItV5!Ix=fF_PQwMc@G7EQS~*KBF=bM3K6?H8+M>%xVu^Pm!~1Uj2D|_$ou?hPx35| zH7w`=OPE%^CFH~ygeAKulM1dj;%s;Ez#iO46ZxNSdSd64hQiJo2NF>o8?HWA(pY_{ zHlsBSz4^{rZt-&<>i*F2m~|^Vn7Z?r0X!zBGCi|`Y*0LVG!lc%*1ZfZ3r8FXyDxH2 z>`=z)I6^DQ_>ip_EZLhT>|6>pwF8lhx*2{N3REaEB5R#r4%Mt5)gvTN)Vx7Zbrc&9cq+v&(me)n6Jf(ym6 zOnp|yB$pXEB(br&=(G6wCh=QHAKmxv%dW9lb+O^k8bt|Px{KLjlHG4va_HHZFwLy8 zFQKI5*iocB%`@5g8bvHJ;pna?Kcx7Rr6|T#%K?_V;!#%XtXBcl4-j5jkfW{ z-mP;#`1}e6D+P%6mTajp)C|>#RNpe73=BCNsk6anK^6Q!wScwu#P0oP-u}7%tS$Hm zG(i_#Lf-wE;|R7CM0Ay=UAM*5>>P?KJ{L{%x$;>8Gy34ii>|@b`NdrMBB_tbTM)D@ zZtZ?Wi!()U#gxgte=;vIRw4Q{pAnS8_-WLOuEAK$V#R=zFnMsH_!LTUaKQNC z-jsRtuH~0qgR#8#4gNnb2H04qu60+9!D`*^7Xt*zYw{*lG9IwH!liPCcBB;M`7XqS zWOP@)mtAAAE@vr)1WLuDawZ#b_bJYioJWuXC;?q|`PNR#w_pq<+WB(1>5~jj@oC3c z%qzz*n579zFqG2N$x=;?9x*V5OsZZT%|@bYVt=5b!m0M84r#HurPz{m#t_7^aW>2D z8<}O}8m`o0n=h)x=Fmh;%Op*1ntZ;iSvQUN4IVqsp7x~JZ)^4c;`%6t>z~Q#{HR{t zK9c!Ic|!yhtO&tp;@d%dKb_+uvD)@Gvt0}@c=Jf9>-cqv>+^7ReSE$Cc71+w6wdQe z3YQ_RH*bzEPs90nd+WOhy=)K3(dk9VKc3OweYgyuzxqL#eX$szvNGE`?d=_)AXZXL zahkGDoRn2u)Eq#nW}oV8fHsx?D4?&_xm;Wy-+f2dC0wQFM|a=+QDd_`NYnRtcJ!t_ zhDUXM)n1=2x{mH1(|OVTGSqOjUTCx_cg1(x>E^w|*E`qpaTc{$6?rPUWsRj8j>cNA z^Ig1(Y#(3O=bNkcz@;h3-tt+m+WQ>ce(HL0b#{H!o*vzQ=Vu{3U!ONh8}AE5;3Y9O zPhQ+&{HtHpH?O~b{_AI&KVE1fka64JJ?tIE=p~`?6->=yY{Z%%87L_TLo8;#;+5A& zF}}QIcXNGwdU4VokL%|%1G!`;!L#qh)o}IVW~sQUs}^wv1u|p?wI)&|%+{L{nk3LB z3<_YDIN$K7up#=_GknLffp{EVm8

zHW;3yam-J2Cgn{u8$gQN0+5Na_5`%Y1t!E z*P9=Z`f54DUA1EkH^xd0kFP?UTkIc%s#d=mt z4z@l1PHps=o!^6T!3YIXv^GQwhq%LSfB@85cp`%w%lKsS^S$l}NuW06sv zZ?B~2QVlt=MqoD^iGG_t!u=BhZ?q?TXcz0c3Zm0cQxFmWL%0Vc13?ieWP?o364wI3 zQ!uEhrYiG=P?6DZtG?|RLhTCdVsh4M%_(Y2uuCdJc@IXgEG5%|u+KFEU}@(|(=Z4z zSuJ6{E&;Z~_YOi=iqS6CJBX@XPeSk-`7ZI+x6lb@DfAzGaLTxQ&b zilYw_!loz1EiR1JbyeFxKExcIko5}1TFOuh>$K!&zL8c-L?g{|*{40RBNz+2;#xAF zYG$j+S_Q0_y|JO@5{2VzZKte5&ac|8G0*W>!_!nEX-Q`4)3*dE#Tc1$rQ$eLljrL+ zMW-X#MY^srkNslFJ5}RKinVxk@Xkkk*A_iA-65{2#Zn4^0k2l76HQYN)DG(T7Cq?j z=Hjkn@N_GKi*4PR+}M1RRjyP}l-(~uB@yt|l+>Pt?8FCarm+(rsc_QSC~ks6M<1EO zr#&fd!DlIovsYiHwY5zXCZFscwEedvDaV|#2(c+GC_7YVsHO9X^L+9_oQys)gKcoY7AvGWYYACAWv5VZ_ZOhKY*Cn5If_v6 z>|%(eVkjcM7?@8{cp5zxQ|?Kz$K~9KN-UU7W}k93HSGSSR;nI67Vm0q(ip5Uq{dT> z$%az>e9eV0Vl|99iU?ex8Ec2HWy-l7{@RXxBaWn{WEKO|qA9AIZ(>k?wuY9E)>oxo ze6tLF{%KG8c)7!$O!lD?P^M`7yJkRk%}2;t^rlvdjwMrRvA%jzpADvDY@Kfpx`ol3 z0=eViPb*rkoM22s!-k!+mD|6&pNNG5PKpO^XT4GhA>;~;>Z9CvCyC%E&!K_t#iVQSR0E4`$4HQ%q6-`xK%w35#-BU zg&B9e4BrkY9fPM|8C@*@7uBG?*5Cw_<=t-wtis3+z1X6bsDfITj35<;oZNgu77#|i z-PNZ(DJIdumJ9ldNyORAss?>_Ew8e*aHuiX*(|NZ%8*3GK75_1NS0qR(3Q&3XM_aLa zW@=w`OhiqxIK`Zk@lmQVF3oolOEUau>ruz>%QN)F{`2tbI08(P5VG1@_Q4IiMP27P zM2it~5TfWJ)EuE$nQ<S9cqC~GLrrkHoFxnz9SBFWHOEnr7 zOoS$d)D}dZ&n&~Mj$VuXx?>_HE9b}Bu~j)%XlHUUSi4kAp_~DH2{s|y>U@ESL{gz?NHd>XrRb3G^^=XLGt9Z} zSmdjYy|uw&f}*+QD}o|Xfs+I+vst7gC|Entf&1SbV;(QrM&jetGE@T_RpVv%NBX?9 zv)MSRF_@;~kZ=Duf*KGU&4#R?<{O7^AJ$*&buh!S)=x#A^EbqR$gxpZv<~*37eyv z%jq%Pqm{qE|K7^q`1JX2m-ANvUCgevoy$n-0mMxnPjUC{S^-iFs1-9!tF9+sDu>f_ zH9O8`Hj{RmO0k10iQixLq}Z6TnyGq`*wnJ~GEf@!`Lj;gwZk7)3X6@BRGtE-QWOXd z{O+e=Y+d!%Ne;l#xoLU?LNJzM`}$euYv6Zgc(3a}Jn2fYEVg&m#FA2$7>rO;8va1> zJ;h8k`dHr|s2|04WoWTjY%u4b9IX~rD)B(^!>yPdz9jZVM@7-nF}qkSPQug}zyy+O zrQP?s5;nF#uz)RLVjB@+Q^Yw0a%Q@sp0B;jdK#VL%btotXsizJUh&kCRT=44?90oZ z!PEG~S_;^r*c@_;o}jGp5IpZ|S?YB3TGm(3de*X>@>pGk90+_)z`__gK{nG^cVM+G z37T&(utj1qBh91!v11j$tymTdo+am)Nf0xDt7i9=r=}EC2uYMvi=)BSl-WvhXaTCs z7CeQA51xOdo)il%W>J-EF1~m)8mOYf1I70gd+$c?D*V%BPm0wn=5qc&(#g<+gk2TgHQ9>;?;~rQOL=Dwy zrG(CqG$kH5sSAaJAkSuR?ZFOzo%KIYdQwcwUCN@X&SZ^{L!pwxf#Qe0EJvfa7W}0v z#iP}-dXZ=aJ&jb$`b*baR9dbtD~pmhmP9lf-GjcYZV~`dMmNc*-m>6e)& z1{U4I^2yWhb9r^L)CHAU>2k{~Ifq1!nG}i#xBLDB=nzcI=gOu^TEkxtvZr%>hLG9+ao*w93kGu+EgIIhTN_>Zkn5Fo~J3+Zu;AaQkf2 zlVZPIk(GoPigA>Zsg(19;)iZ)#?ia2pLUJK@9(Gm&#PS?Ip*v_bvYDU4iw)}+;U(Z zeuO*sq*%;iMg$>cbljwbYNI0Y9yD*q;H5aH)q%+vjYrE6Qz`|G;n}JRR!D}&xUVoC zY^_VLfQm?#N6N=O@2X^#7VCR;*@4Z8!8>P*${~8*D_PHG^n47y*ShtU{t1>d)HZ%p zLpYnN2amA$4u+b19+;c*#z1B5wB9BH5{R2DLzP(3u>}a$gvjk;^!Oj5%E1bM#kK^l_2&-&3vW+l3qLQRaxGsK$Nk_~C+$+eNIqVqMS zi*X3FBNHM{TW5=otJaT5~coK-NR1gt4%jFNf2;aTU&j4lYi zc-9kR!(;hk_d3*Br}9JZ!ocr7T!^`@sg&?yS5Y}hOG>bOokRw2V^V+nD--fWeht01ssC-zqzt5I&%!p34F+XXUfomk*@!0x`a zo1YdccuY=ZdS(ULpm_FZBnHW|-3%c3(L?ATsVBt*W7Sl%CXOM+Dh1NC=7n5#s<{Xj z@idHRI1Mg zT(ya&YfEplvMV!sO_J~~&WXhJ`AJ-=Pw(tmPdF_v<~~`b&UUadXR#&O-7f`MsHKFK zaD&!d&`*1|!DL8egYjm*cV913CbE%MvLZ~UsEnL_fBa7REUFqIivZcmQGgKo|Js8Nqkh76GUp0NY z6dF8)UOekbG3sKiP2v+&9}?H-Ij7yf*^FRIK}1&x4f$efb`HfApNl3=^R+sYAKmus zg1S-+W7(edA`x5*+-9H@|F2yofV#!9D32zIFJgQ(wy4?tEK0CNwd75zWISMXg-hiO zG5MxuX7lB7P4ti6-1OJWo)n86>o%wtiJ-u4xOvgPc09NzH=VH#?x~}5GGe6x*s9*z9)IOxt@B)c-TfkHEC!SD#@dv9DqhiZ zES%9A8={}hXxFmv=v|#xmt8}sEM{7w5^Rc!9)PMsyt(x@g0*jRxW)E2J9N=E1NjUMts>h+VJ{<=(KHJsFh zHn6y+q!ZcXpowWir6pCySL8b1nqC4NsR;T_SL~D)n<^@r!!$D~R7wcA`!`7FGK3UE zn(}_HE%DR#suqM;Yl^c?Bs)MF{p9}UvadP$SSNQc5`k2Bq~7E=Pr5oa^I|0^YZA62 zRBD|35nvC3XLeDe_b3`2JHz1Enjo5;mO5hzO3{wqMDpfYU)Scb97j#bSZj6#Tj-2Y zv8ZY>jl|Oa%FLF4GyZH<{6$@xzwPSU{QkYnyEa!Dp+Jh(hG>DDj};A6sp_4HGy2^+ zRE2?#Zu6w8&9WOzF~-Cgaasi8#g{y3M$dlQAB_|f&Nt56GWn6H>uQH+V6odCP8oqy ziwe#~+JkIcY_b_J1TgJI@7m#BjvDBJEu{Ej9!Ob?g=C|3> zy?@s;wyTF6@K}rEtf|QqYpjJrXxIcdxxy<6M+0#_`23KqZmuhQ?bKMT&ImpStEPg{ z0(;OT)bg5^*@T#*6S7{RSW6jdVNIdxd}vhy2D{-VrD9bBVzpUvLQGyc zGNQ%FO>4eRb?ej(Bpaz~@FZAl%*Pgt(sGADUZa0k?AbMBOC&AHOrsQ*Af*^1bFNez zhiYaseIo}ndhqmJ-Cx-*wwf!}oQR6gLNOb^`yG~Q*@|mXx0KR;yTPlK>O@lpz$OA_ z?9(u#Px^lNgIHV^H1jeRhmrtE1bj6mwI?Av@xhwO72ZcGoOHe>H%|y7Sr>kE*%Ldr zT$3BwG(GeQQ%)7^?gvjY&QDvlON*X~s(5hZTxf!TVj+|n+tX$A;Q8^Bo)lXe%P*SeGZrB>rJd)~?UkXHQ6PV-PXLs6OY+t|f24HAk#2h+>(REYH^DCIBPW?|<9zrig$c2j8ATp0C%Jw;9vjKlpz4tS5YI$11zCv*=B&6dg;ZQrpX(CR1Zf$=LaF zZgieT%DI2nQ8v=b`mqk&Xafh!SinXPrkFxGJLAL!!z~)lx31C;8S|(oeB=gmZ+AIa zv4z{SS{(Tn{+jAbAmU^4vvv3CHX8%>556bQdcr5mxwE?}xdC7uSr1V2?mKExjqRj{ zR4o`!WPw}IWJ{AZyVm*4FvQx?tBp@OhETsUwAgH8#wumnx5H4K+k@H0Dm*Ra^(_Lc zC8|?LMlym_7;&}`UQrfnkN{$NKvv132hsAN(nHnV53WZ9#OT}m8sTim>n^P+ zJt=rg;D~e2W!lS zfk!K&w{3jY@c_3gki`sR&}J@8zkxVc(mrfA2TRFhaX#0{Bc=d4u7VI#3&VltqZo%z z<-fY@NwLwf+BSNT2-AkYk=i!?*fn@Mzt}!glasS7fn0@RARG)gA38TZj2=Ay*fn^z z!)USoW9My4r15rHb4Yk_K763q`O$^!pSs3k8Ej`pgj||n#ZsD-Nh-b+tdyfoMhn$CUpJH+u_5KpU4?+xv5NV<3}8Xf(MZm5 z|I^j55MZ&J(C8i7AwtKsHgdj^~-)39$KN`?w%HLe}jn4$p^B0pcYJ*5BFi>~nb!OZ8TrGVa3 zGy>8R;%WB8s-fuFXoWo6o#j?%@BYE}va8jwEGHX7Or^$P(A$t|FbAjDhwfw1(W~Vz zyPC%?nEbRypJHkhI}0sA-TgbC5(+pe9@vJWR6+>3LZiBBdp*oH`q_TwJbDlP>65NT zpzpmoW5;^vjrvkc5>x@3Cl#tTrE1!dKt}U??neY8Ro%~?bv5oBEcfYUz6oeVMzWka z>uPp5TBXMWakb!zN(=yvzy#_ATGB&PyTxoNHx8L{pLd0imz!J9Ou2>}tM!qU=-{+@ zpY=G9(e>iRv%Y?@W4U(qa?1o3v}T}_`=YN`5-ex%D%tvkNjb zg z3eA4L!logCfyzm*pLN5|!b+E$`cd`8L84TPGlA^x_imJI)rCCGSR}((fkj22h?_;rw8GVT8O;<%BG*)X#FA}HP639S8_S=pUpyf|~v7&y>Y?CuCdexZA?r*^6 zC>4E4)`}1nfmE{w9~6uwrrFkbu(3S)z38{plVWhZSZkEaoUz0b9ICJ!D1H#K(@_HOikGWpIWRu9bVi++Pcg@>0so`WwRIafGEfMUrVbp~z7&*+>mt}BtAq$(H6f?r0!!B7QxfG(>1Qyt7 z@db$rwcn^@XtoY5F-(sRyF5&~gv-mL>k_Wg^F5k*`RWISsm~Te(yt8SsPk8`*cc~6 z6(1w`Xf+lO3O;)eG4pH-M2xZcNXCEsy2SN)xVk=mzRtOvADxu5>!bDg(aUuV=V6cN z{9*BbF*;!~_*u?rg+sPJiYtbEOuN5UluateB?e^1KwL$&P>4oiDHZ1{{xj<6qcJy6 zds57Hv7rJ(R!nL~Z_CTL?19-@FN&2!M<0#3(Vi5`auhRit|=O>0SrVuP<$_U35W0Q ze$`b`kd9Tq>O~?N0Z#+fuU>8XrCDxeV6o}gS}*|H!d}=F*?qq&Z(T0LMPsB=Erd!H zgpFpKZIt<@W7Y8Jy;!gN1y5^N%!650cOnrD%QmJ}`(u!yJ+Tufi#4)RLP}1fhd_|S z0ojLkY(IPp;5VC|6e}!7ajB4{N{vFMVIT*J@AD^iZuI;AH@WA1fum9V+H6xd268RH zCL8itl6q!C5gn7AtrGwQ@zE=+7njG^H}N`MtuLn!biGG61Rs7cs=mJd>SDPGL0PWD zwT4i!x)zaaz>@c2JOD~G!K+Z?)=>5-rd+azM3{Lt$3ZgA!r)Q$quiBZU930IwTKpz zEjd*w9P)wUhZ$Kre4qBmPkU0Vb~%Mxtam9jB0QsUa-jHOK*pNU`?NpqswjB4QLR2C zTJqL*H_uv9$^Ncm^rV#;ZkZLtkPADB4YgPkCvg=eIgYjE|FacW!C4&&yWAJMv3Bkf z7ivTVYqO$wq?~gkO~qH$U}tOl^V1UFp|IQZ#mtLwT-6z@)JHK+EgKbcRY^H&7UwsH*B2i0gLncU3 z$>V&d>=q@IoAa0F7q8DhxVpI6l)VA))2``-H)GvdSg)m`C0E!_tK>`ext3ZodoG4% zTZzmLtldK9-Ruu{o1TG>Ne1l(^H!>{?MXGv-c+MW+2yD{7mhIB{Vi|N4fbGYu*kUh zN9(InFTPoZ$CIu+3eccDvZoBOh{?fK7K3V`nv!F-8l9Ngj%0MkGHuCY`=OMp%d7Qu z**~9+Z*o^MhqZq3#3@^W8ada9HZ(k4F##K{HMrS!8dz2X_K`@rNBl|G6h&cFpO+Mq zS^`ckSz9fm3mUBVA*&$ISDFE`^kYxz<66Sz=Bn&d|2BSa!^=0D&C{j0BgW(wG-r#81`IvY19+THFK+TaMaQFOJt{(Ze zWw9w28&e31>YL^ZmfV5jhY47+qt9_aebSF&SsBK~Hfsud<2XzmTq$@yQ2ek~%h=Il z@zbt~LTIcTqh2H;kU<^D%H{VRC4jC3mfPlL$aRSvR_m@ENuWWoE%?=^Oxn#(W~|KO*mbDd;1}eUavRL zk6x9Nu$OBzo?rGXS;2C~EF2+=%?>qTD(|9W*A~9{1nfCfn|%mV>q>x-rNj)b{piYk zs|W4y)`RP=g;$WpC~l{tR)}g+z~~GfD1NYkRUO@4=tWnGEiXo~F_AP=`>d3La6M3b zPqB!Mp2WTAswhS?E9ym}bI$ko?^qDKm;J5}EUaX?4uV+JA$rS}ER)@X9om|VPq7FR zPNT^JSX;JMrnVKxVLlIS4>I~bxR=zEVjgS)%v2nrue^~y-0sg@mczU z7ooWQ$17N_i7*zE3R=mA6;1sKO@!B%VNQH+KirSF7Z7xhXGkfZukJ8wKj`#wwZ1rh z<&OWJyzAqulGj(|Zcz1V-QMyp8p}7EAMraE#b{>KL;Sxcgi`vNa6JP#r5VF4vcvSjL$F5%5)+1^()?65UDGO zwA@|{S8S+WRI|%Kx^Eyl6wsdv;#pXqe|;Watxw*5f<1-tH&434D7u{T%-|v+Kphrd;j)f&H7l2evFWA4poX9oNNBJGE_$dv{ke<6w*Ryc9oHA z++u^L#hHjTNKt?g%if{MB4!>mzb7hZWHhx0uplS)5OQ_xHH)caiR>kM)P+_6cB}|V z3!jTM_nUUqv}C(w4A#~PZvPnF=Gy0Hs|ZQV#DGo02Z~ZdL178SW}iY5iwn_7J?SJ} z>~KeCYc}Y?h@s;4kIwcG)9%ulnsi4`nH!rigsLIr60=cTK@u-S=f_Wa(&_DDu@h>N zX^5Coh4#yx_b+xL(@xYYe|ar6o9zcbn{Gs^ zS}myMkWG+mnX7Xx>!z%zIW9zJ*W+52JFY?6&ncK{qLvuJ?i-zC*qEKrjXx8JU5{#A zFoALHFsa5uDi!w-#A!6o?Tl{xnPBW%>rua0_fH`!g``3PpIyPdgV8!?cJ(6XXF>CK z&-$VXiw&~7=oyHb0#BOU9=2e3`q@*OpNYYa;Zav$mlKU-eUTawNGtDOPns1rJA2P< zd=5F2jX;e{BurT;O#8Ai7Yqw+`|T$q!K_*UdtXzUe}2&|AviznKQ)vrOJ_F!g_F&X zgj60|;_=1X>4f$9$p_&)f6x-^vVJwaws~GYXb<qesi8yA6%!a z_2uSz1WZ49(iKxN2TUK`_Te6x2YbHRTwed;`1tkf*Q>iPpq=^0?I%BdDOc@8zuvq# zZO>vm=dT-Zm#cJr{q9+@yGL>7F@4q-(?c|U98*wvPfTC5|C$`QdUNDfZUw8e_4(?> zo`c#~lZrcl`Y5RA{Z^pX_6e_7Cl?ndrzKpjuN$pr$9o?+`|41^1CWmbY1D27k>a?Ebe7 znT)s)<&oLn4*%gei++(#DMH+p(;wYq+FvftGARjzsv3Xd18*ewY?Xfh@R;v9-_ z(0l09_n_yu&|j}NWjyNp%HwU9jQm?uFHV=lo~+MB0Rsi&P|_XtQ>d>FYbI)6fJBLJ zu`iSCzPwsrj|cx}eYLnAwD{u}Xm-oo@F&7wYzZzE#moX?;SPT1s1}(_TPP5zvfK-u zvw?8$tn2lF`=hBRyuQV~JvmvQpA3Zj=R+MMGX|WW=1o`veZHXKmvCK9Ma0shX!x`tp9LRzBXUX<3%!9i2^*Er=Mb#CpfO zZ;uz7B9pg}WmWO_8En41Sf6hOV*XiQ<`1>XEiN@-(PCvSz(#AnwQ)>*FKe2NHxYb< zM9yS@`(ou;xEx5+JiYA8`=Ls?O_$!HnX4g+J}^K*iWur0?@TSk6ZxD;j7jM43N`oN z;%Ftxr=8XOp+xz3i4t|uNFPe%-~$%T$+5e?i{;#2O~!(u#+%e|7wO-wryYm*-*?vY zd?5bOMKfL&&0ljg)k$&`TCk^lemc#U%55T6;1 zCR<8zg_?T5177R*ZlTJZxJhLo-1};IIMgS%@bLpb*C@j(+-xq=#o6U)*_3_ng#3M9 z^$mwQ%j2v%WZjO|aJl~BEV#W7&BQJEnrTN%Dc)3OES!P!alUwcetHq|UX%NIUlk39 zipdscLlzb-nPATLwts7~+DFi1iZNHy(6gCKE|#kRL6+ln`?WZ_zDVnEdUXA~oYtd8 z)AimO;k33okGBi)N70(nUkjS(8z6e!!jpa&#wS-KL+`-;WW9NQ6Zaqc&f;7S*gq=H zjdQ$ca~F~KiQ3O7WG^`!QwGOWiovGkrz#33Z9-mdJ)YL(>gX2#+Q5w$7ccjo`9JiP z_4ZIa*`j#jJuS(+L#QQ-SJtL*V!UI%7L!YhaLu z_4s`d(y~JuoN9z%6x2W}@RoRQ+WUHAl#m^>`fTr<{N4h8x;}qd^7?%LiSMiD@ld;Y zlz0!atgcB`B1kOSo`ouR#9MZ*fv45`;xZKcN8;aH+-z=Q*?-{sDtS7nnk}X@bkP>x z5P_?8O~6#FQMdtb3BlDSW*8Dc5)0Z`{KxjLJNjQgUvKsw`!D*6c{J!5t@}w< zFkhdSZ#MUaFt65U|NZhWPfqizbaVYt{maGE^y2r&)6$CThufux7mjk-g!SpZUzL9G z>;Ur)`fQm+VQvrO<=%taS8dZlZEpdt6~8RF-ETm<%1=4? z%5MRv_jWEof42#zEvwppOuK4PHHTCGaZG_{!Sus#8f%}fPo8h~AJacR>5J*1_`e0F z&diJHC^7YqUA3tm2C27!b<4K(M_?T#oOTtbY7c~N(TwF`HbRGqqhUzW4=uP;vX{zLlbzM7N|Rs9cU+x534 zq@%>sKljz9a;WTYkv`EZmHk0tXGe|MAh)!w^Y z{iUnEg+n{_7B{V|Vt&%RbPL9RxAbRyc59~62t9rt&f?A0Nej~_SK-b6L;LIi?e5J0 z$WLPS-N2q*#HKBd&cmytaCLR@`snJmk9F_Cz3dC_q2{%Pn-zmB2<~aA1900_55r+A z;5K(&sJtDxF>F?GeSUH~WIesI=XMm&x@uNBc+PJ#O6>{FzrKV$DVq=eNi03dmsdwQ zY{I*^EZ=O()pGT$ z@nn8Fs1u~=bbT2w!c`uE(5_n4A6C(AH89QYCuHm)O&{{u>^F~nCFfxQYL8a@uS#vNJ-^-ew)d#UCkIq_ZO@wndJj>1N9n^Zt6NMj&-WbDuF94V9ogIX zR9Zt@reE(awB9~&tIOw?w^i2Tld}1!J>PFmyDDD6Ll5CLbAnrXrhn(=e-zHc>6`YI zy!EL5?zKHH5Jc*W=OK)4(~9jBe@f-jr$H}Uj^z9{V0$3_B-`k2F0pHA29 zn>n8DFw5S{%+gn8%Hf)Qi~CEEEv=(pT>l_omiE2pkkl9N44PW3Wb0~86+?@~?)c$< z7@*i$`YKX6)RZ1ik`T75Dcu&6ZZ_-lH_!k2_Ohs4U0ei@E8;biZr>?=|AaHF{e zm7?Oeu72k0)#>{DWy$SSpQ35HI6ZCY{$5jAyNXkVL*lee;-uz1yOvHiQyR73WOfyv z>JFvQ$H`={KmC>+h=#douU#dk9_sYlOgEV=cS39~kM3$t-@9o)K3&KA+2!M=p;qqh zl@Sv8N_~+%WJTL}=(!n@J-S&R-L=`3t8kQVt~VEFNA0m#`Bl2!Z+cJq>Qp`4)o-B& zSUvoR=B9sO_vAGkZ?0bNH0eAG-uRc3++QR9}%|&DH@)q3J<*viz_|^J)z4>#A zpSK_R|NZ(bJ%5^h3B*>x8sizve@$=v@AF^YKL1_*<==hG+c$mn@|V-I@6G=oO&@~< z+r#S79I-li`|iKJ_~k#o=j~fRzj*uczqtA3f7*}Ab$fC@mO8!savj5Yc>A8|m$%>D zf4X1YzW%4H_T|#s4;}74NO}AG50}6ESAJKk%~i`U!=~i#UfTU%O6vMcd03ILjV^C+ zZ#PfyFq5@9S>=nHcv{lwI=$`ux*N@UwJxtW&#x|SPM&`^rFE=AqJSjFdwrxlf6|p+ zJltw*)6qR=A>?L#Jf)Df-e;M2dF9P|gsRB%XFd6~hs^@p6!OICBelHGfB)ron&_J! zbm&~}wJYZHt}@-yp;EU+tpgF?tJZOLz27b@&%4T0d${q~>Yx|%e)q(er#C0-^XucA za6Gj(tn`uE-zaCtN}D;}M$uQ#LQP3va|PIs*o=M=Uq z9{(e!t8gK9e}ei)`?@`D<(K?lQ&>H^xjKEgA^1=GQTy*7?;HNb{X%*kuCB}Gmp7YwB>xq!E?!U3 zd3|0lez{q<4+o|_c`?1v{+v&r;NhkOEm3>@_HAm-H(;Jo!)Y>vSlbg2z_1D|4)wno8m`}W~Zp{EO#mzswNBIbJdatS#?&hzU0FdM8f{!253G8yx8k}9da47uq{3Mzy<<0nu z)Z$3iKr3yxa_-}m?^w=n3?Qf9BOaD7?G2_Pc#-xZsVR zZtwSWyxFjqy;JP@jBA+4F$E=bE~IlNeHtD6c#1{)Eb8;jB>CCVdT#UgbA{*Wklo(Y z!5@8Do!q~R41^UYP31t^EPHZgam+61+`Mp=2EArMv-20;m^%M^6fyPIZU`v=3?aRa zJQ7c7-|;YGxE43&QtxYY`K3YbAoudg(?HQ!BUxCII}x_fD96uw(|4}4Rs}pI{)iHV zk>Nd9k6+S12wni=qddd5I%hTx73=8lVi57WJ+#fr@=h!U-+7Uy9|S;SBi z?4v)c{ytsWR?bb5q%YlPYRbcR790Wwz_;v<4PR`3{hxa|{vCR9?HPYooZGvw*-YMD z+qwy#6#>@nomOk}Go78IGAwYcEqPjZ@>cStPHMcZX<)5^OpMBqXuH`lx09JauNRd4rp+?HFS z02K2+{08*wCJtWVeNNGkv;o)0A}8lH%u#xHfB0-Y(U&DyI$c!g#G`415-crRkwDps zQ!y3n&6_HroDmZ%S>q9jJx0!{>e4PZr!$ZHowXcLoGM8VX>!8n7kjO?IMI`vzsC;U z#{&GkgSFIN2Seu~fR!47aH0ehiQ(>|H5^|wGU~{Yx(I>W5rfOuQd62s2-d8bHv0eYQsEC*2`fkTsR`(+ zCMvFW+pBrsdA#NDq^D0(EKJ&3;}<*)l1L608qu?^6(}uf9m(FV&pVuecNNFN>}AJi z!R(NF2F@w`{5!JMO`ykcWYn0QR9)+Ejv<{ysRXebc4O8uHX zgQyHDK80mgVq_pVAIe1HAy1}MQ+B^i*%Gxfw*fA&3Y@f6=fBWOX-;;{d(UeHfynN^ zEDR^1A`~WK;>DRp^VWS6+G!#>QZ#Zk6=LJKQDF2PqDn>OHjV^o@`v{4T204jW-VBoR5bZ*TcN|hs zY}}&l24HT|4)bQsExxPQ3~{>&ZJnxUZ^G+!P@04A;6`q~u;ce;(Ni1q8nbwDgLg*SqLK40Q6;pUP9OhPwB5s* zb31$GSy(~CqOpox?ODU`!pbV!iu|kzql6z2Ru+;+E#E!-l8AhH9o*PX|)aO(ZT4&bAc~)-B>T9<`2mSGTZJM&s3D@92SLYtP~;cYtAB6&2n@FSmp3 zs+J7wBs$8#t+hus+M17t0kYMLkyW&53v)Xz;5q?4dU&J>kKoo?wPi=0EA1Vu3}01? zJuz*DC-DBllS_tRn!mfvfoJ{x2kg)U5Yx-7gdmj)|8azRo^B&Yk0E-tS>_R!>2IS` zqYe1{Ivv4mXT1s{apAy@Y(IG;?ozJ9PnI&Mks=QHD53yI6fl(>p=f&Nq za9)Fb^kQ%5A5DzEY{J@&u+?&S=?a{cW0Ol}SDVAE%akws)(1fY68#-P zk-bI>{R_7|VFY)8ug>Lq`!8)gcE)HdSK5tlnBtr=%um-dO_m86$&Mni+wE~$*@9SktUNr_Je3S;(^}@wma#ois}-%rmExHnZ{6P5%}E6?Y_xelM~qFwfouGU~4FfJg*iYDHKRRej;@LwPM|X-|sbJt$K^j zqxSRtVqW1-+T?A({a(JmQ9CZiyft!vySA*yw1+}V?hWc+-`BreXN~i%K41<0<=3aw zClGVXYYwlQEm|R%fD6J;mxsoIl5xuR90nKt>1a5iE0*4kU z5(8@?edbNuHY@fRrVSj2c{-UbrzZIpVdH)kQlw0RHnF?G_gCfo6PcmRv^O?CQisQi zl`hEReShLvDOENGoKp@Dla6Aq{EHDAeYej7mL&Te4i00OX1c`_9#OzO{KYe_u2-#{oHzp1t=JVUu2zwhn8s4WIe!6_KZ^3;O*C$fr zZcAAs{loiEtHV3GrO%Q;;75|nw&spi>@%74F$#R#Dypf^T*&7(kAjofXf~4Q!nsf( z-OTXJ0n&72@H$xMZYUgU#u$BW<5ApQIteyARQ764^lx0m<8P=JzB>bcvy*ysl&9Sx zLP~nbu#xBNh%nujsI;r+9*nXdv z^|)d)Heog|mI*Lus94(1Lg*w=uWmOJcrnjN--@=(eJ0zF5rI zcyG<3L4v3n86zSTurC&f`Ch(YBvT7C_r8v46j^s)0VBxC%+of|IVuXyWqzR}`ltdq8A(ccUi znjgBbeLT6WAyKs+vQ*6CLLDt#GlQFW_{d0vBICVIfK(9Ib>W%g-=*qmRY%Gu>BGE; zs#9C46hYkG{e8YThB@%K1JY2TFB5Ie)n<}py-Sxw11+#SyB7{tpHL4f5$U)q;)-0J zvtU*jk7Ko7Z`hX0uae!uyK_U`+kkeIMu{B1A0}+Xi>`6^g8bCy412_y z$qvU&J*wV~%5*V*04RjZFSQ2h)MGI3sj@ZQZ*IKwaQM^Id}-nAz?`MLc7PYH=Pkk_ zr6>|!sBS>zHyqk_u6NN9_5)=sHKF(mMl1>?lyQ@R`q}kb7iD^5R#D4XCrV9N6c@Gab}AO%4tsSqUp6oVa~9sVEHZ&xws(9KL2b1 z7#G;M+HHPOQ=$F^TOPPQDhd^g`hHRgN`nH;*8!@+oO?pro()B%(9aA|Qp|N8{UbxS+=cIz`2r$O|w+L0YE2GHnjK=O6 z-aTey=7(Bw-$hN91M>Ul%o4XPip%@xl|~;#k~0ZNfC@tXsg;!nOlczIcka zsq-iHW{XqUIYJ;DX8M-Z`G$=f8v!|;E1CMH45M>+e#ojO%3OUdIWeRWi!))|bI#zs zxxFAe6iagbRbna)m6yrFnCPsZm7Sb9huD2Grk@(!vMO%dm8gL8dpXsK zo8~dAufE>?L6ZAWDT?@N5na;2cD9BlPHrU9M%?e22tgoco&2zzWyxzF zMm{z{v4R+S134!hRRPww_wL$zc0fyVE92o%5ASm;>6*E9jjj>!`U_WJrPZyeg5#+7 z}7$`Sa7RTS_4vixd_Ef9&K!5hz_2ZceawwdH zP_DM4TW{T#!k#Oa0TWQy!aKN)qWJGPcyq0P_{#&D22Xy4a?(p6^TbYB@qgyQxJw#_ zc9E=nh<4>NM3hb*O9`0nu!l+awki&owngM+)?8>+;Me~_+0x9!jYrYMdt&nEWX@L{ zT=f1$`h0FISnnZe{p%uL*WnQ0gtH3hjyc<~yAi+DQYWVQCo0mr)DWP8{mB?zl|3>~ zh&}dh`PrD0R>P8OwwMu-6$l(Sz=JVr$Io2sgh}pZC?2OnFD6=RP5esHKaS%V2wIbz$^beIEOKD96`t_{ZgqGrA{n{Ju3Zv@a`wQ_Hw z|6-Ka1M%)?8F(@>hd8dB2lvY&%X<9rK6p0KaP?FP8O0Wk=f!~r5dCx459;U5g1-}! z;+DW^N^+;lX&VPwhBsv)%Mx}=X^svxDJw*!Qed-g0{#Pgy0?q?i~+*T6QVa-kn0cE z&IPyx8;rSDl2HQheX6oW_t*O}FGZf?c{%Tk$p>twT&-=Gy#U{<_)@svCi@UaOQ@4nD%ILqGd$0in#d?Q%(iYd_9|7E!(FAqy6TmCh! z8eif9{b+6m$r3GDbm|E+!1u>bQaYE8@7ur1H{3LHkss5*9^VJ_f5*BZ;Gh<20aQR@};Hc8Gr6AXgh>?e35f(A**u`XglDBAdueX?3L zMMb%D72J7cuqO#0)ExY?$MZ9r{5{OYIS53KwgE&|nYRMw=x=XC!ijfOXN0vfX$VJB z7~jyKKI}`JXkFaUe1a1>a|XVz4-MH7pVn5s$7MbD5v@R~ zE+g5nb{aY~==q>Vl}#yp+Mvo2CML7A3BV1>LelTnmu18x%a&Xlm6xFN9us{*sDYJ! zM|SAOANopm_QUoVz*Y5!X7OJ94Le%A34dMFp+tncYr1m^2w{SJqmhXWtu5Pf-)^Ud ziWA#e)h2|YG|l%BGkxwM!6Tu7P9bBJ z0_hr2yC;*CQYVVF6)|>ZbWu7Sbk&D)Em5y$2F-tK{@=l{#M83jRFxPq$p=eYn5(g> z{!w4ST15`EMNV#8tf~Z+M$j=(`rBR*7~15Sm^#Q0C&xF$J6J1Q3n&~ozt@2{1%f=k zXWZ=HFWK(4M%jXw0!dnCmF5G$-kpp<*8^p7{-66>uNp_}=LV(=6}-ee3*UL8X%}_z z(}CU-(cK)9=#@jR9W-z6P9M&;*5Z1RCSy`N_M&Sy^jo-$zF(G2{WJ)>nZ|s;t>f=(lX(_0pkMoOMBja9gZak z-Jh7!;&imbrs0%$-HNUgzJcZlJ6X=)A6NJ=b&8)}n|l2ik(U)sD%h%uu{c(3V_S{y z>F;3ar$)85b|{&l-w!moXL14y)F}qCzRdi>lhCi0&+U!WNYy~*g~b3R^RZLqIjWI& z2C9l6o1r(BiZFkfi(w9eI_0iwN}39vqc>;K!%Y^yf`JrL)s+NeC=;K3L2rcQP*o8^ zexuY_0Lm+pBty1k~8$r6o zVVlNXw)mCgkKH?SE$0kT5hP*PKj`%2`X@{H#%3`QYXj89vEC%`{cp|fllespYL}6H zaPB(#Rj?lm^vZ{vO+>S1cZ-S- z7sUi_YR6gvVpF;K(Aq|ocIvzl!8zjyv_zI67GTXg19)SNak?u4xup-+_!zsi#1xE3 zt3DXWb%3oFc^$5-Fmq;EENLP84|!uQe-QaBy3bdiuvUuub7SM09sV*A_#%M+z@#YU zDr?AAZDRU|Et)Jy+qnGqLa|c+yerIkSuSAlFgn}-e()*U69gYD_wp=6J9!WnV;Agt zor+qi1ggxF`DOJg5b>ei`DpMhZ}8IBvtqXRCz+U^C9giKh@Avnht%v zf|T3hx$MB;0Ge=fY|?;JB$oMa=X4FcJ9HT3B0dI}UEx1gnVi!(={pUhB`g&gobzc- zb(IQp!e+sglU_r)5FT29`4}<#Fa5KMG}tY)g}k*o{mxvh5(9UDT)Wm zVzD0U0PkVZ6K42Jg_z4y*U5afEah)*+ulnS8>4~d_P@P zk3013(8y$6+g(Q`&aNrl-pH098Nozdigs)pj36XoqIof3GibK;5S_Bf7Ow$TZ7j6- zHS8{vP{8~jRHuibpVVsVtHSm`U&V3aR|9ls^4}@BdyNWQyw$=dcjD?$;Hfuxcqp7Z z=>*CgG5#iW_cztyWoeY+LQbg+9PdtfO{$KPlAUzO%gWqM7z7#PPvx-EGU2uuX_)`^ zB4VD+1%8FNCTlx+RNj%B6}~bNxUz}8xU{L{k0YNQzS&8G9-87tr@quw;_)wnCG!u# z0u=iE1F$d@%=Giep#ZD>9;e(gO332H$cCtnD1Vz}+L`EKEn96?8*xwgA~p2p0A#7V zN0Qj1fRlpAr$uA# z%o2~4=n@+j1OC5WZY+@?Zv*3ndMTd_-S00ek923XnK^y5Fb?tMeKx|6pI0zsPuyD@)TU%w&%R zR;-qsE(~d4eQ2ofR1O6k8;NFolr@Hb0YRF)^5gFCMOR@6XnI8$LtV#!0;hKm@$B*8 zEV!{&I*KeE3n|t`bn^)aBM0n-BY>1{%@OY7%O)3){_~ajM+F>|Y8*$LNAqIsXVKLCt47jA=vHBWxuP~VC{tJi;@OkWzPj5zbdz-X{eCp8`xDTMMu18Bd_dl=B>A%)}OOy>Tm``(gIi< zFZ{^} zozkOcibvIIjgIlu$~3X0zb@)2QV)iVI#s%}geNaR4l@ge&nz`tW^N!+lcX{CAX&Gs zGh^U09?89cMM}DDxMOqrW-^pY>c^8qE#*4;ui52Xe?HJ`*(13w+2iVF&u-|~Rgt6) zYn4R-h*v%C-CVuNjR%fPYOyg_6=zKqc>z0iejVP8kGC-Ymth-wj(5+y#^;+Ul2oNT z9B4SUG(2%#nkJu@tu%$LpNH;e9upg9{{FA`sE=l=9o9xm09OvH?RG6;z>L;%A4lcL z{Kn+NW$pU>1?4+9{}%tp6ZZx8<>v6Y0b{4Pw0F~C)0X#LBXPEu|Jmu`a_V(2x5l#mJjU{?a()JB3^BoGkHmkbu1tS{?T~8nvHP zYeu@Y4wzF#h|e$jpK_w=Uek`y8~9EeW*uDdYu0nJf9n1+mbT;$byQCo3Gd&MF!YM3 zYegNH_`BC`GuLY5LDp^)CBG=O+W>@@7ADuymTc5_c`KSX|9`|v2c|{$Dpx9eCq$Dk zvH$BDVP-Tdhw;9j3gV>Ylp7WI*)4OW4ybkdfIU-KHDL<0t@`3wLDHhL^9aS_pfV^` z0ltx=`Cv6X=>!?Bmgz~qBCT>ih1<%pdCCN*>b^q)%OJmZ-3!;Cx2!roZJ6pKJ6C^! znOW(|T$UOeWs*Y(r77)N4Zi`cpXB8wsitc(OhI_VR8azLJCK&ZNL)wBPx0Y$;i9?z zt4O&t=P4NYZ)^izS;>*qXs1_9*Ta%15G3Cp5xsVw^zmVX#CWtSB?av+Zi=t4N_@F>vd25K5-8 zu{o?FQOC(x6T;fGyP2x^&i16CxGnn1goP>=w=q3#=_O=2UAUl?xo_yu+P-B8SpaLN zhfoC-nrJUQe7W`@rJ$!#Gzlxbx@ZgwIuLXtLg_u+$2v`vhITe>4|9wdBOr}c72;?a z%@i$7pR2(}=6v1>Lwy0vpNygq!=hAuDAek`Zq7K|2u@|*@P9x-~Qt#fR#>E#Za|vgO!G*^?yhDP@rNjhzYWbrtHKDCCaD8*pu6Ty6&8SPi zCdvX6%KdfNUb*$}&8m@Khvk%nildF$`sC;j1Xk$sz7e~17}iwzt5f5=7KeLlX+eM1 zuFDs9r}=x6?CG?q$v-*-#*TP}Am532Ule&egSRgTJ4tqYSm)Pdonx@nf=Fhk9Erh8 zz|6dEj?L9OodutW+Kb9PpNWqz^YF?4&TYJEp=xW=pUDZ^yA7&qQG%jFDZa7~2vX-0 zem}j_@Y^(mGx1*cjxQB@NQ(kl++0!3uggx2IicftC6O~%yO>}>x99V3!;3%1O=Pti zb6;}l%5WH#`lTLaPQLlr{P*T9O~~`nffrM?`7R?9Jgu#~HW!e#ci_#vvXu*z&6XeB zKfAvsd9Sz+^qtA-YRHtO_9i=`@?-t-!6_=;=81?lF&$KvgRjrC2h=1oO zKNAXnL{I|1G0LB7L5|rOs?rXTy9qZ}E6GF%Cy+M)>6her@|)i0DcbBC{Gwg z1Mki@K}&*jG8Vum&)H7p8zMp6irj z3}4fJD7iKvk$@j9P(5`|$e#D%u#NTOm%WH`Gj>fi>=xml2Lb+D*GJXl&rrLBnvB~) zhx#-XSQ~qY0Ze7RD87(NHsu8OQ*Y4$2JpR4@Sa7DI@@$jLXrw8Pl9CeeAiiddFpEy z^M#JWR{;tf^CcF?&w>JFubV;)XjJDYFRliaratc^p?|K0U!dzdExA>_=dJ zd{nO=)uP72ZZ;I^AFM=nY+o)na|w4i|9*lROeBKt7A!7ZCkcQ`0SHY zh{REKN{EH;851^p{Y^f?sPDvg^}E`Z7@xB^M)`?a#oB+J*98WH=+Zb>8Wzhajg+iD zdw%gQXExcNg?t~}ctv;*m#>qsM;DQYmnTI*_&&g!g5nV72zQ?6(Qr^LKzayev?XxJ zrtryarte$;$eacNr6BLI&>!)jDDBrjXmu3-QkWjRiMqvfI0E-I&+tYLoAuideA&Lc z-J~F1-oiSGLuw1wHg3+k}TBwWQzeGWj!E-hCLw1~t*XT=%6@3dy&EN34ogzJnbm z!jk$Cg^=kW$o`@`)a+#c_nY)X`Kup}#=&iZiR`vaX$LxYLVzbEmp-qS)%7*k z5E2}tkfdP&QEfOH)o4%5Ov&#JMx~Q#H|afijb2xb%ONnE)$9_;aEOsAXh;PY}#a704{f5-e` za`Lp7xsyE9l#Zi($SG&RF>T99Zh;Wj!4TMyWucO`giuw!<(qud%Ad6AgA?Vcra^Z54Ryxr-M1=g%b^q!v;425dfh=NSgg!sa1g#|Ak z)*Fsaa@z{HEp|Bd;}ac66-fCCZ79K;v86 z%&SoDQ@l&)2K^^T>i8&8NV;vansZPNaVe77OF^u1Db^zLz*>~>p0ifi!|{-tTG(!y z+*_tnT>}%bEzu|Av!L4qN$eCu4kg$Yt$tL4t7WsC2e7$N)QqEcRpxgc-n`2R{mq$~ zx+yZGDPqn2Y@;3E{;4?v)|{_{qvp9RX{cV`9%y{GUgQT2Q1tbPFwo%gf}n%cN4$*; zQQWj*t0tSrP7x1K14?eAHZI}r6$ESp&_8F2(7n;Vu;`!g=-UVI!;tK~JW7Ot8dc?{ zY#OVfKx}lTAobWj_Z_DHk&TtfEnJh==fu#j0NnZW_w;~SSG&t7iCo=%G5=$8KP*3l zJl7WaB2%R^R}dtrtYSo~y+mU4Kqbrwvry4Gz(k{Y9rW4m9ywVh_>p&bTH`fNxjEq+ zMg#JGp(b0*#>cEJmLFkB%UBv-kLK{`_^>OR;VO@8vHi-AyKf}|Azly52f$pgQZKQF zL$FdhPO+Jh?fXh=Z@pZQqI=_jMh^)0x%7cpW4TWyfR=KnMSzvM6^&DPGyb3|zV`fI zvnB+EkJq$+rFZ*^m&)RszJK>r5BPZhyQk`KRR^RJa{?|PVe*8Nv!6A@3QQcPMrq1X z3WR<}^MAgC%`O}GyFEM+_Iy~k$v;WwdKY5oB(Xfn3RuO+FmZpU1OQ-4hSF@X^04C-kx#7=Mw`_jBfzJcjy29?j z&Sq7^dD4Ce5CQ^}R;n9a%8T)Ns+o_HrmRqvR1LnnJ^&Ap8p<0_e)`vJl{MxN<36E!N0&4vCvvJ*N*Tof zlK&r9SUT-P?TkfhRvmh1-08^|iiHU~(eq~tt=R|P0sSr9=}NH^CY@BZ7;CmXZ_b@a zY2SU;^HEyhIse6|{qWgCVgE^p!|hxISa#Sk+S{xv&KJ|d&#rVejd5VE&WyM5&i&EQ zX3)B;_28w2|5hAaB`v*H*Y4Ggy>_~M;A*G7jHuqIZQDHdX~8%yqAyed#pCTs0jHhH zkiA8}{vc<3Efhm9{O)aXVtAO6s|{~RfVU0dux8|X=c`xyXY_eUr$%{|leyB`Spv{e zOgesNtym2uipYJ}XcoG7dhkc}Y>}SJ&7;;8howT6n<4~`m7pMjbe=A)Kz8yExxb}d zrFWEReY};*iR6-30^VGeHkM?+4*R;U1^}=n*tVg`oyyISIHSYxsl`ZY0M?sN}dRq*kuY)ykp~g~~CUloy@#%VE|io&P1-?9;J9F49>UM1H&Qpy67^}`;J#4%!R{0`D%E!M~)}GmWn@LTL^P`dn>4-yFcE}kS*DBwiYG^H?6;)MH#l_+9frflvMb`K6bc{3Up+4 zoH?wktkO~xj|CnO?aZ6+H4M#PO#A;Wb?7{FpO52E01#f$787(m2#TlGBF8a+-U)aE39(D-$Aa{?5eucbeA z`TVwiVd*a!Wz+9Cb;<8VmIwR$)qY}Hs4v1>kIHl68KVln-xQDO^K)@VX9d5cYAteD zi16+?B5TlVO*CU(8KgAvIqWSySa*=wFvCBjomi}-o2TsHg|;;fq@&P$gOc4ER5e@N z(T3xGb39}xjnfA_97fW%^;A0C1on*)H4~0 z{Jn5A1Z!OKw^izSeGFR;j7jSmgVlLYh}!Zeb5kdSqFx1+BIjzJ%JbVgzj~p~@_Luk zXAR>{3!7cY^fTRwWHFkzFjGN@2n{RsA~*9)J{7RPt9Vm5=>l`rAEFKmu>3CHG$(QB z`Xx7bVO5)#NEK6OuT&)_*BgbNICfQt@Xu8ihdx+08Z1A^w*}}?HXrq@hd#WA#4chz zB2F3A0gnNlqX@)h1H@(fV))1_UsHao8sA}USe#n`-du#Ubp%nn@RwAT>BS;b#!=LM zQ!rL-f<_tz2XvnQ!F_;nZiW<*-}jC+Bm;YY7Rs^N)GA9mo^Z&gjewEM-?YqrsED+l z{)QxSv}Bsp>3eTkBJ5^t>d5(@&fiJ-EcakAOu!oDW{t&_*X|kK;9G7_TwUhJ%uo zgR$a7lk6>jK5vH}uflz)v1L5`<+gO$uI4)RL~x72BSd4;*+X6?TQ=>j^esC&CMz!u zT+N$%us7I!4%D4`yxg9yU(I=}#Wa~od-I>aof#0gTWzd^1ZFDHWx_9~D72geGtE$C zQobHSj8dL!-NB#Wy0z!GZq50A-&mi!e?R?k@%ZRige#WWq0+<0njDuo-MzsBvsO5_ zZqd<|dEsGm2bli(x)j>z0^W);8EBdFazTTSEB^D3{_JG-KVi=2b}VjrGS%YD@btht z>5|^0{dq0+*W_iyBz;nk--G{T?$Yo^QEo0{g8gT0y}40l*zL+$4~_Tf2~FiZxX7&PG&aRX0lSZ?wnX)MmO#sl;Vl zH`_;m`i=*^lTK9xr{V#tDP<8Esx6)9p}!r!Yewd2Fys!8dJ=M4@Dr);8G8w9e1szS zjXOV@Gg_Uc=w*+z{^Ma$mFFq`80`P2qnERY7%X<2NWcIK=)u8aE|W$I&b_ z>-wf5$j#qeRs6rax1r{Lyf?8hc>Y?K`r4s9H=Ux!?flk09jB!y46@ioW1OW*w}%hN zz=P}ZyBipj8mKj2O&vyv0zJ@)f7CP*r!O_FSv&b6>iq$brMjEvxwijo6A@RI{4Sp# zHHI$>G)Fz19GvQBk#6jh~%#UxCgt*9^T;1nf~g6>S?#r$_b9 zRrZO8muVbAD1c;EUeZpA3_0m{${cndI-!8Uul}9MGP!3(kB$_n6wy9XXNbuP?`(5L za))TSiU?VRw8aGqhVfHmC_-^@DHd2+=z$D(?Qp4;ooWj=b=T)SL&P;b;YRBfdKXH~ ztqhkxU)J9c?Z2%*g+#u2FDZOseL4&?>e+e>kMD{r838Y1;?z+l6k)s>7!kiE5jZvf zOTzO;|M*`eyn8L91(D@`491F7bg(JzAFol|lo`IqkE;~f*T`%;{**;qWcK71Uu8h; zv1xAU?Mlh5!V}M%xs*pyWNZkMe!C$*n*;yJyoQ1@-q1>l-ly=k(B0S%$&TfqDUjfyKwtk(xzfb)VBIU; z`a|K07B8?hBrMrSKuxAgcScpP0?EoEKx(zQW-fKB?-AJ*R)RMs(vW0UsRlh|P)PzK1sb_*a`g?vmsFHVDr~NKT5*l(8 zOY+H#q~CuOJvZn|Pm^c8>=dQ*XrFxc7Qxi2!t^pZb(i%%o-D?yKUtN-uw z(ap!u;)6jNAeaBD#^+b>)Ej~0x-&clK1XtbpcSLDV)WDU)hsNvw<-vHgfe;V`l%)O z_d#MxWmnN7GkI=uvuv+}09Jfz@jxGtpfC53EGSa{cpNpbbsV-}S1+)P%_s*PIRZ8a zN(CqUWL0Pu!1OB0Xe^I~enyM4AEFuwHKeAfF0PFeEvwkO7ro-tRyEN67X+97u0X0o zcpg?fB?dXgO_vzMf)a-GI^W$H%A^j?oGmWM?QqW1J{daN5nmUa%D&2+>P8S_o>1^u zgtevNWjt(EwIMD{$*R1KObFLL6Q^WU^`843j1Zlp2p7vs{ZpIz99Ddn6l)uZB$y|U zVS%)mk9UyOeUV@nD?jXshm6_~1Ia#gse8|r!CSSkW3#w3L{mEtE4XZ!FF;HZ1B|O4Q^ONwU*tjf%%G zCGSjUxphJIFziDB8bJatLk7Js??_+eT!vDE&lJgpZC2HwHHbwHs$z&*nk?icM6}-p z56V=Lgo$oakYr;Vv8)VZ(SZ4K_QL1G|Zwsa0JPFvXiEo}j`IViwDdyDcd)D6)%q*m6;?>=HAhi%|(bo=H z@N#UAz5sZd3Zx>VSLo&8)Np*ArPtd@O7Ju<}_J(jZ0fY63F8*@Lg9M-(v?l!TR{V3RU)vV|x% z=DDQ!0y{)PoP>FFc+e>sKB(kQS-!5KOx9BwYsMMA?Vk7MX_Q=$+#*r!z` zWx{0mW)uR~82l9rd0PooZ|u;@vFw7XEI@+|r=xcfq4*k)G!g4@@{`725crH4G2tFe z@X$z(;pvY-8mB7NBFpa-(jz{xX&#muzMamYcstf{kIVaV;$oud3=uCw=%mO5%g zJ4@iof~Zp;3nUG7lcGLZxYOqAI7BH-j=xhzl9E(=l=`V97fT+ki|*KM2~h^Wx?7BW z=#42y*MTGzVqS54mL$2RV^FXn9(R4dfoW5IeMbc(Y&9rmE7XbAeSYUSPOs1U?qI$` zeIlhz#Oe=Nf*Gd3Nn`5oS*~QvpQ&siWJb_spZ4Vj$yFRS6!N4TpQ&zC8jT&yspH_o z)rUAuP6uYF#eLVBc4V>qH=ZP{8eX&K_8G0p{A3>CkjbJ+w=`AKZ`YT|5_;i2nINwd zRbb5|*$=*nzzFDJTzY&ZMZ9oHG|W2bg zk9@SQI6TiiUKgewQKaD`{^Y{;etlxKedjgNQN_{muD#IS;oY5c zwp5(sDu}D4M%P!^d{}rkD=V%XFoIn$vD}k(pmnV$qKRnQ{(JGXc`FbhSPasW{%cL~0P<$*fJP@04-Hwa7x5E>)o&Fx)t4vN5&7Y+&norg6|k zt;-;dY#5Rem89@|lXJfWfTb1RY|tC_c+uO_TJyCD>Qki6uJp`eP|`Zyy<$aT`P7$1DF z)+DLB<{Sg`j|7|%R*P=lmQ1#ogcp8)_*u(KPVaa!ZTT3eg1J6+Jj?y|LNj;+GdEkb zD_dx&JZ?rAx>ieJFBpp|t%W&*761#Wl6I6f2?$aiRm?0COe8oF{sYb{%^6jVsRhOY zF@#8#G-*5~cQS`wa8`nT>jot#)0tvT2ktmu#JDC3=W^^I2Tgw(Xo2B~_140M;!hm$ zo+<8Rn}YVrQVLm1Ze<%)rDM&_ddQ{1nVASfAh)y4c}>MPco<AZs3L$$m46z&K5>nw#1hU_LXa>>= z634`kRNg!(el~jgJYNhMGQ93=B1!!jNiOHsm)b;4NcY;O0E_6+K}`9Lsv*mR9Hb>- z)5jx%1Wzi2Gek<0qnibKH~Z})8QfSMw4;(kjW;mysjOhy%J7Z8k{zv`1uH|;xGN=9 z#oU+-;$=?ICo|lgg!L|Vp}m6yL&%FLI)E7j9*y%ya8S0d+@loMn}zyanWlyHEcY1~ zX7UY@6x>h>k%ctPrpn#1)jTd6N(m@wxU__I7u=xa{)q?v$FL4# zq6;?LK_@4F23q~J?=TU%c-nbDxU`RKAuot@l8#l7Xf^jPOXd4QMZ<$(EGayN6{~$j z0qg`|4{~+StU)IN=2)ctEdo^(mO$+mgG4(L>uWB;91i7#DIq)N(h|(dwA6W=0z`WJ ztPncU-?8Ye=GLf<8oi&8-dR}E&4c`v~{1(TBWqdS&^$=lf7k(eHveQ=B zLX80_JV_pT1guy)WqBhB#KK=0EW<4sa!K!0VS%0-H~D7Maps`-!_m8lckBy}p*zs{ zf7xqR9;mTEYNHr%;kpxX9epd`+a2_I?$I<}}!uD6V;BiOn{ad)?kdvN#Q?(V_eU4sW_V6Zowfq!CiN7hXmd}=Y4m)`^LEU zcU4z+kFH)dYpzvumf==s9CR{D_w!S|n%Pv%$uA@yxbJ^_9W;*2j)D`fflFyPy znHrNt7afF^j0I7%zghwsxk2?GRjq3J%npr;l~_HV>T=4LUIkG@aVJR${O2=5$>lHg zG$wH#laeuaTTaqVzdY}|3QbgVOc*3paIuqVtqu5Svj@(@=ROTB%2G_dEq%IpHjvG8 zYBgA=Kup6ThH|7`P9Jij;NV$&=70$E440aK6zYy78B#X&ezcg2@SlLz)bq$k%SbI* zET645eV6PN;`05D+Y}t&Pvi8GJeahsm$FhC0@AR4z*d{TqZ*rajsK?xtMY+#;YSNw@3+%R4gWOG{yxSVJD~vXj441ON?CIP% zH#h)GE2`K9^*J+g^XLP`oaZiK85jdoV4$#XA5X*~D%z575VQKo#96hKgeG2{{8aOq zEuGJ07(uS>)(!^XD$8A@t%Sz=rz8M$s zKsnMft8{pY+dB;+n=+Z}6XAsxtJ#Ju5^b+ck!EPAd+ExKuv1XTKd56dI{0pTL{SDZ zyZRDMpX=x?gwGXU&n`RPVelhdbm|oK>M4Q`YT36Ewl1p82_sTqWbkpPgJ}tJZ8dDc zVa}H0KTMUAosW#!<;v8z($!D~n-?kGc0%#dD0)Utt43IY@_7i)W3;d49=^03c~;c_ z^jy5K7zmrYw`+SWJ6AR2_+e1cLQj7F4C+kIeW;wDw;el8)DmgF!aIb!K)4T$GJ*BM zLQ=$|6|UDK|1S&{$G%k5+{-GOvx{MrTvUs(ny4nt`okoZf@p>#yN@bXGF<~qm~7+s zWqh}V`;+NAxH=O2&mZLlqpZd40EpEF|KZ5=sWcm~C(G#b7j@0rb7=QboEK<)umV1N{<9P9XP5(Fy zCZMRYsfr+>8sc<##VM?wwhL-Qv!@fM4oTUG+D9)K*mp`%ge^@IqpKMJQ%fcq#seIZ(*7|gwqp-^+BFP4 z1}m~%6zN2vqOEAXz1r5AIQKDd^^u_|`@YCiS5&-6{n zNpBv)Xf3~UaZj-Wdm=*qJ=ZXSOkwAd!W@64#;>#jtHFG0(#D>pWcdwxwkqec&g5hM z{ap4xN|I-iaO^eaCEYn*snXc^nUC_#l@`8B35xb-J${;MzSBvnq@ui1V$qtRuylL~ zKZ{DX;-yx_1gl==;2g!XAHCHCXB!7`u@xDG)a8nJTaPebJ#TD9V6@(KRdhw-Wb8*ySw88u%RAouQ z%&bAOMSpC=@3@{^(-!tI%@?;{W{tY*)rduhvlqpWwZ!qs-|N}+M2U0qIcT9^hA{}* zLMZ+N`T=PyFUOR0B{&|DKaEPIWsMUp6HHwZ|HL7}1+HdF|Nrng_Y?z6jlf;V_end6 zlq66sTTaEItWw=WrlE|niMQ*S>$!ZCwEOr%81;gioe;*cQnH3paoLrP-(UP0`HBms zUmR?BxQAkJ^=9+B#$QRLwOCKQm7xy=Kx_%EEx!dUlU+mdbtSUP=YIN%73u|D=;R}e zP1myBUD*+pLZ1TMsN!WXRE>v3DO8N-pSe(+nu#Q7dTMw^i?UK^h}ztm2Awb`zkpmL z=~M{Bl)_xVP=JIeIs_Y2OEyE;qtziGWkuX>QO_77<6PWoMx#(Pxalr5UHnmkHy=D1 zuG&uKw^e7OVx*fPlGW5nqx7-XiMM?y30nM?0LsU~DT*@IaY#EqdEM?~qcap}`~=cQ z^vwQ?^h2npaLd>QXvLBsN=r`mJdFjbe7tK25rK(EymAiemQx_~qVq|k?4`_cffC!?~mG(4)k2SJG z)hS20YmNbF@A5H?8JA^CPZfKs(Y#4%yDu?87`l@wxXN>fH^y%^iQid8z>G)V@P0nh}MUlRLZ{TO-AeH1mH>>95Q2|?5G zZ5580N}eZCuDl&sA2-o1ESXkFPgC9??d1Vb)HM}dj?vqb9BNys63IdUo11;-_CxhE z=xMG`E}m+A^P7|_8auH4AfEz(doLTzcgF-eR#&bgI z94DC#uh9pK0?~{%he8d`W4ZJRfluw&K#pJ&dK5McO~yl5AH|rk(+i@H_h#_>#5~Y3 z`AW)DW62a(HT+@Ks%71I(i06&CPzwltX4y!o0q9`pz~$)a7mO~q;h^IVM~sbG7S%q zilBrPr$!%|ps%cNWFv0e@!PZ(bJxS0b%1VnP4?REv=Ft9t9XnU=cYJ)ZvQnz&TL1T zHrHOCL?A{5Qy#4q0#(yU{#muia<_t09OrtTSfrM0hg()8rhY;QToz1Wz|6#JP4Q5) zXSA<+`x7mPLx=Kiv@_$mjzF%Pc(^?m`y5#}vwl=mX))A`Z*U3LmzqL@NGs zb4{GpvXQ7y7Wt59jbor8>3^E-z=O4GQriotzIn-KjG)+llMe8zE(2u9FrbKhSD}Yx z{6Vk;lX#yHnUz zt_l#6e0)!;Qi(_f-~TcdFW;Z2`0ct>)1BK#1^m>Fz^{_UJ91Ux;6c3Pn_TKY5@G*c z8DD6kQhf;0Ggm7_Oz}J)B|l?YM#=3)W1z0;G(^j9JmZ#1Bg%C_I);`B`Bi61Zr~oc zD|!W`L@tCrem&Ps3P2U~z!)RPMq{EY@79`AXJmde=$xFCb#!5Z+n0(;`nL^f zkfM#a8kbzVOSvk+lA3xl!euzd+mTF!c zwQS))QekEIn$f*y6n(MkTv*|jpc%D}nuXn@NNBQ$dV0Jvc4aATxW`Ruf+)z{?W`(U zz+EzQPU1ABxIN|8VLg|`G7$s1nB&ac)02Qkm===Z{w0tUZr~-X0N|!Co2?}21~8;% z2|i_E$iI**#i7?lFHW)^zHwDU(Q3D$MrVSoOv4u7P`b!zE)w+xmVn!^rw+21iK?n@ zx9mWD`&+jc0xl4gi6W9zzee`I#U!jM9^JQ7DUd=QhD;=)nR%9QyNIqV*&JofGx3Ek zHBEJJDSc5`3OU%prs%75UO>M*$x{8kxr&qzYwx=}MDVcH`LL_uOaq+i zG2tlcVv3>t^~1_#hsrdZfqG~KU-2~j9zEYlQFV5WbLj`&JM)UZJbf$`8ecyZCsm-= ziz>;b1AE{BR>IQHi&tzi{iPW@n!B1}bKb*sZ7DvMB{d{Q_0UvbqunXMJe}P)@DWA5 zKIjLn1=Cy!9(gT~sWZ_w3w20MUeH9BnebCkRNIU|T?ri;UyHtvHDMDJ_ZWs0slccH z>W^lJlJ1mAR&PcqKa8QfHx3?AiqA~bzE#t|4L}9TsB9F3{t?lbQBCKKx&p+p;*vJA z^*heEOYN^VWnA<_h5gyE`lM6pmI%cwYylR9hZw>WR32ejd2bk(3qAA?M}fLBxG64NMiwX zbayRKaUZt2Z-r1k>ME(~JbAWdnNxD1r({dab@RkZ^;0y;YK}1ycnInlfOtyXqln~7 zsq{`ukob~!iXk@xxPS(RS)Kv_BvUaulX?XJ`Oy+e4pI2Yevo=V&EJlx$%Z?FG)2jJ z$IXraJFE9;^(KMSA-ZvWCU=e;y*t6$~7TS;R22EYrQAOLR3 z?@e-v2hz)OZU^L>UUQVmF6+9;yy1`ha`Kogyn>;V1dPZOAw}1{(8K zTxbRseQV2E@fX+?V)?>snwWllfsyq?WdYdqSCJkMFwH-!9T`kNiz*-iNdkPNky)&l z2^VpGTlYOW;*}b=XSu6`kf=aViHt#z&2Xzl7sGjzq*)OlSJ8993QY>{G0AK`Z`H4A zwJ=r)Nm?4bPke2xb)C^sn$;*mEu(nl6YVU01 zjf=I~sPR@3MO(D0V^WE}w3XylE|m5Q;AQ?e@8{KhSRiW5C6+29AGI5HP*iSDkW)$4 znPSOHU2u+Nl*@0(CZePeLpU*8^B7&mhgr;x;vA>=g^l#tein>MnZr3U7y@fna&5+0S650DMX^k|7UQEbfA^ronKgMGlPyR7%6Mkb5P-joJB4*@5xAX2 zE%?qDdH=G$i~H2lvOY=Q8S#51r9>>Wjukupa8f@!&!_)HC}GaqGVC}Rh2>drLQ}4F zLB+NIL~R{XKV}H%YyB=c=ZB5?6)1CGSt*=KX&||!{sjtpgF8)YSyT5_v87-8*H@L^ z)AwR8^=gL%#lq#YV4Lv!g!4B$cpJCsgI7KEiFge|Hw7s+Mu2@0KRp~f2XG@%@qS|$ z-_w=aLSf!An=s`E5x#AAW1uH&FpgGeK#aiMd-0HL^s6?RpMBo4_VgKZ9s6V40=mqN zW>WtB+4yzrh0M`9d21YzWdz($!llq<1d6Xo!2xAAnvaJM=)h?xd5(I?WyMNafZera zMAcy~{YI?5jWwmKUb-ZSIPki#5j%!F03D32}2uX{s?Had?vED*g-P$3DYh#hv}!sEOV^!fPlHvdn@K zCjW<{Sv4n6)B>2!oGZisq05C;Z`&?MggRLHOaK#19kZ+>m689o>=Ya^G!wF4Sm?^Va>)-xJhD@3D#bjmGJ)`Ko=wM>+g`+$);4|h1$u#xo>^sQM$ zGE235wA5vr^ur7iLXY}n6bLPuN>81pQi5BYB2UAa?5k%zpo;zzui#EgK$a1%c5L91 ziAJzdFBqk@TwK+N4-Jw)Z*XUOaTg0iI6Qi@%IV>updU`=hjET*UOAV>k$(#0#y?Kd zrHwnq>*B~SeApsJNV2*5re_YTy-IL7Zzz<2OBsn{!I8i%>3$qN}W>7^2&B?5u6 zXM+`X4%N#DZ0_2*gO5bJo@EKntJ9H`gw?a6mFeXwCUmyxj0TzL4|_{(@)}sgG8oGJ z6zTYgWDDv0j)dgp1|^3g(025Ojc5gee05WmXL!ED!(dXnuewKvh9hBnW&QanbdV*= zBoGBXX+=xJNCn_iiLhMO;`JQi()yPrBZM6{UCeeDkXGJ%t7tB21&!U^y+y{tC+u%` z1YQN(&L)`d>q0!y=t~qSh7!?CJiFEGeXFYz^^ml5nfa{6DeXwBaPUy1sDsrNpxLqW zq$2HS)Bc0G{-`?vzuFm1%zdI3=;eqTZm;@AS0$?fFiR#RC?1yBEG(EGE z=8Vjux`jHT@T}e=|jX$iy!Nox!UA^ZEDUswaPc99uGC zLnU8a#a2BW4FYCz%`B9h2=TEf9LOR9q_4bTe|iF|)AGS9JQd&Zx(OFil!u|Dwa;BQ zXqwktc5VRUi3ue;l7`UYRiIx!4o&RE@v7vwdN`s{@u_PsOH0xpXCnmD80s{g$WHPG zvJ^QYPFXePLtjKUW&Co1OIJE(cn znLkrYTc+X-*`iG_&NQ1`jD#K2%{KF4M@dDxPUsW>Z%fB0I0`2h7V5j9G(*|fOZwNX zLl$r!eW~|f14xf30JQ`N*8)z<*0|A$!ptA;v|Q6@zlrXc51yp`&2hoo%vz^Gyxf9; z#6e$z2UsH_Zakq)UBHlwier?x&3Skg8&$GNfsqs9s7(=}mQ5$dAR=2smu4kK+hf*C zcyfSzIE55-#)SjNtt{3vEzUW!?Jq) znsFHHSZo{&Zp4a#ZOjB2*3OGAq;M5dsAhKp&4iMN$rtGp3{?8aTDud9Fd$o9b=Ogh zs(8{Yv12I7{CW>!i^On{V$0T2F-!dFx}npgu7^J5V-of+y+GR(@;7~!Zvv6oRBZ|1 zAct9QNQbWugU_I*cr12box4(MF;hCj>jsY`hUA#nk)W9oOtGjX^#*bjEFQ!Z*E7MZ zLWFDO<;sFCz=?dwLOESIO!jcgc4n{RNrY&l^hL%5*`JVS(w5@yJY|W77n7fWAmA2l zZtahFwg4R6<_vl1q>jpD4a<$$t5a#Gb)oPHM7H8jB%NK%MI5tKBY-`! zH_uH-SFTpGMHyShr@)sy=<+=DCFo`0Qy3XDw2D1LIOJYR=ER&QUtW{X!CE+c%4I_3 zoRH;G_Q{F!zH^I9TMXahJ7w3n{|y?aImcl#xYtEX<*3PG=fWynIlh8wq$27oVCTJ4 z3=mfnVK@QxI69i_7{D!$zuhrWR}_=o-rNWCeF0bNr8yE*0J9diJ-5@y~qbPOt*+$;}=PVN@0XK<$FUq;`dfbNcp|V>+ z?Nfhfs+cD(*fSxU9U+!jtA1)^CnmF-IE~Vf<;e16na-oE5pip?Mw_n!KA2%45`Q`NX>y zK_%ElYosu)fE{J9TJ@1)s6*dScV?{r$j=jpy<x2VBNxa5)uesf)uD$4%lLsal>4py%eyS{>jfvK)}c*j6SH?peDXiC z#S6E}4{fvpNjt@N)+kTFXsJTRa$zRDT_17xVdo&SiSXnWJtF{@*3KqEvt3=k8 z3b|e_o{4e-JlGB+DK$S${D?7S0PLcRa z6HT@$I|y-cfjOkKAyH25;1?Y|P*wwN2xRb)h^j?GmQ5j#04_x{S?t7|Ic?B)O&rNQ zWW2I&h9A)e`DE>R@mXq9G_PHrUoR01)1LN>m% z1jq?n4vK6B7W7E4Q!@JyOY?vWgN5J6nGakxU^4UbGPaoEK8>#fQeqFSWF7;j!I{=j z&hM)5IE#Qupkm}cZM|brpDwOwPF>2;Q%nId`_Tt8OPyS(vQjn0Bg+6fL2#;<;)i7N zm(q{xVg@2{EB795d=8gc)yOm0Dpsj5g*p}d)__Id{gtIxvTx~g0TiD0wNF!-vZ0oJ5CV_D1idXF<2KhQ533jyRGVir4Om1bpYP!w5@6F#b8#}loP~M-i zs8HRisv>%>8rE5?QTU3+JPr>C~`N)xzew*ha`_h+{5-^8o|_OZg3Nqrykcm zZWfOS!C@X|T<~N6FjgAO8~{N8J!}9kw{_n<%h@dHCrk2h86qV?QB966PK-D(R?)kT zi5&)n)0W&rfN(rhf{jz<-oQjI%$(OvokxEcF~xxS!){7ez(&z5&;v>Softe`9xxD0 zd#x+eq%5Qss={4zCBGSxl>4GXiCGUfo?+C>_T$LgLLWke{KlYJ?a)WSRX^2ZD!h!K@N*t(3o zrLSW#`(xq>{1;JKtcxBIu~o^*+uo?_bRvmkt-imBoti$Z9~Q?g2ITWyl#bUek*9Dp zxbcrh(jnyuF?rAu#3pQ2O7_p(4@Of^6A)!pH##vMw>ISE&xM`bM_MkFzRH&~nkQF@ z(Q!Su_a|3XhU5x@FN2%Tl9?KdTAwMAmWV)`L&6Nce=8@9E){0+Q^rn_tTD+wO)r79 z%qv+m$zYi9DR1ukRYaY~_{|o@zHW^+&|H*OE3k|m<|}TV@38pk{{8c~6gc7%hZQbF z85K)+bT~P?GR{n`s^x;kyk*D60hi#x15{ zuR^D)UF}NYaA0IYVsxWZ3!6$_ws*O35gpa~btKEeoRM^_I}NkwW?!;`=r~ z(G;`-k2%8q*0o3WO4Y=E6}tRLH6Pto|G_X_WWp4C~HJc0P_6SqAkn2!rTr24+r7z zq{0~(K)AOJw9R2W?I9OeU&OxF?}E*pk$0cq4t*b95ZjgVz2{QGX;I!x{s&q|ha6t* zmq<5$QQsuI$ES1Pf&E;+uiJC0Z)?Kcd%?gb60K3AyRa{ocFoUfKYs!G6~6_eI_K3x zu07uSIopjLZD$2n)rx|Aut5Ls4J8J&#Rs#AZFWKVKT7%K4ZA$1j{&3O=Z!$;Y~ROH zG`~kIIirqW*5{E%OdFn*PI?1)1f%DcGS%G-RhXde2dITP1O^%#`MS#O;cBs;Pw|G* zXtNLj9+HDh87pCeQNO2Q){Goa)^W1WWs7qAgB8|{-P2a5lMLOxRF7`X>sysv z0eP*&W9vmEbY0ux2I`xjwgG1!`@M&dj)7UlrP3u;H%pE5@!&DL;YCU37JT{6d}&93 z*(zwhp3ZCa2UuHnkR5TfcZWNy>D=1)4I|kac-Ckyezxc|2QRNlR2YsfbYV#occ!hf5D)X<~cI4O;9r~$& z;AyZFJsS!7hfC2G>HFNO3`;S*s^OQKKWOjsmV8V)vu}5MWWpqSpQC%|OaxbMMSpmg00~jeMmGOZ+@aMRhes9K#W_Uu1onLEaZmTU2Ao zl*}X9c;8d%B&YebP`xW4x@K3U7Vs+%Jwm&-R7$=brJb(~lO!v99-1O<=_OaXw@ADN zcY+y|4@-rE)XwZY1yINlL7WTIi{~c3i_ZRIG1iZ|n=Cx}%6+HQXoF=T=0Bdat1?!s zf(|fEh0xKLYUy}bi|2NC=N}Eag=hW>h#GJ>5JoBnAXD5xMAr)63iM;9qWc?M55w+% z_zeEj7}-vqNINu1Zifu|3R!am!jvEJ?(A7NJ7h(8u~gf0h4>)YlUj{~R?cfOQo+r$ zQ2fo9J=kOSr{Sf3OX@zmc;CUpd!@DL`++I>2R0RHN-QIQO><1)Scx*vk&rwXB@}{GHGisK@#*=#b~FTa zFvwSJ!LuU9?(FR!tU&miuiOULna!H(g-htzD|4#~KXNsyJyJPbRKiT&#d`!bJ_DL; zd7q$y$&UV3zy;tJ9?5nv{*az}PTxV4TMDv5A%NYG5a3% zs5naZKo5-eC{0k$2wuV*2BkFm=eZO90BiRy1iAgzsDYxUTQ#sI^!ROmigho~2SAKg z<3wRel;g~C>~416mI=%P>%D2mV*2wK&wY^zntv)FdV@4lG-g`R#J+&q7Hpvw*1;+k zqdo>2NuF|Bd#%niggKu)62FVB=qUWfT(KCpT4LEcu;NFS%hEKiIIL;*Geob=?^Hdl z51yHrnf>F7kF<-I==)mfB}9hqqaAC##(QP8#B+bDGvL@{_+!N{Y2M*Gx{*xQ3bwO8 zr`Y6T5u&oeAWUXe{`&FYAJ|OI!)G#gYxN%SrZI0NbZ6|J=kfWOkM~_Qq}l`~b$F}C zElsxC(?$!O+kI26e?jCjpr5XGV=U{lX^tDrNgb`5nu1ATP<6T?EGPGS8@I8ko%NEg znO|RDE96=?x2ty~-av&sU!0)VY8yUHI6H{#E8G&(9@V>${SxpwTe^3|Up+3Zls0lE z9ZUl%jV-_G_(1{!Gsn~P?r z5i{QUIE@E#9m{6}gx53Wc#$_=E*Ol^Qdi~A4f4u8Ih97ejG|7OvXm>2)MZtZIVoUI zJxBC4YdLrZ{mh!WNx>S3O-(I{9@U$WJ@S=vi$B`!xIUj;MDOp)Pgz4}#-Xz^_&Eoj zA6XssKb$RT7*GcDF?2sSG*9pJwyB3j&HBpS?E%lLEiEO0#2%TFzGDk>j`H&wuh`e; zNa%`;8HO$#RD6N2{lDhYXN5-cW=*a zYW&ICdWoLjp|57_pPi*Uu!)nPhOG>>A}q{myY1Z(qON{$>B$E+^BSr9zh371W5t z!qu@|^28`4OBdk2bh&8I*~{_eYj)12Rk#1=;VsULf25k50{ZDtTSF^G3Z+rxDJHKd} zOE6>>yn=3@XKumva9#NwrR{OaE^j%<%0RBE3in2=TId78U9Kt#Qcw>_bfPAe5{Oqu)#5F}-Dr>gRWttB)4Y+g2)Q;Qg2f;46cA!_oPFQZoSo7fGA|yU z?JGc>v4O*OB;4aOW+eW?#;0m7j3xG9#qIB8*in-5T5ME18}M(rR0U(T$dBQzvJ%IVuk%jEqM6iI>T9DT&V8bCdi@!>(o=Gb@9ioXyA3Z4lu2QEJ}DK z0mB-i4-qN8e|)DeMEI)l8?R%h&{YQXb6;%AZSM(b=7X4q=^zG6>Zbdy-ur~q14N9y zW!m<0#3j`5v{p;M=zqlOy|up`m3?hA=|tA|(bQz`t|)Mi5`(p(B!H+>+m6l4ncn~R z4i;6P!=|BTy-wdCU(h%frn9wKzh^;^wQJiJ5tgTWOnCO-bUax?HtVl#){%HPX1f<^ ziC1}UlP@QU=4Bdn`PJ(yvHlLY=Pfegb_x`mVTC{O9~U}#v;wR8BBm?D>8E^OXzK&w zMcm}epVQ+j7Ar%2?&P3mP&=4F^m~7~ura1$<#V6ntj58_RJ{(#I1i^lWDFEjFVvs( z=UrvRpY81?n$C)U22 zCf@ynHaK+JC=HQ+yPF z1?TrI{+w%*C(M=`b^e@n!`rw(#`^1yaoETCtMZ-^3m9rME{-51>c;zgqBqWaqC8?8 z*W)5K*3}3_mVQPu)H6e3CJ6|4q1J8W!btb22+@eZ;K#%&HD5goe$RYMyN&(nHoAUx zRV|0t?{{P>+V2dDmo_KlNz}#}HMwZ6IBTP?H=~t-G zEtAOPpGiY{r*i)!u;_0@6Dw6Bdqnn9n;I}6ST}Kyi--GsYe8Irz!9^52 zX&P*e#efM63TdbU|Jc+nldLEB%j9Jkpr5&-){=tyf434F1WlY&j6>h{eHl&n1=KX* zP#wyRNMhCvOA0}Y`6~LsRh29=NPC9g_{GeSeoiB3eQ0X`vUV``;nzauka6Oo?v3D$ zW1zwD_>Fyn!XE0n&n_@Tg3;*eHsEdWSLd9sZWUiNK##xSNAm`JbOzZsU`^LLPpq7a za{WyFc5OMndGV)~c3h3=?fL#$w+KxmFY@M$_!^q41$Ya!ZL^}-u<_Q#{H5wK@yzY_ z{2j2K`hB-EFTw}%H=fq0*$oU(b@V8V(aoFtOuFeDi7aTzk>DRec}|vI{52kXb2mjq zb0QjzAi901xqCI5=$l5T?MHLwD{|q(Y4McS-ku$xGBGvM)`_cy2A=6_zM0XLt|U(vmK+#vIggIMT!O%+G? zw#kfp#DOb0MpA3*X3D=`#{RqB5=~ctxT+hRR{tFLDbQnoa;8$Jp@uA(OS}7A3*1t1 z^0u6wr~I*V8wk+k&;R_ci}Q$hF*3aBs?8NchKl0cFK_31ch-F-)`1y>$19XCS zZ^`PZ0gdkUk>*7{9gl4cg*Tg^bupqVujRP>7X?hbzS{TyM=@yH%1xoCrw#k9Akq>M zko!79gp;6Dp)W$5W7W3R_G@Fi1~6XCn1ViQ2pm)+17RtF<$}CzEOWdR{wo)BDVe^K z?lGSp8R_!fL0#5u_;jf45I>es(3S8+<@<*%)}>cRH9F+hM%v8k%RWwo`XVTbOcBn$6a55%lilc04K^e(-WCo2vREoTjW)&LG(R@g81(Zuf# zh_4l(uLLuD1b&CDD9ttH7+?dtTLL2-X~ex0{2&*|rnzrZ7iv5{vNArh<6e&2W63;@ zoI&3oH=Ua4Ygc2tvbYB#Cusw3=yqDILX*`bLYEL3o%9|>mRT*i8O@+lRw)TfKvF?PLg(i&8NB8u91k*f6TdiVs$@*_kku9t zie}gqBs_{YEVJG8Rq=G!({z#Naq-o4p%wHkJqSoD<^o&MnVDNtblo}OBWznUZu9Kd z_vth9EY)PlDPY%$+A@kNU6glJKBNX9?2;KTGKkP}heH`E`b``bV`&cW;RC`oMi>lV z13MoU|Gtb%(Nq(;i2~(xMcU3%>!QkjU4r)5PD1dX@wQ zY<0Y~By363Biu5#zmf=OxljVwxJ&BiMm(OasCa12wR;fQU?XZsu(?Oy&;|7mY;bR$ zxTpUkJ8jI|ft*gaH2*#C`)d4oGj(|?n*JkO`3rkhxm?QJti$#{4xS~%G(#jrc{ke9 zy5|FFBILfh z8MLq82gCcvz%DGb-sPS;*oBoo$sIxc3Un+12?d_mIwe|B1tCM(tEsv*q%rauWS~cPg z@ih$C;W^i0kmJ4Q*}l0_ewOBi*_3E>^3!@B>%^?;{{yw zHmvXV*DP1igzwy=AXKgKk*QnoN}d6|2^m0+jV7IECIqu80hg?eS40F z!LOm|`F`4iPab6U&1+XEPy_ND@7bW+dGrcXX_vL1D`^uvaMvG^@nvUp1l*FVGl#E$ zyUU`^ZL+3^Dyw(&zK;=7=O^M+oK!Y3F*cKV;ST?cZ{LL1gUqNACq3SuFXdFcKf=$c zlK!Q9<}Ncz zw{)wt@RuB-ojV(k5OiMkT+?Zn5(X4SqEwFLC%pZh={<9zZhhrF zv;_hwfb>_$fOk`mj(yYu*!mlXBbyuaq>gpBbqKlCk9sSfjDFzJn{UijEww@)Wtx5O z!Y5Z9hWR@1@6nP=PEF+PD)w61kWSBUn+3~%x-Oy*`TY$&Wz%ZA^%Ls6F0n?`uf#&=%WEA6i?a+l>F7@-w(pWIR6`L8O)${^05w#zLB^P6D_t3Vzv^p^Eq_}%D zC9n=mXIUPHx^{FT=CyOZf5JY+;&mS*Uuy-Muz$J>a2ahD&|Mw~%zQ0ywrct11$H2* z#4Qm+JW(VsaO7SwYYU=P!}L(~!a*&eqVOOf470NkwHc=2Hj!AlpX;wI33ii>;G=Y4 zMmHk;vmO?vHms1Tc`McC!T}8ytxF*T&VA{b=TB4B++!3T)kgbOg%JRRa&^eSGpcluZStbbX92aWSn6NUESruwIO zjS~s*98Bl(nzrUCt}Z&isViK7D=Kj$dP1m*nJDfnsopK1dw7HJx5BD9e}@GAufiyUX-1@v8bxm0TJX!z*zer)=c=&8KQGhz z`Lkwj)3mdaZ?d^qR;A$@R1~!U+hWsF0%}JpzA_@Z%j11RRe2D*`3TC0>5!YlK~Yd0 z#h*L9l_}qqk1Iip|4GjF83l1pLs4$?#D`E_UIgrqEIq!voV6_|>ZYCrV$9*6+)(@J zkt`$kgb$;=@BnPQ``StZns*;c1y4bfV0T9kQ&ojNq#|p;n7c^|{DQMOj!MiD#E{VX_+Qk_w~hIE%(>tIw|e;r(x2US ze`QQs2|ZH?rT5{H$im53O7@`?kDF-X!4RVM zB1be`=dP}STT&Un;IUZtp=$mLm)17?8xPPGlISqCs6Unbg;DH`UP#lLjZngiD2xz4 z*6C`%OK=^}(=R-|YhDqpgKG}%8ijo^`EAS%@=oIN2yINCa0`bE$d@iq;EN;19>xP` z4CZLuAizNpEf^E34|UcaY6D^G%f{=E9{KCdZ@5);LwxmvBjM6{OXC~2J%6A%m&{j^ zlb<$22|@6Xv{lcGz=`45K5d-OdRex7#p!zSI4{uT5yg>a<64Q|gOGft1m}h^oMX`r zZSn8Bwiab(%T}nTg6jn`a_%%x4_}ADy{Jn@1wGNN+{27st--nwvR!jNKuz-x^79z*7< zE>IxMC`b3TJ?#zNM^MbR9`L-O0HeJPW8N%I|4ssak^)CH5h-a<^pu?(g{p_P4sWPJ z`iwOzIL8E;ga;VIysO*93301PrO>{gXsh+cZ4zm9xEFNao~b~e2@A}ae2_=q_!$PK zaLz<7H>HjvSq~oM`LE(uX4IsUK;&T%2!nMlFp{JkdJ7bWY8;8aoh$sp;U~cT4kdv_ z1EJFoG4+(9u1iu+mvZd>F8)`dL(ctkg@Y>2`ui>dA%^C#FFQeOHIF%bAJ<_wOr5iM z8(>C|`0M|0JVUl>WmSa4e8Re!MX~j^5T8rmOYK zNw04D2la}d6ai3WDv1eQ^OYL zVXDi|r|PQ-b{97utUz~1Zc2ujkcD5NZK#E^ZU^q*F15u<^(ap;tLTDW6${hTIsy=q z0H)@M5r^UyMuDe~{br?lJn#BRZB%;NEqCA}+$hP40kV*HmyZ9Wn`<$SB~bR*lERS@ zD+p(o>R*3W=ddC;ZjPR=+#>w-!I~}Rt|I6>7oz>%=f%zR$MI$W5!mwMRVIOthts5sL z!S>mJ?uaITRsOg;H93MM4DLZ6pU~8*!_BpF-XL?Kfn)3z<47;zrWPK_>uA^nMalok z`E32)b3UGd53Asc&6TL=){2&&cD?<1tMPrTvHvj21gzZTV{?E1*F|YQr*Qtv|Iaq@ z??beA&!r#Jhy8%gYa@fro2)Fm1;rZPG z=LkCFe@g}p{%^@3XpwEj|A()4434#3*LGvu$%vB?jo8kJZQHhO+qP}nwr$(i&O7H^ z>sz(aOap?&mqq>$uM=Uf7*?27a&0d4_?IwtPhNC-)ipckTn<>B_(Pj`Q%J z+-C+|>8YP0k|@VG!#MIlWv>G%g52+CqZ9FoV*^>hvx1m#s}7PQ((5y|Wec%oKKP!y za0deMpWFW)Aw6cfq)uV{v$~3Q;V1gh{!jFCwwUkxwk1o0IgZs9;Y;{W#X7OG3yoD= z25FL*IF8L;vnQwX-Vh~?$SN5R!Zybqs&B;rGQb~LxiordwSg)x5jB>ohvSAII`PyWox?)|H- zaqct3Vi&jE#R;Vwd`}_npY0XIx^TPbJcc{cshGd)VwQi_SmE74(9_(Jg*Z_L^Z*m1 zb_;9$L_CFkT6--vygl$~UEY5z0_WcLkw>z>njp)M_3KU1t!(Qv0-N6Cz}jk{@RSa) zixk88JDIqdH6v;de9Vv-4>Rhi=S0Zw`?||S8XlhDRpT-uud31lJRg4o_8j^`iqYq5dd_vy~CaH4g1O_V~L|E;!LjE;VVTZE3$!}B-q}A4@TANi=>2za@ zNWO2Y_M6S$r8v=?OPQf8e}u=PjLeYL1#ZksSN)AuYF9m^(_njds2Ib2VKUC2EWw|; z1`9;QQR#(^fvR-gA6D3ZMJ_VZE;c|*_4|Ho1OU;wTwo4W$6uMwE(c;ml?J2B3pAxQ zmCL$)A#J=3WNjDeWc~Nwk~mcwKxzwiIX;Mff?Cw4WFO)G%%4m`-9C|2sIU4ctc>y- zbi1O$7bR6RR~B=E%X6)j{S64O>ElFNjC_e#fur(Q;UL1)rWu8dA{%w|mLWzuyqGHb zC^yntp_3gUImypZ$>!gq2;iCGPX)xNnYy@I3JMXb#~wP^_-&VrWifo?2YEtNsbD%1YT)hWI-ZRx)a?+F4CPOLGs}jvcuSl( zyV+t{ETVJvONQTR#3MiQ!{vv3>B#xf_TVTB&KpC$1^PI2!@KqeZ@70d>K6f@H^_&G ziqa)AS*RbhZbF2D%|?H9fB7i`i6$CHyLWxfB&9~l&1)Y#`d|1!c%#gcLtZk#SmeVz z7_loFfZ*z+N0DC>S3oIKXv`5-6KCud)FB^Dl&@y^-!}^he-jm-ZKz-ff=a3$L)PM^ zT^i`{qeXBErRd61;W_R$_1xIl*tAdTdf+=nqf*0vyDqzmXL@Kzi6qoa`gMcj#(<7; zF@Z?x%+=%EjHjBmn--7fe$g1Bc46nG3rnz?rm@r^rzF#*90-F8e>zn<3wzQ6$r8zs zL?H0mcjkK;9nDL!tD*~ds;bfiyBz7B$;!kj{uDzr`oCI5s5 z{+_CmG{J)e!Wiy?^u;*pp*aP~)I$Q?t;1QMq#64Q#3;OKyU%G~WzgH{i)OaYygSK@ zPj(Rd*!tJVud4TyrGQ7+V`M;pr%yW^iCL7bQacO+)0~^r+LKs#O6TLgU*p2S51oHx zMP0UbxPU}XeRAowD7M)e5{Lr+&I#hT2iBZ4K$MW!)|#Z(U|H@)hibH|Xe`5f>KgJ8 z%iscXC8qW#`3>zPE|f$@EnVeC`@SIL0i>gF|1%?V9B6`N95Tq{VX|i26y(Ee@lbD3ZgbZAvsPk$S-)@h?IKB&Pm)C(^(5HMP=y23)*?854cL4vMRGXAfO z(|a9SCoyWl%oA_|ec^$XL@yYKnn`9)@Xj*yxJo@n z?nZvu8J_03O5ePH?#O?YZIh?J+O6dN8Zmxj4S zPwXV;mL@`-XukJbEZF-e(!$`TM-%NApFodx_?b3$K^b%+ej(K|HU>NX%0d;9gD&GhT;l;ITeq5K-pHT1vzaCwIQaY~#{ue<1Xt4^lF zg%i<9zuQVc63rlbaR=m0r5@b(Oh5jKJT;2=%|D1+B{l_k-SSC|K0U6=f)$ek9dDB1 z`pQOUsW`H$hMQhJ=`>Rh7dvr&!UH3>#i$===F;ZpOx@Q&uOPdSH@#Z{i}$~BPl4U0 z0p50uY5sRR{Y#U#Iup3rS)#m`yOTs8Y30kf$P8~tV`KLDp;%Ssc=ff-O5E8zb`)|P z1TNNwa{YSu|j5aV4{2M)7VGXVxx;V>4rMVc0u~ok%m$` z;%_Y_?Vq}F*MKe*7lZSsgRp6T^I@8$9LG2MiR_P$dE&K8FGW1DH+R*<(IA2ko3kdq z+$afCv!!M4nzZ%EMtxN!)j9$b2Z0%pF6HOkTfHRgY^nt5Wviuv&eRLiCG+6=iYbGB zyJRAZA_HM+XV;&3_TWGB?5aQc)1mluw2P<)A=FU$AUC7oJS{#k$1FdyWjwwtVS_*! zM+2mL=9~u8^w<0HZKrx6-A1j6$%%BM z$i9iBy6q25OFAbFl}{d!G?X8$NvJVYW{vq#DE_7ZC$IrYbTJ6%GFRqQpMZ3y`upv` zbvjm3wL0#OPIq!1R{$5t8YOBn2V}D41SupVrMk18R?6rU{se=>r){3RW17-2H};-b z^z_buCk9_SXxU7@5t&VWF16?VQgZP~t8&#Z5BihEr$=zx%mmbkRNVD$X~Vymv51#- zvfFTV#0jgs8}0;;=Qx|I28^xqjfFaticb31Er31gsX*YD{%a}p9IfpRz0Lb(i_dsY zNt80{!8~pU%wLGCW`p>Lp#XdX8wnEwU2jYom&W;KJ$!f#Fq(4P=5*I(?WVW#+=^-+ z{))qzY9GFkinWoD2MpkIG1tF2&ue6`5Y^`S{9S!-uO4*XUh>~5H_?8$ez*)=1=_eB zP%(6Z+*Xh?4VQeJj{c|Oexs+fOkNlgg;5I>G-zKDKYjBnE2=j2LzhV5Pv_okFJkVE zY8FMxG|51c4s(QQP%`mtyO!a791@v$^0d*V(JEHFfYe5#gFFtR?4Xzl*SiC7I>JwT zF6MPdZK*}K-v2vFHB;-RDw7GsHsP`mZ{@B7v}r~#$tHasddnHDs68K@|CesYH*7ZX z3{S0#d#A3Qw3>TAu4@F!Q3pO`I}yb^Y0}NdS}`$VxpcW_^v{CAVJl6xF2Tb;Fym}d zbgkGJ9m8o8%PW~%v!d;7<-f-A%20!TV+;Qk1(ep8FE(0G1W3QyvKSaLm@q>J+(t#M zg5XEkNy*dR)L8Zwd$+Zmo=?2F(dJ;E+?B4HZuR{-u6@<@`Zjy9tc}af9Fe);2Y?DI36=eBwdZ=$_>Z!`1izHmJKwCarAWV7?l=~wa{rr6_8$~*4ZOz!#1 zdY(#r+qU(riLO`HS1HY*+v)!E{_0AbFYIdf`qZ6R;dyV9+d)TOOkjD_=d6LCq1q$j za-Q#5Y+Zk*^Wsa<*yufdw&*>;3iCNVx%s*Ky2*UdVA(bf==90vaowZ4y8J3?358Xd zeEze1s93#_O!id6nP%tTF)vi6)f~xFA=0M)+UAD0yg|o%Y?ro&Y~kTk$%QlLXUf|q z0aE^zizN?{)%M|)lQ+z~ar!0C+Z(*F&ixpeFXL{ACf9mH<4?}(O#B%dOOrJ2@IIfE zMP+dS-JRL{NW;Q#mwB7({v!?=Z)Wo7zAYGhQ&`t`@2Vno*fX4We^Q+Vkke1#W9xb+ za@$#*cUJ+dR@b*T9O7-GKDIB&%zi=WA%da{D`VZB--g3^<1|>&rGqXnNgB!yi;w1t zogns7MyYv7Fzy&>I&Y0l3%cJHZjOKzBKh7EOXibcLB52EFXNUpy)5nxG2VmM5AM0u zb6S2HSOM23fs7Y6DyS7%#*8M%Xo;C|8Trj52O@w&z#k>zRh)ljwpty{gCF&JkuY`6 z`8(a_{5Yg-(!Z3@d5vbH76i(DC;au9PyEsDhHutMaL%Z*?Z0(UHB7A9g>f=ZBdo2Y zv|PU=Jd!R~d4qS~@w4S{27caOty^^en;T-O##|k)WGv4~J!~b~m2Dr6_+PVASkkp(mi1F`yLe%)LU(rI?*(epIbMR|G{{bN> z-nzZ(CigY_+S*{ACh1-hsRo`6i4?T?x~|hMZSg2bSoFceX?P=*$HeeM19a^a{~1j* zn4Eht=tyihc)Qik`8!G8xRLT&p40lPxUORvI3c{Vb>1+wzH6oW=Tp;L??r2z^^yHZJrG86oue4S9bD$S_86ClX-FJ9zoGsWj;@?f!jmp%m6j%1V z^7k=?#`xFs{5k_TtvAHdV&NnV@A875;_Ls5bMm(Pxt!-FALhH%-(XbbF~M0Nzh4P7 zRS+_R+BzUYCLiK+3P|P~XTqLJRTQo~u1+88eLe&lWX;E2^-rAjm5h3^T9k%q_ZS+Zqs#JcAhSw z4|L$BTyN_+XD&}6A19uu@#Zj{qKCTTP(l5-T?+Em$?}U@WF>`n`sUZ)c9Wu z-3WosxNhh(X^D9YX>>{&zn$D~Uk>67kQFnHdU^Xs$UtHIoSh>kl(^p%qkrg$#D~HM37lAb0 zpS!JpNvCabK3`sDW#zlKX8-M(Kofc)JbV)28Y+42%OYH=K=^`-6kLWb-$tI6)GV`5 z|9rmwS=ZZTwz;FFNr937h$w=}WL=eBi7iwWJ;8?X!I2Ehgx8#MceMX8IYft2|6`&i zVf|yG5>umD&NnXGguk8$mJhDMHn=m=ZgcSV-5Uv#MB@1?%jGk(tF;?*gYEH$08!qJ zPy#-&-(PCZJC(1O33pY1fz#uAW4NX+pTnHw6&95z^Z%F3kuB=~H>#v?o51^LUfBh^ zNVE+%@(k;WPifu+z+ObD$b9n9FVHBQMR1%zfl~;xF^{h${Pn6gZ)H)E?ZSny&9e79 zSJg4{|6AjD6PUyOZZ9vY%y!pSnEoRMeg*#=9w&!aY*q1Z2f|$D$AJ)5@Q^L79Ibge z2?>E3rQk>*jL3`KpfHLFhg3O_w3WTv!CX!g_uul**tpg-jyP{_7es9;;VPH@x!Toi~I_KPNwp>lB)GW z*~q7)hHEWUww!Uf*ycp`yR2iA0GaJ}W&Lb$LRFX}Eq(TIU4r%?>?*ufqk6fSt)^SF z5o{@kbc_`BM=vhO9Ns3$cZJ5fe2#-aEv20QPc^u@@_V_l>*18w=gIwbm*<+7!M$W@ zMSZuIL(?|}>CDX-lfGW4DScL^3jLh?>JU5kc^yD=`e#>(KTahxliU3X3e-D08$}7H zq~S9eya?!vIeO*8vA&$B+-oLozMBRk#1;>J`Px*EIIT6Vuwtr05p#Ja=TO9RR-@-O zS5EV>Wo_q5Q~s;nVVd#oaR;5{&>&;u>$y@Ugp34oQ8O)$qCI`e9E@AUl}g+*m1t%u zU!`?l)y4RCmn*aVV=Fse@^k{+On*d|@N^fys+s%BI9FyZX<41PJeqPX zYrPqAdAxiPS8?1Ky5mi}*B|A?H7)E)6Rm~UvplxImANv^nN(&EJak7_C5^_ zFtBK~2Aj$BNPBR54ZyHCfJ+d0J)d{A$+FeFiIu&iY!qfAvvitj9S>G#KANG#95UGR z%z(SDKU>Y!XcW~=@7!GP!uG|s8nK~rSz6H%3S{n6NRSf_pyP7X{y%)ayGZzg$Zbf>@8fu8N~Hd{mH6T`aqi(hDO|V6B4Z=ToOhV z25aF{=#SShMGPV8hQ#(Tz(5`ReS{aCw*ruSw|9?t89$CDo^tFSio#h_MZ})hP19_F zW;{9zI?eOEU{%>TU*-Mwh8?=oN2_9_nq5#1(3FTI+mgwXmI8N`$RN37Yq~1od#P`v z>P87OTfrLDx)N2g*=ot+Mydy06<;Fx!zxZjF^m%<<@Z-Ro;SNYY1(ob9lAJ_>rE%X z%djJ>^%dkd@zk(!;=S}5&l`sK8=V{4S7&N>v=OVtO1F)2<@RkK3$*k;Sn)ldqN9sT ztonJF#UZm}5_&MyOm<56jrua@Dib$y_DNYsl|Eo{U$S%>X9o?)ZdFJ&0J$&{VGpQ2 zA!qbDg5eG-F-Qj=u~l2ddY`1Kr^`XJVv8{+Gi;LXj_+m^mKXh1-u{i1-@I4vva>%p~`IL z=)2A9HP#$TRcERm8{zSD8L(*{UbVHBjBTFnN%qalK~WGBD^MO&Aq+V-7(gLA%!$8v z&WYg{lE$mu=_y2q@*SOCKe>ZvSX^o#ey?U3|Y&(2op50hg$;S;R zf4aXPOf$~pmG+@lVi|99rhN>$vz48Xib4fDka~@G{fyEqol@{yhtph*B|l6) zRGwKny3`1$<|2FY{><66b6wS#$3kc!-44)34QST*6yt1Fm#C_$@o~>FxizGKeED2Q z@z|0qUA9yru);mD10=_L`FL61O`xvyDAS-mR(}s7UVaN$ckYdfI6XL1)(_(em=9dbWGr*iP>|o!V<~H}hTY}S#CK8&bT=#S50m{(K2Vxr z!%~Cf{~mbQe7;FRb9N|2l@Fh|zADdNC3i^Pw?Kpo#V&@mqimd6kmaYW9YrCHC~6qi zwhIE&_qDoH2@@IK4d3sL0(9N@w}bKvF-pRs`>BJRM)S5{rE)p@0uKtH6$OHwH%1oD zV~!*#d2u%p0>M871k-uVNWdhG{I>-O%Hh`74J5!cJBoS~MJS?pQ@gM(+Xt;>oy2FG z^wP$>!Z?X8I}-t=TUF9UwCR#YOXPTyIchQLQB(ys`f9^K^LibhoAmbOPcyKEaN;1V zpym4vxm%LZ$Ng3x>723)M;ZNZLN=?+0J)%)g3o)U1!iyLy2pFAX5XQ)9d5duV4Mgm>dr-77%K9-tua zdSx(rU-s4zfIF<9*(l zFG|wWG3XT)<+lyYDi!4u9Xl0ZfBJ~7f2E!}U+1m4= z6r$q)UZR!wJxlVkDTb>>3;#BN26I!&BNIEra;UmvJp%}z5G8U6<(Tl@C)el=pu zc$+@{db&7%1WO_X+>d{EX5+;GLv~~IxQ)@wQ+8=`n+{}WZK?0yY@naSp9Sa8AUIb4>?}H)ceCn|kY4y~wpgk*x zXe@+|UVp$r)Ld&WIq~4dk6wa1v`WvaSA#?YfHA?z4qtiGXU+>)XX15)IEL$HrvrxB zw_7(AO56*z=R?p4BhTHw1K*n>&BFL9 z;=rswM_z+Hv9EL+B72$(<=-HDUmuguLmo_m7d)+eynn}*5;h=a6AD8IB9haXnHd%l zXiJKi=0S{bnSw9Inv%;1WddFRvPBpDdU0d}0)`>Q_4Be3W44$$5@u#*5KJm&V5osg zlhcP+XQ=E(CU>?v9c*}u&p|e17+mupqWJ;73t|i$+v$jKGXnha(E&#xQt;|J%o}4` z(lvY_;&}+Pb8nc-rUIIvSKc->&buPVgJ%+`Pn0j))ZJmzY0%DSQZH7>-E$l<9WsfN zTl6KLw*ndZ0F}-$z|dqwQzAobIcYjlu{aRYY!q2Yq?{bT$cZ)rkDtrRuIFBw8J@>d zHODPHV#Ez3OC7m9sOt&jEf#K0&Cz1UOe-*Cst;N1~|J`e8+Bi4gAo(>heT-{#p zm(AS`ogNv!?Om<3JeHICtCJt4t`XtdZ+sfNaYJ>|A+px|m?r>m5_W8`n(M)vMR%mC zg67^G243-PG!+vUFJ==VH%oKF3tGA-E1d*6amLMyo5wValn`KW_L0=BF#%A-*_~Z@ z<2vGzVf>I?tz9Mut6Cx~ty$7b%qvNzIQUDHRrDt)8?Bx$NNPDc?VK`rGIk^H!7%;& z8q1?mbt7aUb4lt+oi!Svc?p~2HK

W800H%k{`~wOs^~4duc2n&4F|4q{moL+3|r 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⪙5RSURDSO!x1&j1`k|G*TL}r!C}?!xGP}AD0>P zP3IRjYZhm97G}c9K20U)=xF^rUvZ{0-HfmPAZ^yTw%?+#uv)H2Q4XnGto98MefrKymDU@Ak!2a?;^R(<`t3;Tw8WhH4r1QuSau zE3v)3F+Vp_)6~x+zoyk}xA?cTv51|s-M$;lO1TN)kF=M4^WFDye?1#J^a?q)Q@)y% zXQ7ZkY(mm0r?r7!Qb6A(5ONUfh5U2FZ{$9G+f+QosFGfABh4w==`=ah>P2|SkWbB{ zH?jCsTnYWW6L|ZE-p?Zy1j=>qxwxW4WG&%~@B4U6UgA$4wpm9doqKn8p12|Wa#ski z5tNR*$j~G*!0sExk+d2oa_zZt96O_}wP7favhz}xr3_0Uu`UXLSu`Gc5UMiN;EN|b zq|G(wzo5@|8je#QJ^28gGPPE-24(9|v#3gSNA(MbEsva&ojmFGcu#%8JqtJf*8+LQO(Q<;${eA*-4J-vD5;8Ax z#v>szsCf>j^rXZrq=!A!yzL}bn%5%zhgr%G=sBU@*&Dd7{tY0tW-blaM#VbLjJ38_ zU4<~aMEIDTut+VD_st@F?fPS(u(zu>G(Ov(>sXPEp-0fz-r?m%iH3X|E8&>Rn02M?@M<kmaPeka}DC0iGPhLzx^)bn@F zt6JA{8zg*?sK!WlkO?z6$25VtHR@uB&rDf}aB>*OC%LqR1!~!_Bi@hkI9ip6ieb>g z(TvM)6f+|HsEVV|JV`e#!RD^&jmyRW%5|X>8G<-VwoIQ*-X+yM8uKK9-=Ar5%%=ci zBkc6tbcyC<#MdsLy$oNX@zk-1V2US*nLn2U9fkDAH#MGaV=xzA@VoOLu3PSsOsVE#)+zak!7*~KLsq53;t z=Xy1o8E?35vV&|r`ecuyivkCE0F@%1&1@t@wq-ccoc;w;XSESTq z0Xr)1R_hEfF5&Z%kzN(=sr~LBH(_Qv)!~}TzdxQvBbH->|1DD<3N%u`sZKQl&JYQp z=j;Sz<4;?dQd$i1H`a;8n%7I(+AvBp2z%+CD56*`r8*?YHMM@hs)*(-;0LxYwej8l zTn+{%8`!s|L__evaIz$S$}pXDzaDjt6-7*g8@=kELZl{I|8%{_24ywyS@P6Im934B zfZt3V$SdtbEAWw;t}LcLFNcYrB~L~1yyG&@lAxTBM&bs%QS`SmoWS-Kc=ODn1>u|( z)uA+X%wd$n#8XN8kYNNpax_*b;+1Nu!_bx{4=Zw>`MXfaj}QMcPqQ}TGS`isiBQHb zElVlxDB_$-#sHJ@xbse} zW(tH14XwN-3#jU`)ST6~2_r!M$4gR6S zox%05$qfQYtFc089EsZLS)Mx zrQO6n4>_Vhkm0Zo!K>GbA!$u2KPQGtUh;q@j=5rHCi!q$3H7#H*`OVEG}2m;{jUgomrjeAU=ku3|x zp1f_GyH89X6lL*jZ(w1}U=Lmj4b#hC0ltZ_jDh6Ao*t7=V+8RO1U|GV&9uhX?y$fF z2Gia#pxIY?%)@N)>c{A?3H;DG)o5BsyWg5W1`jJ|*V%q}|N@vTT*zV24>6{@Dl-F_JHMlh9z!ph?YCj2hGP1ZE& z=!Dj{cJgEUY;h(l!aCN1a5O@PDw;A zWr4RvzHZ#b0s^)ZaOfUjzQZ3i&Tg?=?xk^rc$QcMlfR2y!u#7j3W$H>Koq69KB1IN z-kPKNCXeJ15?LUS>yU6Kr!m*_yJOLL&2^JMagJW_S37y<$=RXqqe;5r*w;iR;#CX3FY`4T#iJycly^u8VeaG9qBfS9U9c@wr zvPS{d$3^8|5Z78}*M1$M=2jhIX$)R4{p}ASO}qR$noPBSApK8D9X2ZLSkXVMb+F&f zhYIJ1A0>>@4n;XxakXK{L6vFns-lX!k#6J<_F zk9Pi#!2Ml})xu68F;535i7x&HI|!qAbx?ZiR0!{f=|psrK0qR)B~LOJvhOJb&<7dW&Yz5KY>xQxw;!lQ zNU+C>rr&aVT7nN9jkIPfd+H#G=?eOUQjOPZc;s5R`}ZYT;{Sp1~pqt%hMFrxerDp$aRp`zt3$_*9IP+peE zWu^$YZDhjw-1DZC^NFVUm{)7K&z-4vrf#_M=cMf=gF-$_Y3E1?))ceJ8IAU( z$CU;#9p18C>-qWG3%=mS?OY|MNeSBH?4PDrrU4b5fu9W!cSOyCEcG24_NzeZ;VD(zAS4|7rxa@yyR<+MY84oy)T{O_Vd)MZ}X$8fL3+HxQb% zPKg$62SpznbXmpq0xM>E9X7PryM?#yG8ZF9$sMDOH51gip52i~|4!RzOi`J? z4!J6NmSz53Q`GS7=@OafQ6JNVTGVG z{#uHGo;3vf&0rbN%6@TE+)eDa7xq(-@C`R70%2L&fWgH$9oH|26u21DQDw}!m?-F{ z1|uV7G|7Cu6BWS$=wOwL10>P_gILvJhe8j3bU-Ey%>6G4TX17N+Q3(xiu0k@Oo=z1 z<{yR6ktohz)o!HujbNhb6hwy|jrBJ)&?DulX~x0{M@2OPiUKWpCJkS|u|z*lH3d$% z5ty879P^umwEVzgUNEq;Ok8@o&gf8sKQnf;HbncI&HdJrD+uwjG%74k(}`u&fia6C z^Y9DXd5S+aUOfSM@>Okd=Wfq$k?Z~z8A_zNt?;k2N?4q=R0J z?@dJlp(>jaxESK`oecU>Ag8f4k{9?iC&r+k=(vx)#IZNZJ7uuUzJ2&LMb(~rMRJ~ah!6tM1 znI>I0@lqfnv+gq80mckl0H+NhU(XuZg*T)@B=v^H%H873pWwdWXHvgtgRi?%UOhy3 zUdzv^8|3{4PlE0CBFG{uI+ts_agKn~H}8Q*m#)j@`0S_|&DsS&AXoPCbIZZ=@4Gy^ zf}EpAey2D(9hKh+K!fL*FqWuPWF-yW^5zXIyxGNs4_nWXQk&?1JZ*_1Zr}6|oUD!5 zW5r~Z-nLnR>Jj)VjfE$ld4D|YoOtkdPdj!y-}@SVUGHp1f#MqtE6z~g>tyY#Hp6Q9}{uWb4{6=elI% zYMf;|Oa9a)BU84oI!t9eBcVYC$-YLL49|3%-Gk=;m*BwW<+#`L9JBiUK7@8C48A+s zq8$ z2#Rjs_4@D}HGCl}@V+y!!YOc=srcMT>3AD;%$uck{2JNQ`=ilUIS#%2vca{9VJ=NE zC`BoL2Y=dRBlnrVWpyQKAMzf%$Q)X;m$itMb=cbzJGWH-*Zj+n-qw#+&Ju4x^BI_G z$SH>OPI(x)z4V-|>>M0vyzufFp({A^bA?#f*(X_fu-69^2U6YLAfUGK7CRao#O*Bg zOfrd8W*tL_g8ZPrIIdrIaeIwa#%-P=&d%@2?U2vbFy&7j>$O%|U}skz$nOUX{uu(7 z(HP;PTWha@^X`_sqMj3jww~utji33@1f{?#1wHZ4Iu5rpQjwou&>GxgD_pH!0}>W$ zO@sUdv_OdWvz)Pt!ZJ4N#v=K@vVH5akGN!yP$}ivM;_czqd9-FiDzdHvhVZl^MK<# z+kItSF?2PylZ_={%@F@djsnGoJc-E1@%!%E9NKDobA{jU-Xj8^ic&t%(mnRfluOFs zIy0}9_Zqs3z!azh_zubHuYEJpQq4_KQndXY;?SE$@)2*@*SLrX1W?|qE&Tdy7_Knb zHW_z;<3terIf%<)n)BAoQ_)UOyVyaqdBPUp0Y{J|Jx$h9eqEPO?eNyKcKWRY~C>n~vM5Ceyb99f{^a1SXbCqwfPJFy%LnR)l z0~Nj1-Fjc^_1WUPvq@Ft%KCf1d+dCw?>k2yynSkRTszfxwCf@p^%Rm#fAmElqfd0r zfw4%3_X`q|{S5tm^ovvI=z1;o>QJq3)IMui&x9}I7m}nL8jVC@FCZoZ7p&!X*qiev z2m_OUu8tBtc%Ycc0n(jOSOYj8DZ$(n$AUaE@uaR-F>iB-EC`vb448yW$OIj+*Fu6J zr8^P?d^(meIBjQZ9*}nXhGwqila7RyvFXIBPyqM!Qe3Dhs1If#^UZnSVV#}@;j3M# zMxXeLtHxKOhDl>=S#5MNC1?+LZ-gPiHEE8GH-}@Zo#Xyp(i%!UBUz6FErw4Suv21_+M#D)F^*Cc~YhD{RxH@5Oi0)G_?2$bv z@khLkc6n_jcVO@W&Fh{&*_0)qbd=Sg_f(%_c&wjC4cN6nSgzwknBVgqGIs}jtZjC^ zvp%poGk$G*lNhYOYER}~V*Ty5)h4aEZ%K9~Qu(peGWvmJBaO*;grH>q3L$#G>!}Q0 z`rF!+7W63;T7UXuaiGY5d$v?J3~i%9zUA=}BJ0L!X&y`?9(BZgmQ5 zs;vX2RCE41RgSlFHs832>#WYXFl_?uX`cd~>i`SYQ^)QTP_(Y}NeY}^OlT|;+- zo8*l7<2^*F%0zC#i8FAG2MyZ}10Ibz%nwA^JgXlsZ&bhDh?%yL&3w{n^Tk1xUYsM> zv<6Dc+wY@Jm*{viG_$oVYfAy=EnQ{ke_8>JI`c35c=sJzxH~fuD4a(=tw(8y+>-Wa zg^_o4Z}HPGGG)BV$QU^6IKlKPHV7%4I ztKprjm21Wo0gCz^4=7U+FYE(v$f46eHX?o^AKcQAX(()6y}yXsdbVx#fotgQ6WZ+E zZk^WXw;kusS>$Kh7`94p&{a|_w8-gK5U@?FJ&(S+v2n}`I2He4`>Op$U=MkNrxtFC!r&sND4C|2-bsXu63~JC8j6%J={o$87rWoYb zKAep_#YR_~@1_q{nt!>y?vJRwV}%_G_nR1|YmCOZxU6JdPUK`y-m;C!6?0!w!u66Gi6ZwZ}4}}g+Kqp{Y=9^J)@VbxX=pM!)M;^+=}hbUyagv zSzGqy%}2HNX!&cMaQ$m2gf0{q?&ww!p6#Gq9rS{tdkd+TM{}7p+BnMtj94leQz0YO zMW8Yx%(K-3C-@7o{zjVc_fT9Vmfn|FX4&N9DhfM}q06pO55?VR&qFu*x8(X!uuD3@ z6ieGN!O{w+6{rhzPfQ-;#1ZX3qByZ5f#ia=TPsxDc`W?^&A}ngF68iOc zUI@AC3l`#Zy8roo<@zixv|5Khn636li>aN?PMWjex&(fWM2W*3b)N?xvYrcl6EkgdH!8e`Y zvz}mO+ev6MMT36cqDd!1-{uOHCPtOwiu5=4{ieWQ?}z{yV*q%Qx&Sw=!d7a zyiw@6-oL+Jf*{|hFN~c(zKzKkWrzSfrge*1oO{GzjP$J=2h zX|D7F&6}QR3~L(u?Q#FWaYqE=8TqN~V^Zr?yeh%?fVk-8E6l^r^8rcfyZ%R9|GQ~) z+#`fSzX)~KwCrnJkc;a_`0UHZ@9PrnF`ec2Bh;&HzJaRYP{j4Z@9#SOaMnCp-3f(U zHyHiD49~$WMH=n;*P{<2(V1pJKOJ~?8)P;OPYt>}f zuSwP0efd`#F^^|SNB)Sp(m}I~GThmW63S-PD(H27)YrCc%eA2uHAb7sQmvvuc7);C zIt!~&(S>aFV5<=LxionNOk;N`nF`_F3Gf7;8hqU=x-9Be=6bIdziS7tV8$Le!!)Lm zsIc?+x^ztAvHnQ%4a9Iqog&W?u>@qqoyE*9(SSyhy5C(ts@RxG!2V(ERk^rcXgLG>V4rn#bjyIVNr?U*tds;({Ch$adhrW_p$Bsf+anquFbN*^$jw z%iEVVE$zUymN5Yf6_aZ+`xoY>XDbN%Clc1KBcC2NL!yx#zrRk^Tm%u+96}*8X6?$W z{(vcMaWHB|(%~r2N880kWu19pWvG-ge*#w^q)o+S-JP5|*n9#>e7U7pv^EZUy$7Dr zD}L=3X!5EW2txDx*j^v$E1da9h*Np`j}Z5sgG|hiNB$RHWDT$t^zlO^;DY@jDzGD9 zJt(&~8&}Bhjr~!PLVoFeRiv@7?W6}0x2lhoV)(Ma287U=En z=1;|Iu{M&#F&b$##3X94-s$a7hAdYGGvH-c_lD z*J{Irm!*O$236X zifo9liQmW7=G~=KbC}8gMe~{c9p$0VmnKY?mZyC98(Q73T zB2{Vq|B>9@`l0v0rc4L(%bLTzap_qz>3N1DS!KMNmI$0blzziO-`pRFm96wYUtV(? zkwi84FKNG@f@u2tMijWsIqh0;6DH87&-?H88vDyy%<$XSo)5K*UMrXKAsk0nV|Mns`8WQKUnYtgJG;S_m;KsT8YF1bxi%l&^`7i3Q?oZ)}Vr@(8~ zh}f@UT_P*iHk6>RoJqY2P?0cVdeN1hPtZU|;>uj%4y_Z$*gG5CCLIODkzlnu|?>-p_ z2H%FglQuCeIyr0!-hzagN@dH<(imkRanRS#y!#w%fo2Ref~co8o>m?j?OVn#QyG4I zJEKjyMBV;e`}_-hxba5SC#V=Qi14FajPcUNgn^&p2+sr>Hb;mj8XKBQsx26~%6Sts z)(Qa_S|fx^)ub7@G+y8KPM-eZ1HV8}7eaq84<6 zJ^8#ioLIfY0!HkB-PPbQw=8m!H03z1yu|UUj^61K05^Z#?VJ3tJ^x%4riBY$3dN8A z5)$7~faijG!iBm4l}s2 zuP(mh!TCG?it)aTZH_gt8y!1;ptp@z6|F`Caa=R|W&mX!@}W%-#wFdY?kCD++or>C z`5?21%KZW6BiZuRhvq(qiDWH+#J$%eM%J8D1G16Q?l5{UG}y~H3!3V$+0(J1x+dq`{gUr#@3S!jqGv_TPJ6#IY7<%RfCMfA9 z<4_RmrLhSG(19QR_NQR#rB+jq(87D{&g&N@?=SZ94lgPKIZYqIeUJuu^;JC$f@1iR zB&7tThBRL!1}WK*i%Ip|pQaMIl!ypfQDwEddbJ68io=KqKI>!8-r1pDFT&~4oYLYU zza2_wAtEWd&*%$T7My_A#q*Kb6<_3Y@it!+IeYqqibO~@&_v%&6jcsPgG&5ZyZ)%Yif&Y`^bs9Vq z>gPr-nG~6n6k9C1*)Z#s<(vfzE3CBkbvFqiB=OUmmQPp)@!W_9%r@^y%dYBqin8m$ zq?Lmu-hZr+}%X;SjM zs`GISDqaai$uHQ!aQDcwV1D)(d4iACq?&G2vzNh}X^LRuuN-xQb)@c zAW9VK$kQsQYZO7#V-v`T`)QiYNEr;tkRS?R7YJBy!)lDzeX881riD#`Jhx$sYfi}m z;1!&@(tn2dLGMin3lFVW2E#-jzis*LSD&`cO%?Ec!`hO|(4$^GONupGK^%HW)rga_ z{K?yueip`jMUuNfRhy{vJI_?;9Fb_o@g0KjN`?Kg*zHGC#e-|X6glq%=1lJ}mJd1Q zXO=IL)xv(iU%{d}SEB!nI|m%>*iZUHz9tfEb&@beD)#*&Xed9avPyAZQ&OtPaBm4@ zQUuP}Gf8)FKESoW!5E&fC{n-V#ob2R2r?XJUXIw!@xtfvb>8|gmBxN+zl9Q|2NOtj zz?QZ;7rWq+wo-ujk9|NklR{F6;#1NfORz)}p9Djhy4fGo;#;=o!rC4nEfb;JFY01R zlLC`d62`A#GBu#PeGzP+o{m#Ci{msw0_myO(0BG6aUZ4Cq$6rne0-(6h8AsA zN%5q01QtCXM~+_@nE)5v697sMuzS}+dC}wT{LS&)+ZcV1Z+XP>{)V3GE_z7Z<;ewy z-&W2)Uo;6rneZswjmkz=$~rSuSvsY2E8M$C7^5`rQ(uoA=?o@0*n7b2zh2wpzu+ze zS&jx0VFg~tc0uVl{}{srdlsVgGF>tn_5us1tm=^SPNS*jpw34Thy%dy0eDsitZ{FR z*M7F4t%jPYFD)LJqajmaeZL(zX{xZG&zri!3?)zsEklTStn6^0EGZ*!9OI^nDPhKd z*d;J6jzQA2J!ZF>37537+T1U8D@$3YSOsPbW-&Gf>Ch}f{WW=q$3hp>Bx5nx=Kc{iBhusO@OCiJ4}~R4jfxxCt&G8!lfm8Zulv{waf<%aC8aB75G!2bn(OjYFfAU-}^AR(YDYA)?Q)?IF zu|fNKLwVyTvrLGPv6D9xP^N&Rcq+Ew(kv`pEa;pt_EC5eA5?*DUKZ5C$vOrXM#J@r zKcv$g>-43lm~EoOHDiDqVHPEx9OXYygR;)b-|leaek6-(M@cfha@Z&2VV$0NAKbc_ zMl|P)!B%w$7{y|&mi`(ACsx4UYkot$wq|Al3`H7thzmWsB%q=gU>(YC?^{tZ&JhJo z_Y;m5#zopy-vF5Es(dQj9z7Fw6h9kh#o;Bx|Hs*6NmhcLrI8-n4vLPEG zsU$|R>;;Y5F<6Mo?%#OMjhAv0`oC%~%X7$OtHN;Y0Zf#tBw}5Xe)Sg!+*a9W3)AI< z(xfJfN&xHQ)%9?27js zOc)6+9%O2;feZFM{eeG;+>kXC`#BPeI|oKR`;^Hj}JL*VL1Zf{jCA^ssgvaO7%rbqA@Gz7$Pk67y!Hb5qfVe73W%xVkfzC0Zq#0gn@$@m`W+*AB82yoD)KJWQ4Zo)?D^{Eg>0uX^u+`O>Rw3> z7Ks+V^YMr%wJLPT(Qb<~{{ zK?wsejEzs~dK}HddYtJxHM$;i0I)gxH*pv-wnDMozCsxpyN~CyF=$IMIylE#x6e=3`6BFQO(bL<-wj2Bu^N$*gNTSXmF3)P5ovb+Gg%!>;(3 z_j7q6{OA!Q9T19UG9P7$UEc8=w}QyZ^&N-&%z5Kq|ri_f%-ezwt6 zH=fT+2f3#DaOOTj;0GrmYDH@}|79siQ4_FYb>D@nq79%WNtIJ|<~2BoRay zyU}7avnMf= z;I<`c#gHDy&Zuc(`sMK^)ow@;Q~)u@*<<3W@|Ob#)!_V;Dc7^=6*3%X8gKC0Dso|} z3PUQWdN8-Bs&z_LapF8$zATWLI44p?0u`eg0Skvxrq^PDPs*W4`*GD?mMmQ*Jzb?d z6_uJ=oazLhw0clY&B)Np;PZUeQyFuCsfFfmO(eEmlJqqFOGFAu$r3KNayK-eAB=iC zkR+^Dn0)k?X;DzCUL}vwi&Kbb5Rud|9@hgf^F{18zg*0oJr`|Hmh@zjF!Px0QDtUR zu&&aZ5mZC;?4#BBV}BiHi{9ypDIUYERr!bG0r-Zpzr%Kk&F_&a{kc(O^8_b$SJ709 z`fP$zgq0w$osjQ*(geKz+yGE!n%bn4Y%%HwjEK>Lx&ET1XR0LJokWE(QXAURwlZ%WIQva=~XQelMe9VkX>yil41UNtN!X+p= zs4;;9yC)`?ZNqosu_F9B->Z1ERU~TzF`f_S1jE8QpBdj>OQZ%wzJPHJp$^e2qM(#b ztjDG(R~|YZ>vsX`Vg6_Ct*s5@%H*rWX25ck%++=zYH8{J1pq<+zP$jZwFktQ^a!K!=IT&FMx2*nx4t`0>!S+00hG&gz`LZim4h$UdDMq{Cn1=TFPWwJXm8z z5m>M!NFt#;CwoW;J(q4g6O36MZH3ao$gyBnJL{M?1?Kt^P4(GFg`S7OPcs@sHRmi@ z)X^}9nPSvSVQnDAb=4q?WCS# zlq@ptEO;T6>eG4yakRWbvFM+Tol%0UiRRpBOSBXQYXDEA_0$rqgh(`N{_|YI@-Pb` zT|$s^!1t9UxX%kB*IvVZi|7Y)9m+Lx? zvwbV7{Qd||Pamc`{~RBZFpliljuW#|rJ5rN2?SsOlq_HUH;V)lNpV7m#>`rSY*``! zNM#UfKfBNUc68a*Hi*xumJ?~1Q>WypLgl(0dgAp&sL}aw;AIF09-~sJkaO&hx#XIp zK>tGr4_S2(oi>%uFs$DGZbc_pA+#8`suaIM{WG<1LBLRZk+r`As47U+^Gqw zI$dsZjS=8DMfIIvEK^||CtewqTi{Ho=Zd9=;_Jnf`dBgLqbK6~q&qL}=At>wVMlN| zCEpsWF;ZAiW61H|{hocy<3CL`k71nppK-BLsvvCT%C_Dtn-CpdAKkodC&;w1Pzj3f z%%rbU%(=#Kke&SH#6cqLiOsN{WDv;gs-~ts`9wRq38fG7^-Mif*GMsY0!*-As)UE`PVOTY z{Huv$aeQVvZmy%%{;(oe_9<9eZ(%$b9JxIiN=O{BKxt&v)gDy^+pcVSgCto7;dwVx z=@Q+r;STKyQgNwN*JJs>%c*TJ6Usre_?qo_0-$QISiky zBiMho@;2XnQR-bhzgX2y{(7pN4CD59W5QfgG%5+y{DM+~ig@%?Xdg!Z<@33Wj@uGq zla$4SQqS7kdY7GpJV5Sp)`Z7SFi!Q}>V|pm)&hqt+e7rFdR(vuue(bL?!@3!r>!2rxn;$0PpC~q|zUBSL|!U^{ZMp!Umg$BOnr^S4t~ zE}a|Zu!+IAZY9aWKGAY1jX03qRWA2o@OP7Ce}|>jF0+NKRLEB+3#K$=#~&NoM~U@! zQzZs@T42Tr?Pay~ap$;Ie1C#=b(YN5rH3Ly-lbE=jW`(ah` ztj;idtH2q$?^$p4jNl*(xx0Y)uX6>fdDsN-JEa`TAvW|9nU<^nc+~?f~V2WMLsJWgJ-3yl9ZHOW>QHn)qOq{m)L+8-SjTMx#E ztT2v_8~0)GZl*H28#m~a(WqyBjUYQ{)i0=wZgkwZaUV_ef3vA{@-PbtBH6_Nn2Rfj z%W0x_L-gr~L?1P7+y}&e|9tKNiD4k74tX}Lg}Eij>xo{O*>Nt~?gZo9YbH2Oo&{Sa zO*Qt{R9dF>vT0|ycigxSgMXNMt;CP3H*!stYODr1iW6Q>+QRtI(iZ!iEct^yk&`7Q znZ;PO6elU*dJEbF?va!&wu>cS+@6=3;`&m)FQ>|=!nn&2uBZf1D;U@ZTCZV49v@H> zkJslv@}^F@xJym~ZtB~bN(fP&zl#Ox?Xu8LJ{U1>$~+W}L^Vh7wd#7pfQ00a?DhB2 zrjC=P`-kxvEF<(shU5|muUE}P6gudF&Q54fHJyQmbsl@dZpNX+poMzkzMkd)C>|8e zebmy^M62n~WZV%w4nWaV5YagEdOHz;H5}Qiw@oVpy=Us7C)8-U1KTo54v<_JG+&u) zCZB4dGapHAhGoP`Aj-( zpvW(VinV5OLh9RkJ3D9(5OSH(qudF^sczh8m{bN-6VA~6I3?%6t>?zohr{$JcY^V5 zDvV)Rc{3!-K{+^XJ@yF;&J_v6-aX2F7%WpotYlmdC{jYq>>b8{EXx^0QqcqNLm92zr+#S8>`m?Jsc;>p^0TT}D4qZ#%iBFr$=eUAp zDuq2e;v%KMa#KdZ1vo*r*Y*m1^97YuH%V15tzye=%<-M(0ZKj}vYY zuBp`iq>8ppzGXE=mAvR-a_^mBoa(uCTt!leTWI2?MpXCFRaPaU~X9Cv+jTfrp*$A`!5&OC+ET3(LPZu|ZUnW0CoP3}YE z`Q+q#+&!l%H5rnps-4T_6kPF62r|-et=Wp+ck3A9oMntBSKkbCw_m)2YKkO+{?6_@W#$F)Vlp4;>$5 z9Agg4 z6{1W`Y5bXtQ}^vmR(9fQ1c*M=^+X4V4}CeuwJ5pUOVF}y(C47)p`mlN_UyZqL6d3| z-8Y^A4&zg;e?RQ+W2E4V*?N3F;q$)>a)EJ zQw!1>Vu=tdRq)lXrxs-N>8C*-ZL@nH2B#WC9Jib3iu5GVi79|uT2GE&@Uh~?adQ`$ zdm59y1q@zGsj;aB_TJbcwt#a+e8)1%Hmoe<)lqOg0~fE=d|5EJVLondgRUi};(*0L zZ4{I1@vcXpA{xFk<}!4|cPyPUZmHIB%5i&UQAO)|7L?S5W3&@@0&%JJ^$W`!KqF=$gqNBgDBz>)e3+lu-;uphjetOO(8mN+ag{nE`{Jr zPrs?hOUSip8#I=2KGjYdjT`5s>Y@U-%;Gt&*IPtKN1Zg6fF+;?iiLxxOzc|pJ*9*k z0mC5k`Q=13=`7f=@@4ni1}VhM5h!Y0PaG8(k8VC)f#$@=;+q1AMl0&Nm)DE{CWA&Z zzM44I#%H8BF6ZgCxpFB@ing-gWF z(Cy?4hk)J5V`%HG>!8Rd52nAWcVF}ee{)yMsvurW_2b4k?htOvrC>5E=q#@{u0d>% zq~+3o(DF9leerd@x$WO>eQSAfHy6@zf>hAq~#B>T$aYUzFXb6 z3cDEPxYge(w?^x2II`FO>omTZ=)mR7!O1rMkG2tw4%2+x3C1!N#&JdUmZbO;Aw&W=RQxaMBbt z;Cg!#9^H}McdOe?Hw^4tfk1)TT&vY#j@bjs7(TD2nobG*Nhw8?3QgA=Cz5VE4=?pwBsw!-mnvR- zI?)ZA*hrhSDr1qh4O!>qPJ*Lnq(iKn?F6Dt1(C)j=$x^{9E)s0P+D(;0)sz}g5^Fi z{_*pfFp?VZBBl@W+TC2t3^AZIoDy^ux1ZnX}JgFIR+{0mP3;BRPz|d-Lm!Dc}sxW(0f#93o2MX)_VA(n@5V|&?oZE`ujVDz>Z5xE;W~|ltEiO zHxtdHo{_k5$_12wa*8C>f_LkosgJc_Hc+`BSf#Ql4>bW_V`Xwa`RdI`6Au!~y8V16 zqvD1&d}{VNij?9AtCsaDLL8hPol(wAsz41ayX;yjAT_JH&|Hx?Xw&R=svQkD&c&Mq z2+FC4n3QQfMnfQfMb~@~tKMyuk46>Pld)||Zi9r}?xxyM4Sw8>iPB@F?&z@x zN@2lGNHXA~+t3hv$hibCkj=YS@ex}0j8Urz`az6Nw4rw9!?4D=GeuQttWK;)r0b2W zt3UK$2PKkjM8#1^U`2~psc1g9F?_zYnKx3L$heh?*3=8A^H_XZj?aL$e<{fY z^EI>xCa!Q5GD{U)?I~zzDGb^ezj*QGI|hI9llJX5U%dW1H2ujyIe#9;AcrCtGqluF zCXOo}n>gxlQ7+iC^B`Dj(jt&3R3ev=3M2VZXkO1nbJ*BATM7g@Ne6U0*|XlZxD(ym zJnqBbo2ll}%dkdd76;r~DHuZPKgD`!PI#;|=h4mMK63wWrkY0_r$r<{QaBP7XPMBg zH#sDSZ36A1@_#wiY7Q*0OY47hYtiLG0J7kPJ+Z?VhjM?)nR^EADN^+nQ}=@nyA_pC zOB-Z9FQ=MM88;TpX6!<@p&_!!dW>Q~Z^s=A-bbhPl4sHx{IDsbicunKYnvQ1l| z(GU(X7Q7FLS5sYi;9-|2LgEA(3NeCc*7ZOP0LL|x`)CGVy_`$uxb2DD4J2?(1w1ue z&WQ)72a1cHiw5EI^XB~&dtOOo6m@c1(l_QkjuM$Cu5g+y~Q1N2QEhL zbA0E9r_!mzdNwEtF)3HGrjg5frE>oC8>Ej~|Jet`+ZQuIy zi&}t3S_J#f6|&_oJ>5;rYqo19!)zp!ED{@RrHc%@Uf$gkZ-4Y+`96%keKD2MFmBYM z`x*(@ttVSZq6=OlJ3gcPDEYsgYDYZ{^Ycvv`%_9T=1t6UJv++c@W8`rPTFP#YL7uB zn%gwn1T}`%!>d@`AUb&}o#QO1bFKRupF>R)*{wGpqz_rxnKB==3y5D&b>)b|=7Wkc z1O`q{`iE^j&1nIa!_Q{y!{}63j((W2q}Z(XaJ}`k-Iu!Db|X6yInHdxJ}^%8+!)4P zh)N*EmEtf$PT3Z`eY?L<%RUT#^KvGGJwzHdn}L=DeZxYbgtFen+fCp3$g>&yoZ0!) z#Go>C8#!#4(u=0dfjLp-lKg`6YmZeQ8j*WP6wARx1GrKJJosG5z0;V{{-r^5PTkG% zJWQ6_Nld=KkrP)SR#;GxfDU{Fs%ekXEvu`oVNizHfFmT}+&^$Uh|Z~l=w8R&-XYcM zBW|)x{oNean;ZhtLsW+L0rA_ZPF%)m3VDeF;?b;O%>@@6uv9pDWoVxZ6W>nVEb9hg zn79zSmep#biruNpddAX!x-8(MSB7>nm~%zg#>JI2IDmv6v&BHMtvK@=_O1-=!{DDM z8bm!K9F}>DH_4hyPrO^tz}Fl1#b9vc%FsUNcK$rqM$)jYGSDogKfJ(xllENiVjd72 znom{N5YaZ>)E2Tt&8?&Y&39T^22HlPsrHk{b$2MDiLgr~wr%0Am-Hygk@?)`6qK7< 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�y$ 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⁣w&`Z^!z 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

@@ -404,30 +428,13 @@ export const DiscoverGrid = ({ data-test-subj="docTable" gridStyle={gridStyle as EuiDataGridStyle} leadingControlColumns={lead} - onColumnResize={(col: { columnId: string; width: number }) => { - if (onResize) { - onResize(col); - } - }} + onColumnResize={onResize} pagination={paginationObj} renderCellValue={renderCellValue} rowCount={rowCount} schemaDetectors={schemaDetectors} sorting={sorting as EuiDataGridSorting} - toolbarVisibility={ - defaultColumns - ? { - ...toolbarVisibility, - showColumnSelector: false, - showSortSelector: isSortEnabled, - additionalControls, - } - : { - ...toolbarVisibility, - showSortSelector: isSortEnabled, - additionalControls, - } - } + toolbarVisibility={toolbarVisibility} /> {showDisclaimer && ( From 7ddc136330d7f98760400105021d7958ab5848c7 Mon Sep 17 00:00:00 2001 From: Robert Oskamp Date: Wed, 1 Dec 2021 17:57:42 +0100 Subject: [PATCH 024/126] [ML] Functional tests - add retry to Fleet package install and removal (#120076) This PR stabilizes the module test setup and teardown by adding retries to the Fleet package install and removal service methods. --- .../functional/services/ml/test_resources.ts | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/x-pack/test/functional/services/ml/test_resources.ts b/x-pack/test/functional/services/ml/test_resources.ts index 7546aa39ab6fde..fa6a53a80b2878 100644 --- a/x-pack/test/functional/services/ml/test_resources.ts +++ b/x-pack/test/functional/services/ml/test_resources.ts @@ -476,10 +476,12 @@ export function MachineLearningTestResourcesProvider({ getService }: FtrProvider const version = await this.getFleetPackageVersion(packageName); const packageWithVersion = `${packageName}-${version}`; - await supertest - .post(`/api/fleet/epm/packages/${packageWithVersion}`) - .set(COMMON_REQUEST_HEADERS) - .expect(200); + await retry.tryForTime(30 * 1000, async () => { + await supertest + .post(`/api/fleet/epm/packages/${packageWithVersion}`) + .set(COMMON_REQUEST_HEADERS) + .expect(200); + }); log.debug(` > Installed`); return packageWithVersion; @@ -488,10 +490,12 @@ export function MachineLearningTestResourcesProvider({ getService }: FtrProvider async removeFleetPackage(packageWithVersion: string) { log.debug(`Removing Fleet package '${packageWithVersion}'`); - await supertest - .delete(`/api/fleet/epm/packages/${packageWithVersion}`) - .set(COMMON_REQUEST_HEADERS) - .expect(200); + await retry.tryForTime(30 * 1000, async () => { + await supertest + .delete(`/api/fleet/epm/packages/${packageWithVersion}`) + .set(COMMON_REQUEST_HEADERS) + .expect(200); + }); log.debug(` > Removed`); }, From 3f1b0aa15297c0deb6d4b482b87bf1349183e210 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 1 Dec 2021 17:28:38 +0000 Subject: [PATCH 025/126] chore(NA): use internal pkg_npm on @kbn/babel-code-parser (#120121) --- packages/kbn-babel-code-parser/BUILD.bazel | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kbn-babel-code-parser/BUILD.bazel b/packages/kbn-babel-code-parser/BUILD.bazel index dcf76b337ff913..06cb6dfff22814 100644 --- a/packages/kbn-babel-code-parser/BUILD.bazel +++ b/packages/kbn-babel-code-parser/BUILD.bazel @@ -1,5 +1,5 @@ -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") -load("//src/dev/bazel:index.bzl", "jsts_transpiler") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm") PKG_BASE_NAME = "kbn-babel-code-parser" PKG_REQUIRE_NAME = "@kbn/babel-code-parser" From ad5afe1f6da1790aac2b908205b36fb6cf0809af Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Wed, 1 Dec 2021 18:31:22 +0100 Subject: [PATCH 026/126] [Fleet] Add scoped AgentService (#119017) Co-authored-by: Paul Tavares --- .../plugins/fleet/common/constants/plugin.ts | 4 +- x-pack/plugins/fleet/server/errors/index.ts | 1 + x-pack/plugins/fleet/server/index.ts | 4 +- x-pack/plugins/fleet/server/mocks/index.ts | 72 ++++++--- x-pack/plugins/fleet/server/plugin.ts | 70 +++++---- .../plugins/fleet/server/routes/security.ts | 2 +- .../server/routes/setup/handlers.test.ts | 9 +- .../services/agents/agent_service.mock.ts | 25 ++++ .../services/agents/agent_service.test.ts | 132 +++++++++++++++++ .../server/services/agents/agent_service.ts | 140 ++++++++++++++++++ .../fleet/server/services/agents/index.ts | 2 + x-pack/plugins/fleet/server/services/index.ts | 37 +---- .../fleet/server/types/request_context.ts | 7 + .../osquery/server/lib/parse_agent_groups.ts | 10 +- .../routes/action/create_action_route.ts | 2 +- .../fleet_wrapper/get_agent_policies.ts | 4 +- .../get_agent_status_for_agent_policy.ts | 5 +- .../server/routes/fleet_wrapper/get_agents.ts | 5 +- .../endpoint/endpoint_app_context_services.ts | 27 ++++ .../server/endpoint/mocks.ts | 5 +- .../routes/metadata/enrichment.test.ts | 19 +-- .../endpoint/routes/metadata/handlers.ts | 64 ++++---- .../endpoint/routes/metadata/metadata.test.ts | 68 +++++---- .../metadata/support/agent_status.test.ts | 24 +-- .../routes/metadata/support/agent_status.ts | 6 +- .../routes/metadata/support/unenroll.test.ts | 14 +- .../routes/metadata/support/unenroll.ts | 6 +- .../endpoint/routes/policy/handlers.test.ts | 11 +- .../server/endpoint/routes/policy/handlers.ts | 1 + .../server/endpoint/routes/policy/service.ts | 9 +- .../services/endpoint_fleet_services.ts | 90 +++++++++++ .../endpoint_metadata_service.test.ts | 17 ++- .../metadata/endpoint_metadata_service.ts | 27 ++-- .../endpoint/services/metadata/mocks.ts | 18 ++- .../security_solution/server/fixtures.ts | 2 + .../server/lib/telemetry/receiver.ts | 8 +- .../security_solution/server/plugin.ts | 2 - .../factory/hosts/details/helpers.ts | 18 +-- .../factory/hosts/details/index.test.tsx | 2 + .../factory/hosts/details/index.ts | 2 + .../security_solution/factory/types.ts | 2 + .../security_solution/index.ts | 1 + .../plugins/security_solution/server/types.ts | 2 + 43 files changed, 736 insertions(+), 240 deletions(-) create mode 100644 x-pack/plugins/fleet/server/services/agents/agent_service.mock.ts create mode 100644 x-pack/plugins/fleet/server/services/agents/agent_service.test.ts create mode 100644 x-pack/plugins/fleet/server/services/agents/agent_service.ts create mode 100644 x-pack/plugins/security_solution/server/endpoint/services/endpoint_fleet_services.ts diff --git a/x-pack/plugins/fleet/common/constants/plugin.ts b/x-pack/plugins/fleet/common/constants/plugin.ts index ee0e1e5caeae4d..86211ba3727eb1 100644 --- a/x-pack/plugins/fleet/common/constants/plugin.ts +++ b/x-pack/plugins/fleet/common/constants/plugin.ts @@ -5,5 +5,5 @@ * 2.0. */ -export const PLUGIN_ID = 'fleet'; -export const INTEGRATIONS_PLUGIN_ID = 'integrations'; +export const PLUGIN_ID = 'fleet' as const; +export const INTEGRATIONS_PLUGIN_ID = 'integrations' as const; diff --git a/x-pack/plugins/fleet/server/errors/index.ts b/x-pack/plugins/fleet/server/errors/index.ts index b2039dad4d57cf..c72d476e4c466c 100644 --- a/x-pack/plugins/fleet/server/errors/index.ts +++ b/x-pack/plugins/fleet/server/errors/index.ts @@ -52,6 +52,7 @@ export class HostedAgentPolicyRestrictionRelatedError extends IngestManagerError export class FleetSetupError extends IngestManagerError {} export class GenerateServiceTokenError extends IngestManagerError {} +export class FleetUnauthorizedError extends IngestManagerError {} export class OutputUnauthorizedError extends IngestManagerError {} diff --git a/x-pack/plugins/fleet/server/index.ts b/x-pack/plugins/fleet/server/index.ts index 17425050a4e109..9fc0edd0b7cf81 100644 --- a/x-pack/plugins/fleet/server/index.ts +++ b/x-pack/plugins/fleet/server/index.ts @@ -19,6 +19,7 @@ import { FleetPlugin } from './plugin'; export type { AgentService, + AgentClient, ESIndexPatternService, PackageService, AgentPolicyServiceInterface, @@ -34,8 +35,9 @@ export type { PutPackagePolicyUpdateCallback, PostPackagePolicyDeleteCallback, PostPackagePolicyCreateCallback, + FleetRequestHandlerContext, } from './types'; -export { AgentNotFoundError } from './errors'; +export { AgentNotFoundError, FleetUnauthorizedError } from './errors'; export const config: PluginConfigDescriptor = { exposeToBrowser: { diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index bd7f192dc7fd24..90a0addfae4904 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -11,16 +11,19 @@ import { loggingSystemMock, savedObjectsServiceMock, coreMock, + savedObjectsClientMock, } 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'; import type { PackagePolicyServiceInterface } from '../services/package_policy'; -import type { AgentPolicyServiceInterface, AgentService } from '../services'; +import type { AgentPolicyServiceInterface, PackageService } from '../services'; import type { FleetAppContext } from '../plugin'; import { createMockTelemetryEventsSender } from '../telemetry/__mocks__'; import type { FleetAuthz } from '../../common'; +import { agentServiceMock } from '../services/agents/agent_service.mock'; +import type { FleetRequestHandlerContext } from '../types'; // Export all mocks from artifacts export * from '../services/artifacts/mocks'; @@ -65,10 +68,26 @@ export const createAppContextStartContractMock = (): MockedFleetAppContext => { }; }; +export const createFleetRequestHandlerContextMock = (): jest.Mocked< + FleetRequestHandlerContext['fleet'] +> => { + return { + authz: createFleetAuthzMock(), + agentClient: { + asCurrentUser: agentServiceMock.createClient(), + asInternalUser: agentServiceMock.createClient(), + }, + epm: { + internalSoClient: savedObjectsClientMock.create(), + }, + }; +}; + function createCoreRequestHandlerContextMock() { return { core: coreMock.createRequestHandlerContext(), licensing: licensingMock.createRequestHandlerContext(), + fleet: createFleetRequestHandlerContextMock(), }; } @@ -113,33 +132,40 @@ export const createMockAgentPolicyService = (): jest.Mocked => { +export const createMockAgentService = () => agentServiceMock.create(); + +/** + * Creates a mock AgentClient + */ +export const createMockAgentClient = () => agentServiceMock.createClient(); + +export const createMockPackageService = (): PackageService => { return { - getAgentStatusById: jest.fn(), - getAgentStatusForAgentPolicy: jest.fn(), - getAgent: jest.fn(), - listAgents: jest.fn(), + getInstallation: jest.fn(), + ensureInstalledPackage: jest.fn(), }; }; /** * Creates mock `authz` object */ -export const fleetAuthzMock: FleetAuthz = { - fleet: { - all: true, - setup: true, - readEnrollmentTokens: true, - }, - integrations: { - readPackageInfo: true, - readInstalledPackages: true, - installPackages: true, - upgradePackages: true, - removePackages: true, - readPackageSettings: true, - writePackageSettings: true, - readIntegrationPolicies: true, - writeIntegrationPolicies: true, - }, +export const createFleetAuthzMock = (): FleetAuthz => { + return { + fleet: { + all: true, + setup: true, + readEnrollmentTokens: true, + }, + integrations: { + readPackageInfo: true, + readInstalledPackages: true, + installPackages: true, + upgradePackages: true, + removePackages: true, + readPackageSettings: true, + writePackageSettings: true, + readIntegrationPolicies: true, + writeIntegrationPolicies: true, + }, + }; }; diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index b2dba997351ea4..4b45cf645201c1 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -16,6 +16,7 @@ import type { SavedObjectsServiceStart, HttpServiceSetup, KibanaRequest, + ElasticsearchClient, } from 'kibana/server'; import type { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; @@ -71,13 +72,8 @@ import { ESIndexPatternSavedObjectService, agentPolicyService, packagePolicyService, + AgentServiceImpl, } from './services'; -import { - getAgentStatusById, - getAgentStatusForAgentPolicy, - getAgentsByKuery, - getAgentById, -} from './services/agents'; import { registerFleetUsageCollector } from './collectors/register'; import { getInstallation, ensureInstalledPackage } from './services/epm/packages'; import { getAuthzFromRequest, RouterWrappers } from './routes/security'; @@ -187,6 +183,8 @@ export class FleetPlugin private encryptedSavedObjectsSetup?: EncryptedSavedObjectsPluginSetup; private readonly telemetryEventsSender: TelemetryEventsSender; + private agentService?: AgentService; + constructor(private readonly initializerContext: PluginInitializerContext) { this.config$ = this.initializerContext.config.create(); this.isProductionMode = this.initializerContext.env.mode.prod; @@ -212,7 +210,7 @@ export class FleetPlugin // TODO: Flesh out privileges if (deps.features) { deps.features.registerKibanaFeature({ - id: 'fleet', + id: PLUGIN_ID, name: 'Fleet and Integrations', category: DEFAULT_APP_CATEGORIES.management, app: [PLUGIN_ID, INTEGRATIONS_PLUGIN_ID, 'kibana'], @@ -237,7 +235,7 @@ export class FleetPlugin }, privileges: { all: { - api: [`fleet-read`, `fleet-all`, `integrations-all`, `integrations-read`], + api: [`${PLUGIN_ID}-read`, `${PLUGIN_ID}-all`, `integrations-all`, `integrations-read`], app: [PLUGIN_ID, INTEGRATIONS_PLUGIN_ID, 'kibana'], catalogue: ['fleet'], savedObject: { @@ -247,7 +245,7 @@ export class FleetPlugin ui: ['show', 'read', 'write'], }, read: { - api: [`fleet-read`, `integrations-read`], + api: [`${PLUGIN_ID}-read`, `integrations-read`], app: [PLUGIN_ID, INTEGRATIONS_PLUGIN_ID, 'kibana'], catalogue: ['fleet'], // TODO: check if this is actually available to read user savedObject: { @@ -260,19 +258,33 @@ export class FleetPlugin }); } - core.http.registerRouteHandlerContext( - 'fleet', - async (coreContext, request) => ({ - authz: await getAuthzFromRequest(request), - epm: { - // Use a lazy getter to avoid constructing this client when not used by a request handler - get internalSoClient() { - return appContextService - .getSavedObjects() - .getScopedClient(request, { excludedWrappers: ['security'] }); + core.http.registerRouteHandlerContext( + PLUGIN_ID, + async (context, request) => { + const plugin = this; + + return { + get agentClient() { + const agentService = plugin.setupAgentService( + context.core.elasticsearch.client.asInternalUser + ); + + return { + asCurrentUser: agentService.asScoped(request), + asInternalUser: agentService.asInternalUser, + }; }, - }, - }) + authz: await getAuthzFromRequest(request), + epm: { + // Use a lazy getter to avoid constructing this client when not used by a request handler + get internalSoClient() { + return appContextService + .getSavedObjects() + .getScopedClient(request, { excludedWrappers: ['security'] }); + }, + }, + }; + } ); const router: FleetRouter = core.http.createRouter(); @@ -365,12 +377,7 @@ export class FleetPlugin getInstallation, ensureInstalledPackage, }, - agentService: { - getAgent: getAgentById, - listAgents: getAgentsByKuery, - getAgentStatusById, - getAgentStatusForAgentPolicy, - }, + agentService: this.setupAgentService(core.elasticsearch.client.asInternalUser), agentPolicyService: { get: agentPolicyService.get, list: agentPolicyService.list, @@ -394,4 +401,13 @@ export class FleetPlugin licenseService.stop(); this.telemetryEventsSender.stop(); } + + private setupAgentService(internalEsClient: ElasticsearchClient): AgentService { + if (this.agentService) { + return this.agentService; + } + + this.agentService = new AgentServiceImpl(internalEsClient); + return this.agentService; + } } diff --git a/x-pack/plugins/fleet/server/routes/security.ts b/x-pack/plugins/fleet/server/routes/security.ts index 0b7065edf63ba8..8e037c25ceca92 100644 --- a/x-pack/plugins/fleet/server/routes/security.ts +++ b/x-pack/plugins/fleet/server/routes/security.ts @@ -24,7 +24,7 @@ function checkSecurityEnabled() { return appContextService.hasSecurity() && appContextService.getSecurityLicense().isEnabled(); } -function checkSuperuser(req: KibanaRequest) { +export function checkSuperuser(req: KibanaRequest) { if (!checkSecurityEnabled()) { return false; } diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts index 4f034a0add32fb..d48d80add24358 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts @@ -9,7 +9,8 @@ import { httpServerMock, savedObjectsClientMock } from 'src/core/server/mocks'; import type { PostFleetSetupResponse } from '../../../common'; import { RegistryError } from '../../errors'; -import { createAppContextStartContractMock, xpackMocks, fleetAuthzMock } from '../../mocks'; +import { createAppContextStartContractMock, xpackMocks, createFleetAuthzMock } from '../../mocks'; +import { agentServiceMock } from '../../services/agents/agent_service.mock'; import { appContextService } from '../../services/app_context'; import { setupFleet } from '../../services/setup'; import type { FleetRequestHandlerContext } from '../../types'; @@ -34,7 +35,11 @@ describe('FleetSetupHandler', () => { context = { ...xpackMocks.createRequestHandlerContext(), fleet: { - authz: fleetAuthzMock, + agentClient: { + asCurrentUser: agentServiceMock.createClient(), + asInternalUser: agentServiceMock.createClient(), + }, + authz: createFleetAuthzMock(), epm: { internalSoClient: savedObjectsClientMock.create(), }, diff --git a/x-pack/plugins/fleet/server/services/agents/agent_service.mock.ts b/x-pack/plugins/fleet/server/services/agents/agent_service.mock.ts new file mode 100644 index 00000000000000..d1d45ad48f30ef --- /dev/null +++ b/x-pack/plugins/fleet/server/services/agents/agent_service.mock.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AgentClient, AgentService } from './agent_service'; + +const createClientMock = (): jest.Mocked => ({ + getAgent: jest.fn(), + getAgentStatusById: jest.fn(), + getAgentStatusForAgentPolicy: jest.fn(), + listAgents: jest.fn(), +}); + +const createServiceMock = (): jest.Mocked => ({ + asInternalUser: createClientMock(), + asScoped: jest.fn().mockReturnValue(createClientMock()), +}); + +export const agentServiceMock = { + createClient: createClientMock, + create: createServiceMock, +}; diff --git a/x-pack/plugins/fleet/server/services/agents/agent_service.test.ts b/x-pack/plugins/fleet/server/services/agents/agent_service.test.ts new file mode 100644 index 00000000000000..7dd61be1ab1be0 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/agents/agent_service.test.ts @@ -0,0 +1,132 @@ +/* + * Copyright 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. + */ + +jest.mock('../../routes/security'); +jest.mock('./crud'); +jest.mock('./status'); + +import type { ElasticsearchClient } from '../../../../../../src/core/server'; +import { elasticsearchServiceMock, httpServerMock } from '../../../../../../src/core/server/mocks'; +import { FleetUnauthorizedError } from '../../errors'; + +import { checkSuperuser } from '../../routes/security'; + +import type { AgentClient } from './agent_service'; +import { AgentServiceImpl } from './agent_service'; +import { getAgentsByKuery, getAgentById } from './crud'; +import { getAgentStatusById, getAgentStatusForAgentPolicy } from './status'; + +const mockCheckSuperuser = checkSuperuser as jest.Mock; +const mockGetAgentsByKuery = getAgentsByKuery as jest.Mock; +const mockGetAgentById = getAgentById as jest.Mock; +const mockGetAgentStatusById = getAgentStatusById as jest.Mock; +const mockGetAgentStatusForAgentPolicy = getAgentStatusForAgentPolicy as jest.Mock; + +describe('AgentService', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('asScoped', () => { + describe('without required privilege', () => { + const agentClient = new AgentServiceImpl( + elasticsearchServiceMock.createElasticsearchClient() + ).asScoped(httpServerMock.createKibanaRequest()); + + beforeEach(() => mockCheckSuperuser.mockReturnValue(false)); + + it('rejects on listAgents', async () => { + await expect(agentClient.listAgents({ showInactive: true })).rejects.toThrowError( + new FleetUnauthorizedError( + `User does not have adequate permissions to access Fleet agents.` + ) + ); + }); + + it('rejects on getAgent', async () => { + await expect(agentClient.getAgent('foo')).rejects.toThrowError( + new FleetUnauthorizedError( + `User does not have adequate permissions to access Fleet agents.` + ) + ); + }); + + it('rejects on getAgentStatusById', async () => { + await expect(agentClient.getAgentStatusById('foo')).rejects.toThrowError( + new FleetUnauthorizedError( + `User does not have adequate permissions to access Fleet agents.` + ) + ); + }); + + it('rejects on getAgentStatusForAgentPolicy', async () => { + await expect(agentClient.getAgentStatusForAgentPolicy()).rejects.toThrowError( + new FleetUnauthorizedError( + `User does not have adequate permissions to access Fleet agents.` + ) + ); + }); + }); + + describe('with required privilege', () => { + const mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); + const agentClient = new AgentServiceImpl(mockEsClient).asScoped( + httpServerMock.createKibanaRequest() + ); + + beforeEach(() => mockCheckSuperuser.mockReturnValue(true)); + + expectApisToCallServicesSuccessfully(mockEsClient, agentClient); + }); + }); + + describe('asInternalUser', () => { + const mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); + const agentClient = new AgentServiceImpl(mockEsClient).asInternalUser; + + expectApisToCallServicesSuccessfully(mockEsClient, agentClient); + }); +}); + +function expectApisToCallServicesSuccessfully( + mockEsClient: ElasticsearchClient, + agentClient: AgentClient +) { + test('client.listAgents calls getAgentsByKuery and returns results', async () => { + mockGetAgentsByKuery.mockResolvedValue('getAgentsByKuery success'); + await expect(agentClient.listAgents({ showInactive: true })).resolves.toEqual( + 'getAgentsByKuery success' + ); + expect(mockGetAgentsByKuery).toHaveBeenCalledWith(mockEsClient, { showInactive: true }); + }); + + test('client.getAgent calls getAgentById and returns results', async () => { + mockGetAgentById.mockResolvedValue('getAgentById success'); + await expect(agentClient.getAgent('foo-id')).resolves.toEqual('getAgentById success'); + expect(mockGetAgentById).toHaveBeenCalledWith(mockEsClient, 'foo-id'); + }); + + test('client.getAgentStatusById calls getAgentStatusById and returns results', async () => { + mockGetAgentStatusById.mockResolvedValue('getAgentStatusById success'); + await expect(agentClient.getAgentStatusById('foo-id')).resolves.toEqual( + 'getAgentStatusById success' + ); + expect(mockGetAgentStatusById).toHaveBeenCalledWith(mockEsClient, 'foo-id'); + }); + + test('client.getAgentStatusForAgentPolicy calls getAgentStatusForAgentPolicy and returns results', async () => { + mockGetAgentStatusForAgentPolicy.mockResolvedValue('getAgentStatusForAgentPolicy success'); + await expect(agentClient.getAgentStatusForAgentPolicy('foo-id', 'foo-filter')).resolves.toEqual( + 'getAgentStatusForAgentPolicy success' + ); + expect(mockGetAgentStatusForAgentPolicy).toHaveBeenCalledWith( + mockEsClient, + 'foo-id', + 'foo-filter' + ); + }); +} diff --git a/x-pack/plugins/fleet/server/services/agents/agent_service.ts b/x-pack/plugins/fleet/server/services/agents/agent_service.ts new file mode 100644 index 00000000000000..0286c29cba0c55 --- /dev/null +++ b/x-pack/plugins/fleet/server/services/agents/agent_service.ts @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable max-classes-per-file */ + +import type { ElasticsearchClient, KibanaRequest } from 'kibana/server'; + +import type { AgentStatus, ListWithKuery } from '../../types'; +import type { Agent, GetAgentStatusResponse } from '../../../common'; + +import { checkSuperuser } from '../../routes/security'; + +import { FleetUnauthorizedError } from '../../errors'; + +import { getAgentsByKuery, getAgentById } from './crud'; +import { getAgentStatusById, getAgentStatusForAgentPolicy } from './status'; + +/** + * A service for interacting with Agent data. See {@link AgentClient} for more information. + * + * @public + */ +export interface AgentService { + /** + * Should be used for end-user requests to Kibana. APIs will return errors if user does not have appropriate access. + */ + asScoped(req: KibanaRequest): AgentClient; + + /** + * Only use for server-side usages (eg. telemetry), should not be used for end users unless an explicit authz check is + * done. + */ + asInternalUser: AgentClient; +} + +/** + * A client for interacting with data about an Agent + * + * @public + */ +export interface AgentClient { + /** + * Get an Agent by id + */ + getAgent(agentId: string): Promise; + + /** + * Return the status by the Agent's id + */ + getAgentStatusById(agentId: string): Promise; + + /** + * Return the status by the Agent's Policy id + */ + getAgentStatusForAgentPolicy( + agentPolicyId?: string, + filterKuery?: string + ): Promise; + + /** + * List agents + */ + listAgents( + options: ListWithKuery & { + showInactive: boolean; + } + ): Promise<{ + agents: Agent[]; + total: number; + page: number; + perPage: number; + }>; +} + +/** + * @internal + */ +class AgentClientImpl implements AgentClient { + constructor( + private readonly internalEsClient: ElasticsearchClient, + private readonly preflightCheck?: () => void | Promise + ) {} + + public async listAgents( + options: ListWithKuery & { + showInactive: boolean; + } + ) { + await this.#runPreflight(); + return getAgentsByKuery(this.internalEsClient, options); + } + + public async getAgent(agentId: string) { + await this.#runPreflight(); + return getAgentById(this.internalEsClient, agentId); + } + + public async getAgentStatusById(agentId: string) { + await this.#runPreflight(); + return getAgentStatusById(this.internalEsClient, agentId); + } + + public async getAgentStatusForAgentPolicy(agentPolicyId?: string, filterKuery?: string) { + await this.#runPreflight(); + return getAgentStatusForAgentPolicy(this.internalEsClient, agentPolicyId, filterKuery); + } + + #runPreflight = async () => { + if (this.preflightCheck) { + return this.preflightCheck(); + } + }; +} + +/** + * @internal + */ +export class AgentServiceImpl implements AgentService { + constructor(private readonly internalEsClient: ElasticsearchClient) {} + + public asScoped(req: KibanaRequest) { + const preflightCheck = () => { + if (!checkSuperuser(req)) { + throw new FleetUnauthorizedError( + `User does not have adequate permissions to access Fleet agents.` + ); + } + }; + + return new AgentClientImpl(this.internalEsClient, preflightCheck); + } + + public get asInternalUser() { + return new AgentClientImpl(this.internalEsClient); + } +} diff --git a/x-pack/plugins/fleet/server/services/agents/index.ts b/x-pack/plugins/fleet/server/services/agents/index.ts index 9b2846b68364e6..7abe1873b70a37 100644 --- a/x-pack/plugins/fleet/server/services/agents/index.ts +++ b/x-pack/plugins/fleet/server/services/agents/index.ts @@ -13,3 +13,5 @@ export * from './update'; export * from './actions'; export * from './reassign'; export * from './setup'; +export { AgentServiceImpl } from './agent_service'; +export type { AgentClient, AgentService } from './agent_service'; diff --git a/x-pack/plugins/fleet/server/services/index.ts b/x-pack/plugins/fleet/server/services/index.ts index ab88e5af18efa9..7e615f923b2213 100644 --- a/x-pack/plugins/fleet/server/services/index.ts +++ b/x-pack/plugins/fleet/server/services/index.ts @@ -5,13 +5,8 @@ * 2.0. */ -import type { ElasticsearchClient, SavedObjectsClientContract } from 'kibana/server'; +import type { SavedObjectsClientContract } from 'kibana/server'; -import type { AgentStatus } from '../types'; - -import type { GetAgentStatusResponse } from '../../common'; - -import type { getAgentById, getAgentsByKuery } from './agents'; import type { agentPolicyService } from './agent_policy'; import * as settingsService from './settings'; import type { getInstallation, ensureInstalledPackage } from './epm/packages'; @@ -39,32 +34,6 @@ export interface PackageService { ensureInstalledPackage: typeof ensureInstalledPackage; } -/** - * A service that provides exported functions that return information about an Agent - */ -export interface AgentService { - /** - * Get an Agent by id - */ - getAgent: typeof getAgentById; - /** - * Return the status by the Agent's id - */ - getAgentStatusById(esClient: ElasticsearchClient, agentId: string): Promise; - /** - * Return the status by the Agent's Policy id - */ - getAgentStatusForAgentPolicy( - esClient: ElasticsearchClient, - agentPolicyId?: string, - filterKuery?: string - ): Promise; - /** - * List agents - */ - listAgents: typeof getAgentsByKuery; -} - export interface AgentPolicyServiceInterface { get: typeof agentPolicyService['get']; list: typeof agentPolicyService['list']; @@ -73,6 +42,10 @@ export interface AgentPolicyServiceInterface { getByIds: typeof agentPolicyService['getByIDs']; } +// Agent services +export { AgentServiceImpl } from './agents'; +export type { AgentClient, AgentService } from './agents'; + // Saved object services export { agentPolicyService } from './agent_policy'; export { packagePolicyService } from './package_policy'; diff --git a/x-pack/plugins/fleet/server/types/request_context.ts b/x-pack/plugins/fleet/server/types/request_context.ts index 8de68c91f4ef33..aafa8765723d1d 100644 --- a/x-pack/plugins/fleet/server/types/request_context.ts +++ b/x-pack/plugins/fleet/server/types/request_context.ts @@ -14,11 +14,18 @@ import type { IRouter, } from '../../../../../src/core/server'; import type { FleetAuthz } from '../../common/authz'; +import type { AgentClient } from '../services'; /** @internal */ export interface FleetRequestHandlerContext extends RequestHandlerContext { fleet: { + /** {@link FleetAuthz} */ authz: FleetAuthz; + /** {@link AgentClient} */ + agentClient: { + asCurrentUser: AgentClient; + asInternalUser: AgentClient; + }; epm: { /** * Saved Objects client configured to use kibana_system privileges instead of end-user privileges. Should only be diff --git a/x-pack/plugins/osquery/server/lib/parse_agent_groups.ts b/x-pack/plugins/osquery/server/lib/parse_agent_groups.ts index 8fe60f59f01d76..c2c86e7fd119d7 100644 --- a/x-pack/plugins/osquery/server/lib/parse_agent_groups.ts +++ b/x-pack/plugins/osquery/server/lib/parse_agent_groups.ts @@ -6,7 +6,7 @@ */ import { uniq } from 'lodash'; -import type { ElasticsearchClient, SavedObjectsClientContract } from 'src/core/server'; +import type { KibanaRequest, SavedObjectsClientContract } from 'src/core/server'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../fleet/common'; import { OSQUERY_INTEGRATION_NAME } from '../../common'; import { OsqueryAppContext } from './osquery_app_context_services'; @@ -34,7 +34,7 @@ const aggregateResults = async ( }; export const parseAgentSelection = async ( - esClient: ElasticsearchClient, + request: KibanaRequest, soClient: SavedObjectsClientContract, context: OsqueryAppContext, agentSelection: AgentSelection @@ -42,7 +42,7 @@ export const parseAgentSelection = async ( const selectedAgents: Set = new Set(); const addAgent = selectedAgents.add.bind(selectedAgents); const { allAgentsSelected, platformsSelected, policiesSelected, agents } = agentSelection; - const agentService = context.service.getAgentService(); + const agentService = context.service.getAgentService()?.asScoped(request); const packagePolicyService = context.service.getPackagePolicyService(); const kueryFragments = []; @@ -59,7 +59,7 @@ export const parseAgentSelection = async ( if (allAgentsSelected) { const kuery = kueryFragments.join(' and '); const fetchedAgents = await aggregateResults(async (page, perPage) => { - const res = await agentService.listAgents(esClient, { + const res = await agentService.listAgents({ perPage, page, kuery, @@ -80,7 +80,7 @@ export const parseAgentSelection = async ( kueryFragments.push(`(${groupFragments.join(' or ')})`); const kuery = kueryFragments.join(' and '); const fetchedAgents = await aggregateResults(async (page, perPage) => { - const res = await agentService.listAgents(esClient, { + const res = await agentService.listAgents({ perPage, page, kuery, diff --git a/x-pack/plugins/osquery/server/routes/action/create_action_route.ts b/x-pack/plugins/osquery/server/routes/action/create_action_route.ts index cebdbe7b8fe869..0188f1432c22b0 100644 --- a/x-pack/plugins/osquery/server/routes/action/create_action_route.ts +++ b/x-pack/plugins/osquery/server/routes/action/create_action_route.ts @@ -46,7 +46,7 @@ export const createActionRoute = (router: IRouter, osqueryContext: OsqueryAppCon const { agentSelection } = request.body as { agentSelection: AgentSelection }; const selectedAgents = await parseAgentSelection( - esClient, + request, soClient, osqueryContext, agentSelection diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts index 06641cc60e13dd..90de01702868ae 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_policies.ts @@ -30,7 +30,6 @@ export const getAgentPoliciesRoute = (router: IRouter, osqueryContext: OsqueryAp }, async (context, request, response) => { const soClient = context.core.savedObjects.client; - const esClient = context.core.elasticsearch.client.asInternalUser; const agentService = osqueryContext.service.getAgentService(); const agentPolicyService = osqueryContext.service.getAgentPolicyService(); const packagePolicyService = osqueryContext.service.getPackagePolicyService(); @@ -51,7 +50,8 @@ export const getAgentPoliciesRoute = (router: IRouter, osqueryContext: OsqueryAp agentPolicies, (agentPolicy: GetAgentPoliciesResponseItem) => agentService - ?.getAgentStatusForAgentPolicy(esClient, agentPolicy.id) + ?.asScoped(request) + .getAgentStatusForAgentPolicy(agentPolicy.id) .then(({ total: agentTotal }) => (agentPolicy.agents = agentTotal)), { concurrency: 10 } ); diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts index dea4402472958b..1f4f12648a25b1 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agent_status_for_agent_policy.ts @@ -28,11 +28,10 @@ export const getAgentStatusForAgentPolicyRoute = ( options: { tags: [`access:${PLUGIN_ID}-read`] }, }, async (context, request, response) => { - const esClient = context.core.elasticsearch.client.asInternalUser; - const results = await osqueryContext.service .getAgentService() - ?.getAgentStatusForAgentPolicy(esClient, request.query.policyId, request.query.kuery); + ?.asScoped(request) + .getAgentStatusForAgentPolicy(request.query.policyId, request.query.kuery); if (!results) { return response.ok({ body: {} }); diff --git a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts index f129e95fd9508c..b638f92f19aa96 100644 --- a/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts +++ b/x-pack/plugins/osquery/server/routes/fleet_wrapper/get_agents.ts @@ -20,14 +20,13 @@ export const getAgentsRoute = (router: IRouter, osqueryContext: OsqueryAppContex options: { tags: [`access:${PLUGIN_ID}-read`] }, }, async (context, request, response) => { - const esClient = context.core.elasticsearch.client.asInternalUser; - let agents; try { agents = await osqueryContext.service .getAgentService() + ?.asScoped(request) // @ts-expect-error update types - ?.listAgents(esClient, request.query); + .listAgents(request.query); } catch (error) { return response.badRequest({ body: error }); } diff --git a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts index 68ee826eca01c7..79436c66d073f2 100644 --- a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts +++ b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts @@ -34,6 +34,10 @@ import { EndpointAppContentServicesNotSetUpError, EndpointAppContentServicesNotStartedError, } from './errors'; +import { + EndpointFleetServicesFactory, + EndpointScopedFleetServicesInterface, +} from './services/endpoint_fleet_services'; export interface EndpointAppContextServiceSetupContract { securitySolutionRequestContextFactory: IRequestContextFactory; @@ -64,6 +68,7 @@ export type EndpointAppContextServiceStartContract = Partial< export class EndpointAppContextService { private setupDependencies: EndpointAppContextServiceSetupContract | null = null; private startDependencies: EndpointAppContextServiceStartContract | null = null; + private fleetServicesFactory: EndpointFleetServicesFactory | null = null; public security: SecurityPluginStart | undefined; public setup(dependencies: EndpointAppContextServiceSetupContract) { @@ -78,6 +83,17 @@ export class EndpointAppContextService { this.startDependencies = dependencies; this.security = dependencies.security; + // let's try to avoid turning off eslint's Forbidden non-null assertion rule + const { agentService, agentPolicyService, packagePolicyService, packageService } = + dependencies as Required; + + this.fleetServicesFactory = new EndpointFleetServicesFactory({ + agentService, + agentPolicyService, + packagePolicyService, + packageService, + }); + if (dependencies.registerIngestCallback && dependencies.manifestManager) { dependencies.registerIngestCallback( 'packagePolicyCreate', @@ -119,10 +135,20 @@ export class EndpointAppContextService { return this.startDependencies.endpointMetadataService; } + public getScopedFleetServices(req: KibanaRequest): EndpointScopedFleetServicesInterface { + if (this.fleetServicesFactory === null) { + throw new EndpointAppContentServicesNotStartedError(); + } + + return this.fleetServicesFactory.asScoped(req); + } + + /** @deprecated use `getScopedFleetServices()` instead */ public getAgentService(): AgentService | undefined { return this.startDependencies?.agentService; } + /** @deprecated use `getScopedFleetServices()` instead */ public getPackagePolicyService(): PackagePolicyServiceInterface { if (!this.startDependencies?.packagePolicyService) { throw new EndpointAppContentServicesNotStartedError(); @@ -130,6 +156,7 @@ export class EndpointAppContextService { return this.startDependencies?.packagePolicyService; } + /** @deprecated use `getScopedFleetServices()` instead */ public getAgentPolicyService(): AgentPolicyServiceInterface | undefined { return this.startDependencies?.agentPolicyService; } diff --git a/x-pack/plugins/security_solution/server/endpoint/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/mocks.ts index 3ad3b32b7fec1b..9b9d72805425a0 100644 --- a/x-pack/plugins/security_solution/server/endpoint/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/mocks.ts @@ -17,7 +17,7 @@ import { createMockAgentPolicyService, createMockAgentService, createArtifactsClientMock, - fleetAuthzMock, + createFleetAuthzMock, } from '../../../fleet/server/mocks'; import { createMockConfig } from '../lib/detection_engine/routes/__mocks__'; import { @@ -96,7 +96,6 @@ export const createMockEndpointAppContextServiceStartContract = const packagePolicyService = createPackagePolicyServiceMock(); const endpointMetadataService = new EndpointMetadataService( savedObjectsStart, - agentService, agentPolicyService, packagePolicyService, logger @@ -155,7 +154,7 @@ export const createMockPackageService = (): jest.Mocked => { export const createMockFleetStartContract = (indexPattern: string): FleetStartContract => { return { authz: { - fromRequest: jest.fn().mockResolvedValue(fleetAuthzMock), + fromRequest: jest.fn().mockResolvedValue(createFleetAuthzMock()), }, fleetSetupCompleted: jest.fn().mockResolvedValue(undefined), esIndexPatternService: { diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/enrichment.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/enrichment.test.ts index 9b454a266834c1..8cbdbc064f8b97 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/enrichment.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/enrichment.test.ts @@ -9,6 +9,7 @@ import { HostStatus } from '../../../../common/endpoint/types'; import { createMockMetadataRequestContext } from '../../mocks'; import { EndpointDocGenerator } from '../../../../common/endpoint/generate_data'; import { enrichHostMetadata, MetadataRequestContext } from './handlers'; +import { AgentClient } from '../../../../../fleet/server'; describe('test document enrichment', () => { let metaReqCtx: jest.Mocked; @@ -23,11 +24,9 @@ describe('test document enrichment', () => { beforeEach(() => { statusFn = jest.fn(); - (metaReqCtx.endpointAppContextService.getAgentService as jest.Mock).mockImplementation(() => { - return { - getAgentStatusById: statusFn, - }; - }); + metaReqCtx.requestHandlerContext!.fleet!.agentClient.asCurrentUser = { + getAgentStatusById: statusFn, + } as unknown as AgentClient; }); it('should return host healthy for online agent', async () => { @@ -87,12 +86,10 @@ describe('test document enrichment', () => { beforeEach(() => { agentMock = jest.fn(); agentPolicyMock = jest.fn(); - (metaReqCtx.endpointAppContextService.getAgentService as jest.Mock).mockImplementation(() => { - return { - getAgent: agentMock, - getAgentStatusById: jest.fn(), - }; - }); + metaReqCtx.requestHandlerContext!.fleet!.agentClient.asCurrentUser = { + getAgent: agentMock, + getAgentStatusById: jest.fn(), + } as unknown as AgentClient; (metaReqCtx.endpointAppContextService.getAgentPolicyService as jest.Mock).mockImplementation( () => { return { diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts index 63e56af3fec6fc..708cac5a845ce5 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts @@ -35,7 +35,6 @@ import { EndpointAppContextService } from '../../endpoint_app_context_services'; import { fleetAgentStatusToEndpointHostStatus } from '../../utils'; import { queryResponseToHostListResult } from './support/query_strategies'; import { NotFoundError } from '../../errors'; -import { EndpointError } from '../../../../common/endpoint/errors'; import { EndpointHostUnEnrolledError } from '../../services/metadata'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; import { GetMetadataListRequestQuery } from '../../../../common/endpoint/schema/metadata'; @@ -43,6 +42,7 @@ import { ENDPOINT_DEFAULT_PAGE, ENDPOINT_DEFAULT_PAGE_SIZE, } from '../../../../common/endpoint/constants'; +import { EndpointFleetServicesInterface } from '../../services/endpoint_fleet_services'; export interface MetadataRequestContext { esClient?: IScopedClusterClient; @@ -93,9 +93,7 @@ export const getMetadataListRequestHandler = function ( > { return async (context, request, response) => { const endpointMetadataService = endpointAppContext.service.getEndpointMetadataService(); - if (!endpointMetadataService) { - throw new EndpointError('endpoint metadata service not available'); - } + const fleetServices = endpointAppContext.service.getScopedFleetServices(request); let doesUnitedIndexExist = false; let didUnitedIndexError = false; @@ -118,18 +116,25 @@ export const getMetadataListRequestHandler = function ( // If no unified Index present, then perform a search using the legacy approach if (!doesUnitedIndexExist || didUnitedIndexError) { const endpointPolicies = await getAllEndpointPackagePolicies( - endpointAppContext.service.getPackagePolicyService(), + fleetServices.packagePolicy, context.core.savedObjects.client ); const pagingProperties = await getPagingProperties(request, endpointAppContext); - body = await legacyListMetadataQuery(context, endpointAppContext, logger, endpointPolicies, { - page: pagingProperties.pageIndex, - pageSize: pagingProperties.pageSize, - kuery: request?.body?.filters?.kql || '', - hostStatuses: request?.body?.filters?.host_status || [], - }); + body = await legacyListMetadataQuery( + context, + endpointAppContext, + fleetServices, + logger, + endpointPolicies, + { + page: pagingProperties.pageIndex, + pageSize: pagingProperties.pageSize, + kuery: request?.body?.filters?.kql || '', + hostStatuses: request?.body?.filters?.host_status || [], + } + ); return response.ok({ body }); } @@ -138,6 +143,7 @@ export const getMetadataListRequestHandler = function ( const pagingProperties = await getPagingProperties(request, endpointAppContext); const { data, total } = await endpointMetadataService.getHostMetadataList( context.core.elasticsearch.client.asCurrentUser, + fleetServices, { page: pagingProperties.pageIndex, pageSize: pagingProperties.pageSize, @@ -171,6 +177,7 @@ export function getMetadataListRequestHandlerV2( > { return async (context, request, response) => { const endpointMetadataService = endpointAppContext.service.getEndpointMetadataService(); + const fleetServices = endpointAppContext.service.getScopedFleetServices(request); let doesUnitedIndexExist = false; let didUnitedIndexError = false; @@ -193,13 +200,14 @@ export function getMetadataListRequestHandlerV2( // If no unified Index present, then perform a search using the legacy approach if (!doesUnitedIndexExist || didUnitedIndexError) { const endpointPolicies = await getAllEndpointPackagePolicies( - endpointAppContext.service.getPackagePolicyService(), + fleetServices.packagePolicy, context.core.savedObjects.client ); const legacyResponse = await legacyListMetadataQuery( context, endpointAppContext, + fleetServices, logger, endpointPolicies, request.query @@ -217,6 +225,7 @@ export function getMetadataListRequestHandlerV2( try { const { data, total } = await endpointMetadataService.getHostMetadataList( context.core.elasticsearch.client.asCurrentUser, + fleetServices, request.query ); @@ -250,6 +259,7 @@ export const getMetadataRequestHandler = function ( return response.ok({ body: await endpointMetadataService.getEnrichedHostMetadata( context.core.elasticsearch.client.asCurrentUser, + endpointAppContext.service.getScopedFleetServices(request), request.params.id ), }); @@ -314,10 +324,6 @@ export async function enrichHostMetadata( throw e; } - const esClient = (metadataRequestContext?.esClient ?? - metadataRequestContext.requestHandlerContext?.core.elasticsearch - .client) as IScopedClusterClient; - const esSavedObjectClient = metadataRequestContext?.savedObjectsClient ?? (metadataRequestContext.requestHandlerContext?.core.savedObjects @@ -333,9 +339,10 @@ export async function enrichHostMetadata( log.warn(`Missing elastic agent id, using host id instead ${elasticAgentId}`); } - const status = await metadataRequestContext.endpointAppContextService - ?.getAgentService() - ?.getAgentStatusById(esClient.asCurrentUser, elasticAgentId); + const status = + await metadataRequestContext.requestHandlerContext?.fleet?.agentClient.asCurrentUser.getAgentStatusById( + elasticAgentId + ); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion hostStatus = fleetAgentStatusToEndpointHostStatus(status!); } catch (e) { @@ -349,9 +356,10 @@ export async function enrichHostMetadata( let policyInfo: HostInfo['policy_info']; try { - const agent = await metadataRequestContext.endpointAppContextService - ?.getAgentService() - ?.getAgent(esClient.asCurrentUser, elasticAgentId); + const agent = + await metadataRequestContext.requestHandlerContext?.fleet?.agentClient.asCurrentUser.getAgent( + elasticAgentId + ); const agentPolicy = await metadataRequestContext.endpointAppContextService .getAgentPolicyService() // eslint-disable-next-line @typescript-eslint/no-non-null-assertion @@ -393,15 +401,12 @@ export async function enrichHostMetadata( async function legacyListMetadataQuery( context: SecuritySolutionRequestHandlerContext, endpointAppContext: EndpointAppContext, + fleetServices: EndpointFleetServicesInterface, logger: Logger, endpointPolicies: PackagePolicy[], queryOptions: GetMetadataListRequestQuery ): Promise { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const agentService = endpointAppContext.service.getAgentService()!; - if (agentService === undefined) { - throw new Error('agentService not available'); - } + const fleetAgentClient = fleetServices.agent; const metadataRequestContext: MetadataRequestContext = { esClient: context.core.elasticsearch.client, @@ -412,14 +417,15 @@ async function legacyListMetadataQuery( }; const endpointPolicyIds = endpointPolicies.map((policy) => policy.policy_id); + const unenrolledAgentIds = await findAllUnenrolledAgentIds( - agentService, + fleetAgentClient, context.core.elasticsearch.client.asCurrentUser, endpointPolicyIds ); const statusAgentIds = await findAgentIdsByStatus( - agentService, + fleetAgentClient, context.core.elasticsearch.client.asCurrentUser, queryOptions?.hostStatuses || [] ); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts index c1dfee0252b38c..c705246014a7b6 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts @@ -43,7 +43,7 @@ import { legacyMetadataSearchResponseMock, unitedMetadataSearchResponseMock, } from './support/test_support'; -import { PackageService } from '../../../../../fleet/server/services'; +import { AgentClient, PackageService } from '../../../../../fleet/server/services'; import { HOST_METADATA_GET_ROUTE, HOST_METADATA_LIST_ROUTE, @@ -60,6 +60,7 @@ import { } from '../../../../../../../src/core/server/elasticsearch/client/mocks'; import { EndpointHostNotFoundError } from '../../services/metadata'; import { FleetAgentGenerator } from '../../../../common/endpoint/data_generators/fleet_agent_generator'; +import { createMockAgentClient } from '../../../../../fleet/server/mocks'; class IndexNotFoundException extends Error { meta: { body: { error: { type: string } } }; @@ -88,6 +89,7 @@ describe('test endpoint routes', () => { let mockAgentPolicyService: Required< ReturnType >['agentPolicyService']; + let mockAgentClient: jest.Mocked; let endpointAppContextService: EndpointAppContextService; let startContract: EndpointAppContextServiceStartContract; const noUnenrolledAgent = { @@ -151,6 +153,8 @@ describe('test endpoint routes', () => { endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); mockAgentService = startContract.agentService!; + mockAgentClient = createMockAgentClient(); + mockAgentService.asScoped = () => mockAgentClient; mockAgentPolicyService = startContract.agentPolicyService!; registerEndpointRoutes(routerMock, { @@ -176,8 +180,8 @@ describe('test endpoint routes', () => { [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => path.startsWith(HOST_METADATA_LIST_ROUTE) )!; - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -220,8 +224,8 @@ describe('test endpoint routes', () => { }, }); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); mockAgentPolicyService.getByIds = jest.fn().mockResolvedValueOnce([]); const metadata = new EndpointDocGenerator().generateHostMetadata(); const esSearchMock = mockScopedClient.asCurrentUser.search as jest.Mock; @@ -415,6 +419,8 @@ describe('test endpoint routes', () => { endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); mockAgentService = startContract.agentService!; + mockAgentClient = createMockAgentClient(); + mockAgentService.asScoped = () => mockAgentClient; registerEndpointRoutes(routerMock, { logFactory: loggingSystemMock.create(), @@ -439,8 +445,8 @@ describe('test endpoint routes', () => { [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => path.startsWith(HOST_METADATA_LIST_ROUTE) )!; - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -474,8 +480,8 @@ describe('test endpoint routes', () => { }, }); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); (mockScopedClient.asCurrentUser.search as jest.Mock) .mockImplementationOnce(() => { throw new IndexNotFoundException(); @@ -536,8 +542,8 @@ describe('test endpoint routes', () => { }, }); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); (mockScopedClient.asCurrentUser.search as jest.Mock) .mockImplementationOnce(() => { throw new IndexNotFoundException(); @@ -653,6 +659,8 @@ describe('test endpoint routes', () => { endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); mockAgentService = startContract.agentService!; + mockAgentClient = createMockAgentClient(); + mockAgentService.asScoped = () => mockAgentClient; mockAgentPolicyService = startContract.agentPolicyService!; registerEndpointRoutes(routerMock, { @@ -683,8 +691,8 @@ describe('test endpoint routes', () => { [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => path.startsWith(HOST_METADATA_LIST_ROUTE) )!; - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -718,8 +726,8 @@ describe('test endpoint routes', () => { }, }); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); mockAgentPolicyService.getByIds = jest.fn().mockResolvedValueOnce([]); const metadata = new EndpointDocGenerator().generateHostMetadata(); const esSearchMock = mockScopedClient.asCurrentUser.search as jest.Mock; @@ -913,6 +921,8 @@ describe('test endpoint routes', () => { endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); mockAgentService = startContract.agentService!; + mockAgentClient = createMockAgentClient(); + mockAgentService.asScoped = () => mockAgentClient; registerEndpointRoutes(routerMock, { logFactory: loggingSystemMock.create(), @@ -942,8 +952,8 @@ describe('test endpoint routes', () => { [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => path.startsWith(HOST_METADATA_LIST_ROUTE) )!; - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -971,8 +981,8 @@ describe('test endpoint routes', () => { }, }); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); (mockScopedClient.asCurrentUser.search as jest.Mock) .mockImplementationOnce(() => { throw new IndexNotFoundException(); @@ -1026,8 +1036,8 @@ describe('test endpoint routes', () => { }, }); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.listAgents = jest.fn().mockReturnValue(noUnenrolledAgent); + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); (mockScopedClient.asCurrentUser.search as jest.Mock) .mockImplementationOnce(() => { throw new IndexNotFoundException(); @@ -1142,6 +1152,8 @@ describe('test endpoint routes', () => { endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); mockAgentService = startContract.agentService!; + mockAgentClient = createMockAgentClient(); + mockAgentService.asScoped = () => mockAgentClient; registerEndpointRoutes(routerMock, { logFactory: loggingSystemMock.create(), @@ -1160,8 +1172,8 @@ describe('test endpoint routes', () => { Promise.resolve({ body: legacyMetadataSearchResponseMock() }) ); - mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); - mockAgentService.getAgent = jest.fn().mockReturnValue({ + mockAgentClient.getAgentStatusById.mockResolvedValue('error'); + mockAgentClient.getAgent.mockResolvedValue({ active: true, } as unknown as Agent); @@ -1192,9 +1204,7 @@ describe('test endpoint routes', () => { params: { id: response.hits.hits[0]._id }, }); - mockAgentService.getAgent = jest - .fn() - .mockReturnValue(agentGenerator.generate({ status: 'online' })); + mockAgentClient.getAgent.mockResolvedValue(agentGenerator.generate({ status: 'online' })); (mockScopedClient.asCurrentUser.search as jest.Mock).mockImplementationOnce(() => Promise.resolve({ body: response }) ); @@ -1229,7 +1239,7 @@ describe('test endpoint routes', () => { params: { id: response.hits.hits[0]._id }, }); - mockAgentService.getAgent = jest.fn().mockRejectedValue(new AgentNotFoundError('not found')); + mockAgentClient.getAgent.mockRejectedValue(new AgentNotFoundError('not found')); (mockScopedClient.asCurrentUser.search as jest.Mock).mockImplementationOnce(() => Promise.resolve({ body: response }) @@ -1264,7 +1274,7 @@ describe('test endpoint routes', () => { params: { id: response.hits.hits[0]._id }, }); - mockAgentService.getAgent = jest.fn().mockReturnValue( + mockAgentClient.getAgent.mockResolvedValue( agentGenerator.generate({ status: 'error', }) @@ -1304,7 +1314,7 @@ describe('test endpoint routes', () => { (mockScopedClient.asCurrentUser.search as jest.Mock).mockImplementationOnce(() => Promise.resolve({ body: response }) ); - mockAgentService.getAgent = jest.fn().mockReturnValue({ + mockAgentClient.getAgent.mockResolvedValue({ active: false, } as unknown as Agent); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.test.ts index 1eb9cfaf109a84..41286e44b1bd42 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.test.ts @@ -8,21 +8,21 @@ import { ElasticsearchClient } from 'kibana/server'; import { buildStatusesKuery, findAgentIdsByStatus } from './agent_status'; import { elasticsearchServiceMock } from '../../../../../../../../src/core/server/mocks'; -import { AgentService } from '../../../../../../fleet/server/services'; -import { createMockAgentService } from '../../../../../../fleet/server/mocks'; +import { AgentClient } from '../../../../../../fleet/server/services'; +import { createMockAgentClient } from '../../../../../../fleet/server/mocks'; import { Agent } from '../../../../../../fleet/common/types/models'; import { AgentStatusKueryHelper } from '../../../../../../fleet/common/services'; describe('test filtering endpoint hosts by agent status', () => { let mockElasticsearchClient: jest.Mocked; - let mockAgentService: jest.Mocked; + let mockAgentClient: jest.Mocked; beforeEach(() => { mockElasticsearchClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - mockAgentService = createMockAgentService(); + mockAgentClient = createMockAgentClient(); }); it('will accept a valid status condition', async () => { - mockAgentService.listAgents.mockImplementationOnce(() => + mockAgentClient.listAgents.mockImplementationOnce(() => Promise.resolve({ agents: [], total: 0, @@ -31,14 +31,14 @@ describe('test filtering endpoint hosts by agent status', () => { }) ); - const result = await findAgentIdsByStatus(mockAgentService, mockElasticsearchClient, [ + const result = await findAgentIdsByStatus(mockAgentClient, mockElasticsearchClient, [ 'healthy', ]); expect(result).toBeDefined(); }); it('will filter for offline hosts', async () => { - mockAgentService.listAgents + mockAgentClient.listAgents .mockImplementationOnce(() => Promise.resolve({ agents: [{ id: 'id1' } as unknown as Agent, { id: 'id2' } as unknown as Agent], @@ -56,11 +56,11 @@ describe('test filtering endpoint hosts by agent status', () => { }) ); - const result = await findAgentIdsByStatus(mockAgentService, mockElasticsearchClient, [ + const result = await findAgentIdsByStatus(mockAgentClient, mockElasticsearchClient, [ 'offline', ]); const offlineKuery = AgentStatusKueryHelper.buildKueryForOfflineAgents(); - expect(mockAgentService.listAgents.mock.calls[0][1].kuery).toEqual( + expect(mockAgentClient.listAgents.mock.calls[0][0].kuery).toEqual( expect.stringContaining(offlineKuery) ); expect(result).toBeDefined(); @@ -68,7 +68,7 @@ describe('test filtering endpoint hosts by agent status', () => { }); it('will filter for multiple statuses', async () => { - mockAgentService.listAgents + mockAgentClient.listAgents .mockImplementationOnce(() => Promise.resolve({ agents: [{ id: 'A' } as unknown as Agent, { id: 'B' } as unknown as Agent], @@ -86,13 +86,13 @@ describe('test filtering endpoint hosts by agent status', () => { }) ); - const result = await findAgentIdsByStatus(mockAgentService, mockElasticsearchClient, [ + const result = await findAgentIdsByStatus(mockAgentClient, mockElasticsearchClient, [ 'updating', 'unhealthy', ]); const unenrollKuery = AgentStatusKueryHelper.buildKueryForUpdatingAgents(); const errorKuery = AgentStatusKueryHelper.buildKueryForErrorAgents(); - expect(mockAgentService.listAgents.mock.calls[0][1].kuery).toEqual( + expect(mockAgentClient.listAgents.mock.calls[0][0].kuery).toEqual( expect.stringContaining(`${unenrollKuery} OR ${errorKuery}`) ); expect(result).toBeDefined(); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.ts index f9e04f4edebeec..73bdf3c7c3a81e 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/agent_status.ts @@ -6,7 +6,7 @@ */ import { ElasticsearchClient } from 'kibana/server'; -import { AgentService } from '../../../../../../fleet/server'; +import { AgentClient } from '../../../../../../fleet/server'; import { AgentStatusKueryHelper } from '../../../../../../fleet/common/services'; import { Agent } from '../../../../../../fleet/common/types/models'; import { HostStatus } from '../../../../../common/endpoint/types'; @@ -34,7 +34,7 @@ export function buildStatusesKuery(statusesToFilter: string[]): string | undefin } export async function findAgentIdsByStatus( - agentService: AgentService, + agentClient: AgentClient, esClient: ElasticsearchClient, statuses: string[], pageSize: number = 1000 @@ -59,7 +59,7 @@ export async function findAgentIdsByStatus( let hasMore = true; while (hasMore) { - const agents = await agentService.listAgents(esClient, searchOptions(page++)); + const agents = await agentClient.listAgents(searchOptions(page++)); result.push(...agents.agents.map((agent: Agent) => agent.id)); hasMore = agents.agents.length > 0; } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.test.ts index 6efac10b94fefb..1ae9608ee93973 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.test.ts @@ -8,9 +8,9 @@ import { ElasticsearchClient } from 'kibana/server'; import { findAllUnenrolledAgentIds } from './unenroll'; import { elasticsearchServiceMock } from '../../../../../../../../src/core/server/mocks'; -import { AgentService } from '../../../../../../fleet/server/services'; +import { AgentClient } from '../../../../../../fleet/server/services'; import { - createMockAgentService, + createMockAgentClient, createPackagePolicyServiceMock, } from '../../../../../../fleet/server/mocks'; import { Agent, PackagePolicy } from '../../../../../../fleet/common/types/models'; @@ -18,12 +18,12 @@ import { PackagePolicyServiceInterface } from '../../../../../../fleet/server'; describe('test find all unenrolled Agent id', () => { let mockElasticsearchClient: jest.Mocked; - let mockAgentService: jest.Mocked; + let mockAgentClient: jest.Mocked; let mockPackagePolicyService: jest.Mocked; beforeEach(() => { mockElasticsearchClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - mockAgentService = createMockAgentService(); + mockAgentClient = createMockAgentClient(); mockPackagePolicyService = createPackagePolicyServiceMock(); }); @@ -46,7 +46,7 @@ describe('test find all unenrolled Agent id', () => { perPage: 10, page: 1, }); - mockAgentService.listAgents + mockAgentClient.listAgents .mockImplementationOnce(() => Promise.resolve({ agents: [ @@ -81,7 +81,7 @@ describe('test find all unenrolled Agent id', () => { ); const endpointPolicyIds = ['test-endpoint-policy-id']; const agentIds = await findAllUnenrolledAgentIds( - mockAgentService, + mockAgentClient, mockElasticsearchClient, endpointPolicyIds ); @@ -89,7 +89,7 @@ describe('test find all unenrolled Agent id', () => { expect(agentIds).toBeTruthy(); expect(agentIds).toEqual(['id1', 'id2']); - expect(mockAgentService.listAgents).toHaveBeenNthCalledWith(1, mockElasticsearchClient, { + expect(mockAgentClient.listAgents).toHaveBeenNthCalledWith(1, { page: 1, perPage: 1000, showInactive: true, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts index 2af1c9a597ebb0..99559f6a1b8f03 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/support/unenroll.ts @@ -6,11 +6,11 @@ */ import { ElasticsearchClient } from 'kibana/server'; -import { AgentService } from '../../../../../../fleet/server'; +import type { AgentClient } from '../../../../../../fleet/server'; import { Agent } from '../../../../../../fleet/common/types/models'; export async function findAllUnenrolledAgentIds( - agentService: AgentService, + agentClient: AgentClient, esClient: ElasticsearchClient, endpointPolicyIds: string[], pageSize: number = 1000 @@ -41,7 +41,7 @@ export async function findAllUnenrolledAgentIds( let hasMore = true; while (hasMore) { - const unenrolledAgents = await agentService.listAgents(esClient, searchOptions(page++)); + const unenrolledAgents = await agentClient.listAgents(searchOptions(page++)); result.push(...unenrolledAgents.agents.map((agent: Agent) => agent.id)); hasMore = unenrolledAgents.agents.length > 0; } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.test.ts index 0570eeb708d4ef..b8efa2636d8c79 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.test.ts @@ -11,7 +11,7 @@ import { createMockEndpointAppContextServiceStartContract, createRouteHandlerContext, } from '../../mocks'; -import { createMockAgentService } from '../../../../../fleet/server/mocks'; +import { createMockAgentClient, createMockAgentService } from '../../../../../fleet/server/mocks'; import { getHostPolicyResponseHandler, getAgentPolicySummaryHandler } from './handlers'; import { KibanaResponseFactory, @@ -29,7 +29,7 @@ import { EndpointDocGenerator } from '../../../../common/endpoint/generate_data' import { parseExperimentalConfigValue } from '../../../../common/experimental_features'; import { createMockConfig } from '../../../lib/detection_engine/routes/__mocks__'; import { Agent } from '../../../../../fleet/common/types/models'; -import { AgentService } from '../../../../../fleet/server/services'; +import { AgentClient, AgentService } from '../../../../../fleet/server/services'; import { get } from 'lodash'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ScopedClusterClientMock } from '../../../../../../../src/core/server/elasticsearch/client/mocks'; @@ -101,6 +101,7 @@ describe('test policy response handler', () => { describe('test agent policy summary handler', () => { let mockAgentService: jest.Mocked; + let mockAgentClient: jest.Mocked; let agentListResult: { agents: Agent[]; @@ -122,6 +123,8 @@ describe('test policy response handler', () => { mockResponse = httpServerMock.createResponseFactory(); endpointAppContextService = new EndpointAppContextService(); mockAgentService = createMockAgentService(); + mockAgentClient = createMockAgentClient(); + mockAgentService.asScoped.mockReturnValue(mockAgentClient); emptyAgentListResult = { agents: [], total: 2, @@ -173,7 +176,7 @@ describe('test policy response handler', () => { afterEach(() => endpointAppContextService.stop()); it('should return the summary of all the agent with the given policy name', async () => { - mockAgentService.listAgents + mockAgentClient.listAgents .mockImplementationOnce(() => Promise.resolve(agentListResult)) .mockImplementationOnce(() => Promise.resolve(emptyAgentListResult)); @@ -204,7 +207,7 @@ describe('test policy response handler', () => { }); it('should return the agent summary', async () => { - mockAgentService.listAgents + mockAgentClient.listAgents .mockImplementationOnce(() => Promise.resolve(agentListResult)) .mockImplementationOnce(() => Promise.resolve(emptyAgentListResult)); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.ts index 45b6201c47773f..0e40836c283377 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/policy/handlers.ts @@ -44,6 +44,7 @@ export const getAgentPolicySummaryHandler = function ( endpointAppContext, context.core.savedObjects.client, context.core.elasticsearch.client.asCurrentUser, + request, request.query.package_name, request.query?.policy_id || undefined ); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/policy/service.ts b/x-pack/plugins/security_solution/server/endpoint/routes/policy/service.ts index ced0e00d345855..5d3e862611b0ff 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/policy/service.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/policy/service.ts @@ -8,6 +8,7 @@ import { ElasticsearchClient, IScopedClusterClient, + KibanaRequest, SavedObjectsClientContract, } from '../../../../../../../src/core/server'; import { GetHostPolicyResponse, HostPolicyResponse } from '../../../../common/endpoint/types'; @@ -78,6 +79,7 @@ export async function getAgentPolicySummary( endpointAppContext: EndpointAppContext, soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, + request: KibanaRequest, packageName: string, policyId?: string, pageSize: number = 1000 @@ -89,6 +91,7 @@ export async function getAgentPolicySummary( endpointAppContext, soClient, esClient, + request, `${agentQuery} AND policy_id:${policyId}`, pageSize ) @@ -96,7 +99,7 @@ export async function getAgentPolicySummary( } return transformAgentVersionMap( - await agentVersionsMap(endpointAppContext, soClient, esClient, agentQuery, pageSize) + await agentVersionsMap(endpointAppContext, soClient, esClient, request, agentQuery, pageSize) ); } @@ -104,6 +107,7 @@ export async function agentVersionsMap( endpointAppContext: EndpointAppContext, soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, + request: KibanaRequest, kqlQuery: string, pageSize: number = 1000 ): Promise> { @@ -123,7 +127,8 @@ export async function agentVersionsMap( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const queryResult = await endpointAppContext.service .getAgentService()! - .listAgents(esClient, searchOptions(page++)); + .asScoped(request) + .listAgents(searchOptions(page++)); queryResult.agents.forEach((agent: Agent) => { const agentVersion = agent.local_metadata?.elastic?.agent?.version; if (result.has(agentVersion)) { diff --git a/x-pack/plugins/security_solution/server/endpoint/services/endpoint_fleet_services.ts b/x-pack/plugins/security_solution/server/endpoint/services/endpoint_fleet_services.ts new file mode 100644 index 00000000000000..0c26582f920b1a --- /dev/null +++ b/x-pack/plugins/security_solution/server/endpoint/services/endpoint_fleet_services.ts @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { KibanaRequest } from 'kibana/server'; +import type { + AgentClient, + AgentPolicyServiceInterface, + FleetStartContract, + PackagePolicyServiceInterface, + PackageService, +} from '../../../../fleet/server'; + +export interface EndpointFleetServicesFactoryInterface { + asScoped(req: KibanaRequest): EndpointScopedFleetServicesInterface; + + asInternalUser(): EndpointInternalFleetServicesInterface; +} + +export class EndpointFleetServicesFactory implements EndpointFleetServicesFactoryInterface { + constructor( + private readonly fleetDependencies: Pick< + FleetStartContract, + 'agentService' | 'packageService' | 'packagePolicyService' | 'agentPolicyService' + > + ) {} + + asScoped(req: KibanaRequest): EndpointScopedFleetServicesInterface { + const { + agentPolicyService: agentPolicy, + packagePolicyService: packagePolicy, + agentService, + packageService: packages, + } = this.fleetDependencies; + + return { + agent: agentService.asScoped(req), + agentPolicy, + packages, + packagePolicy, + + asInternal: this.asInternalUser.bind(this), + }; + } + + asInternalUser(): EndpointInternalFleetServicesInterface { + const { + agentPolicyService: agentPolicy, + packagePolicyService: packagePolicy, + agentService, + packageService: packages, + } = this.fleetDependencies; + + return { + agent: agentService.asInternalUser, + agentPolicy, + packages, + packagePolicy, + + asScoped: this.asScoped.bind(this), + }; + } +} + +/** + * The set of Fleet services used by Endpoint + */ +export interface EndpointFleetServicesInterface { + agent: AgentClient; + agentPolicy: AgentPolicyServiceInterface; + packages: PackageService; + packagePolicy: PackagePolicyServiceInterface; +} + +export interface EndpointScopedFleetServicesInterface extends EndpointFleetServicesInterface { + /** + * get internal fleet services instance + */ + asInternal: EndpointFleetServicesFactoryInterface['asInternalUser']; +} + +export interface EndpointInternalFleetServicesInterface extends EndpointFleetServicesInterface { + /** + * get scoped endpoint fleet services instance + */ + asScoped: EndpointFleetServicesFactoryInterface['asScoped']; +} diff --git a/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts index cba94cce832323..db38598ea6dd16 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.test.ts @@ -117,12 +117,16 @@ describe('EndpointMetadataService', () => { it('should throw wrapped error if es error', async () => { const esMockResponse = elasticsearchServiceMock.createErrorTransportRequestPromise({}); esClient.search.mockResolvedValue(esMockResponse); - const metadataListResponse = metadataService.getHostMetadataList(esClient, { - page: 0, - pageSize: 10, - kuery: '', - hostStatuses: [], - }); + const metadataListResponse = metadataService.getHostMetadataList( + esClient, + testMockedContext.fleetServices, + { + page: 0, + pageSize: 10, + kuery: '', + hostStatuses: [], + } + ); await expect(metadataListResponse).rejects.toThrow(EndpointError); }); @@ -176,6 +180,7 @@ describe('EndpointMetadataService', () => { const queryOptions = { page: 1, pageSize: 10, kuery: '', hostStatuses: [] }; const metadataListResponse = await metadataService.getHostMetadataList( esClient, + testMockedContext.fleetServices, queryOptions ); const unitedIndexQuery = await buildUnitedIndexQuery(queryOptions, packagePolicyIds); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.ts b/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.ts index 00bc0618f57ad5..86f4fd28f506a3 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/metadata/endpoint_metadata_service.ts @@ -26,7 +26,6 @@ import { Agent, AgentPolicy, PackagePolicy } from '../../../../../fleet/common'; import { AgentNotFoundError, AgentPolicyServiceInterface, - AgentService, PackagePolicyServiceInterface, } from '../../../../../fleet/server'; import { @@ -57,6 +56,7 @@ import { getAllEndpointPackagePolicies } from '../../routes/metadata/support/end import { getAgentStatus } from '../../../../../fleet/common/services/agent_status'; import { GetMetadataListRequestQuery } from '../../../../common/endpoint/schema/metadata'; import { EndpointError } from '../../../../common/endpoint/errors'; +import { EndpointFleetServicesInterface } from '../endpoint_fleet_services'; type AgentPolicyWithPackagePolicies = Omit & { package_policies: PackagePolicy[]; @@ -84,7 +84,6 @@ export class EndpointMetadataService { constructor( private savedObjectsStart: SavedObjectsServiceStart, - private readonly agentService: AgentService, private readonly agentPolicyService: AgentPolicyServiceInterface, private readonly packagePolicyService: PackagePolicyServiceInterface, private readonly logger?: Logger @@ -156,12 +155,14 @@ export class EndpointMetadataService { * Retrieve a single endpoint host metadata along with fleet information * * @param esClient Elasticsearch Client (usually scoped to the user's context) + * @param fleetServices * @param endpointId the endpoint id (from `agent.id`) * * @throws */ async getEnrichedHostMetadata( esClient: ElasticsearchClient, + fleetServices: EndpointFleetServicesInterface, endpointId: string ): Promise { const endpointMetadata = await this.getHostMetadata(esClient, endpointId); @@ -176,7 +177,7 @@ export class EndpointMetadataService { this.logger?.warn(`Missing elastic agent id, using host id instead ${fleetAgentId}`); } - fleetAgent = await this.getFleetAgent(esClient, fleetAgentId); + fleetAgent = await this.getFleetAgent(fleetServices.agent, fleetAgentId); } catch (error) { if (error instanceof FleetAgentNotFoundError) { this.logger?.warn(`agent with id ${fleetAgentId} not found`); @@ -192,12 +193,12 @@ export class EndpointMetadataService { ); } - return this.enrichHostMetadata(esClient, endpointMetadata, fleetAgent); + return this.enrichHostMetadata(fleetServices, endpointMetadata, fleetAgent); } /** * Enriches a host metadata document with data from fleet - * @param esClient + * @param fleetServices * @param endpointMetadata * @param _fleetAgent * @param _fleetAgentPolicy @@ -206,7 +207,7 @@ export class EndpointMetadataService { */ // eslint-disable-next-line complexity private async enrichHostMetadata( - esClient: ElasticsearchClient, + fleetServices: EndpointFleetServicesInterface, endpointMetadata: HostMetadata, /** * If undefined, it will be retrieved from Fleet using the ID in the endpointMetadata. @@ -242,7 +243,7 @@ export class EndpointMetadataService { ); } - fleetAgent = await this.getFleetAgent(esClient, fleetAgentId); + fleetAgent = await this.getFleetAgent(fleetServices.agent, fleetAgentId); } catch (error) { if (error instanceof FleetAgentNotFoundError) { this.logger?.warn(`agent with id ${fleetAgentId} not found`); @@ -310,12 +311,15 @@ export class EndpointMetadataService { /** * Retrieve a single Fleet Agent data * - * @param esClient Elasticsearch Client (usually scoped to the user's context) + * @param fleetAgentService * @param agentId The elastic agent id (`from `elastic.agent.id`) */ - async getFleetAgent(esClient: ElasticsearchClient, agentId: string): Promise { + async getFleetAgent( + fleetAgentService: EndpointFleetServicesInterface['agent'], + agentId: string + ): Promise { try { - return await this.agentService.getAgent(esClient, agentId); + return await fleetAgentService.getAgent(agentId); } catch (error) { if (error instanceof AgentNotFoundError) { throw new FleetAgentNotFoundError(`agent with id ${agentId} not found`, error); @@ -402,6 +406,7 @@ export class EndpointMetadataService { */ async getHostMetadataList( esClient: ElasticsearchClient, + fleetServices: EndpointFleetServicesInterface, queryOptions: GetMetadataListRequestQuery ): Promise> { const endpointPolicies = await getAllEndpointPackagePolicies( @@ -468,7 +473,7 @@ export class EndpointMetadataService { const endpointPolicy = endpointPoliciesMap[agent.policy_id!]; hosts.push( - await this.enrichHostMetadata(esClient, metadata, agent, agentPolicy, endpointPolicy) + await this.enrichHostMetadata(fleetServices, metadata, agent, agentPolicy, endpointPolicy) ); } } diff --git a/x-pack/plugins/security_solution/server/endpoint/services/metadata/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/metadata/mocks.ts index 166f8345009279..42b0f4f44fdf81 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/metadata/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/metadata/mocks.ts @@ -11,9 +11,14 @@ import { savedObjectsServiceMock } from '../../../../../../../src/core/server/mo import { createMockAgentPolicyService, createMockAgentService, + createMockPackageService, createPackagePolicyServiceMock, } from '../../../../../fleet/server/mocks'; import { AgentPolicyServiceInterface, AgentService } from '../../../../../fleet/server'; +import { + EndpointFleetServicesFactory, + EndpointFleetServicesInterface, +} from '../endpoint_fleet_services'; const createCustomizedPackagePolicyService = () => { const service = createPackagePolicyServiceMock(); @@ -38,6 +43,7 @@ export interface EndpointMetadataServiceTestContextMock { agentPolicyService: jest.Mocked; packagePolicyService: ReturnType; endpointMetadataService: EndpointMetadataService; + fleetServices: EndpointFleetServicesInterface; } export const createEndpointMetadataServiceTestContextMock = ( @@ -46,11 +52,18 @@ export const createEndpointMetadataServiceTestContextMock = ( agentPolicyService: jest.Mocked = createMockAgentPolicyService(), packagePolicyService: ReturnType< typeof createPackagePolicyServiceMock - > = createCustomizedPackagePolicyService() + > = createCustomizedPackagePolicyService(), + packageService: ReturnType = createMockPackageService() ): EndpointMetadataServiceTestContextMock => { + const fleetServices = new EndpointFleetServicesFactory({ + agentService, + packageService, + packagePolicyService, + agentPolicyService, + }).asInternalUser(); + const endpointMetadataService = new EndpointMetadataService( savedObjectsStart, - agentService, agentPolicyService, packagePolicyService ); @@ -61,5 +74,6 @@ export const createEndpointMetadataServiceTestContextMock = ( agentPolicyService, packagePolicyService, endpointMetadataService, + fleetServices, }; }; diff --git a/x-pack/plugins/security_solution/server/fixtures.ts b/x-pack/plugins/security_solution/server/fixtures.ts index cc8f7966cdd1fc..0d8f91e4817308 100644 --- a/x-pack/plugins/security_solution/server/fixtures.ts +++ b/x-pack/plugins/security_solution/server/fixtures.ts @@ -6,12 +6,14 @@ */ import { coreMock } from '../../../../src/core/server/mocks'; +import { createFleetRequestHandlerContextMock } from '../../fleet/server/mocks'; import { licensingMock } from '../../licensing/server/mocks'; function createCoreRequestHandlerContextMock() { return { core: coreMock.createRequestHandlerContext(), licensing: licensingMock.createRequestHandlerContext(), + fleet: createFleetRequestHandlerContextMock(), }; } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts index f8e393fc3994fe..8fcdbd7304656b 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -13,7 +13,7 @@ import { } from 'src/core/server'; import { SearchRequest } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { getTrustedAppsList } from '../../endpoint/routes/trusted_apps/service'; -import { AgentService, AgentPolicyServiceInterface } from '../../../../fleet/server'; +import { AgentClient, AgentPolicyServiceInterface } from '../../../../fleet/server'; import { ExceptionListClient } from '../../../../lists/server'; import { EndpointAppContextService } from '../../endpoint/endpoint_app_context_services'; import { TELEMETRY_MAX_BUFFER_SIZE } from './constants'; @@ -32,7 +32,7 @@ import { export class TelemetryReceiver { private readonly logger: Logger; - private agentService?: AgentService; + private agentClient?: AgentClient; private agentPolicyService?: AgentPolicyServiceInterface; private esClient?: ElasticsearchClient; private exceptionListClient?: ExceptionListClient; @@ -52,7 +52,7 @@ export class TelemetryReceiver { exceptionListClient?: ExceptionListClient ) { this.kibanaIndex = kibanaIndex; - this.agentService = endpointContextService?.getAgentService(); + this.agentClient = endpointContextService?.getAgentService()?.asInternalUser; this.agentPolicyService = endpointContextService?.getAgentPolicyService(); this.esClient = core?.elasticsearch.client.asInternalUser; this.exceptionListClient = exceptionListClient; @@ -70,7 +70,7 @@ export class TelemetryReceiver { throw Error('elasticsearch client is unavailable: cannot retrieve fleet policy responses'); } - return this.agentService?.listAgents(this.esClient, { + return this.agentClient?.listAgents({ perPage: this.max_records, showInactive: true, sortField: 'enrolled_at', diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 87f0ed7193a67f..5e7bf0659947c1 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -402,8 +402,6 @@ export class Plugin implements ISecuritySolutionPlugin { endpointMetadataService: new EndpointMetadataService( core.savedObjects, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - plugins.fleet?.agentService!, - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion plugins.fleet?.agentPolicyService!, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion plugins.fleet?.packagePolicyService!, diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts index 918d3aadfd6e8e..8bbd30a4a6a1d7 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/helpers.ts @@ -9,6 +9,7 @@ import { set } from '@elastic/safer-lodash-set/fp'; import { get, has, head } from 'lodash/fp'; import { IScopedClusterClient, + KibanaRequest, SavedObjectsClientContract, } from '../../../../../../../../../src/core/server'; import { hostFieldsMap } from '../../../../../../common/ecs/ecs_fields'; @@ -180,35 +181,32 @@ export const getHostEndpoint = async ( esClient: IScopedClusterClient; savedObjectsClient: SavedObjectsClientContract; endpointContext: EndpointAppContext; + request: KibanaRequest; } ): Promise => { if (!id) { return null; } - const { esClient, endpointContext } = deps; + const { esClient, endpointContext, request } = deps; const logger = endpointContext.logFactory.get('metadata'); try { - const agentService = endpointContext.service.getAgentService(); + const fleetServices = endpointContext.service.getScopedFleetServices(request); + const endpointMetadataService = endpointContext.service.getEndpointMetadataService(); - if (!agentService) { - throw new Error('agentService not available'); - } - - const endpointData = await endpointContext.service - .getEndpointMetadataService() + const endpointData = await endpointMetadataService // Using `internalUser` ES client below due to the fact that Fleet data has been moved to // system indices (`.fleet*`). Because this is a readonly action, this should be ok to do // here until proper RBOC controls are implemented - .getEnrichedHostMetadata(esClient.asInternalUser, id); + .getEnrichedHostMetadata(esClient.asInternalUser, fleetServices, id); const fleetAgentId = endpointData.metadata.elastic.agent.id; const pendingActions = fleetAgentId ? getPendingActionCounts( esClient.asInternalUser, - endpointContext.service.getEndpointMetadataService(), + endpointMetadataService, [fleetAgentId], endpointContext.experimentalFeatures.pendingActionResponsesWithAck ) diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.test.tsx b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.test.tsx index 77299341238995..89d691e5c9ce82 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.test.tsx +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.test.tsx @@ -14,6 +14,7 @@ import { } from './__mocks__'; import { IScopedClusterClient, + KibanaRequest, SavedObjectsClientContract, } from '../../../../../../../../../src/core/server'; import { EndpointAppContext } from '../../../../../endpoint/types'; @@ -35,6 +36,7 @@ const mockDeps = { }, service: {} as EndpointAppContextService, } as EndpointAppContext, + request: {} as KibanaRequest, }; describe('hostDetails search strategy', () => { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.ts index 7a4301185de4c1..aedb1061af2fa9 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/details/index.ts @@ -23,6 +23,7 @@ import { formatHostItem, getHostEndpoint } from './helpers'; import { EndpointAppContext } from '../../../../../endpoint/types'; import { IScopedClusterClient, + KibanaRequest, SavedObjectsClientContract, } from '../../../../../../../../../src/core/server'; @@ -35,6 +36,7 @@ export const hostDetails: SecuritySolutionFactory = { esClient: IScopedClusterClient; savedObjectsClient: SavedObjectsClientContract; endpointContext: EndpointAppContext; + request: KibanaRequest; } ): Promise => { const aggregations = get('aggregations', response.rawResponse); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/types.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/types.ts index 8fc1192fa95a6d..4fe65b7e219f34 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/types.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/types.ts @@ -7,6 +7,7 @@ import type { IScopedClusterClient, + KibanaRequest, SavedObjectsClientContract, } from '../../../../../../../src/core/server'; import type { @@ -29,6 +30,7 @@ export interface SecuritySolutionFactory { esClient: IScopedClusterClient; savedObjectsClient: SavedObjectsClientContract; endpointContext: EndpointAppContext; + request: KibanaRequest; } ) => Promise>; } diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts index 0883a144615bc5..040ade4dad41ce 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts @@ -49,6 +49,7 @@ export const securitySolutionSearchStrategyProvider = ; From 86956327deeb8929ee92221e71e8ba782a9f5c51 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Wed, 1 Dec 2021 12:43:33 -0500 Subject: [PATCH 027/126] [Fleet] Fix typo in Fleet fixtures (#120098) --- x-pack/test/functional/es_archives/fleet/agents/mappings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/test/functional/es_archives/fleet/agents/mappings.json b/x-pack/test/functional/es_archives/fleet/agents/mappings.json index 24b4a66624305b..1f2df04713c4b8 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/agents/mappings.json @@ -3090,7 +3090,7 @@ ".fleet-agents": { } }, - "index": ".fleet-agent-7", + "index": ".fleet-agents-7", "mappings": { "_meta": { "migrationHash": "87cab95ac988d78a78d0d66bbf05361b65dcbacf" From 4f733acd4f9b5ad739c758ceb269e189447c0b73 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Wed, 1 Dec 2021 12:18:09 -0600 Subject: [PATCH 028/126] [Workplace Search] Factor out Document-level Permissions components for re-use (#120131) * Factor out DocumentPermissionsField component * Factor out DocumentPermissionsCallout component --- .../add_source/connect_instance.test.tsx | 25 +--- .../add_source/connect_instance.tsx | 116 ++---------------- .../document_permissions_callout.test.tsx | 23 ++++ .../document_permissions_callout.tsx | 56 +++++++++ .../document_permissions_field.test.tsx | 49 ++++++++ .../add_source/document_permissions_field.tsx | 105 ++++++++++++++++ 6 files changed, 243 insertions(+), 131 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.tsx diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx index d8696118d7f4e7..c967b20e0450dc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.test.tsx @@ -12,11 +12,10 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiSwitch } from '@elastic/eui'; - import { staticSourceData } from '../../source_data'; import { ConnectInstance } from './connect_instance'; +import { DocumentPermissionsCallout } from './document_permissions_callout'; describe('ConnectInstance', () => { // Needed to mock redirect window.location.replace(oauthUrl) @@ -126,13 +125,6 @@ describe('ConnectInstance', () => { expect(setSourceSubdomainValue).toHaveBeenCalledWith(TEXT); }); - it('calls handler on click', () => { - const wrapper = shallow(); - wrapper.find(EuiSwitch).simulate('change', { target: { checked: true } }); - - expect(setSourceIndexPermissionsValue).toHaveBeenCalledWith(true); - }); - it('handles form submission with oauth source', () => { jest.spyOn(window.location, 'replace').mockImplementationOnce(mockReplace); const wrapper = shallow(); @@ -145,23 +137,10 @@ describe('ConnectInstance', () => { expect(mockReplace).toHaveBeenCalled(); }); - it('renders doc-level permissions message when not available', () => { - const wrapper = shallow(); - - expect(wrapper.find('FormattedMessage')).toHaveLength(1); - }); - - it('renders callout when not synced', () => { - setMockValues({ ...values, indexPermissionsValue: false }); - const wrapper = shallow(); - - expect(wrapper.find('EuiCallOut')).toHaveLength(1); - }); - it('renders documentLevelPermissionsCallout', () => { setMockValues({ ...values, hasPlatinumLicense: false }); const wrapper = shallow(); - expect(wrapper.find('[data-test-subj="DocumentLevelPermissionsCallout"]')).toHaveLength(1); + expect(wrapper.find(DocumentPermissionsCallout)).toHaveLength(1); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx index a6801cf9de3a32..a9e24c7b944aba 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx @@ -11,41 +11,23 @@ import { useActions, useValues } from 'kea'; import { EuiButton, - EuiCallOut, EuiFieldText, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiHorizontalRule, - EuiIcon, - EuiLink, EuiPanel, EuiSpacer, - EuiSwitch, - EuiText, - EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; import { LicensingLogic } from '../../../../../shared/licensing'; import { AppLogic } from '../../../../app_logic'; -import { EXPLORE_PLATINUM_FEATURES_LINK } from '../../../../constants'; -import { DOCUMENT_PERMISSIONS_DOCS_URL, ENT_SEARCH_LICENSE_MANAGEMENT } from '../../../../routes'; import { FeatureIds, Configuration, Features } from '../../../../types'; -import { LEARN_MORE_LINK } from '../../constants'; import { AddSourceLogic } from './add_source_logic'; -import { - CONNECT_WHICH_OPTION_LINK, - CONNECT_DOC_PERMISSIONS_LABEL, - CONNECT_DOC_PERMISSIONS_TITLE, - CONNECT_NEEDS_PERMISSIONS, - CONNECT_NOT_SYNCED_TITLE, - CONNECT_NOT_SYNCED_TEXT, - SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_FEATURE, - SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_TITLE, -} from './constants'; +import { DocumentPermissionsCallout } from './document_permissions_callout'; +import { DocumentPermissionsField } from './document_permissions_field'; import { SourceFeatures } from './source_features'; interface ConnectInstanceProps { @@ -147,94 +129,12 @@ export const ConnectInstance: React.FC = ({ ); - const whichDocsLink = ( - - {CONNECT_WHICH_OPTION_LINK} - - ); - const permissionField = ( - <> - - -

- {CONNECT_DOC_PERMISSIONS_TITLE} -

-
- - - {!needsPermissions && ( - - - {LEARN_MORE_LINK} - - ), - }} - /> - - )} - {needsPermissions && indexPermissionsValue && ( - - {CONNECT_NEEDS_PERMISSIONS} - - {whichDocsLink} - - )} - - {!indexPermissionsValue && ( - <> - -

- {CONNECT_NOT_SYNCED_TEXT} - {needsPermissions && whichDocsLink} -

-
- - )} - - {CONNECT_DOC_PERMISSIONS_LABEL}} - name="index_permissions" - onChange={(e) => setSourceIndexPermissionsValue(e.target.checked)} - checked={indexPermissionsValue} - disabled={!needsPermissions} - /> -
- - - ); - - const documentLevelPermissionsCallout = ( - <> - - - - - - - - {SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_TITLE} - - - - - -

{SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_FEATURE}

-
- - - - {EXPLORE_PLATINUM_FEATURES_LINK} - - -
- - + ); const formFields = ( @@ -242,7 +142,7 @@ export const ConnectInstance: React.FC = ({ {isOrganization && hasPlatinumLicense && permissionField} {!hasOauthRedirect && credentialsFields} {needsSubdomain && subdomainField} - {permissionsExcluded && !hasPlatinumLicense && documentLevelPermissionsCallout} + {permissionsExcluded && !hasPlatinumLicense && } diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.test.tsx new file mode 100644 index 00000000000000..8677592ea289ee --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.test.tsx @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { EuiPanel, EuiLink } from '@elastic/eui'; + +import { DocumentPermissionsCallout } from './document_permissions_callout'; + +describe('DocumentPermissionsCallout', () => { + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(EuiPanel)).toHaveLength(1); + expect(wrapper.find(EuiLink)).toHaveLength(1); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.tsx new file mode 100644 index 00000000000000..3c6980f74bcf52 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_callout.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiPanel, + EuiSpacer, + EuiText, +} from '@elastic/eui'; + +import { EXPLORE_PLATINUM_FEATURES_LINK } from '../../../../constants'; +import { ENT_SEARCH_LICENSE_MANAGEMENT } from '../../../../routes'; + +import { + SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_FEATURE, + SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_TITLE, +} from './constants'; + +export const DocumentPermissionsCallout: React.FC = () => { + return ( + <> + + + + + + + + {SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_TITLE} + + + + + +

{SOURCE_FEATURES_DOCUMENT_LEVEL_PERMISSIONS_FEATURE}

+
+ + + + {EXPLORE_PLATINUM_FEATURES_LINK} + + +
+ + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.test.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.test.tsx new file mode 100644 index 00000000000000..5cf5863f58b321 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.test.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { shallow } from 'enzyme'; + +import { EuiCallOut, EuiPanel, EuiSwitch } from '@elastic/eui'; + +import { DocumentPermissionsField } from './document_permissions_field'; + +describe('DocumentPermissionsField', () => { + const setValue = jest.fn(); + + const props = { + needsPermissions: true, + indexPermissionsValue: true, + setValue, + }; + + it('renders', () => { + const wrapper = shallow(); + + expect(wrapper.find(EuiPanel)).toHaveLength(1); + }); + + it('renders doc-level permissions message when not available', () => { + const wrapper = shallow(); + + expect(wrapper.find('FormattedMessage')).toHaveLength(1); + }); + + it('renders callout when not synced', () => { + const wrapper = shallow(); + + expect(wrapper.find(EuiCallOut)).toHaveLength(1); + }); + + it('calls handler on click', () => { + const wrapper = shallow(); + wrapper.find(EuiSwitch).simulate('change', { target: { checked: true } }); + + expect(setValue).toHaveBeenCalledWith(true); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.tsx new file mode 100644 index 00000000000000..1b1043ecbc3d2a --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/document_permissions_field.tsx @@ -0,0 +1,105 @@ +/* + * Copyright 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 { + EuiCallOut, + EuiLink, + EuiPanel, + EuiSpacer, + EuiSwitch, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { DOCUMENT_PERMISSIONS_DOCS_URL } from '../../../../routes'; +import { LEARN_MORE_LINK } from '../../constants'; + +import { + CONNECT_WHICH_OPTION_LINK, + CONNECT_DOC_PERMISSIONS_LABEL, + CONNECT_DOC_PERMISSIONS_TITLE, + CONNECT_NEEDS_PERMISSIONS, + CONNECT_NOT_SYNCED_TITLE, + CONNECT_NOT_SYNCED_TEXT, +} from './constants'; + +interface Props { + needsPermissions: boolean; + indexPermissionsValue: boolean; + setValue(indexPermissionsValue: boolean): void; +} + +export const DocumentPermissionsField: React.FC = ({ + needsPermissions, + indexPermissionsValue, + setValue, +}) => { + const whichDocsLink = ( + + {CONNECT_WHICH_OPTION_LINK} + + ); + + return ( + <> + + +

+ {CONNECT_DOC_PERMISSIONS_TITLE} +

+
+ + + {!needsPermissions && ( + + + {LEARN_MORE_LINK} + + ), + }} + /> + + )} + {needsPermissions && indexPermissionsValue && ( + + {CONNECT_NEEDS_PERMISSIONS} + + {whichDocsLink} + + )} + + {!indexPermissionsValue && ( + <> + +

+ {CONNECT_NOT_SYNCED_TEXT} + {needsPermissions && whichDocsLink} +

+
+ + )} + + {CONNECT_DOC_PERMISSIONS_LABEL}} + name="index_permissions" + onChange={(e) => setValue(e.target.checked)} + checked={indexPermissionsValue} + disabled={!needsPermissions} + /> +
+ + + ); +}; From e14496c8650bbc9ff18b9eb2897c639eb450b481 Mon Sep 17 00:00:00 2001 From: Orhan Toy Date: Wed, 1 Dec 2021 19:38:01 +0100 Subject: [PATCH 029/126] [Crawler] Make domain validation optional (#120063) --- .../add_domain/add_domain_logic.test.ts | 69 +++++++++++++++++++ .../components/add_domain/add_domain_logic.ts | 40 ++++++++++- .../add_domain/add_domain_validation.test.tsx | 33 ++++++++- .../add_domain/add_domain_validation.tsx | 53 +++++++++++++- 4 files changed, 189 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts index 3f913d76f475dc..4b229b3687174c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts @@ -37,6 +37,7 @@ import { getDomainWithProtocol } from './utils'; const DEFAULT_VALUES: AddDomainLogicValues = { addDomainFormInputValue: 'https://', entryPointValue: '/', + canIgnoreValidationFailure: false, displayValidation: false, domainValidationResult: { steps: { @@ -47,6 +48,7 @@ const DEFAULT_VALUES: AddDomainLogicValues = { }, }, allowSubmit: false, + ignoreValidationFailure: false, isValidationLoading: false, hasBlockingFailure: false, hasValidationCompleted: false, @@ -193,6 +195,31 @@ describe('AddDomainLogic', () => { }); }); + describe('setIgnoreValidationFailure', () => { + beforeEach(() => { + mount({ + addDomainFormInputValue: 'https://elastic.co', + entryPointValue: '/customers', + hasValidationCompleted: true, + errors: ['first error', 'second error'], + domainValidationResult: { + steps: { + contentVerification: { state: 'loading' }, + indexingRestrictions: { state: 'loading' }, + initialValidation: { state: 'loading' }, + networkConnectivity: { state: 'loading' }, + }, + }, + }); + + AddDomainLogic.actions.setIgnoreValidationFailure(true); + }); + + it('should set the input value', () => { + expect(AddDomainLogic.values.ignoreValidationFailure).toEqual(true); + }); + }); + describe('submitNewDomain', () => { it('should clear errors', () => { mount({ @@ -663,6 +690,32 @@ describe('AddDomainLogic', () => { }); }); + describe('canIgnoreValidationFailure', () => { + it('is true when any steps have blocking failures', () => { + mount({ + hasValidationCompleted: true, + domainValidationResult: { + steps: { + contentVerification: { state: 'invalid', blockingFailure: true }, + indexingRestrictions: { state: 'valid' }, + initialValidation: { state: 'valid' }, + networkConnectivity: { state: 'valid' }, + }, + }, + }); + + expect(AddDomainLogic.values.canIgnoreValidationFailure).toEqual(true); + }); + + it('is false when validation has not completed', () => { + mount({ + hasValidationCompleted: false, + }); + + expect(AddDomainLogic.values.canIgnoreValidationFailure).toEqual(false); + }); + }); + describe('allowSubmit', () => { it('is true when a user has validated all steps and has no failures', () => { mount({ @@ -678,6 +731,22 @@ describe('AddDomainLogic', () => { expect(AddDomainLogic.values.allowSubmit).toEqual(true); }); + + it('is true when a user ignores validation failure', () => { + mount({ + ignoreValidationFailure: true, + domainValidationResult: { + steps: { + contentVerification: { state: 'valid' }, + indexingRestrictions: { state: 'valid' }, + initialValidation: { state: 'invalid' }, + networkConnectivity: { state: 'invalid' }, + }, + }, + }); + + expect(AddDomainLogic.values.allowSubmit).toEqual(true); + }); }); describe('displayValidation', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts index 494d123cae1254..36fe00308bf863 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts @@ -37,11 +37,13 @@ import { export interface AddDomainLogicValues { addDomainFormInputValue: string; allowSubmit: boolean; + canIgnoreValidationFailure: boolean; domainValidationResult: CrawlerDomainValidationResult; entryPointValue: string; errors: string[]; hasBlockingFailure: boolean; hasValidationCompleted: boolean; + ignoreValidationFailure: boolean; isValidationLoading: boolean; displayValidation: boolean; } @@ -61,6 +63,7 @@ export interface AddDomainLogicActions { setDomainValidationResult(change: CrawlerDomainValidationResultChange): { change: CrawlerDomainValidationResultChange; }; + setIgnoreValidationFailure(newValue: boolean): boolean; startDomainValidation(): void; submitNewDomain(): void; validateDomainInitialVerification( @@ -84,6 +87,7 @@ const DEFAULT_SELECTOR_VALUES = { }, } as CrawlerDomainValidationResult, allowSubmit: false, + ignoreValidationFailure: false, isValidationLoading: false, }; @@ -97,6 +101,7 @@ export const AddDomainLogic = kea ({ errors }), setAddDomainFormInputValue: (newValue) => newValue, setDomainValidationResult: (change: CrawlerDomainValidationResultChange) => ({ change }), + setIgnoreValidationFailure: (newValue) => newValue, startDomainValidation: true, submitNewDomain: true, validateDomainInitialVerification: (newValue, newEntryPointValue) => ({ @@ -155,6 +160,14 @@ export const AddDomainLogic = kea errors, }, ], + ignoreValidationFailure: [ + DEFAULT_SELECTOR_VALUES.ignoreValidationFailure, + { + clearDomainFormInputValue: () => DEFAULT_SELECTOR_VALUES.ignoreValidationFailure, + setAddDomainFormInputValue: () => DEFAULT_SELECTOR_VALUES.ignoreValidationFailure, + setIgnoreValidationFailure: (_, newValue: boolean) => newValue, + }, + ], }), selectors: ({ selectors }) => ({ isValidationLoading: [ @@ -174,9 +187,32 @@ export const AddDomainLogic = kea !!Object.values(domainValidationResult.steps).find((step) => step.blockingFailure), ], + canIgnoreValidationFailure: [ + () => [selectors.hasValidationCompleted, selectors.domainValidationResult], + (hasValidationCompleted: boolean, domainValidationResult: CrawlerDomainValidationResult) => { + if (!hasValidationCompleted) { + return false; + } + + return ( + domainValidationResult.steps.indexingRestrictions.blockingFailure || + domainValidationResult.steps.contentVerification.blockingFailure + ); + }, + ], allowSubmit: [ - () => [selectors.hasValidationCompleted, selectors.hasBlockingFailure], - (hasValidationCompleted, hasBlockingFailure) => hasValidationCompleted && !hasBlockingFailure, + () => [ + selectors.ignoreValidationFailure, + selectors.hasValidationCompleted, + selectors.hasBlockingFailure, + ], + (ignoreValidationFailure, hasValidationCompleted, hasBlockingFailure) => { + if (ignoreValidationFailure) { + return true; + } + + return hasValidationCompleted && !hasBlockingFailure; + }, ], displayValidation: [ () => [selectors.isValidationLoading, selectors.hasValidationCompleted], diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.test.tsx index d701eb62d1312c..ded46faf59f2c9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.test.tsx @@ -5,16 +5,22 @@ * 2.0. */ -import { setMockValues } from '../../../../../__mocks__/kea_logic'; +import { setMockActions, setMockValues } from '../../../../../__mocks__/kea_logic'; import React from 'react'; import { shallow } from 'enzyme'; +import { EuiCheckbox } from '@elastic/eui'; + import { AddDomainValidation } from './add_domain_validation'; import { ValidationStepPanel } from './validation_step_panel'; describe('AddDomainValidation', () => { + const actions = { + setIgnoreValidationFailure: jest.fn(), + }; + it('contains four validation steps', () => { setMockValues({ addDomainFormInputValue: 'https://elastic.co', @@ -32,4 +38,29 @@ describe('AddDomainValidation', () => { expect(wrapper.find(ValidationStepPanel)).toHaveLength(4); }); + + it('can ignore validation failure', () => { + setMockValues({ + canIgnoreValidationFailure: true, + ignoreValidationFailure: false, + addDomainFormInputValue: 'https://elastic.co', + domainValidationResult: { + steps: { + contentVerification: { state: 'invalid', blockingFailure: true }, + indexingRestrictions: { state: 'valid' }, + initialValidation: { state: 'valid' }, + networkConnectivity: { state: 'valid' }, + }, + }, + }); + setMockActions(actions); + + const wrapper = shallow(); + wrapper + .find(EuiCheckbox) + .first() + .simulate('change', { target: { checked: true } }); + + expect(actions.setIgnoreValidationFailure).toHaveBeenCalledWith(true); + }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx index 4d57cce653d4e8..8840b8d355864a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx @@ -7,9 +7,17 @@ import React from 'react'; -import { useValues } from 'kea'; +import { useActions, useValues } from 'kea'; -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; +import { + EuiButton, + EuiCheckbox, + EuiFlexGroup, + EuiFlexItem, + EuiPanel, + EuiSpacer, + EuiText, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -17,7 +25,13 @@ import { AddDomainLogic } from './add_domain_logic'; import { ValidationStepPanel } from './validation_step_panel'; export const AddDomainValidation: React.FC = () => { - const { addDomainFormInputValue, domainValidationResult } = useValues(AddDomainLogic); + const { + addDomainFormInputValue, + canIgnoreValidationFailure, + domainValidationResult, + ignoreValidationFailure, + } = useValues(AddDomainLogic); + const { setIgnoreValidationFailure } = useActions(AddDomainLogic); return ( <> @@ -77,6 +91,39 @@ export const AddDomainValidation: React.FC = () => { )} /> + {canIgnoreValidationFailure && ( + + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.ignoreValidationTitle', + { + defaultMessage: 'Ignore validation failures and continue', + } + )} + + + + {i18n.translate( + 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.ignoreValidationDescription', + { + defaultMessage: + 'The web crawler will be unable to index any content on this domain until the errors above are addressed.', + } + )} + + + } + checked={ignoreValidationFailure} + onChange={(e) => setIgnoreValidationFailure(e.target.checked)} + /> + + + )} ); From 51d8a9dbc1a50f2a3334bcb4ce21a4e36115fe2c Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Wed, 1 Dec 2021 10:41:45 -0800 Subject: [PATCH 030/126] [DOCS] Updates Add Data page (#117957) * [DOCS] Updates add data page * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Lisa Cawley * [DOCS] Incorporates review comments * [DOCS] Fixes path to Integrations view * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: DeDe Morton * [DOCS] Improves integrations section based on feedback * [DOCS] Add description of Enterprise Search integrations * [DOCS] Adds link to observability docs * [DOCS] adds info for security integrations * [DOCS] Adds content for language clients * [DOCS] Updates description of security * [DOCS] Incorporates review comments and updates image * [DOCS] Improves doc organization * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * Update docs/setup/connect-to-elasticsearch.asciidoc * Update docs/setup/connect-to-elasticsearch.asciidoc Co-authored-by: Kaarina Tungseth * [DOCS] Incorporates review comments Co-authored-by: Lisa Cawley Co-authored-by: DeDe Morton Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Kaarina Tungseth --- docs/setup/connect-to-elasticsearch.asciidoc | 125 ++++++++++--------- docs/setup/images/add-data-fv.png | Bin 285124 -> 231075 bytes docs/setup/images/add-data-tutorials.png | Bin 427705 -> 0 bytes docs/setup/images/add-integration.png | Bin 0 -> 412211 bytes docs/setup/images/add-sample-data.png | Bin 0 -> 582905 bytes docs/setup/images/addData_fleet_7.15.0.png | Bin 292847 -> 0 bytes docs/setup/images/addData_home_7.15.0.png | Bin 150994 -> 0 bytes docs/setup/images/integration-filter.png | Bin 0 -> 37629 bytes 8 files changed, 69 insertions(+), 56 deletions(-) delete mode 100644 docs/setup/images/add-data-tutorials.png create mode 100644 docs/setup/images/add-integration.png create mode 100644 docs/setup/images/add-sample-data.png delete mode 100644 docs/setup/images/addData_fleet_7.15.0.png delete mode 100644 docs/setup/images/addData_home_7.15.0.png create mode 100644 docs/setup/images/integration-filter.png diff --git a/docs/setup/connect-to-elasticsearch.asciidoc b/docs/setup/connect-to-elasticsearch.asciidoc index b1d9d3ea2ea185..1d698e90879373 100644 --- a/docs/setup/connect-to-elasticsearch.asciidoc +++ b/docs/setup/connect-to-elasticsearch.asciidoc @@ -1,67 +1,86 @@ [[connect-to-elasticsearch]] -== Add your data -++++ -Add data -++++ +== Add data -To start working with your data in {kib}, use one of the many ingest options, -available from the home page. -You can collect data from an app or service, -or upload a file that contains your data. If you're not ready to use your own data, -add a sample data set and give {kib} a test drive. +The best way to add data to the Elastic Stack is to use one of our many integrations, +which are pre-packaged assets that are available for a wide array of popular +services and platforms. With integrations, you can add monitoring for logs and +metrics, protect systems from security threats, and more. -[role="screenshot"] -image::images/addData_home_7.15.0.png[Built-in options for adding data to Kibana: Add data, Add Elastic Agent, Upload a file] - -[float] -[[add-data-tutorial-kibana]] -=== Add data - -Want to ingest logs, metrics, security, or application data? -Install and configure a Beats data shipper or other module to periodically collect the data -and send it to {es}. You can then use the pre-built dashboards to explore and analyze the data. +All integrations are available in a single view, and +{kib} guides you there from the *Welcome* screen, home page, and main menu. [role="screenshot"] -image::images/add-data-tutorials.png[Add Data tutorials] +image::images/add-integration.png[Integrations page from which you can choose integrations to start collecting and analyzing data] -[discrete] -=== Add Elastic Agent +NOTE: When an integration is available for both +https://www.elastic.co/guide/en/fleet/master/beats-agent-comparison.html[Elastic Agent and Beats], +the *Integrations* view defaults to the +Elastic Agent integration, if it is generally available (GA). +To show a +Beats integration, use the filter below the side navigation. -*Elastic Agent* is the next generation of -data integration modules, offering -a centralized way to set up your integrations. +[float] +=== Add data with Elastic solutions + +A good place to start is with one of our Elastic solutions, which +offer experiences for common use cases. + +* *Web site search crawler.* +Discover, extract, and index your web content into App Search engines using the +{app-search-ref}/web-crawler.html[Enterprise Search web site crawler]. +Search across Google Drive, GitHub, Salesforce, and many other web services using +{workplace-search-ref}/workplace-search-content-sources.html[Workplace Search content sources]. + +* *Elastic APM.* +Get logs, metrics, traces, and uptime data into the Elastic Stack. +Integrations are available for popular services and platforms, +such as Nginx, AWS, and MongoDB, +and generic input types like log files. +Refer to {observability-guide}/observability-introduction.html[Elastic Observability] +for more information. + +* *Endpoint Security.* +Protect your hosts and send logs, metrics, and endpoint security data +to Elastic Security. +Refer to {security-guide}/ingest-data.html[Ingest data to Elastic Security] +for more information. -With *Fleet*, you can add -and manage integrations for popular services and platforms, providing -an easy way to collect your data, and manage {elastic-agent} installations in standalone or {fleet} mode. The integrations -ship with dashboards and visualizations, -so you can quickly get insights into your data, and {fleet} mode offers several advantages: +[float] +=== Add data with programming languages -* A central place to configure and monitor your {agents}. +Add any data to the Elastic Stack using a programming language, +such as JavaScript, Java, Python, and Ruby. +Details for each programming language library that Elastic provides are in the +https://www.elastic.co/guide/en/elasticsearch/client/index.html[{es} Client documentation]. -* An overview of the data ingest in your {es} cluster. +If you are running {kib} on our hosted {es} Service, +click *View deployment details* on the *Integrations* view +to verify your {es} endpoint and Cloud ID, and create API keys for integestion. -* Multiple integrations to collect and transform data. +[float] +=== Add sample data -[role="screenshot"] -image::images/addData_fleet_7.15.0.png[Add data using Fleet] +Sample data sets come with sample visualizations, dashboards, and more to help you +explore {kib} before you add your own data. +In the *Integrations* view, search for *Sample Data*, and then add the type of +data you want. -To get started, refer to -{observability-guide}/ingest-logs-metrics-uptime.html[Ingest logs, metrics, and uptime data with {agent}]. +[role="screenshot"] +image::images/add-sample-data.png[eCommerce, flights, and web logs sample data sets that you can explore in Kibana] [discrete] [[upload-data-kibana]] -=== Upload a file +=== Upload a data file If you have a log file or delimited CSV, TSV, or JSON file, you can upload it, view its fields and metrics, and optionally import it into {es}. +In the *Integrations* view, search for *Upload a file*, and then drop your file on the target. -NOTE: This feature is not intended for use as part of a repeated production -process, but rather for the initial exploration of your data. +By default, you can upload a file up to 100 MB. This value is configurable up to 1 GB in +<>. -You can upload a file up to 100 MB. This value is configurable up to 1 GB in -<>. To upload a file with geospatial -data, refer to <>. +NOTE: The upload feature is not intended for use as part of a repeated production +process, but rather for the initial exploration of your data. [role="screenshot"] image::images/add-data-fv.png[Uploading a file in {kib}] @@ -70,22 +89,16 @@ The {stack-security-features} provide roles and privileges that control which users can upload files. To upload a file in {kib} and import it into an {es} index, you'll need: -* `all` {kib} privileges for *Discover* * `manage_pipeline` or `manage_ingest_pipelines` cluster privilege * `create`, `create_index`, `manage`, and `read` index privileges for the index +* `all` {kib} privileges for *Discover* and *Data Views Management* -You can manage your roles, privileges, and spaces in **{stack-manage-app}** in -{kib}. For more information, refer to -<>. +You can manage your roles, privileges, and spaces in **{stack-manage-app}**. [discrete] -=== Additional options for loading your data - -If the {kib} ingest options don't work for you, you can index your -data into Elasticsearch with {ref}/getting-started-index.html[REST APIs] -or https://www.elastic.co/guide/en/elasticsearch/client/index.html[client libraries]. -After you add your data, you're required to create a <> to tell -{kib} where to find the data. +=== What's next? -* To add data for Elastic Observability, refer to {observability-guide}/add-observability-data.html[Send data to Elasticsearch]. -* To add data for Elastic Security, refer to https://www.elastic.co/guide/en/security/current/ingest-data.html[Ingest data to Elastic Security]. +To take your investigation +to a deeper level, use <> and quickly gain insight to your data: +search and filter your data, get information about the structure of the fields, +and analyze your findings in a visualization. diff --git a/docs/setup/images/add-data-fv.png b/docs/setup/images/add-data-fv.png index 062d5ed88b3ca87480d6d3cd89ab1c5c3a987b29..45edbbc0fdad7e5825fb37e677af53f1f0ee7526 100644 GIT binary patch literal 231075 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
X2rX+M2lLE=p&e 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 CtRVvc literal 285124 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⪚N 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 SugN%k*GnqqXD(k04s0`}cu9r&YR$NR+> zPBvvYg&GvBC176tSqdfP3zT75jaT1aS7SJ+blf*HhtvlvpimcpdYBXD194X}h5K|SaBjsqLWb}X2EJU;Gc+YlKvQuH8f66vL+}u#@5f;sor2aZu z;g47<>NbcJcf;!wCqCBh zz*=~u`bB7~F@Xe74Co&(q`f%N?YvAzSYx5XgJT21%d3NP{00$ zPbQMY@kx9}YBc=r^+K5`Nz_GLF2_&(_p8-!sV3gd@+uEvxaOvR0+bt+80S=_NSsJ4 z?px-1t_*f{B7as$xX&fNyV0ti^(f3VMt>~Z=O;{%=ia;@^uPWW08a-f8bt}{S7!@? zQ>FmbYYJ$4AzA?9u#217#x%ZHP2e06^OqK*!$(EbviWVz?TEv@zDeQg*Z?tfsk6KP zp*(80?DRnrP=>&Yt!$M~zj>9D$X)`A{tY-R zn_G9KatPKvne4x<-JAtNx2N>kNGFZpT_$QD3)yr#_E}5p|Gjz4_xJk%!dvze5`I&M zqCLB-q%u@C=uv*T}J^-nur4@u&KL_lt}jH zqb#Tnj4yAdQu*a?Duu%GMS<`?OHJQlzyI@71)zkEWvS2RJy0Ce5qvHj`Ni$6UWxgD zPBvt3c_%Cnd-3Oj(eG`{7QRpZfMJ*Hq$1Kz7oiT94SY%coO97mutVbX3+RUdOLr*D zu*58ZH7qi<7XF-H{5KZv&;H{3`P>#ip7lNiJc?OvQa42t0<5K+K!UfZ6ExvmIHhU@ z&j26d?6wm-FwZNU#;B}jzK5Oln1a%88ukb`&>?Mq>HsPV=NTcqSv}ZmX?T;3+o2WWZfcW*F z`tToqJ=+ySbZxlCW9N;nSafdJ2TpxU+WsxiEG(Q#gmKciDyV3#I|;qi@3TIc1o*9# z$?KC#R&M>a4;J$T!~k$*e=cF&&2zpwr3DTIQns$^;}YCvk`J7}%-Yfj%VSdHI-#*B z&vyyDE|YaeWgzsgdxnlj-He>?nl6OE+}^h9o!SzIt)#ymEc(s#a&YTsCvxjlWKVtz zC1Zb@{W`aWmjCE*ThI!S#3-RZu1I>X-ZewjQsx$!p|ny(1N-{Zts|s77q8aO2LLc% z)(b!ZXaC*Myhw1Y%1QV^)d*|F@=E|Q<}e-88e43g0x&F#%`TQ=gXRYZTG9h4m%vIu z^;qS5L254E_82A^x6_U6OgN2lLu&ylzRLMQ!#O2Biseg#>o{T(LV?7P~k{IAmN*Lf+) ze*{$2?o!r&FAfhA%Sw->vK$?x$_t=$9F7TrEyMbk3%Vv9fp~IF%s*0K#bGd?BY`Un z-4^%poa`bkGsWMmEUs6slJSL0JqHfycxNDAPgpt(DCQs%s6OTG`i}vwd&WVWmk%h= zD%-&Bch}AVJ`FPk(q&mfVR-BPzcW6+!fm}wz6PRqnO@=V zm!5egp|EAvlW@vs(r;*GBO|o{yt6EHC!h|%gxCS3e)i+H!+kj*$uYYU{%SzDmVmUM zP?J4g6_yCVztsjBGp&!;7lcJNS@q>=t~<9o!4IS)JQp)hgbH>OSqkAfZV8<3o8KQJ zh}QJzBwntW8(b>+Ht?kP@4ugy=_1jI{ZCW&KOZx{{KKfn1K68#D}xMt%&VNuXyt+m zhp1-kLV&Eco!+Hx<|Kp#icYs$nN1u=O)~&(i($hN_${AB!?^ytG4G0((>+-V9}TyV zHvtkguQ5E|>W+bgc)C$)0UW~k*E)bFxvM6+ZAttkKqz6lW4%hgJ;_dDM= z#dA->s_kl?#qq#mDH$c>mS2yqnM%i{aAl^69Es3zi-*vo)t>Q-zCtf|K!UcT2LJr(-V$F)JyL0o)maMHBCv3>+j+X zG3ukG2$u`?)D!X+RPjJnH|>RvRQ`h3B9{}yrW|?fdOr=en*F5;%7Ob!4mSj*S+%_f zyfZpzM@+(Dmw{F`;6u7ZU<)Y2EBv4!5t1Ab`^E@aZ>1lzH`DTu2@Z;m=wijZ}DzJ7sPrK1r^ydvqvSY|oS zRwTg?R0Zgu#n zL@{ZMc7|k5SojT<7L62k%a*8k4iD?K`Y@IKt@&ReTw2)Q1l;Gvsj+uAMyER7&AKn+ z?fmc?apz?i*;6W#yvnhi0yRL;3y67ImcJI!n3u!^! z>8h7w7vk*)3e6qWpA=9E-9GiD*e-2t-JQW*n97wCf9a-bS)7J29Y6sgjscWDVVGzICM03o5bVCWDC1kU5PzkTNS&DqPd z*I#GO%$o5pXEMIN?^EvUzOMp)7{OulzZs(ahc<*0*j(*g6*lnU6>z6O+D9`zlF2?8o?MHP!4N9`ic9Z{2Oa1>8z%+#c=P>x|uHnD^s8ZmE z4FfiU|NDae-$m}---A;XzS=$i+mFfyeu!HZ{X2d)|N5L88NlU?bM}_R-+t5x@I&Vv z=KpoA_20{NUk~gmI@d(jzp)el>rwyNj(`2i{@IRy-Ew>J&vyLl6YQVu_}822^gp-b zf86>1aV!0EJO1^ix-$LG?fBOP#XrUBFRJu^iq-$K1pm($_5XdbdfbPDH%%FyxL!V~ z%vQ3C`uFHzdm)ZC;(_Nm)Tzai^J!Ctc33T3E-3J zrTCJ+3!j4a0bmP{;^_L@p!5L%r7SAuwSOCw&H@-Lrr<01x3R^&2QSj?|8!mX+t}iD z6tFekUoQLGi0z^Z0A3HiW;^`H-T1%wn*V&r{|1Er6WssjL;m#<@Y_E-@~>+P;J5nE zj{F6p`R8c;pN^Y<|J^@#XdP1 z(;ND!PM}W}G%dG9eYWBiq5b#&{|}?-c&pxyAPTFlU9=T17~sU2In|6KgGGp(@8>%{ zYP^+oBKFw)DvRRC>$GrT`jS=PySzYnltanZ{kN{c#hhlG{1kR_j?nNk;ioA*UUVN; zpSdG)es1&P{_1+;!g}Ko`&WC#cdBW}LiKVvf))sUK$gEg1t&Ie*NDCm2R5_f&Z9e9 zW4964_)j&GkLxZUk-j9$z%&E)H`QuHHU7{@h6Kt||gi?PUcwlN7bU_kiQ1S#Ha3`*D`G!(%BWTKrkG zz^sI&ut8U}{ z{@g8(jdyN@Dl~J~JsY+NhMT`42F8ar+0pMDZK4~wwJ^k@8@jQbSGWr75xo`nyN6dO zr2Q7XY(|Y+sWrCPMx=^QmcFvMezv<_1KkH(9~P@m70Yv+K9;B8xgDFaW={D&=_L;FH^8H}G$Zi>a-0(8o$- z>CcN@zn^@)l$Om}&?H;aZUwXCW5ddI!V$E+)YnxszHK*BAORSMyjP{_^)l3k?H~B~ z=(8Kk&GPmmr{3Li#+}OiXkAJZH~WoKEQidd>T$bTeSkOo{{2|~*do)0;e@vDfm+ks zeMGHYR#-SwajQQNLf^^>WgS3&IoMXjCpEY)A?}^OWTnxbM<*J0e&BYFZVJirlY}$- z1?LG#>vlCW3hQ1*p^2_VA+vD6eA@j8$lj-Og{;aR*1}dVT}D&v;z#02EM%C6n12CU zf&v?Vexl2WnU_0B0U7$C@w;(mrSTzmIremDrBh1?hy2~UVWLyO5^9^IaPSE2rOFnZ zdPXgr>$JShy!De)=f?I#u>?2~D=il~!;&`|7 zPreZ-s{zZm>4j685KvCd zbsTwNxy;7e`5w;S$M#Mm4orwiU*a<|`1;8QxN^sFDw}Icx*=ReAHLSMopZ2xYJ2Xh z)bc?g$<^ZbT`t*muCm}%<3UlpL^xC~BP5k{TgVFaJUmT|l1fg{X3AIo%QHk{m}a~% zUx*b8^W@IKHj`EwiXwQ<7Ys|9o6r4q!DAf$^F{l+O!K-;PmjOhTI{CG$Y&rp)Nch$Zwe!A8`t*P|nmt4@q{)V)}S#%>A+A4R-j*pYLcHRH?Y zht_hAm)pf2Y(J^x{pM#fg{#odW_8<`zM5HD#qS@d9NO=FbVv!q3Yv<3y zwM$KE9@ctF6gvCDCJ<1b`>a;`%|>ac5ZmLUP*r;8i>cskwf^dDRW{jO+BsV6_UXVr zGYjuuc$f8oZ@1#xSX-h-|ImlmxC)_{z?R<^ck(S2ysSArpxJzoe3tgBk3;li!aXBFGj6X*SF_~9M@pA05*_wm50pQexprWIeTekP|6{NO>QGoH zv|MA|%3mYo<90)&tO-b1HYeT!PC(}mQ-j%&_CT0*aO(N(UQBT6Ky90Pg3$5$ zjxw-7IJD&T=y%_EZ+#1fzd&*C#3bDT9jQM*pbT7ta);^eIK|p_IGwMQ4mirH?Pca! zFR|d2;V zP15JuBfdWrK(k%gO@F=51IvdiL) zlJ3&(%9V*KwB=m*mOte=L2%MQ!gq{A29<)AQlZxd**biRM;nk!A9}-H$z+kzG`L8*z)13^}g2AcMeuVcQ zc>~@+eDv!Mvu5SXj8WH?Sp@9r*~XN;K|7~M^Q`di7=^`8#lcP~*-j~}YZ{|7X#vNk zR1Ex2QkJyqqeD`A9p(=@FFhTp&2*fs?(kM(xs?^4D3)_t;7*M_-sMhwNnaO!WWAPG ztG4o)-9o2Io4D#{UeHGIMQjqr_kgGSJy(`n^D3FoKUJi11{^&A$~{$D4!L=4Dmma{ zY0Kcr}nq;mgI zPV|={$Bfr6FZkj`3Yml-UbFJw%)Tt|s~upN0qDB=Kl$(6Xsnl3Hva-wEtX&vcmi~Z z4ZH$C=E)V-_@H_AWAtWkxZ4St*fAHy^kI^SW%~_3th>D@Eq>< zhLk$b^#_=PQ2*mba`{Oi*=;UDgXccpFk0B+p-=sojsBOWySQ)6ba$H&Q8i3mZfJ{g zml;7K_v*$DOU1%Me3;3SG=1xNU%VM_uQ5c4xUP6b4JFNQ-&JZ$p_Z4kCU<;mY z7qk7IULYwMXB8mLJ7nJ--D8IME~OUPS%o&|>MM92*;|fV@Hi{)=lPMXq)}lk-s_I@ z)L^#2{9KBx%2en6*EjUhh7eE-+=`t{5ethEGSCDLb$E+znPX69b(C26%?IMg_Gh<6 zDB8F34RX07WM09VZfcFzWj&02%b$?YT`Na_m)bDT1j}@Db*RpMqX8+DPt3TcqD6WF zokB^s!IjtTN#^xtDNB(Yve&0lkBpoiApg9dBoi^;k!02xAE>WC=~`Dhm2f@T5Xm!= z@lvF*-aA0I#L228DmRRyn>Sli;c7laWl%3lok);&XUyB)S$l`IfK^pGjc60le8EGW zKgRN%8d0}zmz-rCF6AAsu!pp_3MXbnN;Gh;PJ3_7ci65auLL0w3miW4mwd{9P_FW5 z8F!xL^uPG@Fj8i(FW;t{e8aLRVXL0+CZEq1Cd(#lw4B_^UhciA?^V$RHJ9~zZm+!^ z*_~LY$L?Mi-l4()H`I*fcha```e%PePdkTzosOZ6fUzKzf8^nlBQfiqy4CEvVZv=c z4u`A0hOf{^JX^a2zbyQ)-dy4EN5!=C-eQvT`DA)AT%r=ck@u}HeKql}bgNMK?#QJz z4ZJtsRh74YQu(90lN!}=m@QPTlMKJHm3x(~dYYwX9Dl}MyMDpMkCEnuoq(dKX6Sn0 zmG($ZI&I(w_HHssAbz;OLVn&paV>DES2vh!?%q>1h_dKv@-Yv5Qe;_Sq(Js4JzB5m zTOhGHy$@#@Ds)H>%YK~gCYowL%epg}Ia=j7t|{%Y;W7;ahN_nOxthf#>$lWb26=c+ z?$WiH*h%dxw_NT=N1I7H$1!t47sMY<(J8 z6orcGaak3jzj$xnf;lPX?M2MB!JPMgjAv;symf15NBS^Phqo`Wwqj=X2(q>jzMQ*~ z%kIa(VUO|V{g0AW^Ib`5ov|YHbABs?s7>lqp!BGpj2wXD&A&K~zikr5W7DYe-0vn1 z>VAizEtvM4J{JzJ_6-s+iqSS|QD;jGc58$qYOia=TavN6-Vb)?N=}WwKtXv1e)84@wCk6!5IDgkZZ zBj{XFlKn3lxa#IXS{yr$iYMvXmOf+NBVKm3DkP&0L7G=J!7K%#C?5QW525p~97=CZ z_^E*_LFJEtNyZkf*Xc{+6^a^-$08)BXZC)SBL$EL5O&!%Qs}m^6}-5G*-kg}sIHkQhEYt#xayj+Vw4NW6uav%^7DGlGoXP6MA4#r;ZLAC1)|r|#oMcY!O&sz~jWufykB_Dyc9i$eX0tAR2x6NjN3 zqBvU1unJi(0$-h1;*yK8RCDtg8ayA;NOX_MvHQ-Q>4DEY^W7_AuT*a{I58D$OtUa3 zyKxv>z+xw?99Vz9X`fnhN@lUA?3Pbwr3vv3NC(kG3ln%WqS=za75B-Qk2aoYl|TL_ zJ9@D81{`g%pCk%ucqzlU#*w?q2uzl*a~YIc!((-VZ-XL4C#8-OO}OxbG_UMEgfMUL zt%_9(yEAl5VHpR)MWo+-+y7x`GGe{O4>TDQ!lrV4=YqZ2#>{2B)~@WP6%e4E)mm3# zh>sUi#u@5eh5lfc^IDTil($ETN@r8i#S6{R8LnO=ca_!`w8T>)m!g^V2>tfdqO z>5{oZc+-j;1&uT)f2+&8=n}!Yd#YK^W>Jx=X03zAX6kbGsaB~jKmN(_5{umT?NvCs zL%QW+<>&){i}6#5BzF@|47)6hW<2+J5 zg0+9~V|+Uwh7uFaLC;p6Cz_rW#Z(dgoU5`m+ch<^ut-w#-RTOa$wYl{O!R!53?dXgkyj0@5ig1!Rt^~h{3 z*Kqtco*K^_L6Ff~*X>Dl;MX154qWsx<-MPJeXdP+%i_cvvqH5*z#uO7q<{?6T8 zoxU!=b*RKdoA~FuFX-E%&Kvr@&1c^hrW)HTd*?24Ay&xjp=CgRqnDeDxpAArV3w(i z-0&TcmZnstD;edIHjF%EKk9s^%22ld@@D;v5INg>gg@49FpCcrPamJ2TQW9QY^H14 zXq{Qws7JrG*u};5iUwgcXI}NZc*j3O*Q7mpsIjDeZ>x)ZV#BA3w@ zYH&R&Lc)q^IwUgJ07ISj-376!F> zO<8q+WH_zMU*DNQ?N5Uv7+eEO*|ykH>t3&KUL~GHp7C=r*^==7qMRE zJauBo(?&wAtQy{sGi119HFvW7awpd}46j?CX|X+6+9u=cE!)#wTF7l*FLKEUTBbjGFg2MXi)2CTAZ+-` zq6T1Wk{Uo%*dk+@%#?Mvn@rlPG$IZ|GI)Fc>MIci%(_bGkYv< zsf%wpQ7;hVZN)YBi>d4T+o$5imuq&X`}Ccr+fl}(afc}Nf~1lU59v|wN7mDBF0Pu@ zmO{N|Br$Cl(C2``lxoZwC|KC1!NN`$DL}uuF~3qTZjt}It?~`(=KHk@&De)m1jqMCOYdYc?|8(b5J_tW2J?zJj+?fHY{wO0QS zBh`k71N+GDp_J55SdjZ8NCshxoX7X9)?`z>@WYl^e#`}>+uPofl**7d!;m81J$#8% zZ1U8(fCQ~}1x7S{Hsgq{pdctS;(diB#<}r?<2IApAG2Nv{je8j8*lZq(8ysT-#i75 z2C=@XpV@bYW4r2+%cH-ScF<34Id+5&Jjk4imYTY3-|d(6NJ*lnz6Uw*;zRnKJoie; z9}`s}wjI&ZW0HeGPkJz_JFORU1L2VtwH~MkgfYe)kBPADqSCwdBQNd><%SrG(Bd7s zBUfvhu^qt&72FP^b(0@kN|sp)NCg9?uP=Fp)?d6|^l`W9&O)ce98BmLH8?5Y`L`BY z0~9COjDfO&MSNq{kN)`yOl0nYU*W6OCbI_Lh~)80^2C)PE%HW|^1ZGjV>YYKbo;Eu zO=(qFl?9n-Zq5Nja3fR>mqt@AiLXerOb_DV18+GZEea^m|yOtlqf>#tUk z_s>-{{&d2){OR0-xsfLgtBm6~a!^yH-Jy;a8GVF2mcRM=J-3!yRavs%%k*3`E}2%` z#Z*fz|KL=LGqiEz6-)b)l0gdM!KtOy@^CE!NdXUxlZ!?K_8~Ra$B*81x1Bil)kaR;dlx=fXUB%c2-j3uAe~ zbY&M@dWq2T!JyV%ijkvm+TqtIn9s^!HuwEc!&|%Pvp{IO^0VcMdxB?dsNlvZTE`JE zUf*>aj|3I-p!lKoqB{i?SLBDG1u1GJ$zE&>&!HKTxy7`E$v`V7(C^On_uDedw`_3R zFhU|0>aDA*9Hi9i_Kx4eCTg8hCfwE=YVHN{)&Fd-qp1ro8OQ2~f%~47a$h$3ELseqlWe@7b>sq|LvUWF3HrZvO zPmz2%kGpuO-LuY+-B;Rerv;{?2wNkq)vaT(olQaH`9(7)Ds8PK$%y&x5Arwt^;zO? zY-SA@MLAAXPdwB>8~yGv{Q{+*p=@f!sl7q1ohE7qVc?ie+w6-G^ulH<=)Uc2J>UeT zCFjjkYgd`{#eSl%f-jaA$g)rvtcQ0P8p^4Ud^Xh>*ho@psVn#0t?T_UUEwtq#kZWV zNLOH3!c9WpfURx#CSs9v`2osbS|e31@yGtMjl-@bS$d=S@JaR(C{IZh+Q#F(p9sPS zq^9PkC_%>=C$mT6qov5tpdvlyf#DShhh<@H&v8f6d>b1fZZ?BiAYw&~h1_Q51|VO0 zCP#m%&u)R8s>|rpi;r!`HU|%w> zj2bu4>y#5h=pbWWHR}z-tGHUbyEhFv(;ULv3iR`d+ZO9uu>z3y%Fkt^r#@*zj&K)m zqkZmk3YnWgS^|5BtO?Uh)t5ngO+gj5&;!b6lM|hxW>@mmeGtfZxNYgPUF;P3S=WkMcF5x zcD*?En`vsk8zc?NsV#^dkY(o2cgKoV+oqm%I~(|wvG+g};czK;P7iJ4dVpzL`S||^ zP#AZPR-HdwAmEIxz8_iF&n~Un#_He^1X2bj%b@}ia6-_{?4jN**Q#sRXB(OXjdm>S z0L$L1jh%-8C<1rY%0Kz=bczajr!LO5H(DF!3|U=Y|_kCf0lMbZ~ zZDZFl@lGV8uK>y1nh<@=1THO-JnoBAtgn?8i`6{7z`n~^P<)RbJ7;FY+qqiWXzhV3 zwD*$s*jF!7>JzgMh*o>|r&Qbs7vfGH4o#x-eh_+vk(B_AeWR1SZv8I3H zE3_WWS-_geZTmix@?+K9=U)-YQp=_lMif?0RsB#0i>uLm2CA7|ktwx@!Rn-Ud!f|! zlonK+mw~hM~h0FGO#>j!pU&iF%z1vykJ*Rcs$Y%({QB2_@FEsCir7; z&FFgVL`~Ec2W^Ho(BF%GC;JuJOv!~Ub27#7Ti}o=BGO6RA5N3-=-fShp9=4?$9TB6 z{#!=)FmZf+ZJ4oO;P7}=p2o23zr6r5EqCEhZRQLsQgqL`&+dHsRjv-)>{|+Zh*bUyc`UYuO z0~)(grrYmUjCxhuPr{$J^BR8dX6qka3U#%aI(PVRkP+xrb2CJkpC8V29&9gVM;F|{ z)AaNv$r=D7qUVmDS!m{3c&O$`xC1|SX1-&N+d1_x0<}v>6)+UPdo&Ta-6o+btNPijOV}xe$;~oxr=4Wvn*up;Wey?peklv% zw}Z&!JtKjwGxB$_l7_}_G=bW#)QX&Kzh&ED7}_=*txq{tZ>=|VO8Xp@H&L`fcNzZ} zfia3=l`wxRM^bk&Wk(5GiCRLWxBYvnc){}$2F32U-**R;P8pGB?b&Bu3M3;woRNpZ z{q73XuCs_Oeb*A9@ie0MMqsyaPn%xr-brh>f-o>bN4~)$P7>4mwrSXg<8%7NFO1yt z(9=y*q~lN!R2z2xMzvsgXNA$~(5`Fhf#T^EJ8dFPLEaEJvB#X>YN8;rbiJZ7#k53{ z{PhcB4ifWa*%Y0^=ljw`#!7`;vh00Bl6p@mf-p+Cy#!NJv%c*!tWa`o>B`P6i@IG9 z8H5`MX>LzfB4_#6+-i0uz9`;u?TFU>uE%hbj##$+5j&W!L~rH3E)h0#Wwyv_?2D;hzugVG`#0@T#rMUk^ji z-BX*6rj##?I5Z!HKf)P_n#GyThd41gVb8eoOwOF3t+8;LHVh?mYc$X0@C&H4SN{;AakVpQ2$GG| zqq8tw`99zrJ}%*4NMppnen4Vok@XA~wTc=pHV|;>I;?YFym{(8>Xr6ulRL&NqcaO$ zM#bl4H}XT6GA%i;KO6cKTb8S103n}Af{-1N@-XKtp#)HoQ!I3pGZlzqBC|mcL9-4a zgvFi?gQWvKuBqE`-*)peZ@m0G zM~ktqN}@_9NzShJ0=vv)LhhkSerRtDAb2{<`+9PriLo@uY-NHZQQ85vye{ z_c3k1+5al#^RuvvMsVs9LrUd;bIz5+Q)J!s}Vc?IUIXHD)`xAew;ersc6<*hP760yl4^Qn&%mi*p z1<@AvL~ffgBXS4Z&M@^@%f+=wk8@XuWTFNrL<`gJf4K8andtwjl^#@VYa$M-qYm7D zhWpKAligl@2+J+VBmH-b1b9&5xO>i7{@+6BcPa@VN$`e6{JW7?*wxWiwI~232~YC* zRcj2Z2YkNryquvaSVq+&hhQWx#edxjXX#jST6)AL-{qNMCEwE$%vgr5u^f0W2|pX# zNPPcpnYeL$=+*_VS&t2)mgA;V+)1zMH26-Na7lj}ITaWWY#9qqBs&h*owq~l>Z$RX zFKZuW`<+y#NbS1GeCNQslDeNw)ylx0i_qY$^30#e#wkOLXsc+~cgFUh&VYa=Z&NV4 zTEz89Nwp$W<@Q8N0JD@B ze#qeqQ&-l+S(S7x;CmG(aN#;nIDgt2mM!m2VW9SOvFADtxHdUO^tZ;}`d67mOTpy- z)ymalgdYYi;YWt~j+LNgD-EtLsy=x=ZhBl);9qw*)KKn+=78|*Qp1kr_^0yRmw{7L z^7Xa~VuEgw&BWNbzSjivBxa-&(jtoI>y%__eEW@Go!F++(Wm9@*Y+(RMvkxgJ(EaN z7wPzDS){)p?(H}CV3)FYz4z&~Gz6cuWqRTd$_>!-;JVac?|e?Tl&?fd*X&z97=wRr zATC}wIJF}*fI+N0?FLaXb=?qa1@f2BGmi_k?d!gQZ0USwXY+<9*!RsBY%+&m(*{;T zvC5Dq0@Eqqyf2)>!Mn+J#l>%@#rnkKB#V1*d1c0A5XhNSqNc}(3p-s0RxT;{KGFxuYvbNuO4fJkS(4|U5! z^~PKVftdKnf?MMe&lA*I&ilhRzEHuP-j6tp=HL11YOBP#|4MKG2%lzb?d%|6`w`r))BmaJBuEaZU%Y!O)D z{QR15gf;mX_G4@$VbPFxlpe-|?!|l7tf@IFK6gRd-In_uuC)dthruYHZMdqJ-wLLZ z8xKZ2OGp8DemR1;q>~N6`u;Dik3IxGvNqR`k-jlo&qeu*dx_xozZ(gS*|UH;kpBCwSSF1`D0 zST*g|vQUc05BC~x_tjZdHx|i*c@rPWTZ4;v#<0u}KFkbTRo(XNf|GWDu?GKXX22`( zMY9{9WZboii{=4AhX-y{z6i&0OG&7t^Zm)6%(a@w2i2&_CO6V3hW@(F2QUo@#YUB= zOFjPD&m48|MK&`-_s$dviL8Zh#TNvp6GgpxwSgV2!=rL&+6IEoev(}rRAp=Ux|y9N z=(ZJ=FP_RT^qrh_^6F%omc@urigA&5`;|{JcENHRO>n>>`9tSU+MH3bC0E1Yjueim z;S6yph6C_MD{HYZx^YC0rHTRa&5A3}X?Y@iuV%Qw&S=Sfy_K}v4njpB=20C&IX+2} zD1nY>>>manr|SXk{z+6h)4qErUYLC$-?u6pjML5R?wa)*7$5(b%=Y^_17cyozA`Vj z4c+0~|Lkn#IZBTKCRSrFg}afI^1HCr#R!KMd=ul9QR=nHn)@Xve8D45(B4O++bdtr zJlrGeJ|8LJoTQb1gjtU`^L#!+bZ#L+3MYQuxcH$dX$Q4IamIq+xiO8lCG8+1BxfSM z`#Qk*xD}hD#jsOp5fxh3v*w9wgidZV|3bSIv`o$I+rQmi)5z^`Sp2#1M$~$ybz=C| z!x3$i6R@gK|HD6+(DfPIFKM81CaQQjB7uANqc=Mbu2K`ZoKbSOd}hspG(=Fh?>#}u zW8}>o86Hp4p!Od(8Wvi%%WKqIpC)RP7v>_Pyv{fg0Q>R~g`Rd=z2LPvYKkAtp9$Z( z90ID%?Eq8Rr~Qw7{6;TlhAD-RI%ZzZ5GmNvfPI24R%T1;=R3qUwcagpa3qkq_?T)5X4VKGGh08g2 zs{wUm+l#q1W@{lW=311(A5X1i8+B9VbhZ|26kl;XPPL=)MIm*ZP%GD0gZt#sstD8x zN_2fnf55=mLxf?_qSB?Tj4WdgBVxxFKD0!!wZ|d#KbKwPI?w+F&^ds|n3z=>@a>BR zqXxa~D%~liTY)H_R2XA_+I_moz((877!44Nd(}8UkhH@--AyZZ0_aQ)zMk={5(Uf{ z0!JC-5fSHvW7Kgs-jNHK%_?BUpIlNNFVDsnzJ=`rPDk7tR;Hs0{fcO+@M!u`qCBR) z*Tq;6QLJ}zG0!dbQ=6dk^nK&kBTzu2vaNJi^*Ho%TZrlQvWrWWUXM$`KOFLF_;^uC z7jCw9%T7SLa97^GW>vT&l`F}%=Mx0lhuvBnJCC9o03IWbqvuJCbGizq<5D7sg5KU! z7-ZpgkJ#~c1X8(_V4@jrvonv(&ARu7H>HP0q1{M{c)-zMw=&4kyyu(#Y^ZIpb|e&C z>wmz%GTM+UIwc={csv=sP@)~pcVO>-684P@(P#6#`&Lv2PFUsXdrgIQIJp_ zVx~dv-e7tF`_Gb+adb$j{wkhvk|gRmX=|mTv<`h6K|AuA;5jWyDc{hQCcXW!wrVx^ zb1Nq`lW_DpYTLLNemgLLMN0TcGYkhiif?N;Opscx2|W2dUw@>iARCi>xSQNOUm~1m zKeordUJOFp919A#;g5GJyaz6KB#(0nO0j;sT?bakc&!6TlX z7yTSUwhAOy`IkFHQMs4I_JAy&&%H9UY`=MsYNFGiO9+tVrMdm&z72dF0GNeB!DU+N z2teOTNxRNW-uW>Oc|Q93Q0OCc$;&I$!p6=zax6F%pbLYbn($E$N2CB*ic%i>ds@!@ zB=zP~2k>T2uRCpToA0H)5IQFpFv;AJrkGY*?A1c1+b>m0nNBJ$&$K)qXbFWZ)Zz7) zKZGsRu9i@H9?V2WWxHlB0q*bg6d)uL)Wqj_wLi?XT1i(zT$C)kiayPN>GeT-vnnO>aRdkX;rEi!JWeT(<^FF8>omSj6FaFt$H-4J)$qe5 zd;NFILOFN^2+YrkiOe=CU zN|L4hhf>a0;l*Qq&X+)Eln4uhqG+#3J>8Fq@&24J>ATv~Y`06du{FC^@d|daDU6`!2jggoE>+~=EIH{oaLLYXZwc- zjq^>-6+a6b)2R9__3Q4Y!Kq5Ac{D$9zY4(pw9NZ&3leMt9vn=E9M~T1ONC=D$%v>1 znm%mswK%{x{cf*6U8C~u$>5I~>XCC$hAfZFl_6dd>W-I8{=?$P_0hI6N_p7(xmRpX z8<4BRnA6!bS5FlKi3w`#0_D5WRl01QL`XN zLY)AQ%3BPayevWvJRy6nqCfQZvrC*j9cIEdFA*fOR7?2rK^=2mPtGd(`cbn!Aw4 zRgk{7&;01vWv+p0Rbr2Z9dAea6cLU53?lk^1l#FD_cJ;`WCCVmZ7ehj&J)!Sqj|I#FWWc$oF3O(jpDQ8 z1TFaFeG{6+y_^yJB>;6y`JGTOusSWQY3?vB2*e4+0Qr@P{P$-Ytx<{vW@rV5a|0_P zgrNdVRj$TIpiCh=sz-zB&k@q$*!<$#K*QuPZscm8Bvj@*P&V8< zn+S|?`G6tbgOP;Q4hp(Srl*|vBL$D;F8%U*qE=~$-|lTb{$@M&B|ZcSh2FAN7ujBF z5c=5+cg!smlybny=slCZy_psSr~}f@YuX*D@`Ya8{{P|&^BLr@4ed$~upf0Kisg2v zN_>0T3fSA*iz3k|INAEiy29+*%4E${mc|ex3S+YBK1-@vKdpR%==-1uaF zU44K3{--WAPJ&D6qSXUXce!-M^%ydIr&g?VZF~Xfx#}msi`4Q`zEX=|EwRLWqe?-z zd_oS+e3>E1K%)oHT$I$ENzRcsbELUA*C!dOBPtYh2D3E;0Jk{qvX^~)B>O|z`;XzH zOYgz(j#wpNTvBx5@>o03hTCk{qTvfT0R4n0&hCArS|Fptrvgth4U5d>Hxlu<_bwr+ zYkkj%TfWtn?sC8m%UPP%=s9Y$Q8WeKsKz`R+ZcsFAWsY$S6sy zr?Y54IUrL(@UoS+J*b3f43+TFZ627iEH>^o(dUJ6`Dkb%o&}$r8x;#Fj5{4E#6G-d zv^9br13IZeEQy25iZhdcBni^-Ut4nzs(pdp5q;AJ$IKT>l{liFBJB8+?shxy`0>h+ z*NY1E=^8Ml8?4d_n-<5|M=L0PB|0ZfQ!)QazJ2e~&pq5UqGq?8THc)vYjyq0zOgEi#{lQI)8{Z9SUOT|}zHal{4*Hhgv?8wln&SYt~ygU7&F3x#x zb!#&pl+t~?rb0z|=x;y5x-xli@N?W)XxpPVB7==mfS>I+I-tgWJk?6lDh7VC-zkVw zytSXYNi=M5NGnp#I5sQwE6iJY{;Cz??J>wL<}pWZ88D^m3;2Cq;Yr0I zfw;|Iv`n`n(=Z-P4|XW*Me#k2ir~~WfPl}?E<;aOczmybVtP?#4XYxV@j_N+HLpoChOzBoPCGDyfVKi4>4UwUJ~WiX40zYkS< zildga1bRw4Kc+KnJ9urE-&0>r)mv8?DTrMNWvXQhN+^ZgsC!=gUy#P|8cB%}PX>ou6yX{spp@xmp!5`IXrr2ZY z;JrW4x$%FB9Gke5)7FA&Z-SM>0^t#4+nu1$FPXDlhmv=IRF$r1R+Ews_KIpyH_O(* ze7RR2sS`0>8%D!vN3*z!8ACkXOkTEGAJQcjXbx=qk96q73X6poDk}?2YqJui#7EmlCc%%FVoG$4?m;Gpmi+?Ks<; zzUfHK8A|`%Lk4JFKLDL+z_d}PBKfGIJEh@{CHo?sHNJ0)C|N4T|0s;!b}&fF0y1&f zzy6?)!y=p$;t!~+&xYrvr|gXmw(RWsn@~96$CsT+jsl=R;B16&e72HTfWqr#9Uu95 z^~kJ@VmW6=Qo#L74WS%oGUPEO-VHMX&f89ge&G1jv8XjGeE?PJQ!f>DME{1kldf?~+d1HE#Us6gOLPKu2Z_VfT=1`^qMavBW#^Pw;E#b1H z^=#6X9;&|CZl~#OY+*J?Bxw_ue|(6!%GzG({7qE*ONs+M$WZ`y^<(e+?q9et2i-Ww z{k&hyD=lh-$ykw1WNyu|!`6W*F#BfafFhSeqnyBq)xlROhlhugTecqN_gkxVj$p0c5Zg@O#pIe>2BB-^$L(5<8ja4@fi)>VAnoa3b!nVXEgmg3_Z_&r(zq{!~3NZc;K zj63ae3>{dAWcH=#Fqp`%1(@HC?7=9n0})p(EX`Buo%g=}Y57AsZ_~x@L?$;g*o|6U z=My@XWJ*WmH`wCJ609IPOZLukYP(DKDMVjrLj0G$U89oifXJ2XpS5_-Ksh16 zT{?G=xZzCYD|3xhyCMr~V8jp9R8Vm%+MS7p&WJmIlfhc$_4z?R2^jY_Rn3;@dWM>x zv`|*?yrUwhZoMY>XZAh7aVmKq62WVsL{?b+8E5_F0{IiC#MQoJ7e^qU-#|LixqW-q#Ax|C zi_7esaETJN#e;ln3cqYII9pF#F(&lr^JGI$?O@OT<`amXbH4$S4z}v;WreV2H%XC% zeJ0Jy)j%bO1>0#^(94p{51 z|9NBMOE|~wCvz|Cx6Wj6n!k$BADO-`n~7Sgg+0%wdc{PMGXOfxv86zmJyEs(0~0xR z-Mdf_zgHVg^6+pCG9#G^IBPkME0wl zG1!`{=*#;uGQuRgePKoKaag293suLe3hX_+Wgp0NKlLk4zRrqHq|K=ZOg5klI<_$> zT@T|7i~*#VHrDGaLv^{!n2ty`DJ2m`fAhDX!m1%0(NErx*l0!o+xiZgHI3$(OtmPD z#PZnSxwRk{1!^pTWsf>p{_vx3plaS*H)^t&O~Pm5$R7Jcvp~V0))^gQ_s#Yd((17* zb8hn+AjYynDBKhv@g*(%QL(^?uVP39(`Qu<|C?!4xpc8f&b1w~0zbgNya7BkG)kFB zouJ=OBAu7WxStfarTy_$#*=m#@=uDHv1I_{Np~`XjT!s$WyLibP`(w#fU69z(?Vm4 z|83u37q1Rf@Zqp9DqmIKh)tXyCd+htRCNmR;VnZ~q5Dt-zFovUeEcVuEr(wp6j87V7VzsfQ35V5;gtyN=K@wffzl7H+Hw41lF40k=QE}J_6~+G zEb_?K5nl46!%l1IF#K6rgd+*ho4*s?c&fKMvL<^6%j7iWMD5Gr-|&9Yjr>jTUGe9o z>QSP`$fTiJI6=OD`yGP_{nlv0j36h7BZ?nERwjcigYVCwB(1tm1_5=fZ&k4pN^cd7 z!~?-wrvG-2)YcqbF3(&F%feb+g;r1)XSD2k_m$cf{c14Oj)Wf`1H*mYkAOK;R-%7) z%x$5Y4;V(o18WBp%uUhCrc4zr=HC%|8D`kl0*FKQ5;Z(HMLuR-iA8=Qz@b~JEj(5V z$IRwfc=j=v7afoqQaAT5!wv@_R~usjD_yLg4dKq+aZ85kQ^GM8&tZ6?(P~8hR$!#c^rJ-?>g_fzUS}n{Bf?! z!!`GP@4fQ3*4le51vY|dQCyW2xj2StYFpiOc){0jsDKpQTIFdsnAY%8vzc#avC!n1cj*2o zYj7W?7bT=0)*8h{UoV}$@2Z?-N@OyU>PaKxAfwLI`8cU~9L{u=m>JKxs((#C5kdYG zB=cv$L<#T0@tQriAz3gkI;}8Es2YrHkmfJ2qAjKk*h8zw<E}%bb@<8(mkv-Af9gf3pM-dDrt^U{PaV2>U@bp zNOTuiU3T2&GA@qfL)FqWe&T)McN4Smiw_^HK6z8Yy<)F7s}E6#3)zAV6`QgAl>8hf zwbXE7wP8x!md18Yc2x?`i{bTDZ87MEK(H10%m1eQCTn)Ux{aZXOkMLVCMjB(?`I8S z`HX2@AAP%@^(^eRbLP%#m09)N{P+23^eQD((wZp(R76djS-J6OU688R(5R$ zaBl6(G=?&f)D09?g)RVSjx!9#Y!x#WIFw%roTIKFP8_PXO&Pmh{rqvX{?gI$?7SXM z=uQ_xfgW6y2qjm!eXq+4-)+%NVr_n-_~}wl8V#r#R}BwI3|YAjEk6s+rbrDa=YS$F zmPv=QCu7p6;6~uwr}E?D1FCawi&_V8wFV#ji%V5ME?dP@Z9{YRrQX%|)>AKPK z5QM*zaPPdTTdXzcM4}S95iVjVbM%f-Yj*Md;QsryI%3|9u~$0P^;Qb-U{K;wL3NY% z%x~DAa>z#a^*j=CA0KJ%+vWiFUEl%&=`M{JS`U^~z4%1WV5V9EJv{9RDU5EMY zyE;AFa$H#c=_&U#<%bEFe;jmc3C1oI076muI3X6?Dj}Nj^nSnU9 z!=jD)_O5rxl9hKzde?HX&33CsDawDi2RcRRiCi0S-<%jbZdt$G8)v_NySLvHb2XNx zd`nd-npJLMXwQ`E&g%VK;f&XrLSF7CKd*aEI1O={&_LVEr|l0Hx9B$?QLdVmQ4C=u zGW@66EAs!lKWa%Z=<%uBw8jcfk@_M*r-LT1VaL>G^}QH8cvl4s#wIPPD=+^px<~cp z@)CE9;D26K@&zZ}a`bq=u|LVU^GCQ%xB8BU7$D%iSmoXNK~Ee|%fF2<)VTClw=vMov0|_9JSmr{Y$I!) zVGAP%R6YpwcVIOjH=+&<#ChLHpcqnh31jplx? zm{c;#ALo5ZO!UnS4Nm1nuy?|V+j6`zuz$#PoITGf2^yh>PnZATrcJGJ96zGQ01l1( z`C83U4$N7HuX{aP5uk8cZ9HWNDROM^7jH1uVlg3r(fp?c39ubkR&Y zND7=M5UU}+M=ta#72KA7`gT)+9yE6p22|MH`^NcCqWHQLG;*mJ8NXY^_Wiv3-fYau zSfwQX9sUPi_>@7y?I(9J-50B_RQrXA^!ht5Oik6oV|9tj7&8oMw3qvP>I^L-eBom>HPh*y=pI_94zC?R#KVGUt(||8Vj7jHejj zP2|&#%!~ijWbg0t#-EfySKFjl1^*DK|NScoq`-ss9_N$&lg#{GuUcwFz|0_@&O3kq z-v8SIJ*5E;dY^AI{l9<-cBP5SZ>lN5Gl!4^^|j-^D#5(4IK$ zHtL_4_IFSI%gBFX?!S!uJB7mj?O%<=QsVDq=wFTe2kZBg#?uKGV&&mrd(UENwlHdK z9JaYJL|ydXx|3{PV4|&EWiG?&Z~E8$9UK1PZ`9`C;g?F0*Dk}N?tK3LG=ct4n{SaH zml(7+@X zO>J2J*Zcmk=>PiH4TiG>ko)$0e5C&+4L=2+@rFMyi;B7WUkbUH^cykcQyqEv|5m9J zXhagAU$W`u|EX>6-)%pLfVz`IF+3#Xzg39`mjf3_lQWu1|Dm7u-x2m-HvTUa`rj(} zFB|`FY5G?i|JFzRB~70HjW#Yw1mt0R0sK#L|Ern*YUaOw@^7FgMoIqllm9pB`WNo} zA3_5F*S|*f|My0fD|$ggGpZv`i~y-n!p?zBH+nJ?G=^8yN=B=-AJ&?2^s|XjERjqK z{EirAQqNc$N3ja7L!-V9Uiqx#^YirY_<1JsaTl z#7t8PSMfqlf8BifhKJ_iCt;R{vZwbe8R-L?)}f*Fu&^&t`2C~7v9l$imUtp98lO)u z|A@3-ouSqE&Vl@L*xK(gJ0U_5^^PP~>Gvx-?}A*4Re9O0rr&Wxcl z`+cQaWcBjQlS7S3G33-#a1G^6)jAI5(tOSW-<>>z_A9fV7yaM=F7N^Kw|&KY$r=)I zJ_@0e=W6 z)W>#LS=K3p^4FC8vD1kX?gg5xL%Y1;v)q9KX>;}6nRGM;gdtAFQUB=JX|#+2+j zBIo3ae?UF^Vt15RTjvY_%Vn$4yh2!t+k2+g#n;A_x=Y#~V>iDD2yO^5G1|AE!kUmX zo~f4%qz@yN6QJHw6U;0Oe)&6L-fXN~R@Wm3jTjI<^iptZW!KXbLKofF$3~fDh^8&( zMy5|FfrynzXqh!z1`e6lgP#(gL^)R8zUIZU=#4lvqxFMz#4HX6Db`msK0G^x#4D$! zI91vk)}FGTgj?h`@ytegmZ#`o^}&L2_l!|(rq7!=rg&HoUccE9$u@C5(jzK+1YMXu zpJJfkk$`}EvxcNK!E56qJ#wtypMF=3dKl=j!dkBZ#p!ol!FOA$B`EGPgZI%z<_=AGZRm9KT&UCCbz{wti7Usb{~+R>qoo%sS$}GN^RQh zj#`K`pH9&&44xtwbcoKf*~YP%!tO+b?g|)N14Apy4+fd^wwp_B)8Mz&mV4`;+W26S z#vlN{{j(Y1D#7Ux|sSb6MosJC0d%X`zDl9kZNG z`3_k)gRgwsATp19{w%i}hup_!W@r55%i-HY^_`WdmBpN;w1!1Hw55<)8M)(BM^u&B zfbi*_oq_Ge?AfDo@N|0Cvu@0u-7ft3S)djU7m>$B0*I2uNKX=yf7misOU*a`)Bxm( zP4thu^RUf*F%r+Cw>AzNQKq27ek1U`2zM=zYANlf#HS*eC-!ESLx%O1mp69pVq#zE zrW9ln5NSgiss$YWMM+7#+m!>#8$D~$z1iYi$cQWVPibXz`EVmcYLoMkmb<&>t%zp$ z>eun3cMRJmA1lZ*mNd4%#`5-f=1nJZ-l9zQks5!Lhu2d!0MM9YHEitVM#apS~yBuK)i`8BKMF}9NQNuF7ue9>w3f=bQQk$7t(C8ZPhi9?+DMD>~zVB$$H)JGD1%l>r7+qqtbwO$qfo>k6vdy!(Q~Z}Q|NNz zX+}-JvO6&kG!Ntl(k4_B2C;t{zCIN#%tB(o>OD z1r#Z;$>%tw_56h{N{j;hEVE!^VF{b^8!a^>qNS9Ukxoi=dS|YeW7)39dFIc?h<7I& z>=o6Ywb%{A*Ctz0;;@aMOuGb&!!!@+EnQ7?;ZM{%Zo16QO{)l~4 z&5m$ph-=7<#tFQINHMKnfLim z!i0+tuVYyz@--d9jj)gfjU{E29r=^O=3qK^;_!&<5nmrMME`iat_pcB1WUm)o{YD4 zR}ZLS#oFHfc*4-wZ=ld^SiV@K?4el76S=B}1fa8rTg5568%3Q#gNhQc|Nbni*Ik^K_S0 zb&mt{!nqQxrhCTR*xfFtk}XEqAf?RP6NTpfLTf(Dkm*vgQY|f7T=@CT1Gy) zKq>1~;m(jaF#b*vrWmXtBU~P>)_T>Sd|$mA~4t;X`Vu=YylcPu)MKrjm* zcRi@QMI2SzF4%2Ro;H(qIeIT89f5BdzRC~x#*hSNcpLj}&y`z^UwAn~F^aiT(a&p& zU7E;+Pr{|wu|GR|zKbDnb+vwcg4LZk=vi;HyL zIR(aVM3#W3PK*9_5&PmdB6S$mfDu5rg7Q~tMpxOnnv`$>v4K#2xfN}l|Kj=cAgPNi z$q9(WAJy2!d$tmFoKecKCnhG2GKFjQ<}*hE5h=SI8yyT86;pu3$?24qL)8XXhkxG5 zi#877?YS^Vh}FhVfg*Gm_kOc1o|gzqoUatXX4t%mIMop9XUV_iC7CX=+u{-kSxtAu zqb8&hprN{s+#j)Wr5yc+r>5sUKyo^`RtX5D*=`!oveDw`=Nvt<3G~*fLma1O0Ra8W z)~Ul)q&cJ~2{+fF75L+)8!{)NK5p$}YOp@_e1jPFaL{xrWjKa~ZUdtc%R0;>-z}z) zwYo^>+GX$JFlJ1_^_z|}{%^=%n7&2OIa*3@a(c(6Ty>-zk&fMKcSLpRAW{T?@mB67 zJ^dO$<4-7-imd9Rf$Ob}TW9@)K=ZVKmX_yGNd{ndXb_FjQjrA2uz2~8(rfXw@Okh@D1q%1k(?C?E3=UaMCVD z7+(GwH4|9{Uf8ixp2PdqkFHj(zgRS-|W|+G6sjxS;VK#zA}& zQ$WEh3zVDXHklb29l{uv%PQ5$R@8-ko%l`zO6r~SReRe4O)X5zc{(AySFc{BIIktH z5DSOe2!cD1N3Se-){Ylv-L88yT26sgZ7f9mA!V|NTm!~kIS;??IQ1bPfMPPqHuzxw z0AkJ?PaO{zX<%Vt5qJunrtt4#3bAUYMkS#_mELe#TJf&j@BT!*a;m53^v2Whnjxzy zuF-EK(vLmqUf0vZ<|040R~!ni(^&x?Yj!Hl@8PcH9Xoqhc|nZn@#Sdh1+k=}F27*P zkFi;+2VRM%3{V6TDXa2%7V8Dho@cxdBr>1C8(yaf+_wN1O=mtkNsK-A2cApByD(HS zU6T?Mj982Yh+F|^fm?LCdF2n7&8vhjNF8br?VKAvH5TbWm@_II`Uk7f;|a?CNyY z)s2fx$_#l%OP~tC8W<;Ao##G9P)QnJQ>HtbX~E}H_8eY1{*RXcfskvwh+WUw^NJXO zh*V5KaQhQSiz)2n7ZlXez__1IZmQqH+BFgCQ5?OTqk5?&=7*Qzntt6!vfQ0Y0sR2V zF*3p|(^HbP*s2o{lwed^!r^_%X!tjMmpzPc_g6aFIdfm_gL|D+(YCm7xoz1BdtSOzfzqy_dSS}5df|d*TX)uiNtr3n^w{@d z`*L{@O#_>_1AF)f@g-uuo`xZU(KMv~(W(8@Jv*h4b8#9=lruQJEEt3MG66y7u=Ff! zLBky2h9SjAfCC4tFAlK36Ct|t9yemh-o+CH0ISl3!jFAK#~-9Xe!-L-qjmKHAN5Z| z0Y-XE{;b+uqui-?d7~jSIyvcq0=Iy{m!2_nt~sBbKh}-iqr)sEO-zBOG(-&fY1ASH zo9dW(|AwWe$3PBMuj6Gv0I@IiQQfkmD!>g9w9nYac2J4mIln<=K z_{)%|o6Ii1vi%aH2_P~_C8+~;i@Ns&xXc6VMkr4EF5htTlsjwWnN}OQM&oGu!$>0m z;V@{K?n2jTUoM@@gNZcu9qFN;ey`y5&^{s$BAbRW$YdkkK6@Q;=?F7;+4KTnj{zV-+gtDLD4o>8AgZSNifqe*6^ z%Zk%mu|4WhO|TP=Ug7hi?42&*8K%(|(kpPD#UdR;aKX zj`6^=UJTNF+3by|EJUq(lRUH~zeaWM>UCo_mz8h0*2blp%vibVz56W0+BiWBnOYl1 z15<6#Y2n7=glORG^7oc#g|_upQ4AZ?IMBPr3D7Dj-GLWnmTbly5=DIIy;|}YtXSjz zAKVTSXvC4LgZ7tXfNN%Dmx`mMfzbsml%kHal2IARCR-$gzS3nU`{VFOxl^7woW1rC zjYcQuetpQt7o>71&xJbQH!WJT9*MVR!mW2$S78-m(uA)dgZ6*NSAekLJZX`63nd=-&Fqp2xw6~1@ zkT>br9c2-fU-+}@Fm|YMd;WPRhqFr9?@-z^odEbD69CVfrH6FN@s9x-&7HBEg#RRh zge~{74Jq*C}%;H_ZW1X6o6&Xpkvhy4KW(`{nf5 zI>c8P#vaPic5-MpC02(7q8?6kSgV{dT)L`0VuC*F}}Y>8|fj&+PIn*$Hb+DhfO5e$$84l0?54NK=I}gI6k9078zu1qhT7T`Ji*;Bo8L2G~ z+M_CViM0cZ^EAQh7w*a72f>{Y+pcoQwaiimzGuI^aiir~t2b$vV?SVGf@V>uvxs~-KPR`@I=2fPP;N#GC-#Ge7~r6NR2V|ncmj78xgr+~&8iMpbo~3NNvilALr6q!>DqX>6{zk_sofz ztIYRoocCr)Z5rcaljSn{G+x(YYifo#y*FRX&CXj$Utz)3q=JW=mO8cE2*pK(b!P-O z72WR1>RVg|b6nc{!-IcY!B(9ZB=e03$N{BB?(1(9-SfsK9WNS~d0*k*^xV8;K9KwP z_+XsG;Anr#ru9*!VMbPwG}3<%oX1R}d8TA-oQ<&yDRu&R4{@X}gK41haQA%;lOAJ| z#i2r9=f{fqPjBD2L^83XiAmR{N&$*Q_2iVfogDTtYY5q-rp;(DexPfzjo!|h?RTbY z>OR!qZtF56g2)9U=v-EvnhXZ>?EBM)`Ls?`@P9!-(qNEV*9p3l4}e^l5F0ClzkxWi zF2ks~OJ$9wLfP#)CAnsnt?wvVvp-@pM2D51t;pRO6Ee^SWi6%cc*FGu0^@RYYAsg? zxXnHBV*5O5UO3N&l734x>rU|#JnA9LYva~xNHJ`AYHe-35U*O$$=4xg}c*rI{W=~C?XWUkMSc^BPQRvTHbO*G8$Q1G$1|2zSq8WzWEoxo{1 z!W(RDJTPugLPvg5wR~>Q(rYJ>%dD>iahE>MH9@v)OYhs-Abaq_kTQ*K4?26v;`rCk z>l?G-W(I9)W-+y!5`JWnx9y;VFTE)9KJX#@(Wqi*OPZ*BIOyn5$G65(G@zYbv2lge zX6b8;&4j_t#*3a&KB6HCo2{!DVU9Yf^y-gyl?6Asw|oL*1E8W#SuW%cCg!*TkHcvx<*gzpb@|vxHg{kJ4>J zx+RU;U|RmdleIN3{mHl#S?}1sd;z0V;61KYGU#j7i1*?(?l@DrSidYfKS*cVF_3-a zp67rX>JSH1wBegy$$v8MOmF&gpui*mq!E$f8LH0EI=`J2=Pxnb2Dx^tBMg=>@oI{$ z*@qex#!@3oFsmg3fRMp@zMoems`d?(*GFawmle>v6L2i6t&XXqr81^zb9X%B@Eo^ z&WJ~|+fS8P_cvM;kKf^~fWqAs@%dBrG21dOFwsGIQ$F0=C2 z2;qeux{fEq$>dDVro|{f(3K!-do}ooKK2Kx7>dvJ3PLy8cL;tWyuPb%le##{5q*&* zp{GQuyXNi=Z@QPP+iRN_{DgnOigZxL`IliuKNiB#1E zL8H&u>*+R|ZnELKorj8StE@Pk%A#0 zGwc3%5W$fhD#*du$q{93%+5x(xMkdx>Zi^7D>Co4-KKh)Gm#9>`yJ?h6gplo71;nPX{`%<5cPxeuuJHJ!*MOGLd7-QBF;E== zPWDqv9h{fz)2T9deoy*1sTtjnnw z@SW}=Q6Z-u@5@CQF)MNHu6}0gH*wj!>iJUl&mEauB9D^N`&uF zSxc6q_#uk{@6}59JvPPJ?M+{gbG!CCq zpv7mFX^Oiu!O+&(Hsz>TYUBqv?BQ8(xkrp5N@g9JclnD+`Gk>V)Wo1&>jmp_*=^o@ zhE63tT}z`^!S=%0z5;3|Bw6Rvi0+cI>rDW44_D24_u))C@3dXyLwD^J%*CGP1|yAV zwu%P`&?;@BgrM*_F0s7LlP~T$w9d`UA4U2u0V~;-dfG_aeJ<6=i{3Mz|F<0dq zC%;ReE640(rKB3>Rn?7FrqHb6q9D4Rr0uEK3;6lwueb%hki?20-#sgB9fNVnb60_A zZPLPsqj6WF1DjoHbhWkb`8j-3gANuXw^GV%-#ys2Czo!ai;W>P>EC>6Vyuf7>oF2o z<2^_K8O2>G`_UM5|J<^;;S(g>&0rOm>Wd3MXagRODju&InN8RC^bvehVceR`4mxzG z_d^<}#uZj8?nf+WQ8s9W4l}cLa)f#%>bY%&7K{s6ixy_xl*{-unQp@TA|j5iU)R=N zQNa1I>7$iZ5*!czbEU5BqUu=)q= zmNc>8;?;g-m^Df8xhG$P0hkLtpZUGlBWAs*b=fh@B!o5ekVRU~em5*wPiE$%P47jp zVCV1E)?YNt9{amO^#r#egCshuCY#Nizw$t;*nq$TCv1zv7$s7}5C*k{FLh z^IW`A>0xvSftAi7=VsRI9Ye*Lj9RWQ_tlpnV;r5V_693dW+;DPh<~=6%=G}}*i|Oy z!scb~`s2Md*LGl8!gcDx@|^(T<666OgVLaDiaw-R7XBPKyE_LhY?agpD@w=q6|h4t z;Birx75c*#oM%ww#@fp( zp43$x^)Z|Dndc;hWi@|b3#>b~y&mH!qb@a)KEv9v2iGJ>qm6 z6EhW^cIu!+EYwfJL+}@EQ&okGsJuiL3-F zReQJ?vbEA@QFhagDB+h&8-zsY<|iNE!nSpruFG*D_2yYQ>0gvtjHf7*UE_e{jcf(( zsWM(Dl-odE2(} zz9uo`E07+tuBp^1hPsF=42y2x7q}Kw<>hbRzB8SC5?UQVi*Sak&iirwd*k4G1J|(~3A@^I_K5h-`J*;woL`ce#*_MhYv`Yu_5@%Cg7h zdw4(G13FtXJA3P9YOaV}ZG0#Q0^z&)DFhHgm9?H|+TQaDI~QBR#1t$@%*GNz4?&On z)p+_t*Qxb}nGR6_dhL&qgZIJR$vNGOsHdB)+SmN?JV!9a+;+2*pPvWWbJjG1p&(Or zMV1TM&XVlpR&{tdiPOY!8U7&!9IQOnClKNqw9OG%3#z8rf}CV>f|=;~ zi6IL@@aBq=O(y-s{lffmgmY+0b@Z8MxDi6m%cZjY^YNv0UHL%hJm}w92g| z_-3J2P1BC>M7xh0zOZA2(oJcmE2AehUk25Irr(--&nuSS^-%%Rwj5=~O46E_qaT0j}S$mJEU+fvS zgguS5DBj8@;{kpK*-Q#O=CITp2nUwJ^PNISxUMUMxiy;lh>XvoaiYT+^Z~ELqu{L7 z{LZlA>Avt$kdP^AA#G<26P$J>$2EaEY0%oqn#&+S;s%IV$6&~g@jXP0tKtIr30wzP zBAoSTWJK~h@9<&s$oMsK?$^OO0+c;XBmG_iEdk_?ey#_j#n#K*W@X`cR6@*_Q9HhL zV#dk&y(t-8IsL9I;H*ZLd1c$UL3pfVP^{zFpq!7%`JZE}~TZ>7_N6kc@bgdq6xHKl+cqKtReD&ns?Ke8&BApY9uZMa>rF6P8D=dVFX$^Yj+9b0f_^g=$HXUb#(1g#siSw?9r;oe ztoT6i5U&z-?6&5%v4}t$zVn`jJM-@jKQ6ZZ^*#E|{s}shLvCv~to^PW2x*-UP=lU7 z%MbHp3>zqyqpv6iG_N?$ou8w!7UP+Zz~SJQF9F~r!5eWr>C?jIyBypVo6{oivH56k z;%9(imiO}!^@Nx2J^~bYl@Bny#m^;JYSUbwk-h48sAbhsR2WI+79<<1>8|q7Lp!zl zzGi_b`F>ZR>R{CV#8Cnp{)cP(S}!^#?rw}aj$be`qwS*gB}q{>QCUM=Wv$@NW!d3* z<8T&Oqn#+9tu=x5V^uASyX9*|<%d6MzTa_oDlXY_KU|kY3(P)_JoxUl(W|D%cM<^R zW0$Vv?~Ku<+%fQP*|Z9)eHLk^OGCb7zIcQe>q7C0xt5Pc4~qwiEX)=`5rjeI$PKl{ zW6+n$<9E`ZXVj*)QGIfx;IMmupO?SqR@TBQ(DJBZGswXrjXUaB!b6S?jI&bZ?(FvC z+nOqwjwJH{M>RN}W6p6b1xjB~fL=gW=h1eeRnWnm40DEw23{eu6?Vf(9<=2p`6FcA z{)ryA;qKd|-S|t#ekQro{$25+xO|hlRf@%yI?LP^sK}Nqkzcl|Qswr~&|a-viOWHMA)212ZCLt(c+!2K5Px z99gh(M4U%hOHPTjkE~6u2XDpjOPiH%ZigWmN!NIDpO3%K9VZ)82UDzz4TpYS#{>y8 zYJ}CM3esfyaJOyJyrb>m1`E0H*yDx7yrmYlSZ>A2i~9nTyVC(7+jHW_2Dldb9#c(- zm@&L6-Gjozb#UggyxMZ@5+Ux+lKmI1DoVHS;u{BR%dru=I!X^~gcq#*Qc|w2(AdhAn3q9`>s7t;cRBVJ4_Vm6*a^ zjiwYW&;u6zI>~y~RSDl@^L~P+bcRzO8Vupy$W7N1OB9$DkKpYc4}qLC*Kg0FB&U~++O%+qmtVq9 zxVxVW3GS_D$&D8Gua#E2?)(@jnT_^aW+SAR{}OZ` zCFNnwWH3pRRaUa*PKhHq*1?Hma=*3u#7*zTn4vzKRK(XgoynlZfF`bfZIb;rz2z|u z(-4q8CKXJrcFY^Go*%WD4K=)eVcJN&3Xc+2rmbHV-v6C=LC2-diSKChZpvdDzm-Y_ zr?<09Y-;M{pzWg-(SGh;BqHw1JK2ZJlm+Xch2`b=7MJj0`{L1=_F=2gqn&Z203SCT z?21TDo9<`(H+q|Gb|SuUo>0CPa!_FL4t^vNCoIicW^DIE4s=gk>qT-FF)fhU#UV!=uQyP!uZ#q3tmGp#!Ug(h zD9876qLa~gy_!H`wT=aG;@8F@)qOk}q97D{xnGyfDhd}ldkr?O%|7=--Nx3r1=A)u zPvI;7IoaOEVjAD_>x1@@irv&uayve){>asz_B#EP$R1o&5gIM8!0n0tJ}=o=9(UYd zp3Y(E`?z?>mVVD-u;04H438h$PSIH{^_((A-bKBgiYPNRm8dy9Dx8v-Rr40_7Ac3W z^pa<=e6qmAa^i&l_^Y@PDv0qmLABbSxt4`MO-T^ieGYA<8E1$IX?bQjM$?J3@1U95BI7s4^$mJ8Gg0} zcbc6giQPr&=n7|~UmGZI%U#d4eMau)y;u+r)zs_ipN4Ntyz5GC`K}+&qL1wbkbtT< z!o_1}dvJk}Y19p_4-303;2=9eR)*eE(nsB#_hYY?6hh16e_pQ2se;Aek=_2hOpY2F zAQQ#qHlTAYH7zwSO>Vl)E~>6wdg6Z2w7ae*6{o*{v1s|&{SrqHs*>YCu2ZZt_wL|H z%BJ>DxV2NU)Nqd4JL~gPpujo}$(tNbkfCc154rPYC|Nuuwp6)DAUE_@bjpn0n3gda zTy6>xY19Qt?l{a57^iV5a$T?-EJDW*zBW~H_}sfiF}A&9z8HL={b~t`9(x}QAB4O| zL0$&^I^-JRog@@=W3Y1P=Tq4o(DE@NF5=RoqTyF{Ru$-qX_Zc+jN$ycFPeTHUX)8x z0g12+Q)hN~H`VE*#=K!$g3YnF_BB+#xh>Q~2t)kzAsM`n22wi{4c8NB$C~1&>7xyh z%Q>+(`W+~WzRt;RQt|Rma&zH6)^oZpBU`w|FD;-Q!3~PZ)FBvi3XaP9ww>GF#r;KF zw?10PqO|S zZMH2k2RFrq-uPZagfAP{^?{b0k!c+Ts`gPAWb8Mo-t{wG;7C9$#b9E18vd5GxyR}! z)c3Ww7krbJUwW1M)(I7+cfZ}EYDi~V+B54-Hee*F<9;Pk(J&VatSEx+*o~J*{jPLz zAt>;MJhaJm%*13O65nd#4MN_ zMiUBV`F2rx{P2ERF3W3?AVqiNm1bT83R0bfsp@Ycp=5onOg&+D+4Q3On?E*#vy}1_ zQ45Cm{T>hVpjZ_u_;tB6Dw7LFmmfy%>@DXx?WN#Ci*6UJn?MX^XTnEhrd<0*t=JYf zm$)`YY?0zc2~Z%$d`+3w^p;h!F2+90x_PzE&l`o;K6A(is9e}Y+E$xQtDl^Gmlaw& zI$IG(<}0{fyICSuwU~`o-et2ADEg>&G-?+B3esa8)hEI+J`(3}V>QPT@!G*=7n zl<&+kYrTW9p|_9G$m)q~f`d$BP_(7H{o>dKKcks!xWr0~FlFndxOyGVu$A68-Bi`m z+FKBxjio)i$@7lw(##uhjIv{f5R!P)Llp{G@6@;K^wr$s^)K2Wsxih4{?+!DWN@ZL zqM!lZ_JnHR6pwqir`vFQ<%P<&SBgBtPJAJqWvqejzWUB|S<=bcS2hX=x`)t{(KmEY zK&x}R5kB{LN5^rDc>j!g2KUyA{pU=ba_&Xj?hA#uDFSN|w~GByBkep=@jT-ccVy}< zYFtZEMcy`D-t@I{MRg{}PROtulM27cg{A}}EqzGdUjv1@T#CLz8FN+fHVccIZ`ZUW zezZTH-b-xdim}vvz+|=i>)np*6BMabp@~0N-5m*a*!`~BzM%P7y|LA)IkWPU>b0u- zeeT&D8K4qjQSOjZ@^h)WHR;eY6k}x^D}l4F{fuesdexuIvu>(;u~GBzT81A#kCJ6>3v%zRvbKNu@qu)lIha zawQBeQNr(5R@5pL$WL1ARC(yEISx%$kb$YmBK#OD1QA zS>BGn-Z$o9<?0>C3=PO| zox=NK;t6$iS@X>g^Kpf$@BLV6!Ce-ESP^j?S#);6E#f4Q zVGW;pmW6-R_oI9kRJy&!Bz3lhrHtA~H(zAc-JyKdg38msYKBJ!?&dK`?0vYebuNs1 z#<(u2H$%-!HD|M0o$%Zkuc9eq>o)uK_<8qVo*t^DZO3TbxP~nV_ruY!+skr-9cbaQop14>UO42NavdML`BL7>fwMhRb2QNlY3{zQ zz5*}3y<_oL6)i)l91)nqT~#?&Uk-4yjC)IMA3E1n$GG>KZfo|A2`?NKy#7vq+|;*L zbkJA!q!G_vp8M=fj}mUvwf+X4R<&8KZ2xhMyNDIp^rs1kV_~(7fnyNc6t!t0me+j1 z*oHA>>w&vPpHV`eSOQ;&|PGTNSpRa8_2R0IU1*g&O8??q`+1JXf?^xjG6QBe?SD!q3i zy(d5@N(oW}gcd@G^coOCkA(m0Ip=rreRo{sg6DnqUTfB@nb{bSoB%u}^Hi{iETNm$ zZhErYCjwHqnR4V1>_sG0k?~~6feY#V{zFo}zshBEiG8@FXj@-3>)e^$>I0ETyFka;-gUoK-LL9qoY^p;#h0Xx!T=yd98>?}5d^^8~HzU1H3k z-H>;uy-31h$=R4xH82dCK2~U#u)3!82qb~kNBT|{qAk?u67f|UTY)y*IgrvGBMX54 zV`Eqibh_|6qt24vpsL+(b16?QjN5k$;Mj{_%WZvbR4J<+G?H+Oej*kqh6O*2jRGzS z+^y|+*}KPVye4!8rPTJ2t!KS7De7lEbsl1%0RXz-89k?@ae?9=hJlRJ3r5$Df&Ng) zE^skQ9U#uX{-1nT$WT@rlI}e&7hU-MyYe2rOMwNe!$Uh^>LNoqW+>TiH5?2eZDgyw zMP$DoyIO=1Y0Ms|0{%gXoV9`$Cry6xN4j!@jX%l5r1vyEzryKtVl%3&{>BQ=UXuU& z=Yc+xoXOQO3sug<@iKEk(VxJdn*AH$%RL;>S02byI>%c6U&9i=@z0U`5W+hAQV?J< zG(Wc_=7p%pfnUo7_~F`rY`>|f9`n~`eCr_=XSxN)}6)7!fmTa{|ydFON+(h zGkFFxl|Dq!rfY3fHhf`%*7*ma+*HK0VZDFY&cUJ>P?zkkmkD+h|#9Qz#2&3Oi{ zNlQN@*>(U0L{oZ#$UeQKi$y=Q+^88!6?(82`MKh`<)kAJP`t@F1t^F!5cxDkTK@Kzu0+JgatA#wqj6p$-6DN^Z8D!bbZAu3e)O$>(OrK;9jb|K4glK@Umy{F z%N4T~I1C<)4t}c08#jOQE7{4*&8otuuB5ruWBZT*mFVFJ*->7gCFa){RlKkmFp#KK zNSuhk8C96~oly=GoV!8N$Ni@;372Y07!Os6svSyYYA@Id!u%-zJ8AF?-MZ-qjol+(ovznen z)HXOalS$BKsH3}g3bKVloGCwW$Rqk}2~)uG=C~RG;LSaDnY)jnlzkYmWoS?Yi8sfz zh2#lBkV>^H#mm45J6FkcwCO?tD;%uWPx;{*G{r_p-ON_W&%-0T;2Z2CrRM)MKr+2+ z;&s5V`cG8A=uQQmM1%sbr%WYRZSHMo8Rx*Vz%Fhg)5PGOa5_47&G8MeVkBKH9_&9r zV;EiDUSJ7bNHX!fCKr70H3xdC5+;Ugc$C}Rj$C&`R;c%d2_KMo_$p)Aoql~Hn~yrI zp0*a3K}|lQCH;cogrCy!a4SP=Ma2(*`D^R_B%O?YST?z&WVPwJOA_S~Sw1wS1q1oO zBAEQ*iMU|x>ai1Gu;!Mqc`M416Re&MH|Zl^Z@!P7Gn_a$)LLm$3KU8bfE+K`F3r4g zM3(&mDV#nG-WtDufS1WfSIK0g6jDUp-93lW?PDj6Dv$WK?EfeeO`A^*09*AH77M`R#ctvq7uak;QTVV5?;{oG3<2_QE&yH4PeC-s;JNk-$=9zQZWq}R~c zf|zyt4rp0^mnUdCEO>;D`L{iwq!_FIXWj7utUH>T%53U@X1cprX3d6FEsO(ziEC)* znC%6NMnL1zps8K4eB7NS_zO}M^6>0%IRqjy1mhnO>7&QGdj`^T$m)8u%t`kwWkHsI z3H4m&&0Wvn+#U>+85%ydDSKN8ZE5)VCpTPLI@)D49qd|fb9@alKDCl6#N2yapxV{8 z@zO+$i&nr0+9d2Dbr{V*OakCUEwH4%SMOSkAfz(}TUYg;?vc>kHMLD~C|b(asQZe7 z*Y9%}{HkG1#G48)sgw6YyGIM4E_YD-Uvf5bamrRg?luBY>f8QV9r-CR&Mc71v%le4 zYHiEA6c)Lbyp~yqrrjjutg<*%@g8%csKpmEo=y3M?|0A$o)lk3OH{x0d|{%LefH+) z??)OfV-2;F2|n_=XJ+fhR`6ha+L6S-3}XWg_CdVt%;{5G0S?{-o*tgjW)U>IxYm#Y z^g}{Gu4m{eDRXXudJMn|=Hp}39F3r$w5^nx=LCv;t`bZ!yfpi)7M;>%_|9u`4iF^N z8vhf8e=W~_CO?8%J3zJ2WdRmey;vn+Dfn%${i``Fi>a~XUqi{edCH?14frWakyhWf zEh)Nf8DfGS7Jz0zpnmd?t=%!jUn{B4(tE>>%p7{}C1?6^BzcRB*juvzS58_&l$<1< zv4Zd+n0<<&3PIjuHs5fy|Hg^+A0bTlyiV~?P3ll`;P2e$d9hz9*RbuBlQL0{+O?wl zkRE(9`?4QBG3+pGn$@h8o=(DTic9;ziB&S9x_t#sJ;ama^Gz!~AiB<#_^R5J^oP`b zoXlpQyCy!vE;{1>r$kAKbC+!U3#gKEhwW(s-8q3LERcjD$Ej^9;__MvEIZCzhw~`M z>qYzUmQ-s^QAIRac?UWZCu>!oF;OjXqF~;vyFO8|VLB@B;uczqHvVP>O*UZ_of3kdv>cO)G6JOr6+S$AK~4d(rt}zILhhRV(>g{g@B$#R zHyy}x2yi*vR2T|0Hqr`vyaylX2F}InJjJd4W$8-89}Ool&_4)F6UiM~w>NisnsCNG zN$QhXPQT9T=fcIk)1%9HD&y)JKPIVSJ0q7a>P=^El_=Q^A`Bmxgw6#n4;bSyzLq~Y z#oYonkutZ80$a}B{@m^36`4`7$*FT_W7@b?-{One5^ta_AO3qV4sJbv3Tog!3tW&i z&rH_H2c9FN*jwsKOW(-Zh;q97XLyYIg1d(}sjvQg&u_j5Z~|*{Soh1(FDdH~Mf2$jTm6_1tr<~m+jlTCn#TYZbB^?7JXSvUPKy~Z zn5gH&njSD!rLzPKa{%!o+<^kEA?YFVYb?j)d+vplujH;rA%G}p9~Hf>1jcb<0dcQz zatsh%z~KzRy`fhn1d(W+XIo5Xpc!zxmlnU+rkZ$LU1pEumpG~LRW%@}Qs&SV8u6#Q z=SFi@kAFRg@B8$%z=jM~6KLJDVUe=YzqJS*P+G4W=yW-I<}&uODL~7#wn%y{-0m#b zLP(B0kU;6xc^mvIFY?l?*90OUCt&mI)GnZeDbi$;rr$sHTsh*c1h4rt^1ZHq43}e< z0+a%FV}TEfKsnZjxfIp3VnKb3G0wip{>|f;bshr zODG&JPz$grgIJ&do7}9H*%qMjDY8I@QbiUDWg%XDBgR5bgU_&|Dz9{PZy;igEdvct z=J?XH^G9kD z)@A2%EdnTSo{HlAd`-W(xH&p>Wvn&<4CC6A5D-gMmM|2!qP^|16c^du(L5^SAQPNM zd?Yf(YUyurCPrQ_t13L5wU3IWxVv8H6bcRM;dULZYU^S!at5PfQZgek&0hbiEZFdL zXw==pe>}$sbcwZdA(wR6%QF>Qv^NfS3kSZ8%fc@CZwB2wV__;7*SJrcFL*#v=FKaG` zadv_qhE~|g8oF}F%{#q46q|fwXAH^#u_0}@kp;Fg_oBJm+m7aaYrC1uy9UcD#eX+u zeF&+^3Wt;Aj|2XCM(C|rJ*JndFWD_YO2xtmVH>fH1Ot7ToZDxCi@a21-1p9Tf!L(w zHU*x&OQj?=tB3k96aulnJDYuVud!5kL?8E>khz~eCglBk%31`-ATa6?p_>ltth|i5 z@d=>WVh(>TdJ5hZA21+g@-!?8!tx#K<^aw1HdNqD1anRM-qQ-8jb$I}0Clt;x;~Vt zwO1au@@Fgb4LP{jy__@jsBN>lv)D$lIgY5}lXW;pz1>?`e65u(N6?%b*ocd^e*f!a zIeR*5kolSiN;!tj_$~M^+kfNFvY&x|Jk6R6gy8*=doq<(b*U9{nhWnf!~Yf4R`=&y z-m`urQHqvdwmA#IqEgx>7=nYN?G~n#n(s25ygF|5HttnGv$7%rL&Za#CjV?r zRkc&hSbSVe*-lc5C*J`sh8u`Va(9O8x(>$Hz5OsOuciq|VgXAU$AT{2_~rM{!Tm7E zqvgS0`e{IjwatPQu19KVAC2Yd;83G(uT49LH#-Ht`g4Y~d2eLM*V7zwLT34d>9GpO ze%XM=G+vvh(OZj(_pH+w*SYj&CG&yt>zjlrN1DpNKfghGPT(!v&jKQcvSj+H4tsbm z8jVxE1jqtnMOY}q@ki$DSoR4P$1L~eNbK0r#!$dE9y?m7Zo5)e@l(9KX4C>YUxDcT zaCNfTDht#~H(RIzU_B!dTAJkspC2tC1wYnJw@EXCY-JrDoJYS_#yf&Z4p{@0e(Jn( z{B3}0zS`bTAC5X;{OGu&m8(iSWo$5Ak3$QRO)*JKscu4U;_vCV%l}_E6jP z+xiU~Z%+>)-(>LaBp~-?1ZX~Q*FG;#hl3AW5>BrNV;}R4V3@*PI$(6P@f#13*H`Cb zkb)1TtYptd*LQIQab5YdzrJhuV11ud$FJqA4Xun@&?{v;_GEL)k!`$2ionj*w{Ld7 zcyuPOeou;N_LJ*q!M0j5N7DidwYUxGI%x(u!ZZA<9H(a30sR9tx)e=8>{yoJlqNUp z27l_AcX{a-;ysW26rYnUuiC(KtU1rH7z5p)VFLyTwR!%^o*KusR{2?GJ2$+r^LROV zE0_xixPhaFt5H^mGp9KKxoK&^_?%h&Kmr5h)Q#4z+8 zfCQOiC6EzW4iy1UR?k1*`Zf%?-1r-C-rVxUx8Qc)83V zI1?VAF}IXEmmK2h^;D@-it$13-=$*MCEYe z-3|^^I}p-Vy!+~pedGT`f;nR)?eS*yeB`Wkd^#W1jkUL1;CCFE@+!ed+27%6kGV&xwFyN{nxfa~m&Th8%@WBT2g3N{IfEh4X zy;!FSn&DAvx|Z___b|vs49(q1-S-}s{mf7{+J;dMFoOSh7&<{5esK_bTB9YGesUQ z4oy9(%2?t&lfTneB{FP4djaDAXSp~>G^EpJGh4lRb};0t5}T1az;a$tpzQ& z#$LU@US(9K8v8h2c25?>5h_YiOBA;jF#A(7aQeHT5ZGj#PeZJK3!aIRcgIWO!^jV% zM*QZ|Hg6pKnLK;jI8qr)MY}RvI9MI}(cL(O>@)7OqAh0bU!xpLG-HJHT;4H!@0USQ zMjKlN;~)Cc4Vzx2KAjtZyR%7+wUiLb9O+Apt1LT~(tuKf<=5RgCql>!uw3n3S@KM; z#J5M%_Wp~Apsgc;f-7~72ol-{ZnEWw&Ebm8H`9kzg9#9_1!yKxqzmH1M`Jq9LH??$$J0j&|iG{sXd-9TF{%%R6Rttw|8~U?O1Kcrg9)yRQTrZ{HY`E4g^YGsnV=0WvoMu0f zCxfpTl=!i|2Kr4gK&H40+9olhn|iiR>swXYtSLOT3vv6c(PlmFv8C{9Rz3SNdb2?r z#73fX?T?O2IbGTqL59jE9d4bNs?S9jfP@+MkM&nD+?Uz7n{eBwNS#hy^g}n!@MaIs zG;9b7_?t2X)cehKkbF2~s0``V;+&3z)wGH%)rF>~U$!JgC+E?CG;{;bA3RdunUE0_ zvNIb$twNr`3?1lbxX4caQ|~U*L|=;A9O12ZOjb|e?(5~ry5V?t;-HWQu**BE_*axy zh7*7K148nNgQ@5Egbsmbr=0d5DEMvR>kHUAOZr^qqOTEjtOOcUv=dJ;AM%(wfkKtCL*86aw_2SG|)u_ops>(wEb6d zar(*&{hxJH2FGI;L8p8|glM}n*w&XIHMbLJ*yZe34R>Gp%K=pcVCwibF9kx_&COj+ z3}0HPAm2u{P!nNt0Wl(QmR{nW`tL z-F^6m9*vl;XdBy})-l7^mK6E}{-Y)GYK_+v&Ku2cQ~qGY8}ithgBVtY;VBUA#uap7jqaJn z&)31jTiKAOIj5jlXq1iaS*RVQV|!jaPsqu{t!aFVHGGRdI7V7koKV8|M!`)ApW5bD zn6$#9lleH7O=4)hG@IABQrN;ElBdjt>RUTG=VLTeMqy{lyw-lSyz=XszrOl`RnNrH z$%-e~(T_Di z<1~xs#*tyb&W12)K}mP5N`ap8$_JXR1Tx6|gD7DgHhaof8{n7ss|lvfq1(C^-YpQ$ zHw$J(8fcMnGvldUX>Hoew5$(}UxztwUXsPtYN>I3{y*In_Xwu7N_5UQe$KJ~fSNk^ z-iRG~DPb$opTyK0okC7?jmoCiNpmQrwYcLoa)zd7V+wh4I-OGct7XPa4< zS{PNxJ)F;P?5hMao;|)Y%75$DDA%j|_g|p?EHoIevk(fyt!}R z&z{K!cxx&b{r(Jvzi?}8Tb(@B?&^H~ZpgWxocuCi}Rx{!yZ4!}-2FUDw34+x+5g<+7xe3+dNZe6rv(? zSTtK{WF#Mi!8lWGQlR))I-Nz7{DH?f*LT*S-Th*l+%XLyYmHfxg~fri&O*n}5vOg@=9 zaTUAlecODt=`V^FVs}ika&GlUiQVRv%9Qh+Sg);MW0M@n6yoP9@W%b{K7X+z^({_X z^qCU+7bd6ePEhIiLzBxnBMz(1gQLUrDm_77pt$DK#x<26qd1W=khjeP$`}i3W=; zaHCZh4PaOn$SF(vm5=hDPTRM>@T1Q%=`pyeujl%EIOriq)}q# zx*V}jVpyK8{`BOP=5GnstBO!n)slGVx^_?u#lQim1Y8WKI_hgZa*=C#HCn;%)joK` zrbxH8TF|3y;`W@QQo_PaT?P@goR-?fS=>iq+a4MT+zsp6h#bL_ZJAGDA;AB&I#f3& z;XFE1uMxY$0a~fegINR{ak<06>B2XZ(7MjSpvJP3AdYEju=%)`r}MjB=ZVX+=F^6a$?npGV?U3O{AvAP%)@j%m>)vGA#J?nWez=g zv-%`Pmh*}&I=~M2(7hh^tG!9fKW2ye%CjANDhqEf?T*CK5-{;r?4#?Lex=!>PR^m> zp{4M?c78(#JsZT!oWTUraFHt{T@EMfd&7$4Z%b9z8F?`B;7s6D+Ubv)XwaUC{xeSK z--I=_^wquOMQ!4hhIFAiMatiLhd~Xj3^q1wjxMm_o(Uv8GQm^? zruTG2Zz#jCpq>xa`1P^*K?;BD<5<04A~&W&-R{uJIij=FETkbKmx~5`eD{7m*GLyF z@fmcPhI-t_*S}$pWs!M4Fe^H6I|6?znLGYlID&4Ty5sxl$3*8s85{c6ZhOO_5SYub zD?(ZC=le@e`^>yrJ0)~Rs<(_HvP+@jFHN`{zD%{)M=zL0%6^1JM9Tr6ZSm$X&A^Am zXV1&^951~2)!Sc5+K>>wF1HX**D#v%x~}}XoNrs^=jEaAMNY%M3r2dMcdJHY_k-6^ zDbx*pscq_)qyYz>>!aXLp5d|A7zLK=-X&e`^U`hFH5Uz?wi|4C(T#B0p51Qn-M5|` zA|~Eb3fdq0&wZA9ZbbDWAgy=Dwwte#Wk943vOe}a=KFSKf3yX~s<$Gi#0rwo-Rs+% zQ*?>M8OCGcd%mDc%EhfFM+=Ch){gj;;`YsCSm#RjsC#Q!+$lF6%-adtd(@-&u#G-Az{L zd2PicXsTLf6#5*{=6mg(cI}vmnUEP2w$8tMdH*+@j*IrHwXszeNTyhJ zQb})?iURL!#Iz2`!*ThMHLoM*KZ!rfmcD=QtM}KT1!0pY%FX>Iks8ifJqMy zadimKL)l})XAIl(T&RpX5jfn^Pg*4q$8XPu(VGZ8$Dw)L+pZyYoPPIb`jmI{5=tPX zqXvbxn)d5txy zFN6{t?+YdHZ0q0trBMXeqCeC6$n`OAGtxN06?S!^+*1A0wMFCBwSxz$am9H`gCdH% z>#|v0$TY;3T+pavjww#_kAK)UOfx6Wr!_M=?Cca`)*3`BvmuTh##GAjei1j9(PsIS z=lH$8l`f_`ih!zgYM{eEdjNEJgX?mE4nyr{b1X95ds(9gXoArLY$x)azD8St5>f{&qlA`k z?Z@B@YccPZZP!NUtF*kQSc3Z4H^0h9-*QaA4PU)aNaSAIe=C_`+R>%9xUrCl^QpVe5I9P zse#0xtYO=WKwwrE^0oLY#Gp)%%MR>U%1q#HX&Xop&vPGBU< zc**3s6MK!+XZI}HDO5{AkE(WzmO7U|q^{34F7gG>K!0;3@tgnji`Vbe@_0#rS}PC< z(6?>awyZdIIge|a{(tHV6W6JOfv@=M{_m_o@GF(ng^iYRfTvUhWB%9}t%P$1Ui#IY(VMWo_fWIpRqvh(W*7}Vu@ z@&Wq|q9L`@;g(#zMZGcBJ)D|8cX=@VX$o-{6`tvUt``T)HvX*po7kS)Aq|MK(M0tc z*69+RI?UQ#NqRa2=KRKFMPA79?&|1`QgLgGhfF-+!0MBUD+e*zvb_3V??2Kisb&4- zu)ElO59s`-fyJ2z-goqJiIXocu8e4%I}!P-nL{gQJh`eJ)g6-^-#r7n)h}OUD0b2{ z^!rJ&8|YU*yyp+)d~4e#Lr|Mr-XFBV7yUcy0LX6wrz=iamRk7}6w7^T!|*}-2Dtb; zQkkq1RXo$`oVtAm%j$kp4_vF#x5sk7J^JkG9;=xWs#9UsO}9RAfq}X<&++lJ8&TAr zD z109pLSY5QoLu!aozlcJq_muXIyPKr_82|tl^&XklE(_C^%!pgMI8ep7q*m#9=o z_Vc>X;JVzwFG5trlLNMH-m|!3^cU=?b%Q5ib_}k~EA?`z@y!Bvy+=i0v3Nlq&tyAb znGOd4?;}bWGZgV8aChZ#=t+I^GkOkb<^6TBTDK6mX1Kt)%(v&RDBnJBYR&!fi*B&O zcab0;hg+<(EDs0FGXZ>ks%i^rO313}`CGuL+vU;n?~6IIyGRUw3cTaEr*zl zg(vfUeQw$jYFNvBwN1_MHxMgw{eW&pSl;`{%B3l~Oqz^WI)BKE&fKW0(~ zq%-!#*%oJ*>U8V|zX37BGLs0wF0I>x=?#eqHwWBvTZCiq)>Ptcn%@?M zD%gi5ou+^Z0Yt3X{r#Bn9JGHaxZ#U^@XA<8!grUXzEb0P!w-OMoPRcJetTluMkVTE zA`c=g*}#L~jwuc=`U#U&>=W?3i~Si+(C=fm9G*9%-!!`P#s8gtmIDlfgF7p^ zG-F)xXqgb6DYzoEU&cyyR>~vBu06|^8L7$Uep<`=rOUhC8TXEf?XpT8viZU-PSQms z`+mbkB@8@}6cqHxSRhLV_Q0`HHknwjssyU&2A~Wv%$sa5hop)bXFBnIz%)A^(Pmu8Bn67io zS$ZW86n885CYz||7T^BZ&aAr9Y)c@`cUzc1@w2A3N{S7m{b0H&5=A@8__XCw7*D0M z$NKZbt!@2D0eV_RV)709vjVl)!e)P0UPP^)6WTJ=Jw@`10+)bAGau^|O{tzsu(Uh+7MuBtT~p$C ztCtrN7~gy9H|A6`u;7!xX{t8Ws(D+G=^-j{WOA~fOR zh|U~cGZW)OMi}w(f1lMi8Hlk>;@EF)-o_wdcbwg`moOe+c8?i+t#fN{?notO(&@)~ z*Dwi)W?&32@+noXpMkcy2?1Mb1LX49aDwL@e$~(PtfI=u$$%fIrltOrf=nr&;p(}Z z;m1NUNr(#QS=d;!p|2Cb1*PqFaLs)QDkZkhz)d9s*;2fd6N)~}4H1xy-4 zJql2EoI`p`z-I9A;_#dwxcLzL%vKUb`V1Rv&rntH$RXttTaE|Z`7`M_u9N;!A`r94jY|9~%tqT+PK?jx~JmY(-g>K%QKz(M9)1BRG45*a-0uINnp=TQtiMlI7H zoyD9oQv9m)VQs7*;Va@RO}-9KSHOV_(Xy-1k&ZxVyvrn|nuQ%;?_kQesViq2^+)LT5X7%#*{Lrxd)r2IWw@Zye4PD&i6Q zY&Yg6)P@_hw0(Zb)jZ3Recn7n^Jrxz@EU$Ka%F6)6@6sZpUm&{`)y?1H0ei{S;IzD z+En{Of3x;hJbZ&1Xrlc4TSbU_zn?XQj=SVPG-aM@rINZyfn%qg`xJp;Gmq$B&99TW zKE-4+&Qo@<^Sa}X?|7fRG_5;gOh(OfY{%$w^=7ph#JxfklYnLcEvW(9SGa^=`Qurs|mYGs7$?s-Q*N;&??aIG>f0st?PZ@ zg=tBAE;mkO{v6RbshRR>=5n+>bW_^IsyE9#<{C5_h-NS~LxhDdX+_@sG`^|izb>9T zn1NWGUt-`ew5YKOv`_BN<^)eV*zc&VVxvrK3m14|iqgeO0X~{!*-9Q=?A6zvG~t76 zOe6)U4=YD8L}5iCBjstnd@?r)x9x@W6Qi1eIsUI3if?`PlxklbL;3NpHSwvv#vmRj zOl{7?zvG?uR%@nD!PIVA&aa#M`nG|@NbNLXhx+ElkwJAO4yc`7Kc#kQGb6K2+}%un zC{t>6tOO%!-zTd10Ho8^whiI+*U}zNuE2eVA92;1VuR z!DZTOuTtn#61l<}y)%l@Q<|mkV0SCCE^F_g%KU6GmRMfOyy#Cf#vGo(y!(nV6Xz%J@mP5+7x!oso2@ zmrV)-pR_IoAC4Q7^zz<+OvJjA_cw}E?Qz5Fy#RjnLo%(lQ_ISX(Fn?V`WX#rCIyAZ z-Ia4`Mx_^c=2-Sw-{r9D5*dzXmzee0Yp8iQURr0IounRHu8v`Y!I>Oee*<94 zxWotM;3cGW(f6JQsv&(TTDWmuX3DC=}Y?i48V*+ zjA4=E_x|oP*J?rLM!0*-HX7}m;5^&)iU+VuxO!Xh*PGKtH1-3jaYH%nispzgl?7D% zWMw}!A>_13oC}+Cpheg3ap2j8LM11u1iRS?CCnFVoAWsyzJUTmW4=%UXB#!~a#vmU z{1D~Vqt8){_iqg&2wVB_@*FNDHG%Mfw$NaoKl#2vml~X~W>WBzo;jm(-MH+KdG!-j zK59?-8b!W(LI+mr9BgD2TiJ|ILseen;fW2$iO_Bp+H(?uBtM(Ea`FZ0F{vlgGX zPHxF)iMQ#V?#^nEfjx$V`?Qw-hFGE}CJy_(QHPkGA3}*gAS!$h;WP<-@aM4i-D$92 z+10z!J|=toiI|RW^o@5hFm1K9?z*o2zS0Z^i;|P1Lmigs)5~5als)fUqOriGyWwxe z&aZ-81?GM?mlK|r&Q=Ng2Ub3jBmd@J8p!w@2IE;>&rZPth{4?f06V^1YYD zeplw6hGZdrP_%KJ9vxU4oKteVWEl6ESx~h-y6sh3`8D?c%L3SnZx5JzAEb_0d4z>& zrRO$cX_uG7(1J!4xo+6nr<8yvJ9I=D9DJOmLA4t9Z{o|1$j%!+ke*`V(eW?Gf6l*a zmt1bTidUsw1DrC2tpup2Yr#*m;BCMZ_G+Z+Op#R~EPqH_{tX_LF|Mp$s{n9H0-#M! zVA2!&&!k6nUSgkTMZyI*BhuJ$tn_%F?ipSs|L006&<|rN^)yV>WyV!;66~9qt-!ml z`UR-%G@m~9e53xORM~5hC$y}X2wFDnltpGq!G%`_G4nMHvBep*bYRU_2ipo$@aG1! zHba}HHmW%iiTcnF90Vr`GvnCsz${sB1H|k2pxDD1A=7%3Csp}sZ9M@k>H{r_OI5J-ZnvF`AO9h-_I+`{U0^;kBFNFD~HJd8C0|MsDk=qk{NojN{Ty=`@wZT~2jSv!Z4_W32wcja(huv|t@ z3^f0i_O#Y+@Qu_b538r^b^w~WnPI5ZEYI_MEH`_JFSv#(%5K@T`?~a3j$U3LZ)W`_IQkes;8#({O zI?ZoZOC~^|%Q>>0D``RutCQhs2HRo8PH$BZlBEpkx27!D3?ZeX0a>12?<;%0)86p+ zJlff+z>^X+dn;WdQcphwH3yPZNvn1T@UWB`UTXK5^WP z5|H?A)c6oT?)UHRrU7^NIDO9I#hLxDFP2DtO?YOq^d~v5vmkPk1l%dbw|EAsrAD1j(vHV0bezNTb@y|!);Fgvei}UoVJ4VI3az;J1 zSy!yoWHK2aHNFG*mIwd2g$n<8{{q&~q6IMNjnTKwC-zZKMfnsr927EZ zWnE`Q6U$y*6DsQ|2@uNQF=j;;8E#7R9CIwdO|E*BySVwGE!ZEt!~uE@2aajT5kH(gMU`q(le>cJ3i ztKs-TGmORp>Bm&(10E0bc3JI}`0tw5q!5_{D!-i)p)b6=?>mQ4EfXwQd^@p zzm-MM1+Gq3fW+}m(LFTg)kg8#N0A*LX)r7OOs2(OKOUOfI6UFeEN>&}&`NVZD}#CYDz=V^B7twIfW1o>u&%Ne{_eEt1bOv*^YYD- z>2IATZM%0WZ~@=iaG|re3)j)#pZhYSUsAWp7mx^!VN~5*Q3RE*ZQWg6x<*2sa6`2c z7)rvnjkre}uVn?_%iF3kx9Pc)y_1=8YKa6VEh%R2FmUU&hdEH`N?i|h_5m&|C?fl= zQCcmd99=PswBHr6z^a9;TjaNmje{dxr8K?sz!p7VGkxrgP=qX?W(%I)m2`Tqz z1E`+R7QaAzQ0!k0E!3MkjwLn{una-ks=E%4uggizSf>a@u1!Fgdh88BQ|D4rqQpG3 zGa3q$c#T=ITC>gh_4+kGw(3>BU-JBlI45E^pvWt4weBBfZc)paG#Qb>Zcf*~o{Ebw zg4Vo7e2Zx(rro9dREk{XAK`G8;DsBq8b~a-C6yu*&fhDwT4;+;HEhc=DN@C6?xOBy zf(4lQ%@UKLZ6>s@urlM$I{qizHTeb>HMNQ3sD3ag>#ocOqZK`vt=cfNHUlI3M=noz zZxLImk;u2uIIy@!%B{iHIhYJpZZAqTgZJ|%&VEN%CSrcmbXp($|J&{Sw73dy&}I(x z{I=lJ*>&w{ac_P+=*y?k6>SjnK~|oc%_j{6pBm%k@#`rMk=b+-K3W83P}vR)6_ zK_~Z%eW3|P%^0WE-os0E|5Zr1!p-t$ra)!O=qPTz(>_2JA!vn=2AA3%TZ;FEoW|~U za4eJ?>T=+l!HjU~?G1POF}46N<5-A`X>!rJ8r~OInne44WSD{I^;BpR7%n=p{tXwV z$`yG$Xs>#QPC-$}xUge|hWFJ!dC-eM%9F50($lp0asfgmYq$Vqk=IPl7Zwyj-o|q(Jnz;_gvW-n6+Hc9 z|DnY_lAe?CK_=Vr*s8r)e%iuL_b|q#n3KahOqUM_B;M`y4C@af@V89X{XK)TvqOKs zZ37%ZmWM_6;%T)a!elc6PRO1mImxy_m3Fn@UN}D+yW!bC6-8VY@-u3Qu{6OMT_-${ zBa@-gN{L9lBo4kxGoCO`eKFFs&d4GsM(#K;P1-(R_)$Bn_yO0s3pX-T95#DLbh^qTO(u~` zYtebIBpn1B*HU~Q4^LdX$~0uv4XM@ggo=p{kf+@0PeE0lv-ZYL^rl1@(>*i*ss#91 ze`@E#VCi3*sxAsW3c?h*SQfWp@1z#X`hcf31P@$likyZo@a~E zw5(&Wd*Rfp4$Vnb3wJKgi~RRuqZ^;?C2o}Q6adRp`OZOLPGRvaTe@a1fU-sY{M{lu ze^7;Ro(;T|Nuj!oDO67olklXL{qmNYujm9Kr99pa-0k&Kw?#9Uhf+_tZR6k@;n zA5$!(Nw~l|V?gmjnDQTob8l*v5r39oqmhO~pc(eF_>N{tT zM{#zzbLYojxM^(JxDlUDr)%0ydLa zTh;I|5X%d8;l_H(4gC6V9>WB+8B9=*l-FqEDmQ-KIar0rw27NtaAj5qSdC&2XNzH2 zCOGDKXijOvf+6z9#hFHRack+-lZ<-YMwa9i`?+-!&Q6Zh<3BK3RBXFa`HWV3^o7~X zdRcnR^E_lzcsW!{^ulIWnFrb})L{*5`6f`)@w@!+yZub}w5BgL#9~!U1>ptya z!H|l1wKWk$>5<6pu0CJbp1%Xna=66oQ|}(V(whQdGwUg{7G4S5yt$;#&*n~Mb*E4* zRFjYkUu;wrOO2iXL`>eN!tOk2R%!h1Xs~|kq=$=MN%>n>{6`jd+5ylvYLI~C^~Pk? zW{k?S*_iV-6+_MQ2U-D~5Kr4@zL52+{cc!YUTpX`7A_zxoILTwN9QB`3aXU|<5DJ)vE{FOtXt8IBz+ceUjB`|W$#``c6m|&R zT(X&Tr^*1YPne9y2BTK;ue^1OA)zdZka&%pc-wij(>R8tq53c)%kEyHfO6KuBAqh^ z6T7$pCN9}HpGIQ)fYLg-RQA;O*evLY2V?!ps3+644-Y3o2`cU8DZ2Mfyi;hEP3zn@ z<6dO#S6ORwZN_CQwH#H}fQD6;KbGuX8?4n@40&{2y?0KzuSU@A4xF3aWF&o(4|LK5 z7$9vGVpSHyxbBnt<7eZ*!PRc#Y8SDoTBoBOwesXZsB3 z_`!D1+(G?QbTcEB-LlD`q>Nms>^ca)Wea)>R(8G4P8xY>Ig&L}w9HS0)~9w@i|=Ms zvnRVx!dsnH)B0Yd{mz6Jgnav>W%4UoPS;fPl7m6gZulpsOcO(p!kWpQ3BMRKTzzKW zjBK(|4T3?l^vipC*{Nhc!qYA$)BMX}Q;bp}cdmg?pKG1ZhHvG#L=tsV8*Rm|V90A= zeL6?CR6$WDOUx!(zFAZl zvunNH?hluF^F_3`ZZuxXwaO$z@Fx2#lUR%hRWY|~8qTul&jj`H%YA2FLp%JdXEi>b zqTiLg+n**$F>mkVwn-~Zj>3zjgd&$O5T(^)3(4Aqe3EMAA#&TFV)mYKiYXJ8EWmCH zO#L4lN_Q_%q0P6dAq6Q+gv#1<=x%0|eS?OXg!N%l@}@tNUr@Fp@TwKE?;)_Kq1+@y zQTxiv`u%!Oiw_BW`^~)K=o4)cr*~frsmm`ZE(EbD?Wd9sP6bBU+O0--VpgM{u{PXL+77a z+{;)GjUjv4(a@NAZo4loSG>BoDZL;t7>vIVyS08Z7?Q87)Q&=MDUHgNo+99?cRx&@ zX5IH%Y<)2Mh#MIWm?o)*3_96`s0gX$Py%lFy^DqmRoWXAnA{Bk7>~lZD!-#hH?_LaM(>on);G7@% zHV+7Wzt7Tk&=(@Vb{KAk#gPMA^!j8viUwRWR-$j#93~JZ$3|6n_<<_G_j2TVj0MaPzooWcvnT@+Hl}{mxiOZiQ(%PJ3Ga5y&3q7% z)9DWk;NCKl_OvZf$!`d>#?jZQ?fkiDL{y5So*H)0kawUiks}ZyuI{EzSe@v&`&QDWk(1OSg(xwHV(&j-2!AN*O&0h$H zsreQ7BY~-w1Q&w?J}+&}7O1BB$ZkYxuhw=BESbAzdi$|bws>W^@7!rdE`4nNPRTaG zRCVDa!^zGBEkf>Yn2!(jQ$M1!fR!KfSxzGOm8s2k{*1}Z!Z()(=sjs%L8+J(?u1;V zdq<{J2SwSblC4B7z2J<7L9mVq~XBlzL&Ygp2B>HV*Rl-zCVS~qdoqTf(-T*xVudle%FU#@!Cyz$J%0e zO<43K?fmKDH~i@;Z_DW`+#D|X3(cyoRiV-k79#I+vmC}WEIvYbhHOX12`O;CzI4x? zO`=Bm5kl4%5$~E}scM&1P%4 zrWL)rC~$}KxWRd|nl`OZD2>8Ua%IY!ABRyV!PJZMEoj6`UgA1wo`>1F{8VfM*G!OT z%U_yV*2r4CJM>deehLl-xJ{fEX+o2(COKKYz}>}=_LHiaZS;i1pSK!vKG!#8>4%15 zJ%Yt#@BS~XK^~Q6vAkgKSz0qG{{js%^P$rl+6{qk{cIbBaBu)2etuFwD3R{9p0#0V zhYwL24o0`|^(s{xex&W#G%pP87A@N>T*{srArM$(^$zA^y|2Mw(MM}LRL22wp2U)H zV$6bckIx){=~Qge4tj%%1KXye0Z|GD#eFjX1!M(Itk2h~C3t|({KlW2bhCY$pekm9 zf8vMo%=lb|$CP0V3q-o@?AP%__J(EAi4d1ic^A}sXu{+L$jRLH@89DvS#-~Vz{)`M z%^A8bmW)PYI-0h3L zkN_d+vpUOPXOdU^i4|bjDbJG0gK>(!M94>gU;&Nnd1G(`0qqJ|Qt617Y%MSfawmdnf`o z#Tfi8ku_mv!Z6J~n`?)^WTNVgOOG-&U*ATj40~3zZp&NvN5Rr}xA|Oh?j00|eNTZ~ zpQ_=ivL5Psr+#_|+`0oS{MAkZkkF*YruRMNrolRuou-cl=BQ%0@4VvPBf>jJH65XU z5e_=N)7CCL`sdjH)7P+ocek+qK93jj*M2syZbVx6JFwCXa=0r3wCtB@fjHjk3aZbB zY|wu!(*trMaN`f#0Y&C2)t5<5`>ijU9ZpXdUx@pj>Ch>CD%C$(e0ocdRxnEFr3c4k z*aMpWK&|5{f1I!X-Fr0aLbMEKo9r&-Qv`4JLsLOB%gn>|p_cw3N^2bi|5J!xZr<*A zK7CJG^Vi&;InN_sKb6OqX?u@zv@Ym|2+pi`n|%N~^Yt+E=-V02(RB5uMo7En@|j>3 zVint=irHZ@v%%deT$!Ag$gZ}-_P{;=`>x6HfyR$@U;e6!_Co+Bzj`S1e#;{ZNb!akJTbEj&>KW}M*=|VTaT;M&aVpg|^ryTpF5vIH z$=RP!wg^kdZYDoReKaB%_5c37N%l+PWhXqM2Jq><#Sp>A^vf{A$9)im0Haz1aga?I`k>`QOaz^e zG+EKMv0a;m4rVFa;dJc*QCGraF`cKV_EO~jo+mp4;71m~0SPi>I3jrFH2J40E#!cg z7PGsK`fv>oCba$`-K#u|pc?(sK?Tg_+}cQ>Qv&ZwSVWk(Drbb<_8@?NtYw(_^+1Wjot16 z>bw2ir~98f65j){s*a-c{^MU$JxNZ-q3$N1D=milEBXY99@h%9!a##V5S0LjRWXJ~ zceQ9%Rmsv{{t7R8Uxd;Qv?V?Vvk9E%sh{zvj~2$$q@)nAvMz$6cu#Nq)%leq#KaX^@t zWGK;}HLsulW`Tegh!hpwfAHrtdXN0BQThzGZdSNA>T|5!o}%U7{qKU{K#&3OGMMOCZ6- z6fcg6P(`ntBp_@n`1{|d8uRz5c1?zq{=Q`ZFa<1q-YstO`?XcR%k2C4kKCXBfC~rc zelF*F$@qIeo8R{ZZTB--i1uiM1&w+(HoL)hgl7{w$k?9&*#CPzp)i@uh6z~7V|w8b zKRn-koRo3b&V??qT)_jPM{%!wf51!q!Tb)EopO+5*7ci=+zV$yme+r_;kvWd_lrI) zK)X-j?s%V+}?dzmErR#pB@p=AZq^A34EZ zey=dFDUcfH_z~8`15$Y$17Sq=O_G#*0rS6?FKqt5*cv!zKVdFgX z%64l1C4;YY%L#t}3XxmfEP?NQ71ge?j4gjsU-Pmno(ZB^VS2QJI`#*}!sKhWMC=bE zVvld`_xtk^<%5+e<=<~pR3ONzznlrU1*R0!Ij3Xe)2FDrRf+P z|6u}Xc*x+$%(VBP!2d_IK-qc&)2}1JNu}v<%aQ-Qtwz|fWC=;O2efBDfC9z;C|Tk6 z&Z--*oRa@>SD+~SU5Cz;OTo0a|3N{{cuVlU%!i>NN|MQcZ*GnPrj3}Pl58{LGH3qt zLYS!lg5F-E3`zSL|2?E%2zcbWZ^H8ao(>M-2f)V{gSB_kNdLhLJln}I3boJ75=d32 zGe-Xp4mbqjM}QVZeR*jfxdA=ke+Th*lLt&N6_2_6pDhd|VTjfY$}me%g?obZcZ=6@ zFb=#fCFNNvgE9XXI8cmqySJp?mGJw2&OQ!c4v@qCXC>TyHwxHubNbppq--%q_#f*2 zEC}(gUq4p zC9iM&Lp_5MI{yHGbc+iKr^*fy5lZR5P~2w&dZPk((DYva(&~aAVEV+uQZfH*(FS9x zp#*`ciaHY?od4Uxe+?$?j0@JxBf{(6>ior#ANB3d5D1mO)jzwC0GP9~k|SmQ+W^og z-mUJ+h9c0Cy%dS|&wpUtzH)dVF6d+t9{#;q4DsKTCxQe2;*b6U=l=-UxF{GJ|E?r| z`2u!@$iN^qVfl*j_cbouQgyVLl;>r>&=2JQ&<_+PncKbBZE5EP|AG=M1mIqTXi`xB za~5P6Mt;Hvrba5ze~|pU7#Mwki$uQ z|EvUH0LRc(=evN6+&+mne-(%S@?Ow*Cn*cV$*cZ>=E3iqREQz}{?F_9K>_Rv&E>bl z|A6rc2v%QKdVCK_k1&z*za;h*RE*qvN{vLat@q$w{NJCGKltB^Nf&(_^7l8+y#@L^ zp70lxzZXOP2q@DV5P5DCfdDP9`zU|${XGJP6Xf(Pfy<3M|4K<4n3Nawt<$Xw{)gXw zkAM~J#UlT^a_=LIiSPg^BRKYS>5m2ohkyVBTTDuduYmOLJ^I};KCGjE)(OL%V>$m3 zF5oX;IwlgVA&{9KMGZF8r+l{TpB8*SCzC2QZMd^8i?N%>O=q&A<1)j>Fu6 z8M41W{-IT)LI5+p8Pd)^z^TG^#AP)q#D+5 zl6F(F_<;J~)_`BYm=oNue^>hX_1(hFjqh=;BmU*qtowaE6d^FWTL*MkzHwjaA0Cnc zv@@8dAc0IF`*-i)XFz?5RMmUV@D~hmUYG$;@jAoo(-{6IvcELl0KpsLx?`u$=9wAL}6)bkk&m23iY zxbo|@MJ)e>1pLWbD|FpvpOmh6&wx~~{dcD^jUQItrgc)My77OqC%1D&zC7Qwt@LRz z?fS^Zx9q`FUmr2xcJKHyN^ zMfCrG_2pztztVmY_q;C}qV#S-qCb_`VIlad_1!(W+%!Jd$kETU&x6oNGl+z)pLa$H zFr-2=4`=F+pppPDUx6h)^acTKF9z;>e$nC^h4ya*V%#dhc7OuyRiAiad94rPByyMu zZbR$S81?GJPj+UMF)zS)=Yeh>N2Rm<66Nd~I;E)AcVel?xHWQ#RjLc_jAs?>riaYB z$-5_OV)0D+s?+W7tvcVPna^CGE~0VRPNZI+QA>X7Z?G_;Q!UWYpdjEdy(^c$I>Z4c{wT__0ihHlSF5Cri-Vexa}ztxv!O_ z5R*JxE4Y2X8S?sUA?SW_dr>RYx%h%+PkDL105 zA76V&?6Z=qQ6E+>W>t@hhS~WA*8y864Erqb6f(e5peT@RrE*v+Rdo6_XOK3SvQ*Y# zzVJ!$v$;YV=1PEBgO#@*j^CJW{fWY&tG4CiS5xJIdcovIea|7yh@?ny2(OE;o>AHl zM25kGd6v1}@r8OjDo z*Yfp3ty|gm;Q|vZGp_IP?}WXE){|#)RhE)8HV8Dx%#}}ipEC0!sfFDRsSv#6}rpfw{vMMr$b@`#* z72?7?_^C>|!V9WkY})Gx;C+%b#QV-%6sQcl~Kaa7!+NZ0qvoL|L zFC9JE@u~v37kBEOsGfL_$I%&75?e8Hs8+`mmW;!Ztl~y@*by)=>0$eyh-WlUCyWYGr8{ z65d-yvyNV}{yk8Z5HGvxzQ2@%k%oe1-cD!R2S&nkBfN#dEE91=(Xihb|wiEg!y7p^|mGmv%U8lF7&KeDqOebkjz|L&nJ(z)l330^mq1F z#!$hy$veARvEt?@VuI&yO#3v`B?fa(kaGNa$3E-kCM{?OaE&g{vuoEyA6k8E5qXY$ zn)xmHY3sXVM?y93Q+nMT%)JBS=>qi<$pED9UpjtJMfE{pCP1W)@^`*%5Enk+@h2F} z&EhDGKle(jArjpSFAH&;`x;@9iZA?gYEHyE?|e#is{wJT*IFOcosWHgnRNr@tFc)9 z#&4(Gg2V>3#~2Ni)6N$QvXLH+ZCgTZ5%d{%A;w#`r|(r*yE^?eRHA?54^p6VOzcsJ zc!TNGKfiQm&?14P@Qe9^N>5{4fo^Yx3o&Gd`%+{-UNpj4KdFWu|HyZl2 z7LE60$6JszCjIQ>P-2!CIyE;+d^Ze4;Hcy$FLfBv+L+0ziHc6#Rmr_`B@~KO`@jYl zCT<;or=sRElac+p)OMykz?7X9eonGBiOaTAzKf-ghTG>^S(iezw z)bc4g1*%r`=HoQB-x|gzo&~hMZ;6!ZDV*OqHN_IR*kaqT_;JEtXSLRkAgxIgpde?m8_4kvzTWbR? z`O`$%&h~(aPII20>kgY>QitCPc*QkyR~7bOOO*b0tcOlwS@~|iKC8ZX<6=8(tCm>k zJk?w2ys0iNDwre~`Jh>iyz<@tV<+nMlgHd{sD6G-gg-6V9(#F^R*$=vvZaY~-Vm-T892Mi? zY^k(61Kp0o`B0xkD46~x@LSJ-r5o;pMzS=g^USt1yEg7++jFt}UfVNDD2Xse26OQe;xj5(S6W?PqiVx+6ozS}5suhTU zt}A0uBNL~uq;6099B>NOLGW5~n#)onsNAF{hyBSFm@@++$BKzOR)SzU)Qf{|#PQA6 zt-R}Jkd1BkA&PGz{m5VlEy?8dHe**5Equ1zMHH=^-MdbJ#k$weze@~LkDQh6^k)Ym^6 zcgjY-&0HMAegTIzGe{=f|78T}Zj(7P*=s7>$-el~g~5_noJZ%(E~8`IMFj>V96*iAaRWABAfF+s zp#Sq7m{dWOCOv14BS#T{FMjcb3}Jx@gs422zzinpT*ScCnQjEZSNFXrOjVPgnyRbR zR9kB+O^x;pD-ZeH_=^pfDZAF$Q@Xg@q-Gl(w5uM1Nxw;#h#PaoZ2VCuiJ}b59dZfM zi|uksAG+BD>!9;1reem`>KbFDfOk6FjCm@`@Y8`@Y#)#(FNMIW5NRD0z+|6)Ai2???{zP2l{ zsV>d%AHNp%dJKD0RO|n|se5-8!KCKICK+AcnyO#yu9V@=J#LRI-?)rF)B{E=wb`O1l2$m z8RKG4cg7R%{TJOADZEXJpc`S6m+D?`7+XrcPdWp2x#bx}S29)BP&&46(@L}y+ib04 zkXn&W76F=ip_=ATlqum5u9Sp)W`pl52z$@tyUdl-|J z%D@Pw`w?#zso>og!Gu)332UKCJ2B*o^CKc@lAlpLlvI%Gq7>IQXm9^Pqbt$i1(esV zLA`N2zZHChLe7;IuF-!{Qp%x5gJ*+eIX^y&lp2x{8+)@0bc-WR(_(%=aOx5c_H=eQcs({Z3tXqUEQ|Eft)o!Ae$OCjV4+K8lU z*ZAg!E^yJL{D>fI#$>sc`0W-Dk@6H*2@94n1_}G#-hG9;@xtthgsY%s=kt7}>`%lK z6@yriade;k!_QY|tNLpfS4gyx{V}i-l-*Jl>>pc-<)a=e&3*lBeXYHgooq+D(26wB zwTIrc{-D}~VAczhqbARbbSHxw}phsA%H zq(0?8Qc?Ow9neAWWyvn|T)`U;otQn;Wp^eEVYa3(C`QP4D^&R%7F7d zS7ht9ig@3X9cY$vZr{KNz4}|mvuFq7?t+UzFzmyKLN*sZb(m&*e^3 z5~&3ppp}Icmn1b-W27Fx<^&rx%NqK3A=){V3C+}(UL*o8$)MI<{A_=vS{K>hOn3Q? zC+M6&bv<)(Ok())m)pwPt+UiDmO8W?3-p^il@0ZS6@p*@>K@8WBfi=_`9nI zFRPuqczbs|gBO1$JQmoEksB?x)HOv5iXg^a_DCl6++rzEY%JK&twBGoiPoM)vwW(7 zq=!?Ox2Kk63SV4ea#YZkDaGkhg`szRUAt6vMYz>BbkLr7{3Fun(3dufKD6;j#?Ebj zWs@t+%k~qgn6IQ|=VK`A9Z+LoJAL}%&|mM#DEG9_ab~|N0jtA}#;fL{WX7X$Wo@d9 zvZ2V0t9I{FpTc3gKn##W+e$}&Ef|p>*dadv@@Sh$D8$U__!?2 z#yhUQCGlT_U*&vW-Tfk#E*9b(*fKxMY13`QhrJUp&&gZQDSm7_eYbHIR0Q!S93{3K zXOp!i;0oSs*Cf5aY9Fy0!{+mAaCflqre!{?q{wk~1nC1mnGc5#IzEbl#FC$%BD31* zn$D;&-I$7j-syv{i$gb#3kLcBdr(or(Ax~EoXllk2pLhR~7va8rOUq_-6IN^PY zHV{Kn1Wj?C;LW0$7>V2HoVr|?ZcN=!YSlT_Vk&@UTzMTABqT^15W(ekhx*{AbISnJ zev7fSJ!tA~zCqTC)}xDKn=#%J4ykov&d{ZgvaVhSb_9+iM6UgEkJwUormM7_2aogL zDjMwSK|z_>Cdh`b=C5CAtS@VK`{{l$M${#%7pB=UAI})YN0& zfFu&o=f~vSeaRy*-V0hA3n9o z=jf*i;bcOO`RF??r$#fptqK(8QHMAnXs@K&K_;Zu7of{%lMy33F*VcDE_2dIc?D)b~Xytbvij1T9GDJBuT8Y#Nh7NzAM|O|M8%$yn4-5+;PFnHg=TUz`u5`|yg1AJyTQHMIw# zaLl-$_NrZVdyWPsaTY~^79he$5oP={J{Jrdj9meIQX|FMWAcU{RJ=%9rh?YOLgXk~qq@-OPlF+@C%uX13b#lG`ljvn?tK^5zeIfa4YG(4Zr1 zZ)9ENqr2rAxG*=D#&TmbA_eIy$lZn0=SX1jP3?-epRf?3l=f}v29*ToXJ#7{R&aY< zapxpidS)b(r6K}*0yE=AR|;2!7aZEDcSbp}7aMYAfG#>5M(MLqzkh!uKm34Cwk(0@YRoM3e9VXX5)*snxq;%&@p8iea$TOJ(SJYQw8cj zB4Pzew|EZTOTJ??>Fqv7HeM3|qW+RYWlsUD087?Vvt%{P0y#eh&e5R5rfNbrxJkq`a$s8EnUe~ zgYRTp=uOkLM}7V)_m96ADT-&*kPcL4w^Lbs51Rnao!&!T1IrY+Zsk$=wfJ>RYx->kr@s#zBX`-QJl^>RLtecQOA zZBV{&q`gc_T+cZse3+4pRA|Jxk<97M+4HgH>!+j%p_{lG>mi-Wq-8EBV+HD`6lJv2 zi(T}7^9gPVje>p)x$E|VLE7qDN{N`DuRvWB`P%Y z%(FT`aJUjFdhxP$C{Ly)73LeT{FNEeOe6P^UyE-w;H5dO?_nMz1{&nfq+O zry^QQnwdgVTEs-D<7I1p<>jmgjlS9Tc$qhmr9yL@6r~d>bL%z~)WQ!r9(IBL8{QZm_nz>4MY7Z6_zSos8$@A5^J<0L%_F!WsYwijQqFI3;nu}^9!hgL0Ji`vyZd40K1_(_&PCU{!M!dOYa%;%l9~|;H;?mAU z2_5JUBn(TsKD_bsp&>+TIyEfrg>HQ6^bE_hig%e@GaZR|_EaO(r^-6Tf|uz@gLiD4Rvq=fvk=mAVk@l36y#Pt5VClc=A(55re@2;r#l*A zS6f!TGP`^%Mef^L=HF^-h^sMzKQNyEmGapG9G~&h`tuN~I*eh5FKU2)lVm4W5n0AJ z5Oi9S-U$3UZYbj-JsNB<@!WQ8!4LGhUjGr1FM7sW9_?~jlQ2@Qf0I#ZyuO;4G$PW- z%dsBJtfE3xUW_6D%B;lsA3&!@W%%)q+79NsM@#J=ZU=Pka5-$9(z5$p8Z(T8>XShv zfjaZmjc*H7^m&lkagW~D9^V?)H>jq1ee~1l(G;$AFU5z~KQ9Dy45`)bC$YcEJCW3b z7|bPl-bTvVoGRiy|5tHwEmGmjsw{zcGdz;1c#&Bwq@;HET=h2E5(Vo%*8a zeeO2?ynYSG6%v-0Y7+^3IbeIDinxkZ7D9P}73TGdce;$I8r`W+~5A?I)pGz^K+XPQi znPPDemYf@{byh@%6A8T->Qz#!6f10(KceXK=+Bfu;`KTW-Y~8;gI@SVjHCSo9eAL5 z5y{B8eFY<~ekFuIJi$r#@Gh7}4a4KtUI1vFTrF%m!OU;sy0k zK?SkC(c;8+BF~lOzIB6a)l&iY<>h#bYf+Yqs2)zwQEV2ruL7161&v`58mny~D+-_E zD?AUe^qJ~z^M$M!-d}iiHt)7`66EF|WN-g0C{~mY&`ox@Ah_70k}o`Y4F+ab$#@!g zRkwZ;TdFK2)jDWnZA*u^xH>%RFc~h}zlaLE0{LwcAW^acHLhy){D|I3GB;!Nms*`4 z7ELZRDbDC-zuxC?ZGJdIjLW4OIbDzk85gmFD3^44Le7Wd&uzTgF9$9hQjT(zx0=|N8unym zd$cNRu8x(i_PNHz%jncy%IMzMKUCFT{Vvfh?pbu=;sDb1Nn?Zzjki8MwoC*ihTpDT z95$y!dLkNJ4c9cYBsmD#zfSf?quPMb5PHhv_ry&eTlwhZA8ZLZE}zc;rQBit@iv{m z!f}fuamDJhPmjq^)w3#~2juVU7bVx6a6FHXZK7wRC9QKMaY5^n+pr02_OQ^zn<4tBt)ku}?0jzgzJ z8y~V`yny&3(+Je3Qk)5Lu^aa$8{Cr^HzlnJ^5PzdM{HoO%so*k?o&LC(ktAR;P`kg z7_f2GU?wml>h-V`<5Mm}bOO|IG_*4=ns2Z5g>@@k?LGpsnt?shk=Fp%uTYJ7<(a#U z`e@xd+zCgM>yD-)=$SdYr+do7r;WIzwS@uKpe146G@=+JHq~brIBh_5JbyKU4GF;} zB;x1gS%{UOyNf7ap=(bxI?@#q3QmfZOeNnbQvJR*PV4jKrLHJwS_sA`ht;QC?3~tv z&ky>L%J1)Y^gH%{m}ht05oM4~CCGn1KNf?Ct>^RB45{vM9H&YR4n3}tTG^XWdm?T( z{GKE{tKqIOw_%071&OxGEsM6pPNBi?5;9IHh2`l}45o4mR3d#T&B7I?J<6|FoPOQM zbM`D&xRVxdt+=}^UwZjg+EUbU@B0MkRflH6W05ML&@($sYm~1s@O{HN?m~FK)}zN` zz|LMORADx==Xob;Xh}R{ew%8xgM_uaFeEG#=m6*%j0-;WfG zWepkfFgVj|W^y+kYu)kK@9bDV{ODL|zQ7#)z<1&8{h6DU=NX5?^(h$g zL@WI`4sl_b_)D~Q>WD?}mPO3X$T*eNh-WD}0r?1 zS2z3g)G@C4v0IKaqu9(-$eHYrIll&tcU|R{EQCs~An6{z#(75pKeu2ivOt!G;g!Ee zSEQM-89ZzKVTJF^lH{=lUfG-aex>QiA7QoeOuE@`L*h3GUE0G)3~JxM=1<}eYUBOL z(XwdhbW~D1eAN#>x6jKv-0|)G2`uyF}H_H^`X0~ z?ZcSa^yVHBzEaY`yJMiY2W>MOh>m6xeVEYyxuIRSGUZh`7KZeySf?s{XZEIhu|^*` zqchD{@GWMlYRWP@DA`r|$dcyl*^Rqv(d?LUE?^+`W-wbic($gYi#7RRg=rXnk3*I0 zz?D=8$#oZ+EoT@AaX;p;@zSj}{;V#)HxO`}n8_Yev>`A%s4lC5K++FHhPs*Zr{yt31tAnZ=jO#J0VH=CFV zXxuwf=bkhgT&;EHT4NBvYiQ@A&VYJtek$yIN6IGF#l?01vzc$h-bJ>`JHx}_p%*xm z>NXWhTq~sp+Ybh84w5%MZPhmYfOpfJatP8ncVZeysdsIiJJHSb_RMmLh*gUpBF)Rl zB~%0x4BGgrzOYiRpQ9!@Bi8S`-Xk(>I2@FzJh||0Js0yHbKs7C8lDkFMf&+uRv^g_ zwv~vP_|2k3M81>-x!el*0>z4q-XGDZR{J3Y-)?qmSJ#&EmFol%8Ba*`Z85hCAbE=P z@ZUv8Mmw!vdmj6gw3?gYtoH~2$$QaVs*~Km%Jm;iN2{f1}Bz_mC3ktd9Yj) zkjS*Cw=z;Q`*Pa>7%-O662{Nd^nR|yY1cm$vQ5n5o?GSAu71|q{mn70)n*{4*yi3F zgZ@_rqT1vE=Kk_>7e3t0mEt%x7>X$LpG}?h*b}ix0 zYcFUXxit$2t4O4Xi)IUiCv~m{f(Y4@0-CSum_qqCH_vI^(_ckWlz=MB8^ySXX|(5; zBh@NCxwaUEclR%(p~lq(M7!SBt4p4tSXXvlRWt5Mpj)4?P%yGb6JCIKv8fYqAVn`K z9ub{*<6>FM5WKZU@D+M?;q`X3y31l~x{QRwb|wM6iXn#BopU7Kape&fCja9NFH39D z;+Ka+NSRVqKl!-t2ac|q-@VdXV!rE+c;++X*17i}w!q3c5UTMI4Ukx!n3tLp_@-FQsIM>RYbD2{u#N*?-oFsj|xSD<4H+^ z(9R`+SZMn4Vk0%1?ZJr1Da}_%XdBjFKI9lLVYXtoc*{ai-O(`QNGx;5Qmg#E2+HB|GU zl3OaA*o-JQdBh0wgfho&fOYby?kK5s z`sx5O5kj-+YuJiCnwX}(j~k9bA-*cLGFTu-y*G7UzmhiOvfpZv;(KO16+gw%oQ(Tf zTc=}~^=v+f%w(4ZFqeVP-s4v3JBdTlXeo782EhZm^0vyC?w&L4kc6DKJ?BybOUC>%Z^y@$8szwl>@1%fcpck9Jx+YFD(ZqT4|T8S#`P`7!x{gThLp zu({rM2Cq2+{pR{|QzZ0~T7S`~kU3qfrD5TX!9HR0l=Ow%;gNUS1oEh7YKud`fCl`J zNl~Y{w#(BY2=N;mqvE{lnF`-C=;LN9RiW8ev)Q1dQ`1xhO&bj6LK@B(8>C~mp%GzT!r27v5N}kz8nIXWuw?>MRz9B1|oh=Y!JPM zH`dKp2Z(6yRZ7u`<$+=rh;Si4hJ21U$KBaJ?3k)8uJOo zfgy)fP^-(NOJw0MO10b_9|}yyM>ig z7CiE4m!DV9Ii1g+xr|yH{;J)%Vl~||hB{wgf0$L~u;O|@@4#x4){{{9wq@D$6;bq% z&8q;8Koe)ic-qysRn#>#okTTP-FG;eBiHxmGAD68RuE#dsUl@*D#4XZV}t8WYbg7S&oJPcqJL`FpYtq+`Fryy#}% zd;g$)`KJY5VL+!|%;Gy`!J!d&ma^BqkW!y|Cx6K~nD0}C@zjUNHAz`bLORD+k zsko@ad+XBvDk@-B)cqJ~=V?njYcI-}+KmxuCZB#c0LP zhzqaMk09VIRLi6nItMC+YVqe5-udAVqzfE=W9MJuHZfw`dCA^%IpVa3Uh+)5O*VXk z%7iHdxlmq9a~z-V#}b}<1p3AL_gKidf{Z-;O@F6$E+ZM}ZBjaJ4Sb6umwORe8aWcH z90_+1ZYJu{nCXEF6YdE9iXkoY{$1Rd%*=FhRRnPikq>ATjjrn?*)NdR8&CAaJuoyr z6kuB@eTwf3%zPcZlg1`fZsuUN(hKF|+ky(r8{}puH+0I)Bqu*%H!O%5pf(%0AL-)s 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 q{cb=0+j zq-kTifPh;))EfVt@6+qh34gf)5@AH`8PM`4|1_^T7ja- z4QoLX+U<55_QDI(q-5`pAL7|GUD=VwnUcEI-BDv#@FZmuUBFK=;O20Brj78uB7tMJ52vM zD*}dxpz-q;1m_>tKPM8gc#LWl0!~1rn15I1JYaP@>n5937<&0><#@PJ_IbIf1Em+v zJG|x9yF#{W%jwpa6|oXD&2}$9(v^5x_qP-WUZ3~DCxH#WtMA5mxF5QZ3$53S6F!)S zmwIoA1^h59aY!S~zJ6)!&C~j!mzEC=z*^ofIcx&AoFv6MK{J&sC~=I4yc(K1G#;D5 zZp`q?&QEo_=bd#+NbA7?zL@=TXGs2-+tF@V6xpy+e4e;{E_O8arK>Zd$X% zxa|qX#C5|Q>+r)Nf4KfF8@ZA}zdQXPbcpu>@fJBa87r;^)DOO!!HWw~d#Ui;K~Nou zR}(8stlbjx$@*e_L&s~PB9KWeM@YncKQ{+I2&7Rv^*N!F9yM)bUQpeD+e9n(S z%RAp7a)A_YHVz52>kb5@t#2sMM-^#*dS?6 zHqdH^FhFrUJLZ{hx;F3q(i4h@e55bRygH@z_PdA`76LA(FMwlYs8t#PI{hnsC0}Ud ztS#uZ{5!)GH2A`yCI$8nKXzK7l@XxJSGy64Jepc)U`j`_g2U>QZ3!i#dX~tbCEWb(2La5_g%=1M~eTl#8%LzeJ@U z{X1oSf8M)Knwu>Ey!Q(7;niwbfXsYbkFFphX?G$!{~Mujv~Rk^4#i8@T@Qc}W^Nvy z;Y?A)n~No`cVt1O6xgxZ&>_&DkP5q273!Q8R07ed^fh}jG`4V4?uoSB?yc|{GaxfH z)<(jdg{6S>4q}48toHi1J?E<;fBbPysCCzre@y&%s|bG(deg_`DFrB43s_Rrqb^Uv%lE zB~pS>yWOA>`n}1?mJ~&K^LsinsRWu9G6pjC&mo?dEr%}yxbX=T>%^dODcJ->#p%9` zCcl?urA;5&*!U={@>!urypPZL$GW0hdp&)c$^1kIc(AK z`QK)HGQxl(c^pv!aK%H?bO1T`*L=N}{Z;10;DWT#G?{K6vUFuA*s{?=R)#vNu$(p* zkK}YAa&^B)f5%<2vUNMz&={4e1Eil|O0}CoQKJE!lp#yQKVcY%SSGEQ1FOR@#5PSr4fr#|vgz{NTMkrkOggY`M z(2#ffiRo!B&*@THu6%K7wIwXXqeeEQ!i;cWU;z0Wg-I?>!GU7~jxY!==3_YpOOiw^T{G*WS@tB7V51{5# z%9Hp4xh_J+*x7Hbr<0{R*?B5e%JeKLfWf`=^)qvxN-19JQI3Cy$=|glBi2>C?>lCQ z??RAlbWHqrymTS?LVm|C$nh(0h>B>LrJ*QbW4TWkK{KVyY?5vZ@2zfkyTyO^eDa|b z9rQ%C#Dne#8hm`=2jhCbPuxkJE)eZW9ZDz!akH9?)1~*l<8?-Ewq)G$c%e#fEG>=% zkbRaU#Hc1_R0aUI>`m3^4<882#{uA=C_}677VvhSJwwD3`Wny3XtycLk@)YZ#e0gw zVEyor$49B0O0Nm}&n1BG{`}kIgr~7jXi0o+D|~m5v>lwG1AK^D1ESdQCACt)s-jED z*MHlH74h4Oyf~O$M*h9$zdVaxS-?$y4E0pG!87d^*B~0TiZn0_^sIo`Zu7gmAx(i$ zJB`!P(NSa+OEE$AX{V-*mij`y?K5EF<0{yb6bp&|+?lgF1+*fA#1exqfqMuJq@t}r z-XiKmo}x8$i-EJG_s@T6`~HCED1S8YJ@*A-%J01lm2RUz@bO5Z#GU{PUT(V~EzYe3 zrsLJs*I!a+9GB`0*i0izF^er1IvmUs%A|1TI1TI#uk>s#czn$6Q=UO477;pL?fb}P zfercx*kHh*5|o8<3D{smp^AX`|A=9x7492U|MoWB+LSXuLeiGMEuoDi4Euy;|GtEBVaI$$OK*_&(b zmEk{o^97h#Ju5V3m@EW*-cW!`T^ih(48*3zmd_IN0$Dzh{q|V+hs^w346V6V4}3=b zPKKC63AVHT7&8j_s=B7F!-O1UDTq4jl}7zccIwEE{@5%9Im68>|3ZBXVw7XRK5gUkFSS#AZGQARztG@X5V7W(E=Lm!i(e+%3F?z3Yha4hn=x=X?M4*EQVDsu5%xz{hr6qHCV@j`lyWbc zDz{piHSq-_em@Q2{5DdDwm_KF12ir9HYjXM|2eTosAa#3_B0<<@zXum9334O0Zd0Z z42;RMh;aaebho->Q1rTjPtaCVWR?FYtTjviHly9|5PXRsr)Xy8??b!(cTJIZr9G;l0+M#N8_mj3xi&cW#l_@%}ScWN9+L&GvUb ziEkSP2RQ0A?w7~eZ!z4nulo9IO86fxmDzWua|+O= zr9e@r%9A5qS@5{<1ikcSFtEFUfdXYT$Us!6s@%9?Eh%57O$`F$^jJj5sPV%ow$1ui zN+KP<@q>8V-w(8y`{($$_w%ny|Nlb@{&`3ap`@;V7XtVkf!{9Cy?<%r-|w@FJUo@b zgjI1HQWyW4|#x6O%Say%aAtiIeZ;pZEfu9p?cm(DM=wY39Za#U!` zdH#H;fPBdYnD@so z@uT(O@rxC4R*+B|mf-0n9}>w`LhsN~$%U3%~C#QvrvryL2mo#PZCbM z?Tl3gA_3n+_Ob&VQW;B{W@kImYEvap0ljCi=!Q$;a8t*Y$r3}3WV7Hzqt{mCd|$Ks zi7R)7&0u|Ds>Y(x-#(?Op0UhBr!x!(^KHLUbk14y%y;MG&ZFMAA*tl9U*6nP?^pjh z1lOM@(sA+MZS`FGbBX=Ayd2y9`&jQGMg?h;o(v-%`|qoQ|7V{_BcuCKr5-< zW@8jOpQ2R2?^v}?myR@M4Je-)4_CmS?H-}RQ2Jp67Ie)-S2s#&NDjUpRz-*h(u}GEI84g3% z)vr}kP2%XF65a)4lVaycrIzF`lsXo0bdT&;B{Yvmfw@-=p6t=%{qZjs}8j@Q6hg#v8@35=vF_wrAUWbg_hd= z%C!S?#uQezf`XaeehZYuq`#iT)$a@pHxNZ61b{$g`$RUgAX<$Y^|hG+RRSm@bieO! znm5CSXf3s0@>vULNl63%#i@co_iBS{gv4b^r;ln(@4Dxk8(DVqfqt=1o>F7D=HPk) zlqHZXt(Zo9US>|T0tvhhoY-$`!mvo$DfnN72~OhA$D1ad9sl>S*l!yH=V){E@wZKC z;|30kAwHmPM}4{I(GD2&+#64s7{hPBGtnL0hZ=LUPOEP4bKN7_LKO86+%;y~8InBv zyBC!3K*B4BnjFBJo642plS(1RVX;_{BixjTW=NNx`+Vf*`$+Od-s2!~{f4%y(;X_- z=BB2_*ixhvUbli(jznFE*vihj2Y_42o8OOXwPx$r^IwJ$|0iD6E2#`A{u^hvL1}*e zZNBS|)jACfeuv+qs0_g!x>t{vAfIv)w>h6&FsfIZ7IL}Gr+M8Dmm9eB5g|qh=7E{e zG4`Yq(QO~U_<%wQ)ohC`j-WqWPl;9|>#5i(n3YK?6pAI+UrTO9B}>p6uU^Va zF;imzgdh`IR>PRzaYw2O8E5$A2!D;IEL6%Oqrzb^egrDkey>Uwbhl4F%db-OtI)?# ztF+H@R7TUdtPpDi-`_P>9gxeUh`CMXYdx=hKlkNX>G@Q%89ivHW}XPcB|FUTZ4Le7gc!bk?jZiJ zE&LE!{whqm=Nw)9IUf%JC<7LD1^-h^Nl&G0Q*@yaY^93jjvhou$NTjCD(8yNarDW8 zN$l2HgCF*|V33E^>&4VDskPzERIXt{R@;L;6w6WUq*58tt4$T-3Z_ulW9YPCLwr>! z%%{q1R0O`WLXPIhsMM@=>Jna=E|i2-)tmo-wcDE3qLZIc$ay0$$5|b{cd*c!`C;xU zd)d8b6gm0+Y)kmVZ1lvMZc&9RTAdas7*w*4iE70v#o8gDBxG_7>{`V04H>gzV}tv< z`*fq?Y2{1M357{D56iaSiN)eI4;(ogoT=@NYyB7lO>Hq<#qQcWG>=`qy*=Fugl>V+ z7TSu)$cV9{FQje($WtF3dlbe z6-Jtp&Ff#H$pHO3C+Hx^g-86q@&?48^2V3GZn9r>@OV$_hnSy%PH!a?#Dhh=Zq6Yl z+nm%-TLC8p_*`%%poBlbqLPI+-C2^Z5_k z)wUF^nXD#nzu+ZcX%db>N~^mXn4ZAxL@YH8=LpydfSLIWVKYEFnN!T9`3UqBu|*N@ zWky9TiP@o4YgEAXvWF`Gi!gKWN<#|meYY7-2 zi(;tb(hY+aSVf-Z@YQFYycp?NS>!cQkXg*aFz&NhJzf0L!RXcv=cJ&n;9FSvjyt<5 zCC#+=;}_$}nwXrhCb`}7s0Wb*@R}M`#^G|r0pj2_(djg?a3)G8s)lC(3M{s`{Nh#i z((UzmB((!?p8HZ%Xjl@9SQ1EDf=5wwUUd-Dx`JYSCU{b(~e z3Us^xQm(e9;7g=|qq~{DEcM_9{u_2zkJ_?mk|wMtgTV&n@=}|a)6vcg3@R!A0>PRH zdh?GUKN7@8yl12iA&Zde9N;}X4dQr?)8j`OvPCl&^+|7MvU}J8Y^8u6{0s7TH> z-9IB24Fx0T{6nb%^jP%i`zg0(nmbc7m0xv0iXfTCY}1MtO}lMXTq_wnb&Ui*d-;;x zDx!nexepD@*C6&e zSrE-io9WS)w$rCXv&hjm-avQ&P9c*lh3`>l^4_Q?x?}hiBAb`X)d^RbVSiC~M#y-f2AQU6=ls@(LT&W7w%9Ryj!LGv2OtnT&?}{>-( zfD9N5l{UF2aky42%<5srFM9lCN@0$|cj@20;3e1B*N5|n;P;Xu+RO;AP39mj)Vl^% zn6l)R|71lhDG2}cP)351{;>kZyHK>9N-Nf?2KyCvK7%QIGlT}`R)l}bL@?{@A=NK# zuN@5swkX*c6{ZQJs4fHNX;y}o3{2+JlN8xMy<;3L-q>c8c)@V6Kb%PmH1~J~{ZNpr z>wiJ$GPeuR}vFX!@kj$($J`$BgO-1R=nGB zZs4?q1gwa`43ao8dj1ER+S0W((1P57+tRn;96`VDUmDP?CqvK)#G)q;DYHuY4u*D! zafwSWeT@gHSW_ymaM&!zQN%)t%3sg^a`ifrYRd~}iGTO(Upb=u43&xFDNCb7!+JQo z&_0E;ey)%}g(JtWN6E}T7sDk(KKJWvtx=S}_ad&V2hsOe;_-@FA`-+$oF1Stp}uw< z2i|o$JMKV=2w)+hnBj7q#M*vwjj`B^$b1>6WWE#gShO#qN`5{W|C0JGy0lX~A zmr<0VVz*cJnJx{72?8D>9h)K*ujSIAl?ye^+70i%iTs_bD^}wBf4M%LdC4PIQVa8I|2OE2ZOM8+>Mj}FM`w$9w@Ml6!o@9y%M9=&NPg(RDY#6 zZcyNk7yl$jf@N31K;1w$AE^w}ZQfWMsTLEPlJ5cuuYY&PG+(a>0tX|M3 z%Zh(Z?pkZ7-{`QwkqZL(XpuKA>U=@?EGyL z_MAPOI>W-ptY_2$ph}`aA44oqc1JhMO(?SXNW<0V>t|6GsxxVxiATq zDI0FzM&S||RGgRe^8=04s!wyNR0p)Y@u<$uMSn6L)BGiTW1mB@7B}4?!Zw}FugNf~ z0*>?06;xmO^xj>w%5%#MvX~6z{9-k{FVYDy#0?v>|L62#x08ibq*~!&BEQ8%%xQ>(p(e&od0%vqEIw~%qIpoIIh>tWo+$f zvtQDM13m#NwTexD-JXO}&fx_R@?~>A*@Tf);Khy`4*Re!5-%uyoGbX8p!p z=*aN>@6mC05)EY?n|h+WIxBf8J6`#Xkczim1=g16SFth6xh4<8FJ) zJz?z46jNFoi9yFn*Y{VLfjIQu)N*9BT0>ZqAkFcrR^6X*e8zZ>nK_Xor<6NVWQjKwNkBjf9_c*5w|D3hNDE=)o4{>A$pgexNvN3Vqe1XzcH|BU-i&krO`lUNb(FD)Kn zo7=oUA(rt+;I_B$5+egEJ#At(I~VWY&|mWYl!`zC(*Xjz>SHnHL|^zJ2v@$^^jA3a zi~hju45|^u9?ATP4XS#E_`$3Xv7HTW4bw+Vx-uTGW^mce6i+tCL`*ZJhn$p)r#(Q| zPx5S}v^$9wF3PmMP`o#eb?S#uRg^DpXEiWFM{lV%6Xtc@>v zUAxTLCN>6jNNj(0by0?DomnKv)yP7C#-c<~ULDE~SJB={e`58p&7o&l|Gppo7%i#T znT0&dDc9Ctcg+-hv#);#(@sPBl4j{ED*#Ed@cR- z9Cv7Ps9^z{3cM(U?Vw%|uGkP>K8`1D55mSl&odA=_zDWK3n>E3g*Q|-0xm?G+yE0R zFquqcZ}mf^8hdli|2Rw1wzHw}X{ysLmCf|j`h|!yDhmIQEf%Y9p@!r8M#4+!{rM(L zH%ZNI++516(hy?)A|p&wZfbX#?l7HFGeST!1%aU%v7jh>K@BK3v73mA<$&aHAB_F> z=UU_;>-E|)WV0q zc5314BFy3LF}sPa&pj{h#jDHjnRhR}w;Ui2F-Lc4J~Xyu_0RnLda2Xi+nT_fiOZ)i z4U%^TEps&@ncg#?P#s;w$e>;Gt@j&a|JA!jiEfPcpZxbOEcWh_afPih`4fjbo1bk8 z*SXDwz=orDae`XjSz^3e#@A{T`RU;W8pa~~&8xk|79q|rTS!2_%AYOYrPyoDb*Oau zRS^`bzq4IIeM3WL>3UBB;mK4Gff|2cQ6{R`Eb7jA^Afq3z**f|KYbB7;%h$Q-Tm21 zNlu3yPHCs)Z*d3R!$8vPOmIV zgx?_DT&gI^c>-&)7$5yxI$}$~lvLNu_^G-l2rJ?FYqBQ;D>I zCKM6M&WzRA$Gw|&JPxZerN$qJoy2Qz98P3u-$2iu4Ez}Tkf)qg!A&W16cQ-$B9zDE zz`E%}A}e%&^KGdM#M=m~#~g*4nT2jpfHqV*Tj0 z|FPQ{+5YA5oflc_7JZEOfzhZxsj?tarLHm9urv8n+ki0@d{yd_$irmO-Pj`3IY~gi z8|HFmB)M)zWT9B7t%I&DN7$Pwb}nu5r@qvvYOiW~p8mcd!dt+${b`d|f4V;!?~Q&q zb7p`hLvgN4#|eT&w0aL}7vB5d!+9U5kgdNES1`QRzQ6;sz%ic&k7~GIH%IPfC_5RORCBHT|`kTdFe_+`S`wn{Qa@W{~_`X@+0W3z(kV#P^%2 zSG-DMrxmjZw^hOTY*>|M*LRIvw9WF@%qw^Jq?hL}+5cXb0K$v*3ey$z5B{U{aUNH( zqhZcSQ5?2UaTVZSf`0Js7rV{Zt@@|6VZ&a^V?128+p)9Et5 ziH9@gevZ>tJ`Y-ZOL39RZTx+VEltzv7v+5dv|?4PZ~%t>elop$X=alUV_$(*oq(wX z-(EtLn`?w@p4Dv@JO5Wj_rq4M+6j9zVym_*Y?I-N%A$TR*fWuaS~e!5ExNw=OuS+GNQkno&m?+-3^D zd#GqgqNlfhC>?LDqfoK-TpKw&GJ81Zlbzy|7_u*bs4W?5Fr{hK-}F2Dn`k3eqSFvtz*hv8XVDoEFB%G^ zIl4CsuRw-mX7y9SE^kQ)j(Q~u^MoYZ>URD6o8gyZSP<(#_8?G3@)k6w6`Z{i<^!$9 zYJuYNX1Osogrw)q<d7U z5cTB{V}&y^B5rOj>0f+W`je-`f?k}jegVY#7IYMp2?)Kzv%&D;R|OuoI?&QbJh zz)fQ3s!}M*+kYvTGDR(yAs*3bLT5M7=})BfcF;r<(2QK|j9O0$=E_*+ge~Z|x31Bu zuvYC&m%bOS5*Jj87ID*+dNFVm$6dNAVKDH625kErv}}$TubPo9s|#98SM+S@S?Lbi z7{TR1i#WgJ`OT4+dc_mhM4V%$av1(06h4Q~ml-ZE<2<3><`~Cp)GVhYgr4j}wqzm> z;K>gZ$Ii}8r~vcvLRVHQV!86}gL&sdo$R$2ce2On$69wNnYAZL;&L;qrY5FTnUXQT zqq_|NLFe-QzgA#?Or@nmCy^Vh&Z2C z>p{jF$5RZfrfla{wCQ^>(vFyOnWoG#9UMFeoXh97DJR^b<)pISG^f@`msMDq;>q>` zRUD~}uPRlp6}A=x@P!D_H)*RccB9F4)dK(INNc0_|J_Y=jX zo0ukPn_`q*^~zh3m&xs0JvUg#a@_kt#yl#tHtpr&2gpMtKRj@9xG$%U4$NfJvyB|(em^L<{g$HERJTOAg3laKt}*l3g&-TmfM>i%gey}O^w z@73ac^K@n6sfg$_W8 zIUUYIQEv}hp&4`c27gP?m3Q+L3u(rZxXeRkwpcd{d$u`Dc0TXT!pz-`Cg?OdU-u<8 z4P~1gVkoQ1X7<;mof(-QpM?J+v0mEV%|Qs5_4szpYh7^5^>X8DYh1 zneTL&S?0za%i``^1MN_xDTNx<*Z%M(d}HS0hq;QsYGq~|2widL)wYBPOy9?mmXG1x z&(+DiUU7fCLzbs$j=oRQJ{8FKd%TNLd5rys6m8RNY7)he9S zG6&MzX-C`nRzG(cY>obk%aW1`%Z#Sis*+c5xaw2Ol$tL_W23P*(S$*)qqR5DXmGhc zYspQ2|F@k& z`NHJE{zSJ4N5ku`KPxeZ!|`tLuL7N4aJc2kOS{@_|B*2$*W@U%aNN04DNp%uZ*feT zd?YwQxR-e^y9Fk-RUbNR+4qIfL4NcSjVuV24HMS0qpXEW*`>q$rK!h~{gT2N2c*7= zqVB&JY;6pKLHGIavcV80Gvx)##+A#(f!t=Gg-V!F&*+rIi&vwab4M(T{;pP+LFQMO z3Zd7EKnCT7Oq`Xg%Wp5)%z@4@Z9aMpd-60(vQ?gf}RFEK?7Q6Rs zi?+S8P-8Gl%q2Fy95Ghvx1aPc<=Yx;auVNBD3zx-LXwPy-97iqgT&0lVVbq zug6HMfFAisbd$^GxofVSVVU>8zFye~t#F?n{}5^&?S&^R?5VX<`T8zvBVkDFjs0ca zFXMerH`trF=R5nGW3&@7cc%R1#*9N3zF>0x&&|AiQj3tNT1cC=?{r**<)v}2LuNM^ z*>wGFH;LaA)RCqQxvild>Um>Qrez&*i+BXpUSa?Jbp`#*yVKD|G1&{T?@4MFIhG|S z2vFNpLq&h%yQ(5~PwE)2Aru=O_XYajq}R?=?Prl0ZIZjd{R+dToiMuyUmz*Ze9K`q zuRP5a$!W7(F??Qs*$5O&W;QRm>m2UQ)jrhTSxnVt3=>~AZf(CS``S18UV=-jI$Wk$ zo6fZ+t*w*#Z1{^nV{YHK@m1qLY_au2Y#vwYCxb2IYh>DhRSqm?uugFPUnd=8_-KMo zPSyOL&$Lebt0P^773to02|=bNE-y>q>`zW-@&dTa*D5D!$d5r2D1%WMb5~~hK~qUP zUF}SkN?z4{T1t1qJ8H@0gVa!y3i&H^&FggF&PNfPVVOa9qAP+^m^&fnQxp8S@9&}Z z)Q9-URV+A+Qi~3-OB}iUZ-&$-&xH0q@A2FwF2$13SK^7eX3V~TP_D#3jk&!WY*Qx? z>d5sGKE-F9n5=VLxQ{+F^tyrw)QtE|ZFV?WzA?B)X1eR&EI88K;Y)s-LtHx~gkHHQ zvKLEqlN07=M0n~2iD8}tBW6onfkLNoG?x7#g&e_=-C{Olr#`RhxuRJyrcsfq+fmvNoZXc)IvtS(FX(XVrK zPRrcd_ya$z`IKyp#4&E^(|kbn9@}^}roec8_LbU|)pT0;*t zD(xS&!CVd*S)7%-*_+o|+nc-^smC&BYhB|3QQ78K^4FjGHSC6>|G-{qZ^d~6xkF2M+@c$R`t0%)+IUpL57p3yk=k>4)xyN z9*Q5gNKmg0*rl!G#-f#_maR7l!lsU%=VzSp?%U~`o!_;s=00!rOO(2CjY|3w<#LQM zQ0w!X?OiiAWUK)D^P^{wfK?Td;EleW?l$}GFCT^q{qfBFaSWfFkC#14zR+|P9-^UW zB+&2>btJmDx7`f3lSZ08nFQj2=u!1Mc!<@Bw%g-`YD5_Lqdpj}OEvi_qlJ-8iuxY; z&~&qJ=z3a{+LWck-+dBzXFrF%tz5G`-KM@1T6SUfK9~ zyuvB}bdwuoch#y`7H1YAu2kMaFXuR)ol}k2iqt6653f7SY}V^1j5`H=8%4=QxlvBw0vRJCW2}@p(+l> z67S~doqaoGthT$-Ou9OkD05bVP<{g>E`?y8^w?5xmr}g4i=X}r&Z^)a7s~HwHCF2p zA$0zvkdau-f3_vB^nQH3f*xq_I`9{L3GGYy8sh3u(7s57D0g=d-{S!#V(T;;Evug0 z$`|NK^e`sf=6BiOz|c7yD3E+KxjwgE9&hMvSM8R3S|W2gUN5Ay1Y?p**(057dUita zXpr6>jO71p=i*59D7I=)qXb$s7_T>xrQ4k~np(TBFbfE1A>P!UtQxVJkK@%k?&_+~ zpCx@wRmk4sX*7-U9m@DhwRaD+)(!ij6R#y>=uj}Jf}@R?BJo(w=VKSn_a~r0*R}oD zObtxK`M!?n?d5SET%}>r8%)0Cx#)_RL!)xA*ke>_e5=`X_)<6o2YVoyuV8R}n73RN z3QRuR<|7q!#n>v+)jDiGqyNsqZn2U#ww$FR*Bx|j-{tP*`E0jrPILWbb%*@w|@bP&u>K$O{4WgEdRFX4wh*c`%=F>5TP?{ zFGeYbS_yq`_E+b=JD)oN&{3pVQA90QM@lGPUlX8FaDhtXD2)8GTnFlZEDQLXB0H1Yz_#P6Em_Rd`a&g15IF)*K5r zg`yUIzP8SiT4)6dp{GjSU+w#VOdgSPvF7iU(G81I{e_lj4;$vN1I^#N%HtR$- zOX#^edn~!5Jbez^-)K3Cr3Jy|8J!GQQCh1dD|m>O3F4?H(!8>SaKTJq8f{^1f9vb{ zUhC9n{&IUDwhnR0kY>js3Rt!S)u30209v+}0?&&gdtRA25huL|m z-%q6I3n(+{j1#~t($5H|Q7OG(D|nZNad5IpEN$9u-ANs$rn)!FrPorw$vj=)$_#NF zzvO<}!DMbs!?ujr-c#z5;YXpqn zez#w%kEruE3c6luLXP_r!wIcPtO+}4Xz!-;Pl=#tpp?nt1fIOxAB9SYAyh4Qz$_uZ zSOn-zY({IaN2dEizE6CEjQg)ETE(KB__q8OaZw>yZg@^J?WHD%TiEDgS+9j!q2{g8 zQu+$hU6MckWnS(DBSC`r9qsu_(HMn9YdqV-poIb7hsS%Bp2oU}q(J&``O}#CD z#T>F%h$A{n`YfRKo7u|L=Z!RnBucVhy%UrnFPR!@S!Aro_DLgTg0EBQX!O<=u<6@y zhfWOX<$QY~OTB>zq*rA=ZZF;5V)62Ho`}N1u{l+*efvtln>`8Mek7 ze#urULx%>hv4}RAE&>JLKl2F<;}vQQCwu3ddcNr?er7sX#X=>veT`jMktH1ysD{!& zxgwLo1OG-}IPN{~DW6i|NKY&FpsOeb?OB7D-8KqDZ%-htvhmr#XO-%T;cToondiWt zE)p|gSG@@;6lIV})?DP*!&mQI(EpMdl+{zZ(Zo~UzcpV~2AnhC}rv$^Oq zEV}qXI_{ithf`>}zLTRhN%(jksPV!D!x{)E1Sy5AU_U!k`NVNOtflvmv43e*PL^7{ z#9D#mty2_xffkDCaMrThqlvsY{kiXb8F(iQO}FquVN@R2$3vF+l5COoxfgO8Rm8Ud z;HSPJOj3!vt^TzEDQIq_Z>yvNE9`{n`aSq{E+-9WuY-5MpZ! z(41NwQ1ND5UQ8dzUAg`cMxrni7Ie<*jO-D|s4cK_-~LUG9QN4691)=S_dlr70kcR*C%kQd z*{cqcAfs?vXvAK~yCAzv0v5WHwK~b>Bj_rFNyq`Zs&H~m?2naHI*qg8q^|1Xk*o;( z>q1&x<+Kpn14(tV>58vVp!Qn#htgs^ejnj)xZ99O6LiWYDBoID9vD=S(1wm(9`$m5 zx=1}tCu5hcj7_7`&237WDyP)wAtTGU(@_+Uq$sU{DL?Cm?#rkWsC?&ezUNA$sJHCAswYxp?mZFsNdP_30O9YtV}ayUQ`Ns zH+(sUl}_SoyG!wb>MPq`>uvI&KdmWbsAPa0J!OckFiAr8CO+bf%I_gL}l z{WhAJ=n#^ugr_wrjM~eSOA)*NDO+dzbFjemDtOV|CR6AJG}^9FUy1hNPuqw_3uhA< z?+2oYLDTgzoL-5i{7HfAM*kNEK{R|9Px|R*w*TFYOeorc12mx0!J5o>R-^9iC9%+9v*AGc7O#Lpsz1MISoEyVr1kCKNgGDDmU`5gEbagVgXc%MqlGUuc zw=0sj2?;TvGsd>BWN4!LW3e#pdy0d0wZD5mQI%nxw4*J0?sD*k&9IDF!9PQm`wl&`cKZ_+T#SO)*XaDnx0ce8`H`;vFcybw`7(c z;}uNT$g`AfqA`SFa1Kr3#P(N3q?<(FX3m}#EpLnt5L$c_)q?5V8W6?*K4H3Q-)!pb zsHxA5M%7-0RKDnZtvywV!(0|KquWc^&Lo~MqU%Y##%X%WDkp?})NUNqonB&L$h{bz zmxwrVr+3%;O=O%y*n~w&+XKw|b&mUn+GA~@v>T@1u8{M-bP>OWzX-g8PJ@CQ6Z}t# zh6X7LK5W$;b$CwxFKRw`ML`lew35dHvsE8yvQ*ms2%jp+=FeQu?dimJvwS9PZ?}Q{ zAE*E{afW8w1Lys_eP5BK)@K;6ejDCq_7ZPbe5dBnFlmM%m$P0X%Y-_d?<>?UkBI0v zXBoaQ{}AcX&0_RbG?<_`K*3rx>=YF&ZxY=X$H}14$ucsR9nQ$#du=|7IO&U_!7Qt~-dqGw zC+iem@lqW1>y#)~b((p8u&iz*zNPvQXGEu6CO@Kmx(J~76UiB zlN;d1%rc4HqiRw^nig;h-*$bH3ARy-_Yu1(Iy~21FSwHJ&*;ggQqJ3SKED)LW_Fy{ ze_?d`13SRq<5l>DQ|03$<2ysToE7jmc?ah_p9;4u3V+BTMA+O#YAW=zWjjcvn6-P> zH6_nGKB?}^tOtif{H1?=V z$IytETxQ>PFh7<`QXYD{Q6RD$sCF+R@Cv+&P1r2RDb8Dwd!?H;-%dvaC!NB_aWH+l zfJ6b0H0!YY-+e>5`IGQfjnEY|q!M+LznN&r zLszlr5E4nOVq9aaAfJw~6ug`)CHn5LgzSqj74bJS4w>E|!0Gqvp93+r1tqfE_HiCQ zM!$jzCtrlcH#r>&S`wYFEC;KK3*7|6tBUWSPu7~{e$a^+YxS=~j8%=JwG^fm5JVxk zuBpj!tU=3NwprQ;Gw9A+5F#TU4>M4!K%h^{K@6@rm`pQpd=a+Uvqh&nS8uP;VNe%> zv#H(WMo8^&V(_B;qd7fxO%T6&I~wyM%kyq+XAY}Y!-Oo!YQFC#j-54GOi?doFiP01 zre7Piz{r!EBj?$_-iZ?n<5#yUaUKX<$Nc|Ayk9}jHa$H(ft}=yQ{F;laof}K)%`gt za9UUz8-XtH3F1?)YCR81h7S#q?|wZA>xiH#el%_!-0U3AN^dx((PR6VUzJ!bDUy}{ zfkmds$lbj;oiHaePo+8`SBv-Tlz??Sg)WeO1--2Lt}JFNJU(kHe^OnH+w4IBFpI2R+0(IeRZ3Vzpoo8VP z;=e$tz6goHw~J3;!?ng~6PMF|i|WPwTAYpURYkx7SQ%wT0^mf0muQH3>#xtaPEJ)8 zYH2nr&f(O0f=)nBu0XpSr3x&Lt&{{S(c%cE3nN_e-d#R{H4AaC)d(o1@n}}?AfA6` zv+mu$KHr7_G=7mb4}b@3hJz>e>AsVwIlKR>49qbhlK;6i*(L$a@oNx%zlew=+EZIPkr9 zpTklUAy+;t+$OJ6%YsTK0VWDE>xfJt>jL(*3IpmdTO&U(=LC^0o#NRp8T(%I4G>ta zOw&mTyYN*On(?xFisa1-iP3uI|Z7L(Hm6JML`Z@x!F++*xXv<8B zES4}ELD}jDw#^_ZgI}fvI97%P>%xM7yz!;95p4dpR4-)tIl4D_8Cd+VnyrB$;&b`E zQf}A{-5WO$b*g&$ReY_^ZH02QZ~{7+-<@>3#qEktUsxA0fQQbkBIhP>g?NSC`szZX z)xU7Y!BZzLnFsl?366>I-<^rqM7vtJ?@1xvc0HtfV>7SJ% zx1Tgpj+oI%dw&tq^8~!anum>O+vyjb#N(MDc$^NvvgxgtA3z`dH`SXy-(T2}r%7!t z&xX}1%|k9o5;lEG`zBjvC@x!&^#@c41RJza zbP#$-2^`S_r2m_))=9U{EuLO}-=bfMg<3pRmMPvG5;r?jpL68$ zA;|k@SpwJfI7=Js4mHJ77(ysR#)QAfA|e-!2E{Bvdffl~A091W26NHIyn;Vt&0Kvcfg} zWRpba{`fZy6n|MQWZ|w(_Oe7jyGLbNF8wWC`TmKV><6W%twANz^4_=1oQ@dwk#Q}nsa5(_Xp@mTpXIt^LJ0g;a7=fr>=+<@?RPhc4GV(MtE9Yku8M0 z0;7JlO4UTJtLrb&8H&UQXcbGIoosGT?xbOqFoh(0P#$d-LtUNw*4h)iR5`Kvc%DqD ztH+Co!{D{VAIhE|>8E12;F%%%mVGt{q44BWL@2x}B*H@d)xUzDKxfqKKM{-Mq2T|p zNcrXwBYMnsn_-_)8FoB*Z7N9V(ft{BJix;M4Q4h*D^TA94qwBiy2eD-B2++dJp6mx zdhh=3Sx0ChG@uV15wq##bW55M9H&c2S}yR15TIw()l=Q~4p7i-^X->5%80?M=o?9O zqxbJBxQ_n?YOv3}vicm=;(p%o>Xmsy$63fC;UlNrQQ1S~6VEtZR^x-)MDjX9ejpGt zdwNpk*lM;w2AyI-AokkAX*g6Mo#@u=%-5w0C{YB1l7qdHgk>^uu+TD z?O^h!NGlO1oYL|&P1u3c^Lwxw%4BZNqT5}DEgkgh0fs7a+fC}yNk?|FHxABU!@EqZ z{`(9Rq=)e^bOkGOb>~br!>m-aws?NZNHa|Jv`TbA)%eCBp++dyYJym!9bK$0Qf-!8l(Y3wR;D=v`K&;;r52Ghv4#9Ng9-1dkMmw z>o<4fs}npZUZMceoC)OuSyA-@wvibEpwl(B&1~{!q*&7W{cB7vS-8#VO!C#ijgny6 z*7h;NIr#8y(ru7U3c zr?I(|Zb2~+gp4Pk)-1?tHKW|Queq9SJ_%r~D@=g1JN%H{eag|72q1Li@LIocL|pt& z)-Lj7>e{TV7E@S1O2C3KU%m5bATf3T8|oj{L4Z@LUdt zGGQpPt#HP1a(OJpBJzes{Af&NC#Ov~*a^FZ!jB!#(PhCP2&swRsd*;pt$o z4@LalbnEaEa;oX41%$YDfYeXK-u!$^;Z{JY?szH3z$v=i8HU&$NqH)fP_|Cp{Qg7D zvwE9`6?hSr;D~ys^Lbad0{tJH_g+7BsKy8)3}XismM-dkxn8s1T<*YJ-->!8ZH~Yp zDmZr3WE;XubLG_&^W8w{yva9xALYA~K={MCO+)=L6(FwfO`-h>=UYhRubf;| zw$dV(EuKjEp(ND!c+{z7CBWU_YG+|5ezh2b>f>8W{puigaum`{#4sK}2K*Lma0W*; zY324|)@IV4>hjOlopa9`h?O_F-Qo;03vywMdabld@Lxqcx9)HS>7K+N68L(&H{hb_ zg~zPOaoE_?aynW?oo`y8xSzHa3YL43hVAPb68qzj8;y{t!GEDdR1DTvIWZ@>M66lm zgo;ep=T}MmaUp{ar+9(JMEIS<9R6^*gRNj~E5=;5RDzz!Pt0i`-pW-fTaOe=9R7my2?Gs7 zr846qMYBR@BG>iNcvr7_0M>k&w^PqsdIVLkL+5lS82o%@#`19lI*>LSRLRWnNzrVf zA8SnIuIqSPjE69P@E*UQbvq zeg;2OrsQ#Na`Bz;OM2}?+tEvue(le@q^UPM_ z)^=O|a+tdF^*;5bT6K21!ndNS)qm^s*WThWeS(+q>U=}QUH>v&G-T@~q&zKxr|#3i z{5Dk@{o|oT@|5vu29ipPQ@zy(8^;qVdC$Y5ubWi=ke=bn{kn7t!@?UtJOmlf4@b-Z zng7Xnyq_{25h1VdkLZnu44H?R7rXTo#J~?O+8LcZLmTlZO19tr=!D^^m8QqaZYLy^ z{@ApXJJY44s+~4H-@1kVA8+mPo^HV=R!gxtBov~zKoa(b zZY3aYr_Zsm;}1@6(s2LBv~y~ekHEhA7bl*MI{;~1{zERhHoXnB{BbNME1ss zy{JqA58T45d4>P($hlX=x#SOqay{pplNLK-DPVwl@L8(=-pNxn>nZb;Rvvc0{r;Tt z5eNH0dH~j;pyrHh#-*vCYCakr zz}-Q57pHS!IMa~%=fT?`YLBA)@B80*>`dZE{5KrEgZIYy_rSzVPPxY(r#But$KWJ; zJofX_OC=uu@eYst)A1hh!QQPOla)wUUKj=!8HEf6m0uv-lO`$hFIPd1~` z0aNMqUu0tEsm-i+k1mGs=y?8pRW(QoAHrw7(QjGq2l!Ky%wt{9de#-v^ZqL90-X;^ z{MMdl!J~Yh8Da-Y>B8YOpGCWV&|t0(BoWGI zO6g5=U;;gx%pesK?VB1V3vu@myLqBgr*7NHrh9nn^$Qz*!C<^U4GrC+eBc`n&>l`9 zS~#D2Ft}R2=ZtKL|Gh&C|9{6^uZ>ic?7uw_kGQ9Ph0`We+Q(#UtJT7=(hGdoX)cGBg6n@gUs6G_{QHKb(vxw&HX;e5MeUfqvftzDV1- z&*u{39l|zFwoh~Gyjey$n?o|tbi8COb?4xko#f^IQ|UY!0w3X%Kg!-VeVy>%cLWbX z|71~Bj(`8xa6D!F9!{Q~V6$Ma3IKH@{>IU&;7?bXLeMBs#OVQcXzwq_ajmN~BSxwT z%&+urCW!%9_JACFS%H(&42S+H#^ZEp0aZ5b#PQSZv=W2S&g8w<4b1bl5&mQ*L=V5r zRX|wj5i*0?suB>@#kBN3k&N$L|NCzpuFfF4@^uD3?*NP-jb2*x61pV>=3x~qUlN$K ze~s6thwhE>106hM9$0^dRvi?Uf$pf&)2vKVl`=uQjRd#*yWMaSZOw#acvXz&M-Q(djBN2W#P-gVf^5E-8iP?;aa7yU zn8riL^!Q+qKSgjtx^U?r?Utv}v8iRK#?%~{4D7Xe%}xy;lmNQD=AAFJtcRoxq>#$u z5uaC&0ea3$L&NdE)|4#N{8-E!Xb#H1|6h-&`ZTlxx9d zd-OjT0^65iyaQtXz>GKZ?y%AHI%-~hyBbXb0qI|y;?Y~ShBFamGjGm$8b9t{F&SQP zez*&tM}wgK*~NAAkUu0xNB@sofrl6*{nzkxDl*Qcc=B_PKMK(Qb*l=#2I>D_Zj<04 zUirL*$Om&)0B_zW*c5_ucn9h?*nq3!4aUVfeWM!e0%(Ngwz~!mqvTZ3J8;=roxlV# zb+pHSd2g>zJ)G^$H@%jCxad%@+Jc~QEbL0H-8K}^M-^iPViH*Cq5-Y9%Y%S;Jx!z+ z<|H$iF9=PT^-}#L3+*$8%ybag7)Fc5-`-&P!68(sv!Pil&QJz4+>J$Vukv;Pw zD4jSOmTanHsy4BrZSRts^|aB!+}nW;@4QS#)8)g$l_u-|Kd+A>(-i-yOdQIZ1b&*U0ScB+KM2^`jMC8S6ZRUqGi?|%&nLK$8~Ftglb!_)yu2QRJ2 z^m6`WgUVAn9_HMrqfF4IoB8SHRl@{jzDaY#BToE0Zs+A3}ke}ZBR(9+Y`5&^w@cd$1(dCp+_Pg z{Hp%m^rhSkLVqMhZrRnxYpPz7VYX&i$DhI=#8P{<3?ho$mLlji2_!Tutk3fglQSm~ zIi^3Pi5)p~2OMM?u{NMhzkJFS=5xAPg@7|Z>QIbo70`L*mF@8WVK|zS1wXNpu~pML>ply;Kt~k{j0_M7jSp4_n}eSZkDoxDK$|Aybf71{ zz+kTZ>X^4XekoecfMDBXz0B;by)lG3Tj}?;KO?{E3%U3G^${dmo!?+04a1OT9VCcn zp!T6H6>h8WqwEv^v&OygL;E-7|NG?<*VwD|B!EG+tjx z{x1O_H(&6Fcsn<1?{L98ZW8T~f6pt4#{g3bAz?r;nZ=cQbM*Vd8v$j~p_l*NQ9K?4 zPjr*sTfE?PwPT|_>kLHs1ROba9vke0o+oV%L0Ihc*NtBxzK*YNG1|>iX(`=b6=%9H zUW zrd!o5^HF<@ha=wm&T}IMr%%;;aTyB1x~6tfPpwZbuYe{e)7Sc>9$J}I1rSh{HyKghMh2jD`(CfJ;G!8q7Xkhp2;3qhyj58s zGql^?MCY6nk}xCR(Q4$qKmnSGf0LY*;p_6ENff&*{REprp&SvtR@2Z%u$KV>y2xwD z8sRnq$my|mcb&DSMEviw<y`EyHhr_-xt$$9y+!GQ1cCMSKI5H#&~ zZD#3BfSl*Qc=Nwk9|5X=w-rB|>%hXjC^HuQ-&F4^3#T{1P2wdSGXD0hN4=feHcDjL zPuXWL`lY)zYteuTo4PVaa&205DoNc0scwa(CXb)ZgJkXVFJ;wQ?IFdBM`k3EAgjChGkT(>a9>HnmnH!>)dzf8JKKyElFJLj3CqR z?j=AQ`oT)$lrP;&4>=O|8rW8fW>CQ%j1jQBq2|}8ji*8&NI`&kz23R^4()LZi z6do@`y%xKuQ{Uw&*-N}R!sFB}+rllU_FX<6c4}nSx;Ptaz9!Asdz_t5U6}dW65Axv zd*$&y-#<v*Lx{BYBz29}gs zd9JfF0NKk_k>->N$Oixs>&@$W#XZ1Phu-qQ9Fg~HcfQI8M&ct?=E7N-op7{sA}W8FF5(ml!ypt&;GJOS@$~V7Uu%m#r;ii)|N3qKBQx|L zFv);kg_wURiBn=Z*?CeV=|rlnBU=qn^_0b=BwFH(A5*C@0*_|C&b;@-4ohaVc=P6V zq?}2JoP8&dV(JHRttt`LO|sdHImvxT$vXQc34 zx`(a}#*e&;pBk~*DjYN*)lE+%2wrRpGkHp)aEXm5Ho;z+{f|QZ5a;zrx|}!Db~>(J{y{Y| z!H(@-z~WaG9X_u^3Q85?PK4lQU$ivb(qAGxa0<&_EU6K?D3@-YDfYP6sTueIs^6op zfQu@KU1O1zgr=P+$$I&rE&ipSpBF}3(My>mMzwV&*C!h)mAt$rlzccKOzHaIczXwR zL)&2_h$#YHL`+g4^@nTAc@0p!|97SfQ2m1e{B&mm3kxikn_vJXW*>7q2H~*jw#bm$ zG4&#j_Kg<2isjrm0|vE%QRtUzj`wx%D!zV~`IPDQj#KPrO^CQs)Dzz28YfTHc%j1N zRVD3XHNv~Rga8bP!P2jmvkmrvxtb;TJGp3O1VgL&Fwo z3|^7RKB2-{0v%@$A7IDVyF*7Ku7invZl;nk1G{_}3B{^x?_s66HS13eAVD6b7#GRf zXxs+3W;^K*lSSv6fGQcw!JYlkt-o5}+HlLpDoWaP#S%W!rmgytW82dfj5Ul|wF_gc zNGzq9G7%3_$aoqTitXOB9@!M6pE8eRA&6`wQu-H4O_~G@ACMdFkRhEWuP6A^1$~^X zQ*jTaxoYG$sM@Cg$oAe8KonJD){*kDRi?eQ;pvP7f z#*jqQHzQ$Q{zexTi@zC-n*J#Y`qu5bS;T<=Zf$L&C&H`3;GQQ`$nb8 zjG!wxTM-CGZZHPkI38RKgG(K)*3rBlF>09e|E%tI&UHn) z4>$dc?ztN(H;}jI9c!c!uRN5L+@L>Et5P+gm3iQEB5#j=86s)VzS|y2LQQe26~02ZM;wyn+C3F62Yr;T2m;Ah%oiKwQ(zCA>B0fR@ob~F!8t2lI%O8A zdc`o8zh3Pt3w)!BX1%=G3onht`qIr?v;e+P2NgZR%Ru`7)>3K+#6|&fa{K*xRKT{p z(H{jV&~d0`_>GldwT9p5eWE%~KrNfp6wDSy@(;ln?Bj8XZ16SPjj4|Uv8idBH^K5_ zdDb*XmJ7Ksb_Zi>=@?^^_RA05tGDM^JTldGtfpc7pcf}SF!IKlQK3X(gmAYLBKJhufMOct50<)t%>SO*$M@xo8ikiY8tJ zAmP!(wt8N(zc*1pmm%aI=$yCz4N34=g+9VuJ_7Cs1jOx4mjHlD(3P|KZztyod6DG6 zZ?g%l@wA1&z;0jg4d~saB@rtL&0k=Mf`Opr|L=yb=-WvV-d>;kwtL`APtpo%gWizt zr}kQmMgvf3wf9^O(veT0mjU$(6r05|?9S*j637h?@H^*>5-lE z1GyLeT%`c3VK^w2qLOi*^aAi)Aec!kh>GkSgyLBrcr!HSVxmGc!xtqDr#O{MI+#s6 z=eMFLiZ^Bjaq`YV(JLB4d3}AY1HsW!( z)?JAOEHIEBM2sf1Z=PF%%nFy$0od2sE4$iw{PFbdg>4xL01DJwasKGl2M^k|mBJmy zL8vOc%(Gqm&wPb){LO(xX$II;p2HsL1$=WFO-O{z(auLvJ^RsRD6eNCUN^FZ)fE=v%i!JVOfJuehoyhffk$MgT+KwSC z{79A8Pv4+vQ}h664A+Yn$>-9}w$>erhf<+`i&>zQ-xpyLW;C~1s9e%MzCpPLlDW!&#PV>uQtJCXge|74h)JQ0uyh>Mm$aPYu@@i$5g+3r z@+nUzG%$0nkIJ%^-^mELpV;Pp&oK;OL#ViJb!yGq_5adj+0CofXul6VoXn=+oAThv zUia}QfLbaB+HVF^GQ zm{B~25(gGftDaD`cYBnD(`KtHWY1 zcNdqfkXCCk_dI^jSDTEm7q8kHLobY-Vcjp^v+23yX%3dd?uK)*S#mtWv;TLn?LpJV zVFYLE9PZ`F5LxX}wfCnKOzm|@vkCgicxshCL8)#kN{i&mrXwrSrypO8dz)ASiK4-v z^46Ty%xtt!<17^4+tyx`1l<*GarxV`ZJov~e5DGfO;68}KZ=U4tWkmh%IzCRAFEQu zBm5rCn-R~DYBU=#945CE$5iMKj%5L#5nT|Fc)(T;fi|T6XDfe)Nq+qr5)>XxK zMztwJR<$@cE{4Ab(*mD+}YGg zXU1C6TWhAfu5tI8Ii@_+k#4*PcktoA5jcCK?DTbd_zurn${kzT7$K_@v)H7&U*U9x zUBY}(7y^X}n}f*jhy2HcL{UPyeO2ws}RENJIpdUaQpG zh+s3h5m%Y7`0x7NJ4XwmhA33L&NUxzfTCo;sW$o@^#mNK20y7PZ`oMa=tOa;6z8LB z|M{v}ljuwzkPo@+VmFbb$r=UEW_m7ZUSUBp7Js}M-|4;w4mW|H5yd2?lX*$M!J`sP zZ-H`7pb@(W9@6WP29ZzOr|P`))PIirf|W9VfE|w>4Tlw-#zgbtLuVbgG9biKhNJ3o zX!;7ZbqqP5VQk?^qf^R2yE>T1Y~?>@ehK>)jKm}Vb2uRQDS~r~2=*!(k;C-YpDVZ? zad(39#<*pT_q1_Q1U@Uo_K12O!-r*3xtGPEh(F`Yt(K+oRBKTwH-eq4yP3Fk9;k$T z62$c!Fc3S^L%i%)S9P$N?SAk$Oym(LC4bu)QAZ*b3uhVV>Ev=SMl@e|AA4FCMH{5d z{OL3guT+!MV7;q<;vr9#Oc0mzppq#&px)juvvE|(Z066}x&%9n)C=d44Sf^oD*++D zwpfqoHND4XskTLiOz1h^U&?(jUp?~<8OkagGE%Bowew*v%m4+C?S<)#iLMH4k8C0j za*JWSk{_Z>dN9xOKX*ctb=ZwdGS6wzhZqUU*0kJF95=0Sd?sO`w7(Or1;n{wKW!K< z!-V5b`7ZM|VmtJLWLpwttzHv}gw>0F-z3Xf;uUy*gboz`3x~JSI;!jL$#m*U9JbrE zun;Y-j%MnX5}T?0c5UTSSi*tlG`({g2wcr0=%0DfcMNeWW243}Xs!sP;2Ax4&V&bu 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

wy(`6yXcFHr)&{* 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 literal 0 HcmV?d00001 diff --git a/docs/setup/images/add-sample-data.png b/docs/setup/images/add-sample-data.png new file mode 100644 index 0000000000000000000000000000000000000000..4907d6d649f44217ffd3deec22f69f50137ab004 GIT binary patch literal 582905 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%0A>yX||mLgUBvqGctRdv!Qe6RYc1 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 O!Q>CIjVvA4Fgz~y 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

d>Pe9G6TqS>l`i7mqi6;Uq$`q+ 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 z

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 z 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⩔=Az60{+;*b-V1A5 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 z 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

H9Li?qPzm-7?Y*dZTts<}_F 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 y4ae* z6*NtyHCl)JP2^FvNAdk9u7Crfc^Z86Hter4ZRzUYDV5UEOM`vPwR51^eNg9ci7`)HEv@8SElCdQ6+CxfE&n zRZgQGEORW9{Mx>b{OJ8tq-?U`Pm{*SK{Q58my>3I3NaCVX6SF{od}6|fLiyi`u6nTpr7)jd&ityO0R}YH%~^=_vNqp^Ai=X?T2T;TsG;M1& diff --git a/docs/setup/images/integration-filter.png b/docs/setup/images/integration-filter.png new file mode 100644 index 0000000000000000000000000000000000000000..4d8989679a8591b59d37c5e301c6ee06fcfdf610 GIT binary patch literal 37629 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 literal 0 HcmV?d00001 From cf90e97955cb0d420a59a53bf79e6469a730bff2 Mon Sep 17 00:00:00 2001 From: spalger Date: Wed, 1 Dec 2021 12:37:30 -0700 Subject: [PATCH 031/126] skip flaky suite (#111667) --- .../test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts b/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts index 99e0d9cf972f31..6f65c620b527cf 100644 --- a/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts +++ b/x-pack/test/functional_with_es_ssl/apps/uptime/anomaly_alert.ts @@ -9,7 +9,8 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; export default ({ getPageObjects, getService }: FtrProviderContext) => { - describe('uptime anomaly alert', () => { + // FLAKY: https://github.com/elastic/kibana/issues/111667 + describe.skip('uptime anomaly alert', () => { const pageObjects = getPageObjects(['common', 'uptime']); const supertest = getService('supertest'); const retry = getService('retry'); From 01af8ec4039f0a936f56b2e5dc19c2cc5541f708 Mon Sep 17 00:00:00 2001 From: spalger Date: Wed, 1 Dec 2021 12:40:42 -0700 Subject: [PATCH 032/126] skip flaky suite (#116980) --- x-pack/test/functional/apps/uptime/synthetics_integration.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/uptime/synthetics_integration.ts b/x-pack/test/functional/apps/uptime/synthetics_integration.ts index 83fc3c4079619f..8fee215545bbe6 100644 --- a/x-pack/test/functional/apps/uptime/synthetics_integration.ts +++ b/x-pack/test/functional/apps/uptime/synthetics_integration.ts @@ -129,7 +129,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { use_output: 'default', }); - describe('When on the Synthetics Integration Policy Create Page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/116980 + describe.skip('When on the Synthetics Integration Policy Create Page', function () { this.tags(['ciGroup10']); const basicConfig = { name: monitorName, From 096fb4382466ba42a66fa67c91a8b94f43b006a9 Mon Sep 17 00:00:00 2001 From: Byron Hulcher Date: Wed, 1 Dec 2021 14:49:59 -0500 Subject: [PATCH 033/126] [App Search] Add accordion lists for Domains, Seed URLs, and Sitemap URLs to Crawl Details Flyout (#119682) * New AccordionList component * Add a domains accordion list to the CrawlDetailsPreview * Add seedUrls to CrawlConfig * Add a seed urls accordion list to the CrawlDetailsPreview * Add sitemapUrls to CrawlConfig * Add a sitemap urls accordion list to the CrawlDetailsPreview * Disable arrow in AccordionList when items are empty * Add spacers to CrawlDetailsPreview * Type fix * Sets a maxWidth on the flyout. * Allows the raw JSON to be copied. * Visual updates to the accordions. * Linting * Review and linting fixes. * Styles the tables in the accordion list. * Uses a subdued color for count badges when the count is zero. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Davey Holler --- .../crawl_details_flyout/accordion_list.scss | 13 +++ .../accordion_list.test.tsx | 59 ++++++++++++ .../crawl_details_flyout/accordion_list.tsx | 92 +++++++++++++++++++ .../crawl_details_flyout.tsx | 9 +- .../crawl_details_preview.test.tsx | 66 ++++++++++++- .../crawl_details_preview.tsx | 60 +++++++++++- .../crawl_event_type_badge.test.tsx | 2 + .../components/crawl_requests_table.test.tsx | 4 + .../crawler/crawl_detail_logic.test.ts | 2 + .../components/crawler/crawler_logic.test.ts | 2 + .../crawler/crawler_overview.test.tsx | 4 + .../app_search/components/crawler/types.ts | 4 + .../components/crawler/utils.test.ts | 12 +++ .../app_search/components/crawler/utils.ts | 8 +- 14 files changed, 330 insertions(+), 7 deletions(-) create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.scss create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx create mode 100644 x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.tsx diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.scss b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.scss new file mode 100644 index 00000000000000..4772723f5d9277 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.scss @@ -0,0 +1,13 @@ +.appSearchAccordion--bordered { + border: $euiBorderThin; + border-radius: $euiBorderRadius; + padding: $euiSizeM; +} + +.appSearchAccordion--bordered, .appSearchAccordion { + .euiBasicTable { + .euiTableRow > .euiTableRowCell { + border-bottom: none; + } + } +} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx new file mode 100644 index 00000000000000..2219a50a5e7f37 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import '../../../../__mocks__/engine_logic.mock'; + +import React from 'react'; + +import { shallow, ShallowWrapper } from 'enzyme'; + +import { EuiAccordion, EuiIcon, EuiTitle, EuiInMemoryTable } from '@elastic/eui'; + +import { AccordionList } from './accordion_list'; + +const MOCK_PROPS = { + title: 'Test Items', + iconType: 'globe', + items: ['first item', 'second item'], +}; + +describe('AccordionList', () => { + let wrapper: ShallowWrapper; + + beforeAll(() => { + wrapper = shallow(); + }); + + it('renders as an accordion with the passed in title and icon', () => { + expect(wrapper.is(EuiAccordion)).toBe(true); + + const buttonContent = shallow(wrapper.prop('buttonContent')); + + expect(buttonContent.find(EuiIcon).prop('type')).toEqual('globe'); + expect(buttonContent.find(EuiTitle).children().text()).toEqual('Test Items'); + }); + + it('shows the item count', () => { + const extraActionContent = shallow(wrapper.prop('extraAction')); + + expect(extraActionContent.text()).toEqual('2'); + }); + + it('contains an table displaying the items', () => { + const table = wrapper.find(EuiInMemoryTable); + + expect(table.prop('items')).toEqual([{ item: 'first item' }, { item: 'second item' }]); + + expect(table.prop('columns')[0].render({ item: 'first item' })).toEqual('first item'); + }); + + it('is disabled when there are no items', () => { + const disabledWrapper = shallow(); + + expect(disabledWrapper.prop('arrowProps').isDisabled).toEqual(true); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.tsx new file mode 100644 index 00000000000000..ba537f712cf271 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.tsx @@ -0,0 +1,92 @@ +/* + * Copyright 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 { + EuiAccordion, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiInMemoryTable, + EuiNotificationBadge, + EuiSpacer, + EuiTitle, + IconType, + useGeneratedHtmlId, +} from '@elastic/eui'; + +import './accordion_list.scss'; + +interface Props { + hasBorder?: boolean; + iconType: IconType; + initialIsOpen?: boolean; + items: string[]; + rowCount?: number; + title: string; +} + +export const AccordionList: React.FC = ({ + hasBorder, + iconType, + initialIsOpen, + items, + rowCount = 10, + title, +}) => { + const accordionId = useGeneratedHtmlId({ + prefix: 'accordionList', + }); + + const showPagination = items.length > rowCount; + + return ( + + + + + + +

{title}

+
+
+ + } + id={accordionId} + extraAction={ + 0 ? 'accent' : 'subdued'} size="m"> + {items.length} + + } + > + ({ item }))} + columns={[ + { + render: ({ item }: { item: string }) => item, + }, + ]} + pagination={ + showPagination + ? { + hidePerPageOptions: true, + } + : false + } + /> + {!showPagination && } +
+ ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_flyout.tsx index 8ecd8613044580..9c3c1da534f729 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_flyout.tsx @@ -35,7 +35,12 @@ export const CrawlDetailsFlyout: React.FC = () => { } return ( - +
+ } + description={ + + } + > + + } + onChange={(event) => + handleInputChange({ + value: event.target.checked, + configKey: ConfigKeys.IS_THROTTLING_ENABLED, + }) + } + /> + {throttlingInputs} + + ); +}); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx index bc766462f18aed..7dd279b1767618 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx @@ -25,6 +25,11 @@ export const initialValues: IBrowserAdvancedFields = { [ConfigKeys.JOURNEY_FILTERS_MATCH]: '', [ConfigKeys.JOURNEY_FILTERS_TAGS]: [], [ConfigKeys.IGNORE_HTTPS_ERRORS]: false, + [ConfigKeys.IS_THROTTLING_ENABLED]: true, + [ConfigKeys.DOWNLOAD_SPEED]: '5', + [ConfigKeys.UPLOAD_SPEED]: '3', + [ConfigKeys.LATENCY]: '20', + [ConfigKeys.THROTTLING_CONFIG]: '5d/3u/20l', }; const defaultContext: IBrowserAdvancedFieldsContext = { diff --git a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx index 805b4aa0d7e0d5..c70424f7910f4d 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx @@ -181,7 +181,7 @@ describe('', () => { }); it('handles switching monitor type', () => { - const { getByText, getByLabelText, queryByLabelText, getAllByLabelText } = render( + const { getByText, queryByText, getByLabelText, queryByLabelText, getAllByLabelText } = render( ); const monitorType = getByLabelText('Monitor Type') as HTMLInputElement; @@ -200,7 +200,11 @@ describe('', () => { expect(queryByLabelText('Max redirects')).not.toBeInTheDocument(); // expect tls options to be available for TCP - expect(queryByLabelText('Enable TLS configuration')).toBeInTheDocument(); + // here we must getByText because EUI will generate duplicate aria-labelledby + // values within the test-env generator used, and that will conflict with other + // automatically generated labels. See: + // https://github.com/elastic/eui/blob/91b416dcd51e116edb2cb4a2cac4c306512e28c7/src/services/accessibility/html_id_generator.testenv.ts#L12 + expect(queryByText(/Enable TLS configuration/)).toBeInTheDocument(); // ensure at least one tcp advanced option is present let advancedOptionsButton = getByText('Advanced TCP options'); @@ -214,8 +218,8 @@ describe('', () => { // expect ICMP fields to be in the DOM expect(getByLabelText('Wait in seconds')).toBeInTheDocument(); - // expect tls options not be available for ICMP - expect(queryByLabelText('Enable TLS configuration')).not.toBeInTheDocument(); + // expect tls options not to be available for ICMP + expect(queryByText(/Enable TLS configuration/)).not.toBeInTheDocument(); // expect TCP fields not to be in the DOM expect(queryByLabelText('Proxy URL')).not.toBeInTheDocument(); @@ -234,7 +238,7 @@ describe('', () => { // expect tls options to be available for browser expect(queryByLabelText('Proxy Zip URL')).toBeInTheDocument(); - expect(queryByLabelText('Enable TLS configuration for Zip URL')).toBeInTheDocument(); + expect(queryByText(/Enable TLS configuration for Zip URL/)).toBeInTheDocument(); // ensure at least one browser advanced option is present advancedOptionsButton = getByText('Advanced Browser options'); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx index 1952d50cdd92a8..e136ccf58a3406 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx @@ -195,7 +195,7 @@ export const CustomFields = memo(({ validate, dataStreams = [], children {isHTTP && } {isTCP && } - {isBrowser && } + {isBrowser && } ); }); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx index dc46a4b57bcd8c..40cfdfeba49a5a 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx @@ -308,6 +308,22 @@ describe('useBarChartsHooks', () => { tags: { type: 'yaml', }, + 'throttling.download_speed': { + type: 'text', + value: '""', + }, + 'throttling.upload_speed': { + type: 'text', + value: '""', + }, + 'throttling.latency': { + type: 'text', + value: '""', + }, + 'throttling.config': { + type: 'text', + value: '""', + }, }, }, ], @@ -599,6 +615,7 @@ describe('useBarChartsHooks', () => { validate, monitorType: DataStream.BROWSER, }; + const { result, rerender, waitFor } = renderHook((props) => useUpdatePolicy(props), { initialProps, }); @@ -619,6 +636,9 @@ describe('useBarChartsHooks', () => { [ConfigKeys.SOURCE_ZIP_PASSWORD]: 'password', [ConfigKeys.SCREENSHOTS]: 'off', [ConfigKeys.SYNTHETICS_ARGS]: ['args'], + [ConfigKeys.DOWNLOAD_SPEED]: '13', + [ConfigKeys.UPLOAD_SPEED]: '3', + [ConfigKeys.LATENCY]: '7', }; rerender({ @@ -650,6 +670,11 @@ describe('useBarChartsHooks', () => { config[ConfigKeys.APM_SERVICE_NAME] ); expect(vars?.[ConfigKeys.TIMEOUT].value).toEqual(`${config[ConfigKeys.TIMEOUT]}s`); + expect(vars?.[ConfigKeys.THROTTLING_CONFIG].value).toEqual( + `${config[ConfigKeys.DOWNLOAD_SPEED]}d/${config[ConfigKeys.UPLOAD_SPEED]}u/${ + config[ConfigKeys.LATENCY] + }l` + ); expect(onChange).toBeCalledWith({ isValid: false, diff --git a/x-pack/plugins/uptime/public/components/fleet_package/types.tsx b/x-pack/plugins/uptime/public/components/fleet_package/types.tsx index 89609efb7ed7f3..5e664aa3103146 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/types.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/types.tsx @@ -72,6 +72,12 @@ export enum ScreenshotOption { ONLY_ON_FAILURE = 'only-on-failure', } +export enum ThrottlingSuffix { + DOWNLOAD = 'd', + UPLOAD = 'u', + LATENCY = 'l', +} + // values must match keys in the integration package export enum ConfigKeys { APM_SERVICE_NAME = 'service.name', @@ -115,6 +121,11 @@ export enum ConfigKeys { TLS_VERSION = 'ssl.supported_protocols', TAGS = 'tags', TIMEOUT = 'timeout', + THROTTLING_CONFIG = 'throttling.config', + IS_THROTTLING_ENABLED = 'throttling.is_enabled', + DOWNLOAD_SPEED = 'throttling.download_speed', + UPLOAD_SPEED = 'throttling.upload_speed', + LATENCY = 'throttling.latency', URLS = 'urls', USERNAME = 'username', WAIT = 'wait', @@ -217,6 +228,11 @@ export interface IBrowserAdvancedFields { [ConfigKeys.JOURNEY_FILTERS_MATCH]: string; [ConfigKeys.JOURNEY_FILTERS_TAGS]: string[]; [ConfigKeys.IGNORE_HTTPS_ERRORS]: boolean; + [ConfigKeys.IS_THROTTLING_ENABLED]: boolean; + [ConfigKeys.DOWNLOAD_SPEED]: string; + [ConfigKeys.UPLOAD_SPEED]: string; + [ConfigKeys.LATENCY]: string; + [ConfigKeys.THROTTLING_CONFIG]: string; } export type HTTPFields = IHTTPSimpleFields & IHTTPAdvancedFields & ITLSFields; @@ -250,3 +266,14 @@ export const contentTypesToMode = { [ContentType.TEXT]: Mode.PLAINTEXT, [ContentType.XML]: Mode.XML, }; + +export type ThrottlingConfigKey = + | ConfigKeys.DOWNLOAD_SPEED + | ConfigKeys.UPLOAD_SPEED + | ConfigKeys.LATENCY; + +export const configKeyToThrottlingSuffix: Record = { + [ConfigKeys.DOWNLOAD_SPEED]: ThrottlingSuffix.DOWNLOAD, + [ConfigKeys.UPLOAD_SPEED]: ThrottlingSuffix.UPLOAD, + [ConfigKeys.LATENCY]: ThrottlingSuffix.LATENCY, +}; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx b/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx index 0ce5dc6f9f02d9..5191297119440e 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx @@ -113,6 +113,12 @@ const validateICMP: ValidationLibrary = { ...validateCommon, }; +const validateThrottleValue = (speed: string | undefined, allowZero?: boolean) => { + if (speed === undefined || speed === '') return false; + const throttleValue = parseFloat(speed); + return isNaN(throttleValue) || (allowZero ? throttleValue < 0 : throttleValue <= 0); +}; + const validateBrowser: ValidationLibrary = { ...validateCommon, [ConfigKeys.SOURCE_ZIP_URL]: ({ @@ -123,6 +129,11 @@ const validateBrowser: ValidationLibrary = { [ConfigKeys.SOURCE_ZIP_URL]: zipUrl, [ConfigKeys.SOURCE_INLINE]: inlineScript, }) => !zipUrl && !inlineScript, + [ConfigKeys.DOWNLOAD_SPEED]: ({ [ConfigKeys.DOWNLOAD_SPEED]: downloadSpeed }) => + validateThrottleValue(downloadSpeed), + [ConfigKeys.UPLOAD_SPEED]: ({ [ConfigKeys.UPLOAD_SPEED]: uploadSpeed }) => + validateThrottleValue(uploadSpeed), + [ConfigKeys.LATENCY]: ({ [ConfigKeys.LATENCY]: latency }) => validateThrottleValue(latency, true), }; export type ValidateDictionary = Record; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts index e4a84e2bb85b5d..a4af2333333f69 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts @@ -26,6 +26,11 @@ export const browserFormatters: BrowserFormatMap = { [ConfigKeys.ZIP_URL_TLS_KEY]: null, [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: null, [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: null, + [ConfigKeys.IS_THROTTLING_ENABLED]: null, + [ConfigKeys.THROTTLING_CONFIG]: null, + [ConfigKeys.DOWNLOAD_SPEED]: null, + [ConfigKeys.UPLOAD_SPEED]: null, + [ConfigKeys.LATENCY]: null, [ConfigKeys.ZIP_URL_TLS_VERSION]: (fields) => arrayFormatter(fields[ConfigKeys.ZIP_URL_TLS_VERSION]), [ConfigKeys.JOURNEY_FILTERS_MATCH]: null, diff --git a/x-pack/test/functional/apps/uptime/synthetics_integration.ts b/x-pack/test/functional/apps/uptime/synthetics_integration.ts index 8fee215545bbe6..49f5895bd98f80 100644 --- a/x-pack/test/functional/apps/uptime/synthetics_integration.ts +++ b/x-pack/test/functional/apps/uptime/synthetics_integration.ts @@ -631,9 +631,82 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { username: 'username', password: 'password', }); + + const advancedConfig = { + screenshots: 'off', + syntheticsArgs: '-ssBlocks', + isThrottlingEnabled: true, + downloadSpeed: '1337', + uploadSpeed: '1338', + latency: '1339', + }; + + await uptimePage.syntheticsIntegration.createBasicBrowserMonitorDetails(config); + await uptimePage.syntheticsIntegration.configureBrowserAdvancedOptions(advancedConfig); + await uptimePage.syntheticsIntegration.confirmAndSave(); + + await uptimePage.syntheticsIntegration.isPolicyCreatedSuccessfully(); + + const [agentPolicy] = await uptimeService.syntheticsPackage.getAgentPolicyList(); + const agentPolicyId = agentPolicy.id; + const agentFullPolicy = await uptimeService.syntheticsPackage.getFullAgentPolicy( + agentPolicyId + ); + + expect(getSyntheticsPolicy(agentFullPolicy)).to.eql( + generatePolicy({ + agentFullPolicy, + version, + name: monitorName, + monitorType: 'browser', + config: { + screenshots: advancedConfig.screenshots, + schedule: '@every 3m', + timeout: '16s', + tags: [config.tags], + 'service.name': config.apmServiceName, + 'source.zip_url.url': config.zipUrl, + 'source.zip_url.folder': config.folder, + 'source.zip_url.username': config.username, + 'source.zip_url.password': config.password, + params: JSON.parse(config.params), + synthetics_args: [advancedConfig.syntheticsArgs], + 'throttling.is_enabled': advancedConfig.isThrottlingEnabled, + 'throttling.download_speed': advancedConfig.downloadSpeed, + 'throttling.upload_speed': advancedConfig.uploadSpeed, + 'throttling.latency': advancedConfig.latency, + 'throttling.config': `${advancedConfig.downloadSpeed}d/${advancedConfig.uploadSpeed}u/${advancedConfig.latency}l`, + __ui: { + is_tls_enabled: false, + is_zip_url_tls_enabled: false, + script_source: { + file_name: '', + is_generated_script: false, + }, + }, + }, + }) + ); + }); + + it('allows saving disabling throttling', async () => { + // This test ensures that updates made to the Synthetics Policy are carried all the way through + // to the generated Agent Policy that is dispatch down to the Elastic Agent. + const config = generateBrowserConfig({ + zipUrl: 'http://test.zip', + params: JSON.stringify({ url: 'http://localhost:8080' }), + folder: 'folder', + username: 'username', + password: 'password', + }); + const advancedConfig = { screenshots: 'off', syntheticsArgs: '-ssBlocks', + isThrottlingEnabled: false, + downloadSpeed: '1337', + uploadSpeed: '1338', + latency: '1339', }; await uptimePage.syntheticsIntegration.createBasicBrowserMonitorDetails(config); @@ -666,6 +739,11 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'source.zip_url.password': config.password, params: JSON.parse(config.params), synthetics_args: [advancedConfig.syntheticsArgs], + 'throttling.is_enabled': advancedConfig.isThrottlingEnabled, + 'throttling.download_speed': advancedConfig.downloadSpeed, + 'throttling.upload_speed': advancedConfig.uploadSpeed, + 'throttling.latency': advancedConfig.latency, + 'throttling.config': 'false', __ui: { is_tls_enabled: false, is_zip_url_tls_enabled: false, diff --git a/x-pack/test/functional/page_objects/synthetics_integration_page.ts b/x-pack/test/functional/page_objects/synthetics_integration_page.ts index 80c4699f6c2115..ad39b4bb02452b 100644 --- a/x-pack/test/functional/page_objects/synthetics_integration_page.ts +++ b/x-pack/test/functional/page_objects/synthetics_integration_page.ts @@ -114,6 +114,14 @@ export function SyntheticsIntegrationPageProvider({ return accordion; }, + /** + * Finds and returns the enable throttling checkbox + */ + async findThrottleSwitch() { + await this.ensureIsOnPackagePage(); + return await testSubjects.find('syntheticsBrowserIsThrottlingEnabled'); + }, + /** * Finds and returns the enable TLS checkbox */ @@ -425,10 +433,36 @@ export function SyntheticsIntegrationPageProvider({ * @params name {string} the name of the monitor * @params zipUrl {string} the zip url of the synthetics suites */ - async configureBrowserAdvancedOptions({ screenshots, syntheticsArgs }: Record) { + async configureBrowserAdvancedOptions({ + screenshots, + syntheticsArgs, + isThrottlingEnabled, + downloadSpeed, + uploadSpeed, + latency, + }: { + screenshots: string; + syntheticsArgs: string; + isThrottlingEnabled: boolean; + downloadSpeed: string; + uploadSpeed: string; + latency: string; + }) { await testSubjects.click('syntheticsBrowserAdvancedFieldsAccordion'); + + const throttleSwitch = await this.findThrottleSwitch(); + if ((await throttleSwitch.isSelected()) !== isThrottlingEnabled) { + await throttleSwitch.click(); + } + await testSubjects.selectValue('syntheticsBrowserScreenshots', screenshots); await this.setComboBox('syntheticsBrowserSyntheticsArgs', syntheticsArgs); + + if (isThrottlingEnabled) { + await this.fillTextInputByTestSubj('syntheticsBrowserDownloadSpeed', downloadSpeed); + await this.fillTextInputByTestSubj('syntheticsBrowserUploadSpeed', uploadSpeed); + await this.fillTextInputByTestSubj('syntheticsBrowserLatency', latency); + } }, }; } From 4107d401f3df678fcfbecc91481ba48a7fa0c681 Mon Sep 17 00:00:00 2001 From: Dmitry Tomashevich <39378793+Dmitriynj@users.noreply.github.com> Date: Thu, 2 Dec 2021 15:04:07 +0300 Subject: [PATCH 052/126] [Discover] Close expanded document sidebar when switch data views (#119736) * [Discover] close expanded document sidebar on index pattern change * [Discover] fix unit test * [Discover] fix use_discover_state unit test * [Discover] fix linting * [Discover] apply suggestions * [Discover] fix linting Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../application/context/context_app_content.tsx | 3 ++- .../components/layout/discover_documents.test.tsx | 2 +- .../main/components/layout/discover_documents.tsx | 5 +++-- .../main/components/layout/discover_layout.test.tsx | 3 ++- .../main/components/layout/discover_layout.tsx | 5 +++-- .../application/main/components/layout/types.ts | 3 +++ .../main/components/sidebar/discover_sidebar.test.tsx | 2 +- .../main/components/sidebar/discover_sidebar.tsx | 2 +- .../sidebar/discover_sidebar_responsive.test.tsx | 2 +- .../main/components/sidebar/lib/get_details.ts | 2 +- .../public/application/main/discover_main_app.tsx | 7 ++++++- .../application/main/utils/calc_field_counts.test.ts | 2 +- .../application/main/utils/calc_field_counts.ts | 2 +- .../application/main/utils/use_discover_state.test.ts | 3 +++ .../application/main/utils/use_discover_state.ts | 6 +++++- .../application/main/utils/use_saved_search.test.ts | 2 ++ .../public/application/main/utils/use_saved_search.ts | 2 +- .../components/discover_grid/discover_grid.test.tsx | 2 +- .../public/components/discover_grid/discover_grid.tsx | 5 +++-- .../discover_grid/discover_grid_context.tsx | 7 ++++--- .../discover_grid_document_selection.tsx | 2 +- .../components/discover_grid/discover_grid_flyout.tsx | 3 ++- .../discover_grid/get_render_cell_value.test.tsx | 2 +- .../discover_grid/get_render_cell_value.tsx | 2 +- .../components/doc_table/components/table_row.tsx | 3 ++- .../public/embeddable/saved_search_embeddable.tsx | 2 +- .../discover/public/embeddable/saved_search_grid.tsx | 2 +- .../components/doc_viewer/doc_viewer_tab.test.tsx | 2 +- .../components/doc_viewer_table/table.test.tsx | 2 +- .../doc_views/components/doc_viewer_table/table.tsx | 3 ++- .../public/services/doc_views/doc_views_registry.ts | 3 ++- .../public/services/doc_views/doc_views_types.ts | 5 +---- src/plugins/discover/public/types.ts | 11 +++++++++++ .../discover/public/utils/use_es_doc_search.ts | 2 +- 34 files changed, 73 insertions(+), 38 deletions(-) create mode 100644 src/plugins/discover/public/types.ts diff --git a/src/plugins/discover/public/application/context/context_app_content.tsx b/src/plugins/discover/public/application/context/context_app_content.tsx index f498c6f0a244d6..45bc3df77bd226 100644 --- a/src/plugins/discover/public/application/context/context_app_content.tsx +++ b/src/plugins/discover/public/application/context/context_app_content.tsx @@ -15,7 +15,7 @@ import { SortDirection } from '../../../../data/public'; import { LoadingStatus } from './services/context_query_state'; import { ActionBar } from './components/action_bar/action_bar'; import { DiscoverGrid } from '../../components/discover_grid/discover_grid'; -import { DocViewFilterFn, ElasticSearchHit } from '../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { AppState } from './services/context_state'; import { SurrDocType } from './services/context'; import { DiscoverServices } from '../../build_services'; @@ -23,6 +23,7 @@ import { MAX_CONTEXT_SIZE, MIN_CONTEXT_SIZE } from './services/constants'; import { DocTableContext } from '../../components/doc_table/doc_table_context'; import { EsHitRecordList } from '../types'; import { SortPairArr } from '../../components/doc_table/lib/get_sort'; +import { ElasticSearchHit } from '../../types'; export interface ContextAppContentProps { columns: string[]; diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx index 829d88bbafd082..45c064d06c51fa 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx @@ -17,8 +17,8 @@ import { DataDocuments$ } from '../../utils/use_saved_search'; import { discoverServiceMock } from '../../../../__mocks__/services'; import { FetchStatus } from '../../../types'; import { DiscoverDocuments } from './discover_documents'; -import { ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; import { indexPatternMock } from '../../../../__mocks__/index_pattern'; +import { ElasticSearchHit } from 'src/plugins/discover/public/types'; jest.mock('../../../../kibana_services', () => ({ ...jest.requireActual('../../../../kibana_services'), diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index 154f83796490bc..ae0f5ad670ce93 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -14,7 +14,7 @@ import { EuiScreenReaderOnly, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { DocViewFilterFn, ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../../../services/doc_views/doc_views_types'; import { DiscoverGrid } from '../../../../components/discover_grid/discover_grid'; import { FetchStatus } from '../../../types'; import { @@ -32,6 +32,7 @@ import { AppState, GetStateReturn } from '../../services/discover_state'; import { useDataState } from '../../utils/use_data_state'; import { DocTableInfinite } from '../../../../components/doc_table/doc_table_infinite'; import { SortPairArr } from '../../../../components/doc_table/lib/get_sort'; +import { ElasticSearchHit } from '../../../../types'; const DocTableInfiniteMemoized = React.memo(DocTableInfinite); const DataGridMemoized = React.memo(DiscoverGrid); @@ -54,7 +55,7 @@ function DiscoverDocumentsComponent({ onAddFilter: DocViewFilterFn; savedSearch: SavedSearch; services: DiscoverServices; - setExpandedDoc: (doc: ElasticSearchHit | undefined) => void; + setExpandedDoc: (doc?: ElasticSearchHit) => void; state: AppState; stateContainer: GetStateReturn; }) { diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx index c222e4038f5170..77eeb88904100b 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx @@ -28,10 +28,10 @@ import { } from '../../utils/use_saved_search'; import { discoverServiceMock } from '../../../../__mocks__/services'; import { FetchStatus } from '../../../types'; -import { ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; import { RequestAdapter } from '../../../../../../inspector'; import { Chart } from '../chart/point_series'; import { DiscoverSidebar } from '../sidebar/discover_sidebar'; +import { ElasticSearchHit } from '../../../../types'; jest.mock('../../../../kibana_services', () => ({ ...jest.requireActual('../../../../kibana_services'), @@ -150,6 +150,7 @@ function getProps(indexPattern: IndexPattern, wasSidebarClosed?: boolean): Disco services, state: { columns: [] }, stateContainer: {} as GetStateReturn, + setExpandedDoc: jest.fn(), }; } diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index 39d8268de2d0b3..4b647867cf64a7 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -29,7 +29,7 @@ import { DiscoverLayoutProps } from './types'; import { SEARCH_FIELDS_FROM_SOURCE, SHOW_FIELD_STATISTICS } from '../../../../../common'; import { popularizeField } from '../../../../utils/popularize_field'; import { DiscoverTopNav } from '../top_nav/discover_topnav'; -import { DocViewFilterFn, ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../../../services/doc_views/doc_views_types'; import { DiscoverChart } from '../chart'; import { getResultState } from '../../utils/get_result_state'; import { InspectorSession } from '../../../../../../inspector/public'; @@ -62,9 +62,11 @@ export function DiscoverLayout({ indexPattern, indexPatternList, inspectorAdapters, + expandedDoc, navigateTo, onChangeIndexPattern, onUpdateQuery, + setExpandedDoc, savedSearchRefetch$, resetSavedSearch, savedSearchData$, @@ -86,7 +88,6 @@ export function DiscoverLayout({ spaces, } = services; const { main$, charts$, totalHits$ } = savedSearchData$; - const [expandedDoc, setExpandedDoc] = useState(undefined); const [inspectorSession, setInspectorSession] = useState(undefined); const viewMode = useMemo(() => { diff --git a/src/plugins/discover/public/application/main/components/layout/types.ts b/src/plugins/discover/public/application/main/components/layout/types.ts index 1ed34978416fac..7d0f747b9bd5a4 100644 --- a/src/plugins/discover/public/application/main/components/layout/types.ts +++ b/src/plugins/discover/public/application/main/components/layout/types.ts @@ -19,6 +19,7 @@ import { DataRefetch$, SavedSearchData } from '../../utils/use_saved_search'; import { DiscoverServices } from '../../../../build_services'; import { SavedSearch } from '../../../../services/saved_searches'; import { RequestAdapter } from '../../../../../../inspector'; +import { ElasticSearchHit } from '../../../../types'; export interface DiscoverLayoutProps { indexPattern: IndexPattern; @@ -28,6 +29,8 @@ export interface DiscoverLayoutProps { onChangeIndexPattern: (id: string) => void; onUpdateQuery: (payload: { dateRange: TimeRange; query?: Query }, isUpdate?: boolean) => void; resetSavedSearch: () => void; + expandedDoc?: ElasticSearchHit; + setExpandedDoc: (doc?: ElasticSearchHit) => void; savedSearch: SavedSearch; savedSearchData$: SavedSearchData; savedSearchRefetch$: DataRefetch$; diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx index 9dd7ef19ffc072..a4d7107a7f15cb 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx @@ -19,10 +19,10 @@ import { flattenHit, IndexPatternAttributes } from '../../../../../../data/commo import { SavedObject } from '../../../../../../../core/types'; import { getDefaultFieldFilter } from './lib/field_filter'; import { DiscoverSidebarComponent as DiscoverSidebar } from './discover_sidebar'; -import { ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; import { discoverServiceMock as mockDiscoverServices } from '../../../../__mocks__/services'; import { stubLogstashIndexPattern } from '../../../../../../data/common/stubs'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; +import { ElasticSearchHit } from '../../../../types'; jest.mock('../../../../kibana_services', () => ({ getServices: () => mockDiscoverServices, diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx index 3b4ff997f324ea..78aee49d1b288b 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx @@ -39,8 +39,8 @@ import { FieldFilterState, getDefaultFieldFilter, setFieldFilterProp } from './l import { getIndexPatternFieldList } from './lib/get_index_pattern_field_list'; import { DiscoverSidebarResponsiveProps } from './discover_sidebar_responsive'; import { DiscoverIndexPatternManagement } from './discover_index_pattern_management'; -import { ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; +import { ElasticSearchHit } from '../../../../types'; /** * Default number of available fields displayed and added on scroll diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx index b412cd69c82af2..c65d0b0a4ec2cd 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx @@ -22,11 +22,11 @@ import { DiscoverSidebarResponsiveProps, } from './discover_sidebar_responsive'; import { DiscoverServices } from '../../../../build_services'; -import { ElasticSearchHit } from '../../../../services/doc_views/doc_views_types'; import { FetchStatus } from '../../../types'; import { DataDocuments$ } from '../../utils/use_saved_search'; import { stubLogstashIndexPattern } from '../../../../../../data/common/stubs'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; +import { ElasticSearchHit } from '../../../../types'; const mockServices = { history: () => ({ diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/get_details.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/get_details.ts index b5beebf6fb8d46..0715c7377da7d5 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/get_details.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/get_details.ts @@ -9,7 +9,7 @@ // @ts-expect-error import { fieldCalculator } from './field_calculator'; import { IndexPattern, IndexPatternField } from '../../../../../../../data/public'; -import { ElasticSearchHit } from '../../../../../services/doc_views/doc_views_types'; +import { ElasticSearchHit } from '../../../../../types'; export function getDetails( field: IndexPatternField, diff --git a/src/plugins/discover/public/application/main/discover_main_app.tsx b/src/plugins/discover/public/application/main/discover_main_app.tsx index ea3f852a5290ab..1ef6641e9bc727 100644 --- a/src/plugins/discover/public/application/main/discover_main_app.tsx +++ b/src/plugins/discover/public/application/main/discover_main_app.tsx @@ -5,7 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import React, { useCallback, useEffect } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { History } from 'history'; import { DiscoverLayout } from './components/layout'; import { setBreadcrumbsTitle } from '../../utils/breadcrumbs'; @@ -15,6 +15,7 @@ import { useUrl } from './utils/use_url'; import { IndexPatternAttributes, SavedObject } from '../../../../data/common'; import { DiscoverServices } from '../../build_services'; import { SavedSearch } from '../../services/saved_searches'; +import { ElasticSearchHit } from '../../types'; const DiscoverLayoutMemoized = React.memo(DiscoverLayout); @@ -40,6 +41,7 @@ export interface DiscoverMainProps { export function DiscoverMainApp(props: DiscoverMainProps) { const { savedSearch, services, history, indexPatternList } = props; const { chrome, docLinks, uiSettings: config, data } = services; + const [expandedDoc, setExpandedDoc] = useState(undefined); const navigateTo = useCallback( (path: string) => { history.push(path); @@ -65,6 +67,7 @@ export function DiscoverMainApp(props: DiscoverMainProps) { services, history, savedSearch, + setExpandedDoc, }); /** @@ -100,9 +103,11 @@ export function DiscoverMainApp(props: DiscoverMainProps) { indexPattern={indexPattern} indexPatternList={indexPatternList} inspectorAdapters={inspectorAdapters} + expandedDoc={expandedDoc} onChangeIndexPattern={onChangeIndexPattern} onUpdateQuery={onUpdateQuery} resetSavedSearch={resetCurrentSavedSearch} + setExpandedDoc={setExpandedDoc} navigateTo={navigateTo} savedSearch={savedSearch} savedSearchData$={data$} diff --git a/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts b/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts index 9d198947e06c7c..28d814b871104e 100644 --- a/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts +++ b/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts @@ -8,7 +8,7 @@ import { calcFieldCounts } from './calc_field_counts'; import { indexPatternMock } from '../../../__mocks__/index_pattern'; -import { ElasticSearchHit } from '../../../services/doc_views/doc_views_types'; +import { ElasticSearchHit } from '../../../types'; describe('calcFieldCounts', () => { test('returns valid field count data', async () => { diff --git a/src/plugins/discover/public/application/main/utils/calc_field_counts.ts b/src/plugins/discover/public/application/main/utils/calc_field_counts.ts index 08d1a2639fa0b4..9a7f68550d8407 100644 --- a/src/plugins/discover/public/application/main/utils/calc_field_counts.ts +++ b/src/plugins/discover/public/application/main/utils/calc_field_counts.ts @@ -7,7 +7,7 @@ */ import { flattenHit, IndexPattern } from '../../../../../data/common'; -import { ElasticSearchHit } from '../../../services/doc_views/doc_views_types'; +import { ElasticSearchHit } from '../../../types'; /** * This function is recording stats of the available fields, for usage in sidebar and sharing diff --git a/src/plugins/discover/public/application/main/utils/use_discover_state.test.ts b/src/plugins/discover/public/application/main/utils/use_discover_state.test.ts index 78f742b9f7c9b9..bac6d085acf05b 100644 --- a/src/plugins/discover/public/application/main/utils/use_discover_state.test.ts +++ b/src/plugins/discover/public/application/main/utils/use_discover_state.test.ts @@ -37,6 +37,7 @@ describe('test useDiscoverState', () => { services: discoverServiceMock, history, savedSearch: savedSearchMock, + setExpandedDoc: jest.fn(), }); }); expect(result.current.state.index).toBe(indexPatternMock.id); @@ -53,6 +54,7 @@ describe('test useDiscoverState', () => { services: discoverServiceMock, history, savedSearch: savedSearchMock, + setExpandedDoc: jest.fn(), }); }); await act(async () => { @@ -69,6 +71,7 @@ describe('test useDiscoverState', () => { services: discoverServiceMock, history, savedSearch: savedSearchMock, + setExpandedDoc: jest.fn(), }); }); diff --git a/src/plugins/discover/public/application/main/utils/use_discover_state.ts b/src/plugins/discover/public/application/main/utils/use_discover_state.ts index b70bcded4c6086..a4ef9382b4995a 100644 --- a/src/plugins/discover/public/application/main/utils/use_discover_state.ts +++ b/src/plugins/discover/public/application/main/utils/use_discover_state.ts @@ -24,15 +24,18 @@ import { useSearchSession } from './use_search_session'; import { FetchStatus } from '../../types'; import { getSwitchIndexPatternAppState } from './get_switch_index_pattern_app_state'; import { SortPairArr } from '../../../components/doc_table/lib/get_sort'; +import { ElasticSearchHit } from '../../../types'; export function useDiscoverState({ services, history, savedSearch, + setExpandedDoc, }: { services: DiscoverServices; savedSearch: SavedSearch; history: History; + setExpandedDoc: (doc?: ElasticSearchHit) => void; }) { const { uiSettings: config, data, filterManager, indexPatterns, storage } = services; const useNewFieldsApi = useMemo(() => !config.get(SEARCH_FIELDS_FROM_SOURCE), [config]); @@ -186,8 +189,9 @@ export function useDiscoverState({ ); stateContainer.setAppState(nextAppState); } + setExpandedDoc(undefined); }, - [config, indexPattern, indexPatterns, state.columns, state.sort, stateContainer] + [config, indexPattern, indexPatterns, setExpandedDoc, state.columns, state.sort, stateContainer] ); /** * Function triggered when the user changes the query in the search bar diff --git a/src/plugins/discover/public/application/main/utils/use_saved_search.test.ts b/src/plugins/discover/public/application/main/utils/use_saved_search.test.ts index b3ed7ab8541902..2788d63fdf9839 100644 --- a/src/plugins/discover/public/application/main/utils/use_saved_search.test.ts +++ b/src/plugins/discover/public/application/main/utils/use_saved_search.test.ts @@ -59,6 +59,7 @@ describe('test useSavedSearch', () => { services: discoverServiceMock, history, savedSearch: savedSearchMock, + setExpandedDoc: jest.fn(), }); }); @@ -100,6 +101,7 @@ describe('test useSavedSearch', () => { services: discoverServiceMock, history, savedSearch: savedSearchMock, + setExpandedDoc: jest.fn(), }); }); diff --git a/src/plugins/discover/public/application/main/utils/use_saved_search.ts b/src/plugins/discover/public/application/main/utils/use_saved_search.ts index bfd6f1daa4bc00..0f4b9058316a02 100644 --- a/src/plugins/discover/public/application/main/utils/use_saved_search.ts +++ b/src/plugins/discover/public/application/main/utils/use_saved_search.ts @@ -11,7 +11,6 @@ import { DiscoverServices } from '../../../build_services'; import { DiscoverSearchSessionManager } from '../services/discover_search_session'; import { ISearchSource } from '../../../../../data/common'; import { GetStateReturn } from '../services/discover_state'; -import { ElasticSearchHit } from '../../../services/doc_views/doc_views_types'; import { RequestAdapter } from '../../../../../inspector/public'; import type { AutoRefreshDoneFn } from '../../../../../data/public'; import { validateTimeRange } from './validate_time_range'; @@ -23,6 +22,7 @@ import { fetchAll } from './fetch_all'; import { useBehaviorSubject } from './use_behavior_subject'; import { sendResetMsg } from './use_saved_search_messages'; import { getFetch$ } from './get_fetch_observable'; +import { ElasticSearchHit } from '../../../types'; export interface SavedSearchData { main$: DataMain$; diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx index 4a0e472f17455c..d1a1f2dcdbe8af 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx @@ -16,8 +16,8 @@ import { mountWithIntl } from '@kbn/test/jest'; import { DiscoverGrid, DiscoverGridProps } from './discover_grid'; import { uiSettingsMock } from '../../__mocks__/ui_settings'; import { DiscoverServices } from '../../build_services'; -import { ElasticSearchHit } from '../../services/doc_views/doc_views_types'; import { getDocId } from './discover_grid_document_selection'; +import { ElasticSearchHit } from '../../types'; jest.mock('../../kibana_services', () => ({ ...jest.requireActual('../../kibana_services'), diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx index fa83a7527de120..c9d2ec72bfc026 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx @@ -22,7 +22,7 @@ import { EuiIcon, } from '@elastic/eui'; import { flattenHit, IndexPattern } from '../../../../data/common'; -import { DocViewFilterFn, ElasticSearchHit } from '../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { getSchemaDetectors } from './discover_grid_schema'; import { DiscoverGridFlyout } from './discover_grid_flyout'; import { DiscoverGridContext } from './discover_grid_context'; @@ -49,6 +49,7 @@ import { import { DiscoverGridDocumentToolbarBtn, getDocId } from './discover_grid_document_selection'; import { SortPairArr } from '../doc_table/lib/get_sort'; import { getFieldsToShow } from '../../utils/get_fields_to_show'; +import { ElasticSearchHit } from '../../types'; interface SortObj { id: string; @@ -116,7 +117,7 @@ export interface DiscoverGridProps { /** * Function to set the expanded document, which is displayed in a flyout */ - setExpandedDoc: (doc: ElasticSearchHit | undefined) => void; + setExpandedDoc: (doc?: ElasticSearchHit) => void; /** * Grid display settings persisted in Elasticsearch (e.g. column width) */ diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_context.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_context.tsx index 49b72ef126a76a..3bf80872b06859 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid_context.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_context.tsx @@ -8,11 +8,12 @@ import React from 'react'; import type { IndexPattern } from 'src/plugins/data/common'; -import { DocViewFilterFn, ElasticSearchHit } from '../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; +import { ElasticSearchHit } from '../../types'; export interface GridContext { - expanded: ElasticSearchHit | undefined; - setExpanded: (hit: ElasticSearchHit | undefined) => void; + expanded?: ElasticSearchHit; + setExpanded: (hit?: ElasticSearchHit) => void; rows: ElasticSearchHit[]; onFilter: DocViewFilterFn; indexPattern: IndexPattern; diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_document_selection.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_document_selection.tsx index c517d3a65b6b9f..6fb614327d2af4 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid_document_selection.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_document_selection.tsx @@ -21,8 +21,8 @@ import { euiLightVars as themeLight, euiDarkVars as themeDark, } from '@kbn/ui-shared-deps-src/theme'; -import { ElasticSearchHit } from '../../services/doc_views/doc_views_types'; import { DiscoverGridContext } from './discover_grid_context'; +import { ElasticSearchHit } from '../../types'; /** * Returning a generated id of a given ES document, since `_id` can be the same diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_flyout.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_flyout.tsx index d5b2248162b2fa..30e0cf24f7d528 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid_flyout.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_flyout.tsx @@ -25,10 +25,11 @@ import { keys, } from '@elastic/eui'; import { DocViewer } from '../../services/doc_views/components/doc_viewer/doc_viewer'; -import { DocViewFilterFn, ElasticSearchHit } from '../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { DiscoverServices } from '../../build_services'; import { getContextUrl } from '../../utils/get_context_url'; import { getSingleDocUrl } from '../../utils/get_single_doc_url'; +import { ElasticSearchHit } from '../../types'; interface Props { columns: string[]; diff --git a/src/plugins/discover/public/components/discover_grid/get_render_cell_value.test.tsx b/src/plugins/discover/public/components/discover_grid/get_render_cell_value.test.tsx index e97a2b2901f332..b81dda5c279152 100644 --- a/src/plugins/discover/public/components/discover_grid/get_render_cell_value.test.tsx +++ b/src/plugins/discover/public/components/discover_grid/get_render_cell_value.test.tsx @@ -10,8 +10,8 @@ import React from 'react'; import { ReactWrapper, shallow } from 'enzyme'; import { getRenderCellValueFn } from './get_render_cell_value'; import { indexPatternMock } from '../../__mocks__/index_pattern'; -import { ElasticSearchHit } from '../../services/doc_views/doc_views_types'; import { flattenHit } from 'src/plugins/data/common'; +import { ElasticSearchHit } from '../../types'; jest.mock('../../../../kibana_react/public', () => ({ useUiSetting: () => true, diff --git a/src/plugins/discover/public/components/discover_grid/get_render_cell_value.tsx b/src/plugins/discover/public/components/discover_grid/get_render_cell_value.tsx index 8fd5f73701932f..c1673dad7eaa7f 100644 --- a/src/plugins/discover/public/components/discover_grid/get_render_cell_value.tsx +++ b/src/plugins/discover/public/components/discover_grid/get_render_cell_value.tsx @@ -19,13 +19,13 @@ import { EuiDescriptionListTitle, EuiDescriptionListDescription, } from '@elastic/eui'; -import { ElasticSearchHit } from '../../services/doc_views/doc_views_types'; import { DiscoverGridContext } from './discover_grid_context'; import { JsonCodeEditor } from '../json_code_editor/json_code_editor'; import { defaultMonacoEditorWidth } from './constants'; import { EsHitRecord } from '../../application/types'; import { formatFieldValue } from '../../utils/format_value'; import { formatHit } from '../../utils/format_hit'; +import { ElasticSearchHit } from '../../types'; export const getRenderCellValueFn = ( diff --git a/src/plugins/discover/public/components/doc_table/components/table_row.tsx b/src/plugins/discover/public/components/doc_table/components/table_row.tsx index 8a980cc4160d8a..2eee9a177e4f8b 100644 --- a/src/plugins/discover/public/components/doc_table/components/table_row.tsx +++ b/src/plugins/discover/public/components/doc_table/components/table_row.tsx @@ -15,11 +15,12 @@ import { flattenHit } from '../../../../../data/common'; import { DocViewer } from '../../../services/doc_views/components/doc_viewer/doc_viewer'; import { FilterManager, IndexPattern } from '../../../../../data/public'; import { TableCell } from './table_row/table_cell'; -import { ElasticSearchHit, DocViewFilterFn } from '../../../services/doc_views/doc_views_types'; +import { DocViewFilterFn } from '../../../services/doc_views/doc_views_types'; import { getContextUrl } from '../../../utils/get_context_url'; import { getSingleDocUrl } from '../../../utils/get_single_doc_url'; import { TableRowDetails } from './table_row_details'; import { formatRow, formatTopLevelObject } from '../lib/row_formatter'; +import { ElasticSearchHit } from '../../../types'; export type DocTableRow = ElasticSearchHit & { isAnchor?: boolean; diff --git a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx index 7146f84e194e2c..4a7f0b1c36868d 100644 --- a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx +++ b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx @@ -26,7 +26,6 @@ import { Query, TimeRange, } from '../../../data/common'; -import { ElasticSearchHit } from '../services/doc_views/doc_views_types'; import { SavedSearchEmbeddableComponent } from './saved_search_embeddable_component'; import { UiActionsStart } from '../../../ui_actions/public'; import { getServices } from '../kibana_services'; @@ -48,6 +47,7 @@ import { SortOrder } from '../components/doc_table/components/table_header/helpe import { VIEW_MODE } from '../components/view_mode_toggle'; import { updateSearchSource } from './utils/update_search_source'; import { FieldStatsTableSavedSearchEmbeddable } from '../application/main/components/field_stats_table'; +import { ElasticSearchHit } from '../types'; export type SearchProps = Partial & Partial & { diff --git a/src/plugins/discover/public/embeddable/saved_search_grid.tsx b/src/plugins/discover/public/embeddable/saved_search_grid.tsx index a28e509d3ba725..aa15ccb79da8b8 100644 --- a/src/plugins/discover/public/embeddable/saved_search_grid.tsx +++ b/src/plugins/discover/public/embeddable/saved_search_grid.tsx @@ -10,8 +10,8 @@ import { I18nProvider } from '@kbn/i18n-react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { DiscoverGrid, DiscoverGridProps } from '../components/discover_grid/discover_grid'; import { getServices } from '../kibana_services'; -import { ElasticSearchHit } from '../services/doc_views/doc_views_types'; import { TotalDocuments } from '../application/main/components/total_documents/total_documents'; +import { ElasticSearchHit } from '../types'; export interface DiscoverGridEmbeddableProps extends DiscoverGridProps { totalHitCount: number; diff --git a/src/plugins/discover/public/services/doc_views/components/doc_viewer/doc_viewer_tab.test.tsx b/src/plugins/discover/public/services/doc_views/components/doc_viewer/doc_viewer_tab.test.tsx index 3537699e4fe20c..8eab6b1e12c8cb 100644 --- a/src/plugins/discover/public/services/doc_views/components/doc_viewer/doc_viewer_tab.test.tsx +++ b/src/plugins/discover/public/services/doc_views/components/doc_viewer/doc_viewer_tab.test.tsx @@ -9,8 +9,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import { DocViewerTab } from './doc_viewer_tab'; -import { ElasticSearchHit } from '../../doc_views_types'; import { indexPatternMock } from '../../../../__mocks__/index_pattern'; +import { ElasticSearchHit } from 'src/plugins/discover/public/types'; describe('DocViewerTab', () => { test('changing columns triggers an update', () => { diff --git a/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.test.tsx b/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.test.tsx index 5133ca46015a0d..c956b36b625947 100644 --- a/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.test.tsx +++ b/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.test.tsx @@ -11,13 +11,13 @@ import { mountWithIntl } from '@kbn/test/jest'; import { findTestSubject } from '@elastic/eui/lib/test'; import { DocViewerTable, DocViewerTableProps } from './table'; import { IndexPattern } from '../../../../../../data/public'; -import { ElasticSearchHit } from '../../doc_views_types'; jest.mock('../../../../kibana_services', () => ({ getServices: jest.fn(), })); import { getServices } from '../../../../kibana_services'; +import { ElasticSearchHit } from '../../../../types'; (getServices as jest.Mock).mockImplementation(() => ({ uiSettings: { diff --git a/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.tsx b/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.tsx index 707a98d87c9240..433227133370ef 100644 --- a/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.tsx +++ b/src/plugins/discover/public/services/doc_views/components/doc_viewer_table/table.tsx @@ -13,12 +13,13 @@ import { IndexPattern, IndexPatternField } from '../../../../../../data/public'; import { flattenHit } from '../../../../../../data/common'; import { SHOW_MULTIFIELDS } from '../../../../../common'; import { getServices } from '../../../../kibana_services'; -import { DocViewFilterFn, ElasticSearchHit, DocViewRenderProps } from '../../doc_views_types'; +import { DocViewFilterFn, DocViewRenderProps } from '../../doc_views_types'; import { ACTIONS_COLUMN, MAIN_COLUMNS } from './table_columns'; import { getFieldsToShow } from '../../../../utils/get_fields_to_show'; import { getIgnoredReason, IgnoredReason } from '../../../../utils/get_ignored_reason'; import { formatFieldValue } from '../../../../utils/format_value'; import { isNestedFieldParent } from '../../../../application/main/utils/nested_fields'; +import { ElasticSearchHit } from '../../../../types'; export interface DocViewerTableProps { columns?: string[]; diff --git a/src/plugins/discover/public/services/doc_views/doc_views_registry.ts b/src/plugins/discover/public/services/doc_views/doc_views_registry.ts index 26b5016881b852..8ee8741d73d3f5 100644 --- a/src/plugins/discover/public/services/doc_views/doc_views_registry.ts +++ b/src/plugins/discover/public/services/doc_views/doc_views_registry.ts @@ -6,7 +6,8 @@ * Side Public License, v 1. */ -import { DocView, DocViewInput, ElasticSearchHit, DocViewInputFn } from './doc_views_types'; +import { ElasticSearchHit } from '../../types'; +import { DocView, DocViewInput, DocViewInputFn } from './doc_views_types'; export class DocViewsRegistry { private docViews: DocView[] = []; diff --git a/src/plugins/discover/public/services/doc_views/doc_views_types.ts b/src/plugins/discover/public/services/doc_views/doc_views_types.ts index e8faa51bbab40d..ef2600b4d04df5 100644 --- a/src/plugins/discover/public/services/doc_views/doc_views_types.ts +++ b/src/plugins/discover/public/services/doc_views/doc_views_types.ts @@ -7,11 +7,8 @@ */ import { ComponentType } from 'react'; - -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { IndexPattern } from '../../../../data/public'; - -export type ElasticSearchHit = estypes.SearchHit; +import { ElasticSearchHit } from '../../types'; export interface FieldMapping { filterable?: boolean; diff --git a/src/plugins/discover/public/types.ts b/src/plugins/discover/public/types.ts new file mode 100644 index 00000000000000..f6872e9951c378 --- /dev/null +++ b/src/plugins/discover/public/types.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; + +export type ElasticSearchHit = estypes.SearchHit; diff --git a/src/plugins/discover/public/utils/use_es_doc_search.ts b/src/plugins/discover/public/utils/use_es_doc_search.ts index 10c97c53b3fb31..c8b870b1a1daef 100644 --- a/src/plugins/discover/public/utils/use_es_doc_search.ts +++ b/src/plugins/discover/public/utils/use_es_doc_search.ts @@ -11,9 +11,9 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { IndexPattern } from '../../../data/common'; import { DocProps } from '../application/doc/components/doc'; import { ElasticRequestState } from '../application/doc/types'; -import { ElasticSearchHit } from '../services/doc_views/doc_views_types'; import { getServices } from '../kibana_services'; import { SEARCH_FIELDS_FROM_SOURCE } from '../../common'; +import { ElasticSearchHit } from '../types'; type RequestBody = Pick; From 42e2e782532dbbf27bbb942b964e43ce65450f62 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Thu, 2 Dec 2021 13:05:13 +0100 Subject: [PATCH 053/126] [Fleet] Update calculateAuthz calls to respect superuser for now (#119973) --- .../fleet/public/mock/plugin_interfaces.ts | 4 +- x-pack/plugins/fleet/public/mock/types.ts | 3 +- x-pack/plugins/fleet/public/plugin.ts | 87 ++++++++++--------- .../plugins/fleet/server/routes/security.ts | 62 +++++++------ 4 files changed, 81 insertions(+), 75 deletions(-) diff --git a/x-pack/plugins/fleet/public/mock/plugin_interfaces.ts b/x-pack/plugins/fleet/public/mock/plugin_interfaces.ts index 054ef958c19144..2373f8dd309ba8 100644 --- a/x-pack/plugins/fleet/public/mock/plugin_interfaces.ts +++ b/x-pack/plugins/fleet/public/mock/plugin_interfaces.ts @@ -14,7 +14,7 @@ export const createStartMock = (extensionsStorage: UIExtensionsStorage = {}): Mo return { isInitialized: jest.fn().mockResolvedValue(true), registerExtension: createExtensionRegistrationCallback(extensionsStorage), - authz: { + authz: Promise.resolve({ fleet: { all: true, setup: true, @@ -31,6 +31,6 @@ export const createStartMock = (extensionsStorage: UIExtensionsStorage = {}): Mo readIntegrationPolicies: true, writeIntegrationPolicies: true, }, - }, + }), }; }; diff --git a/x-pack/plugins/fleet/public/mock/types.ts b/x-pack/plugins/fleet/public/mock/types.ts index 5071eb71fece1c..44d88acae1617c 100644 --- a/x-pack/plugins/fleet/public/mock/types.ts +++ b/x-pack/plugins/fleet/public/mock/types.ts @@ -15,4 +15,5 @@ export type MockedFleetSetupDeps = MockedKeys; export type MockedFleetStartDeps = MockedKeys; -export type MockedFleetStart = MockedKeys; +// Don't wrap the `authz` property which is a promise with `jest.Mocked` +export type MockedFleetStart = MockedKeys> & Pick; diff --git a/x-pack/plugins/fleet/public/plugin.ts b/x-pack/plugins/fleet/public/plugin.ts index e188b8e99b5b99..2330cd3690c775 100644 --- a/x-pack/plugins/fleet/public/plugin.ts +++ b/x-pack/plugins/fleet/public/plugin.ts @@ -24,6 +24,8 @@ import type { import type { SharePluginStart } from 'src/plugins/share/public'; +import { once } from 'lodash'; + import type { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; import { DEFAULT_APP_CATEGORIES, AppNavLinkStatus } from '../../../../src/core/public'; @@ -72,7 +74,7 @@ export interface FleetSetup {} */ export interface FleetStart { /** Authorization for the current user */ - authz: FleetAuthz; + authz: Promise; registerExtension: UIExtensionRegistrationCallback; isInitialized: () => Promise; } @@ -144,7 +146,7 @@ export class FleetPlugin implements Plugin; const registerExtension = createExtensionRegistrationCallback(this.extensions); + const getPermissions = once(() => + core.http.get(appRoutesService.getCheckPermissionsPath()) + ); registerExtension({ package: CUSTOM_LOGS_INTEGRATION_NAME, @@ -246,46 +250,49 @@ export class FleetPlugin implements Plugin { + // eslint-disable-next-line no-console + console.warn(`Could not load Fleet permissions due to error: ${e}`); + return { success: false }; + }) + .then((permissionsResponse) => { + if (permissionsResponse.success) { + // If superuser, give access to everything + return calculateAuthz({ + fleet: { all: true, setup: true }, + integrations: { all: true, read: true }, + }); + } else { + // All other users only get access to read integrations if they have the read privilege + const { capabilities } = core.application; + return calculateAuthz({ + fleet: { all: false, setup: false }, + integrations: { all: false, read: capabilities.fleet.read as boolean }, + }); + } + }), - integrations: { - all: capabilities.fleet.all as boolean, - read: capabilities.fleet.read as boolean, - }, - }); + isInitialized: once(async () => { + const permissionsResponse = await getPermissions(); - return { - authz, - isInitialized: () => { - if (!successPromise) { - successPromise = Promise.resolve().then(async () => { - const permissionsResponse = await core.http.get( - appRoutesService.getCheckPermissionsPath() - ); - - if (permissionsResponse?.success) { - return core.http - .post(setupRouteService.getSetupPath()) - .then(({ isInitialized }) => - isInitialized - ? Promise.resolve(true) - : Promise.reject(new Error('Unknown setup error')) - ); - } else { - throw new Error(permissionsResponse?.error || 'Unknown permissions error'); - } - }); + if (permissionsResponse?.success) { + const { isInitialized } = await core.http.post( + setupRouteService.getSetupPath() + ); + if (!isInitialized) { + throw new Error('Unknown setup error'); + } + + return true; + } else { + throw new Error(permissionsResponse?.error || 'Unknown permissions error'); } + }), - return successPromise; - }, registerExtension, }; } diff --git a/x-pack/plugins/fleet/server/routes/security.ts b/x-pack/plugins/fleet/server/routes/security.ts index 8e037c25ceca92..9853877dc2d61b 100644 --- a/x-pack/plugins/fleet/server/routes/security.ts +++ b/x-pack/plugins/fleet/server/routes/security.ts @@ -127,41 +127,39 @@ export async function getAuthzFromRequest(req: KibanaRequest): Promise Date: Thu, 2 Dec 2021 08:30:44 -0500 Subject: [PATCH 054/126] [Fleet] Use predefined id for default output (#120158) --- x-pack/plugins/fleet/common/constants/output.ts | 4 ++-- x-pack/plugins/fleet/server/constants/index.ts | 1 + x-pack/plugins/fleet/server/services/output.ts | 11 +++++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/fleet/common/constants/output.ts b/x-pack/plugins/fleet/common/constants/output.ts index c750be12be2dfe..67c45fea37d78d 100644 --- a/x-pack/plugins/fleet/common/constants/output.ts +++ b/x-pack/plugins/fleet/common/constants/output.ts @@ -13,10 +13,10 @@ export const outputType = { Elasticsearch: 'elasticsearch', } as const; -export const DEFAULT_OUTPUT_ID = 'default'; +export const DEFAULT_OUTPUT_ID = 'fleet-default-output'; export const DEFAULT_OUTPUT: NewOutput = { - name: DEFAULT_OUTPUT_ID, + name: 'default', is_default: true, is_default_monitoring: true, type: outputType.Elasticsearch, diff --git a/x-pack/plugins/fleet/server/constants/index.ts b/x-pack/plugins/fleet/server/constants/index.ts index 633390c368957f..0769f02fc0272b 100644 --- a/x-pack/plugins/fleet/server/constants/index.ts +++ b/x-pack/plugins/fleet/server/constants/index.ts @@ -46,6 +46,7 @@ export { DEFAULT_AGENT_POLICY, DEFAULT_FLEET_SERVER_AGENT_POLICY, DEFAULT_OUTPUT, + DEFAULT_OUTPUT_ID, DEFAULT_PACKAGES, PACKAGE_POLICY_DEFAULT_INDEX_PRIVILEGES, AGENT_POLICY_DEFAULT_MONITORING_DATASETS, diff --git a/x-pack/plugins/fleet/server/services/output.ts b/x-pack/plugins/fleet/server/services/output.ts index 511aba4e6a9329..61592420e91160 100644 --- a/x-pack/plugins/fleet/server/services/output.ts +++ b/x-pack/plugins/fleet/server/services/output.ts @@ -9,7 +9,7 @@ import type { SavedObject, SavedObjectsClientContract } from 'src/core/server'; import uuid from 'uuid/v5'; import type { NewOutput, Output, OutputSOAttributes } from '../types'; -import { DEFAULT_OUTPUT, OUTPUT_SAVED_OBJECT_TYPE } from '../constants'; +import { DEFAULT_OUTPUT, DEFAULT_OUTPUT_ID, OUTPUT_SAVED_OBJECT_TYPE } from '../constants'; import { decodeCloudId, normalizeHostsForAgents, SO_SEARCH_LIMIT } from '../../common'; import { OutputUnauthorizedError } from '../errors'; @@ -75,7 +75,10 @@ class OutputService { is_default_monitoring: !defaultMonitoringOutput, } as NewOutput; - return await this.create(soClient, newDefaultOutput); + return await this.create(soClient, newDefaultOutput, { + id: DEFAULT_OUTPUT_ID, + overwrite: true, + }); } return defaultOutput; @@ -118,7 +121,7 @@ class OutputService { public async create( soClient: SavedObjectsClientContract, output: NewOutput, - options?: { id?: string; fromPreconfiguration?: boolean } + options?: { id?: string; fromPreconfiguration?: boolean; overwrite?: boolean } ): Promise { const data: OutputSOAttributes = { ...output }; @@ -155,7 +158,7 @@ class OutputService { } const newSo = await soClient.create(SAVED_OBJECT_TYPE, data, { - overwrite: options?.fromPreconfiguration, + overwrite: options?.overwrite || options?.fromPreconfiguration, id: options?.id ? outputIdToUuid(options.id) : undefined, }); From 5c393dfad958c6c70f821e3b8a2bce328ef70e3b Mon Sep 17 00:00:00 2001 From: Marta Bondyra Date: Thu, 2 Dec 2021 14:55:16 +0100 Subject: [PATCH 055/126] [Lens] fix not-working test for conflict for embeddables (#120211) --- .../plugins/lens/public/embeddable/embeddable.test.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx index 3b4edb8c72b076..ceb9388a561f00 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import React from 'react'; import { Embeddable, LensByValueInput, @@ -15,6 +15,7 @@ import { LensUnwrapResult, } from './embeddable'; import { ReactExpressionRendererProps } from 'src/plugins/expressions/public'; +import { spacesPluginMock } from '../../../spaces/public/mocks'; import { Filter } from '@kbn/es-query'; import { Query, TimeRange, IndexPatternsContract } from 'src/plugins/data/public'; import { Document } from '../persistence'; @@ -263,6 +264,10 @@ describe('embeddable', () => { } as LensUnwrapResult); } ); + const spacesPluginStart = spacesPluginMock.createStartContract(); + spacesPluginStart.ui.components.getEmbeddableLegacyUrlConflict = jest.fn(() => ( + <>getEmbeddableLegacyUrlConflict + )); const embeddable = new Embeddable( { timefilter: dataPluginMock.createSetupContract().query.timefilter.timefilter, @@ -271,6 +276,7 @@ describe('embeddable', () => { expressionRenderer, basePath, indexPatternService: {} as IndexPatternsContract, + spaces: spacesPluginStart, capabilities: { canSaveDashboards: true, canSaveVisualizations: true, @@ -293,7 +299,9 @@ describe('embeddable', () => { {} as LensEmbeddableInput ); await embeddable.initializeSavedVis({} as LensEmbeddableInput); + embeddable.render(mountpoint); expect(expressionRenderer).toHaveBeenCalledTimes(0); + expect(spacesPluginStart.ui.components.getEmbeddableLegacyUrlConflict).toHaveBeenCalled(); }); it('should initialize output with deduped list of index patterns', async () => { From 54717c179bac36c6eda8450835ff99333d7f2117 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Thu, 2 Dec 2021 09:05:56 -0500 Subject: [PATCH 056/126] [Cases] Removing alerts internal client (#119901) * Removing alerts internal client * Fixing test errors --- .../cases/server/client/alerts/client.ts | 25 --- .../plugins/cases/server/client/alerts/get.ts | 11 +- .../server/client/alerts/update_status.ts | 21 -- .../cases/server/client/attachments/add.ts | 10 +- .../cases/server/client/cases/client.ts | 2 +- .../plugins/cases/server/client/cases/push.ts | 5 +- .../cases/server/client/cases/update.ts | 15 +- x-pack/plugins/cases/server/client/client.ts | 2 +- .../cases/server/client/client_internal.ts | 7 - x-pack/plugins/cases/server/client/factory.ts | 3 +- .../cases/server/client/sub_cases/client.ts | 10 +- .../cases/server/client/sub_cases/update.ts | 16 +- x-pack/plugins/cases/server/client/types.ts | 7 +- .../server/services/alerts/index.test.ts | 212 +++++++++--------- .../cases/server/services/alerts/index.ts | 206 ++++++++--------- x-pack/plugins/cases/server/services/index.ts | 1 - x-pack/plugins/cases/server/services/mocks.ts | 17 +- 17 files changed, 239 insertions(+), 331 deletions(-) delete mode 100644 x-pack/plugins/cases/server/client/alerts/client.ts delete mode 100644 x-pack/plugins/cases/server/client/alerts/update_status.ts diff --git a/x-pack/plugins/cases/server/client/alerts/client.ts b/x-pack/plugins/cases/server/client/alerts/client.ts deleted file mode 100644 index aaa8bdb2047aa4..00000000000000 --- a/x-pack/plugins/cases/server/client/alerts/client.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { AlertGet, AlertUpdateStatus, CasesClientGetAlertsResponse } from './types'; -import { get } from './get'; -import { updateStatus } from './update_status'; -import { CasesClientArgs } from '../types'; - -export interface AlertSubClient { - get(args: AlertGet): Promise; - updateStatus(args: AlertUpdateStatus): Promise; -} - -export const createAlertsSubClient = (clientArgs: CasesClientArgs): AlertSubClient => { - const alertsSubClient: AlertSubClient = { - get: (params: AlertGet) => get(params, clientArgs), - updateStatus: (params: AlertUpdateStatus) => updateStatus(params, clientArgs), - }; - - return Object.freeze(alertsSubClient); -}; diff --git a/x-pack/plugins/cases/server/client/alerts/get.ts b/x-pack/plugins/cases/server/client/alerts/get.ts index 2048ccae4fa60e..d95c4f536abc34 100644 --- a/x-pack/plugins/cases/server/client/alerts/get.ts +++ b/x-pack/plugins/cases/server/client/alerts/get.ts @@ -5,19 +5,20 @@ * 2.0. */ -import { CasesClientGetAlertsResponse, AlertGet } from './types'; +import { CasesClientGetAlertsResponse } from './types'; import { CasesClientArgs } from '..'; +import { AlertInfo } from '../../common'; -export const get = async ( - { alertsInfo }: AlertGet, +export const getAlerts = async ( + alertsInfo: AlertInfo[], clientArgs: CasesClientArgs ): Promise => { - const { alertsService, scopedClusterClient, logger } = clientArgs; + const { alertsService } = clientArgs; if (alertsInfo.length === 0) { return []; } - const alerts = await alertsService.getAlerts({ alertsInfo, scopedClusterClient, logger }); + const alerts = await alertsService.getAlerts(alertsInfo); if (!alerts) { return []; } diff --git a/x-pack/plugins/cases/server/client/alerts/update_status.ts b/x-pack/plugins/cases/server/client/alerts/update_status.ts deleted file mode 100644 index a0684b59241b07..00000000000000 --- a/x-pack/plugins/cases/server/client/alerts/update_status.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CasesClientArgs } from '..'; -import { UpdateAlertRequest } from './types'; - -interface UpdateAlertsStatusArgs { - alerts: UpdateAlertRequest[]; -} - -export const updateStatus = async ( - { alerts }: UpdateAlertsStatusArgs, - clientArgs: CasesClientArgs -): Promise => { - const { alertsService, scopedClusterClient, logger } = clientArgs; - await alertsService.updateAlertsStatus({ alerts, scopedClusterClient, logger }); -}; diff --git a/x-pack/plugins/cases/server/client/attachments/add.ts b/x-pack/plugins/cases/server/client/attachments/add.ts index 7f6ede930e4c38..84dbc8921f0e44 100644 --- a/x-pack/plugins/cases/server/client/attachments/add.ts +++ b/x-pack/plugins/cases/server/client/attachments/add.ts @@ -127,6 +127,7 @@ const addGeneratedAlerts = async ( logger, lensEmbeddableFactory, authorization, + alertsService, } = clientArgs; const query = pipe( @@ -204,9 +205,7 @@ const addGeneratedAlerts = async ( comment: query, status: subCase.attributes.status, }); - await casesClientInternal.alerts.updateStatus({ - alerts: alertsToUpdate, - }); + await alertsService.updateAlertsStatus(alertsToUpdate); } await userActionService.bulkCreate({ @@ -339,6 +338,7 @@ export const addComment = async ( logger, lensEmbeddableFactory, authorization, + alertsService, } = clientArgs; if (isCommentRequestTypeGenAlert(comment)) { @@ -392,9 +392,7 @@ export const addComment = async ( status: updatedCase.status, }); - await casesClientInternal.alerts.updateStatus({ - alerts: alertsToUpdate, - }); + await alertsService.updateAlertsStatus(alertsToUpdate); } await userActionService.bulkCreate({ diff --git a/x-pack/plugins/cases/server/client/cases/client.ts b/x-pack/plugins/cases/server/client/cases/client.ts index fd9bd489f31b2d..09386431200edd 100644 --- a/x-pack/plugins/cases/server/client/cases/client.ts +++ b/x-pack/plugins/cases/server/client/cases/client.ts @@ -108,7 +108,7 @@ export const createCasesSubClient = ( get: (params: GetParams) => get(params, clientArgs), resolve: (params: GetParams) => resolve(params, clientArgs), push: (params: PushParams) => push(params, clientArgs, casesClient, casesClientInternal), - update: (cases: CasesPatchRequest) => update(cases, clientArgs, casesClientInternal), + update: (cases: CasesPatchRequest) => update(cases, clientArgs), delete: (ids: string[]) => deleteCases(ids, clientArgs), getTags: (params: AllTagsFindRequest) => getTags(params, clientArgs), getReporters: (params: AllReportersFindRequest) => getReporters(params, clientArgs), diff --git a/x-pack/plugins/cases/server/client/cases/push.ts b/x-pack/plugins/cases/server/client/cases/push.ts index 1b090a653546d8..953f8b88c990b9 100644 --- a/x-pack/plugins/cases/server/client/cases/push.ts +++ b/x-pack/plugins/cases/server/client/cases/push.ts @@ -26,6 +26,7 @@ import { createCaseError, flattenCaseSavedObject, getAlertInfoFromComments } fro import { CasesClient, CasesClientArgs, CasesClientInternal } from '..'; import { Operations } from '../../authorization'; import { casesConnectors } from '../../connectors'; +import { getAlerts } from '../alerts/get'; /** * Returns true if the case should be closed based on the configuration settings and whether the case @@ -106,9 +107,7 @@ export const push = async ( const alertsInfo = getAlertInfoFromComments(theCase?.comments); - const alerts = await casesClientInternal.alerts.get({ - alertsInfo, - }); + const alerts = await getAlerts(alertsInfo, clientArgs); const getMappingsResponse = await casesClientInternal.configuration.getMappings({ connector: theCase.connector, diff --git a/x-pack/plugins/cases/server/client/cases/update.ts b/x-pack/plugins/cases/server/client/cases/update.ts index da1c25c83a37b1..455665dc7012ce 100644 --- a/x-pack/plugins/cases/server/client/cases/update.ts +++ b/x-pack/plugins/cases/server/client/cases/update.ts @@ -44,7 +44,7 @@ import { import { buildCaseUserActions } from '../../services/user_actions/helpers'; import { getCaseToUpdate } from '../utils'; -import { CasesService } from '../../services'; +import { AlertService, CasesService } from '../../services'; import { createAlertUpdateRequest, createCaseError, @@ -52,7 +52,6 @@ import { isCommentRequestTypeAlertOrGenAlert, } from '../../common'; import { UpdateAlertRequest } from '../alerts/types'; -import { CasesClientInternal } from '../client_internal'; import { CasesClientArgs } from '..'; import { Operations, OwnerEntity } from '../../authorization'; @@ -306,13 +305,13 @@ async function updateAlerts({ casesWithStatusChangedAndSynced, caseService, unsecuredSavedObjectsClient, - casesClientInternal, + alertsService, }: { casesWithSyncSettingChangedToOn: UpdateRequestWithOriginalCase[]; casesWithStatusChangedAndSynced: UpdateRequestWithOriginalCase[]; caseService: CasesService; unsecuredSavedObjectsClient: SavedObjectsClientContract; - casesClientInternal: CasesClientInternal; + alertsService: AlertService; }) { /** * It's possible that a case ID can appear multiple times in each array. I'm intentionally placing the status changes @@ -361,7 +360,7 @@ async function updateAlerts({ [] ); - await casesClientInternal.alerts.updateStatus({ alerts: alertsToUpdate }); + await alertsService.updateAlertsStatus(alertsToUpdate); } function partitionPatchRequest( @@ -410,8 +409,7 @@ interface UpdateRequestWithOriginalCase { */ export const update = async ( cases: CasesPatchRequest, - clientArgs: CasesClientArgs, - casesClientInternal: CasesClientInternal + clientArgs: CasesClientArgs ): Promise => { const { unsecuredSavedObjectsClient, @@ -420,6 +418,7 @@ export const update = async ( user, logger, authorization, + alertsService, } = clientArgs; const query = pipe( excess(CasesPatchRequestRt).decode(cases), @@ -568,7 +567,7 @@ export const update = async ( casesWithSyncSettingChangedToOn, caseService, unsecuredSavedObjectsClient, - casesClientInternal, + alertsService, }); const returnUpdatedCase = myCases.saved_objects diff --git a/x-pack/plugins/cases/server/client/client.ts b/x-pack/plugins/cases/server/client/client.ts index 1d5300c5880b2a..bd4e36bb7c1778 100644 --- a/x-pack/plugins/cases/server/client/client.ts +++ b/x-pack/plugins/cases/server/client/client.ts @@ -34,7 +34,7 @@ export class CasesClient { this._cases = createCasesSubClient(args, this, this._casesClientInternal); this._attachments = createAttachmentsSubClient(args, this, this._casesClientInternal); this._userActions = createUserActionsSubClient(args); - this._subCases = createSubCasesClient(args, this._casesClientInternal); + this._subCases = createSubCasesClient(args); this._configure = createConfigurationSubClient(args, this._casesClientInternal); this._stats = createStatsSubClient(args); this._metrics = createMetricsSubClient(args, this); diff --git a/x-pack/plugins/cases/server/client/client_internal.ts b/x-pack/plugins/cases/server/client/client_internal.ts index 3623498223da72..57b9a0ffbc243b 100644 --- a/x-pack/plugins/cases/server/client/client_internal.ts +++ b/x-pack/plugins/cases/server/client/client_internal.ts @@ -6,25 +6,18 @@ */ import { CasesClientArgs } from './types'; -import { AlertSubClient, createAlertsSubClient } from './alerts/client'; import { InternalConfigureSubClient, createInternalConfigurationSubClient, } from './configure/client'; export class CasesClientInternal { - private readonly _alerts: AlertSubClient; private readonly _configuration: InternalConfigureSubClient; constructor(args: CasesClientArgs) { - this._alerts = createAlertsSubClient(args); this._configuration = createInternalConfigurationSubClient(args, this); } - public get alerts() { - return this._alerts; - } - public get configuration() { return this._configuration; } diff --git a/x-pack/plugins/cases/server/client/factory.ts b/x-pack/plugins/cases/server/client/factory.ts index 2fae6996f4aa2a..4f506b5e0b4f72 100644 --- a/x-pack/plugins/cases/server/client/factory.ts +++ b/x-pack/plugins/cases/server/client/factory.ts @@ -95,8 +95,7 @@ export class CasesClientFactory { const userInfo = caseService.getUser({ request }); return createCasesClient({ - alertsService: new AlertService(), - scopedClusterClient, + alertsService: new AlertService(scopedClusterClient, this.logger), unsecuredSavedObjectsClient: savedObjectsService.getScopedClient(request, { includedHiddenTypes: SAVED_OBJECT_TYPES, // this tells the security plugin to not perform SO authorization and audit logging since we are handling diff --git a/x-pack/plugins/cases/server/client/sub_cases/client.ts b/x-pack/plugins/cases/server/client/sub_cases/client.ts index 52aa8431e2975e..9b0395bbcb3b60 100644 --- a/x-pack/plugins/cases/server/client/sub_cases/client.ts +++ b/x-pack/plugins/cases/server/client/sub_cases/client.ts @@ -21,7 +21,7 @@ import { SubCasesFindResponseRt, SubCasesPatchRequest, } from '../../../common'; -import { CasesClientArgs, CasesClientInternal } from '..'; +import { CasesClientArgs } from '..'; import { countAlertsForID, createCaseError, @@ -85,16 +85,12 @@ export interface SubCasesClient { * * @ignore */ -export function createSubCasesClient( - clientArgs: CasesClientArgs, - casesClientInternal: CasesClientInternal -): SubCasesClient { +export function createSubCasesClient(clientArgs: CasesClientArgs): SubCasesClient { return Object.freeze({ delete: (ids: string[]) => deleteSubCase(ids, clientArgs), find: (findArgs: FindArgs) => find(findArgs, clientArgs), get: (getArgs: GetArgs) => get(getArgs, clientArgs), - update: (subCases: SubCasesPatchRequest) => - update({ subCases, clientArgs, casesClientInternal }), + update: (subCases: SubCasesPatchRequest) => update({ subCases, clientArgs }), }); } diff --git a/x-pack/plugins/cases/server/client/sub_cases/update.ts b/x-pack/plugins/cases/server/client/sub_cases/update.ts index c0d3d571bb1e84..3f602f7979d1f2 100644 --- a/x-pack/plugins/cases/server/client/sub_cases/update.ts +++ b/x-pack/plugins/cases/server/client/sub_cases/update.ts @@ -17,7 +17,7 @@ import { } from 'kibana/server'; import { nodeBuilder } from '@kbn/es-query'; -import { CasesService } from '../../services'; +import { AlertService, CasesService } from '../../services'; import { CASE_COMMENT_SAVED_OBJECT, CaseStatuses, @@ -46,7 +46,6 @@ import { } from '../../common'; import { UpdateAlertRequest } from '../../client/alerts/types'; import { CasesClientArgs } from '../types'; -import { CasesClientInternal } from '../client_internal'; function checkNonExistingOrConflict( toUpdate: SubCasePatchRequest[], @@ -208,13 +207,13 @@ async function getAlertComments({ async function updateAlerts({ caseService, unsecuredSavedObjectsClient, - casesClientInternal, + alertsService, logger, subCasesToSync, }: { caseService: CasesService; unsecuredSavedObjectsClient: SavedObjectsClientContract; - casesClientInternal: CasesClientInternal; + alertsService: AlertService; logger: Logger; subCasesToSync: SubCasePatchRequest[]; }) { @@ -246,7 +245,7 @@ async function updateAlerts({ [] ); - await casesClientInternal.alerts.updateStatus({ alerts: alertsToUpdate }); + await alertsService.updateAlertsStatus(alertsToUpdate); } catch (error) { throw createCaseError({ message: `Failed to update alert status while updating sub cases: ${JSON.stringify( @@ -264,11 +263,9 @@ async function updateAlerts({ export async function update({ subCases, clientArgs, - casesClientInternal, }: { subCases: SubCasesPatchRequest; clientArgs: CasesClientArgs; - casesClientInternal: CasesClientInternal; }): Promise { const query = pipe( excess(SubCasesPatchRequestRt).decode(subCases), @@ -276,7 +273,8 @@ export async function update({ ); try { - const { unsecuredSavedObjectsClient, user, caseService, userActionService } = clientArgs; + const { unsecuredSavedObjectsClient, user, caseService, userActionService, alertsService } = + clientArgs; const bulkSubCases = await caseService.getSubCases({ unsecuredSavedObjectsClient, @@ -358,7 +356,7 @@ export async function update({ await updateAlerts({ caseService, unsecuredSavedObjectsClient, - casesClientInternal, + alertsService, subCasesToSync: subCasesToSyncAlertsFor, logger: clientArgs.logger, }); diff --git a/x-pack/plugins/cases/server/client/types.ts b/x-pack/plugins/cases/server/client/types.ts index 27829d2539c7d8..f6c97df4f8b71c 100644 --- a/x-pack/plugins/cases/server/client/types.ts +++ b/x-pack/plugins/cases/server/client/types.ts @@ -6,16 +6,16 @@ */ import type { PublicMethodsOf } from '@kbn/utility-types'; -import { ElasticsearchClient, SavedObjectsClientContract, Logger } from 'kibana/server'; +import { SavedObjectsClientContract, Logger } from 'kibana/server'; import { User } from '../../common'; import { Authorization } from '../authorization/authorization'; import { - AlertServiceContract, CaseConfigureService, CasesService, CaseUserActionService, ConnectorMappingsService, AttachmentService, + AlertService, } from '../services'; import { ActionsClient } from '../../../actions/server'; import { LensServerPluginSetup } from '../../../lens/server'; @@ -24,14 +24,13 @@ import { LensServerPluginSetup } from '../../../lens/server'; * Parameters for initializing a cases client */ export interface CasesClientArgs { - readonly scopedClusterClient: ElasticsearchClient; readonly caseConfigureService: CaseConfigureService; readonly caseService: CasesService; readonly connectorMappingsService: ConnectorMappingsService; readonly user: User; readonly unsecuredSavedObjectsClient: SavedObjectsClientContract; readonly userActionService: CaseUserActionService; - readonly alertsService: AlertServiceContract; + readonly alertsService: AlertService; readonly attachmentService: AttachmentService; readonly logger: Logger; readonly lensEmbeddableFactory: LensServerPluginSetup['lensEmbeddableFactory']; diff --git a/x-pack/plugins/cases/server/services/alerts/index.test.ts b/x-pack/plugins/cases/server/services/alerts/index.test.ts index 9113b73de187ac..2c98da198fa073 100644 --- a/x-pack/plugins/cases/server/services/alerts/index.test.ts +++ b/x-pack/plugins/cases/server/services/alerts/index.test.ts @@ -6,96 +6,96 @@ */ import { CaseStatuses } from '../../../common'; -import { AlertService, AlertServiceContract } from '.'; +import { AlertService } from '.'; import { elasticsearchServiceMock, loggingSystemMock } from 'src/core/server/mocks'; -import { ALERT_WORKFLOW_STATUS } from '../../../../rule_registry/common/technical_rule_data_field_names'; describe('updateAlertsStatus', () => { const esClient = elasticsearchServiceMock.createElasticsearchClient(); const logger = loggingSystemMock.create().get('case'); describe('happy path', () => { - let alertService: AlertServiceContract; + let alertService: AlertService; beforeEach(async () => { - alertService = new AlertService(); + alertService = new AlertService(esClient, logger); jest.resetAllMocks(); }); it('updates the status of the alert correctly', async () => { - const args = { - alerts: [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }], - scopedClusterClient: esClient, - logger, - }; + const args = [{ id: 'alert-id-1', index: '.siem-signals', status: CaseStatuses.closed }]; await alertService.updateAlertsStatus(args); - expect(esClient.updateByQuery).toHaveBeenCalledWith({ - index: '.siem-signals', - conflicts: 'abort', - body: { - script: { - source: `if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'closed' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'closed' - }`, - lang: 'painless', - }, - query: { - ids: { - values: ['alert-id-1'], + expect(esClient.updateByQuery.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "body": Object { + "query": Object { + "ids": Object { + "values": Array [ + "alert-id-1", + ], + }, + }, + "script": Object { + "lang": "painless", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'closed' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'closed' + }", + }, }, + "conflicts": "abort", + "ignore_unavailable": true, + "index": ".siem-signals", }, - }, - ignore_unavailable: true, - }); + ] + `); }); it('buckets the alerts by index', async () => { - const args = { - alerts: [ - { id: 'id1', index: '1', status: CaseStatuses.closed }, - { id: 'id2', index: '1', status: CaseStatuses.closed }, - ], - scopedClusterClient: esClient, - logger, - }; + const args = [ + { id: 'id1', index: '1', status: CaseStatuses.closed }, + { id: 'id2', index: '1', status: CaseStatuses.closed }, + ]; await alertService.updateAlertsStatus(args); expect(esClient.updateByQuery).toBeCalledTimes(1); - expect(esClient.updateByQuery).toHaveBeenCalledWith({ - index: '1', - conflicts: 'abort', - body: { - script: { - source: `if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'closed' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'closed' - }`, - lang: 'painless', - }, - query: { - ids: { - values: ['id1', 'id2'], + expect(esClient.updateByQuery.mock.calls[0]).toMatchInlineSnapshot(` + Array [ + Object { + "body": Object { + "query": Object { + "ids": Object { + "values": Array [ + "id1", + "id2", + ], + }, + }, + "script": Object { + "lang": "painless", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'closed' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'closed' + }", + }, }, + "conflicts": "abort", + "ignore_unavailable": true, + "index": "1", }, - }, - ignore_unavailable: true, - }); + ] + `); }); it('translates in-progress to acknowledged', async () => { - const args = { - alerts: [{ id: 'id1', index: '1', status: CaseStatuses['in-progress'] }], - scopedClusterClient: esClient, - logger, - }; + const args = [{ id: 'id1', index: '1', status: CaseStatuses['in-progress'] }]; await alertService.updateAlertsStatus(args); @@ -113,12 +113,12 @@ describe('updateAlertsStatus', () => { }, "script": Object { "lang": "painless", - "source": "if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'acknowledged' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'acknowledged' - }", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'acknowledged' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'acknowledged' + }", }, }, "conflicts": "abort", @@ -130,14 +130,10 @@ describe('updateAlertsStatus', () => { }); it('makes two calls when the statuses are different', async () => { - const args = { - alerts: [ - { id: 'id1', index: '1', status: CaseStatuses.closed }, - { id: 'id2', index: '1', status: CaseStatuses.open }, - ], - scopedClusterClient: esClient, - logger, - }; + const args = [ + { id: 'id1', index: '1', status: CaseStatuses.closed }, + { id: 'id2', index: '1', status: CaseStatuses.open }, + ]; await alertService.updateAlertsStatus(args); @@ -156,12 +152,12 @@ describe('updateAlertsStatus', () => { }, "script": Object { "lang": "painless", - "source": "if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'closed' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'closed' - }", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'closed' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'closed' + }", }, }, "conflicts": "abort", @@ -185,12 +181,12 @@ describe('updateAlertsStatus', () => { }, "script": Object { "lang": "painless", - "source": "if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'open' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'open' - }", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'open' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'open' + }", }, }, "conflicts": "abort", @@ -202,14 +198,10 @@ describe('updateAlertsStatus', () => { }); it('makes two calls when the indices are different', async () => { - const args = { - alerts: [ - { id: 'id1', index: '1', status: CaseStatuses.closed }, - { id: 'id2', index: '2', status: CaseStatuses.open }, - ], - scopedClusterClient: esClient, - logger, - }; + const args = [ + { id: 'id1', index: '1', status: CaseStatuses.closed }, + { id: 'id2', index: '2', status: CaseStatuses.open }, + ]; await alertService.updateAlertsStatus(args); @@ -228,12 +220,12 @@ describe('updateAlertsStatus', () => { }, "script": Object { "lang": "painless", - "source": "if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'closed' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'closed' - }", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'closed' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'closed' + }", }, }, "conflicts": "abort", @@ -257,12 +249,12 @@ describe('updateAlertsStatus', () => { }, "script": Object { "lang": "painless", - "source": "if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = 'open' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = 'open' - }", + "source": "if (ctx._source['kibana.alert.workflow_status'] != null) { + ctx._source['kibana.alert.workflow_status'] = 'open' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = 'open' + }", }, }, "conflicts": "abort", @@ -274,11 +266,9 @@ describe('updateAlertsStatus', () => { }); it('ignores empty indices', async () => { - await alertService.updateAlertsStatus({ - alerts: [{ id: 'alert-id-1', index: '', status: CaseStatuses.open }], - scopedClusterClient: esClient, - logger, - }); + await alertService.updateAlertsStatus([ + { id: 'alert-id-1', index: '', status: CaseStatuses.open }, + ]); expect(esClient.updateByQuery).not.toHaveBeenCalled(); }); diff --git a/x-pack/plugins/cases/server/services/alerts/index.ts b/x-pack/plugins/cases/server/services/alerts/index.ts index d8a09fe1baf231..ca7bfe66804f33 100644 --- a/x-pack/plugins/cases/server/services/alerts/index.ts +++ b/x-pack/plugins/cases/server/services/alerts/index.ts @@ -8,8 +8,6 @@ import pMap from 'p-map'; import { isEmpty } from 'lodash'; -import type { PublicMethodsOf } from '@kbn/utility-types'; - import { ElasticsearchClient, Logger } from 'kibana/server'; import { CaseStatuses, MAX_ALERTS_PER_SUB_CASE, MAX_CONCURRENT_SEARCHES } from '../../../common'; import { AlertInfo, createCaseError } from '../../common'; @@ -19,20 +17,6 @@ import { STATUS_VALUES, } from '../../../../rule_registry/common/technical_rule_data_field_names'; -export type AlertServiceContract = PublicMethodsOf; - -interface UpdateAlertsStatusArgs { - alerts: UpdateAlertRequest[]; - scopedClusterClient: ElasticsearchClient; - logger: Logger; -} - -interface GetAlertsArgs { - alertsInfo: AlertInfo[]; - scopedClusterClient: ElasticsearchClient; - logger: Logger; -} - interface Alert { _id: string; _index: string; @@ -48,31 +32,112 @@ function isEmptyAlert(alert: AlertInfo): boolean { } export class AlertService { - public async updateAlertsStatus({ alerts, scopedClusterClient, logger }: UpdateAlertsStatusArgs) { + constructor( + private readonly scopedClusterClient: ElasticsearchClient, + private readonly logger: Logger + ) {} + + public async updateAlertsStatus(alerts: UpdateAlertRequest[]) { try { - const bucketedAlerts = bucketAlertsByIndexAndStatus(alerts, logger); + const bucketedAlerts = this.bucketAlertsByIndexAndStatus(alerts); const indexBuckets = Array.from(bucketedAlerts.entries()); await pMap( indexBuckets, async (indexBucket: [string, Map]) => - updateByQuery(indexBucket, scopedClusterClient), + this.updateByQuery(indexBucket), { concurrency: MAX_CONCURRENT_SEARCHES } ); } catch (error) { throw createCaseError({ message: `Failed to update alert status ids: ${JSON.stringify(alerts)}: ${error}`, error, - logger, + logger: this.logger, }); } } - public async getAlerts({ - scopedClusterClient, - alertsInfo, - logger, - }: GetAlertsArgs): Promise { + private bucketAlertsByIndexAndStatus( + alerts: UpdateAlertRequest[] + ): Map> { + return alerts.reduce>>( + (acc, alert) => { + // skip any alerts that are empty + if (isEmptyAlert(alert)) { + return acc; + } + + const translatedAlert = { ...alert, status: this.translateStatus(alert) }; + const statusToAlertId = acc.get(translatedAlert.index); + + // if we haven't seen the index before + if (!statusToAlertId) { + // add a new index in the parent map, with an entry for the status the alert set to pointing + // to an initial array of only the current alert + acc.set(translatedAlert.index, createStatusToAlertMap(translatedAlert)); + } else { + // We had the index in the map so check to see if we have a bucket for the + // status, if not add a new status entry with the alert, if so update the status entry + // with the alert + updateIndexEntryWithStatus(statusToAlertId, translatedAlert); + } + + return acc; + }, + new Map() + ); + } + + private translateStatus(alert: UpdateAlertRequest): STATUS_VALUES { + const translatedStatuses: Record = { + [CaseStatuses.open]: 'open', + [CaseStatuses['in-progress']]: 'acknowledged', + [CaseStatuses.closed]: 'closed', + }; + + const translatedStatus = translatedStatuses[alert.status]; + if (!translatedStatus) { + this.logger.error( + `Unable to translate case status ${alert.status} during alert update: ${JSON.stringify( + alert + )}` + ); + } + return translatedStatus ?? 'open'; + } + + private async updateByQuery([index, statusToAlertMap]: [ + string, + Map + ]) { + const statusBuckets = Array.from(statusToAlertMap); + return Promise.all( + // this will create three update by query calls one for each of the three statuses + statusBuckets.map(([status, translatedAlerts]) => + this.scopedClusterClient.updateByQuery({ + index, + conflicts: 'abort', + body: { + script: { + source: `if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { + ctx._source['${ALERT_WORKFLOW_STATUS}'] = '${status}' + } + if (ctx._source.signal != null && ctx._source.signal.status != null) { + ctx._source.signal.status = '${status}' + }`, + lang: 'painless', + }, + // the query here will contain all the ids that have the same status for the same index + // being updated + query: { ids: { values: translatedAlerts.map(({ id }) => id) } }, + }, + ignore_unavailable: true, + }) + ) + ); + } + + public async getAlerts(alertsInfo: AlertInfo[]): Promise { try { const docs = alertsInfo .filter((alert) => !isEmptyAlert(alert)) @@ -83,7 +148,7 @@ export class AlertService { return; } - const results = await scopedClusterClient.mget({ body: { docs } }); + const results = await this.scopedClusterClient.mget({ body: { docs } }); // @ts-expect-error @elastic/elasticsearch _source is optional return results.body; @@ -91,7 +156,7 @@ export class AlertService { throw createCaseError({ message: `Failed to retrieve alerts ids: ${JSON.stringify(alertsInfo)}: ${error}`, error, - logger, + logger: this.logger, }); } } @@ -103,62 +168,6 @@ interface TranslatedUpdateAlertRequest { status: STATUS_VALUES; } -function bucketAlertsByIndexAndStatus( - alerts: UpdateAlertRequest[], - logger: Logger -): Map> { - return alerts.reduce>>( - (acc, alert) => { - // skip any alerts that are empty - if (isEmptyAlert(alert)) { - return acc; - } - - const translatedAlert = { ...alert, status: translateStatus({ alert, logger }) }; - const statusToAlertId = acc.get(translatedAlert.index); - - // if we haven't seen the index before - if (!statusToAlertId) { - // add a new index in the parent map, with an entry for the status the alert set to pointing - // to an initial array of only the current alert - acc.set(translatedAlert.index, createStatusToAlertMap(translatedAlert)); - } else { - // We had the index in the map so check to see if we have a bucket for the - // status, if not add a new status entry with the alert, if so update the status entry - // with the alert - updateIndexEntryWithStatus(statusToAlertId, translatedAlert); - } - - return acc; - }, - new Map() - ); -} - -function translateStatus({ - alert, - logger, -}: { - alert: UpdateAlertRequest; - logger: Logger; -}): STATUS_VALUES { - const translatedStatuses: Record = { - [CaseStatuses.open]: 'open', - [CaseStatuses['in-progress']]: 'acknowledged', - [CaseStatuses.closed]: 'closed', - }; - - const translatedStatus = translatedStatuses[alert.status]; - if (!translatedStatus) { - logger.error( - `Unable to translate case status ${alert.status} during alert update: ${JSON.stringify( - alert - )}` - ); - } - return translatedStatus ?? 'open'; -} - function createStatusToAlertMap( alert: TranslatedUpdateAlertRequest ): Map { @@ -177,34 +186,3 @@ function updateIndexEntryWithStatus( statusBucket.push(alert); } } - -async function updateByQuery( - [index, statusToAlertMap]: [string, Map], - scopedClusterClient: ElasticsearchClient -) { - const statusBuckets = Array.from(statusToAlertMap); - return Promise.all( - // this will create three update by query calls one for each of the three statuses - statusBuckets.map(([status, translatedAlerts]) => - scopedClusterClient.updateByQuery({ - index, - conflicts: 'abort', - body: { - script: { - source: `if (ctx._source['${ALERT_WORKFLOW_STATUS}'] != null) { - ctx._source['${ALERT_WORKFLOW_STATUS}'] = '${status}' - } - if (ctx._source.signal != null && ctx._source.signal.status != null) { - ctx._source.signal.status = '${status}' - }`, - lang: 'painless', - }, - // the query here will contain all the ids that have the same status for the same index - // being updated - query: { ids: { values: translatedAlerts.map(({ id }) => id) } }, - }, - ignore_unavailable: true, - }) - ) - ); -} diff --git a/x-pack/plugins/cases/server/services/index.ts b/x-pack/plugins/cases/server/services/index.ts index a1cb5d8138c400..c14e1fab4a4105 100644 --- a/x-pack/plugins/cases/server/services/index.ts +++ b/x-pack/plugins/cases/server/services/index.ts @@ -12,7 +12,6 @@ export { CasesService } from './cases'; export { CaseConfigureService } from './configure'; export { CaseUserActionService } from './user_actions'; export { ConnectorMappingsService } from './connector_mappings'; -export type { AlertServiceContract } from './alerts'; export { AlertService } from './alerts'; export { AttachmentService } from './attachments'; diff --git a/x-pack/plugins/cases/server/services/mocks.ts b/x-pack/plugins/cases/server/services/mocks.ts index 1ea9f481d302ff..f46bcd0906c600 100644 --- a/x-pack/plugins/cases/server/services/mocks.ts +++ b/x-pack/plugins/cases/server/services/mocks.ts @@ -7,7 +7,7 @@ import { PublicMethodsOf } from '@kbn/utility-types'; import { - AlertServiceContract, + AlertService, CaseConfigureService, CasesService, CaseUserActionService, @@ -19,7 +19,7 @@ export type CaseServiceMock = jest.Mocked; export type CaseConfigureServiceMock = jest.Mocked; export type ConnectorMappingsServiceMock = jest.Mocked; export type CaseUserActionServiceMock = jest.Mocked; -export type AlertServiceMock = jest.Mocked; +export type AlertServiceMock = jest.Mocked; export type AttachmentServiceMock = jest.Mocked; export const createCaseServiceMock = (): CaseServiceMock => { @@ -93,10 +93,15 @@ export const createUserActionServiceMock = (): CaseUserActionServiceMock => { return service as unknown as CaseUserActionServiceMock; }; -export const createAlertServiceMock = (): AlertServiceMock => ({ - updateAlertsStatus: jest.fn(), - getAlerts: jest.fn(), -}); +export const createAlertServiceMock = (): AlertServiceMock => { + const service: PublicMethodsOf = { + updateAlertsStatus: jest.fn(), + getAlerts: jest.fn(), + }; + + // the cast here is required because jest.Mocked tries to include private members and would throw an error + return service as unknown as AlertServiceMock; +}; export const createAttachmentServiceMock = (): AttachmentServiceMock => { const service: PublicMethodsOf = { From 90439793c27ba6460ce02f4f080584d0aea16d5d Mon Sep 17 00:00:00 2001 From: Abdul Wahab Zahid Date: Thu, 2 Dec 2021 15:33:51 +0100 Subject: [PATCH 057/126] Creating io-ts types for synthetics monitors. (#120105) Co-authored-by: Dominique Clarke Co-authored-by: shahzad31 --- .../monitor_management/config_key.ts | 71 +++++ .../runtime_types/monitor_management/index.ts | 11 + .../monitor_management/monitor_configs.ts | 121 ++++++++ .../monitor_management/monitor_meta_data.ts | 21 ++ .../monitor_management/monitor_types.ts | 195 ++++++++++++ x-pack/plugins/uptime/common/utils/t_enum.ts | 38 +++ .../browser/advanced_fields.test.tsx | 16 +- .../fleet_package/browser/advanced_fields.tsx | 28 +- .../fleet_package/browser/formatters.ts | 75 +++-- .../fleet_package/browser/normalizers.test.ts | 34 +-- .../fleet_package/browser/normalizers.ts | 72 ++--- .../fleet_package/browser/simple_fields.tsx | 49 +-- .../browser/throttling_fields.test.tsx | 6 +- .../browser/throttling_fields.tsx | 34 +-- .../browser/zip_url_tls_fields.test.tsx | 30 +- .../browser/zip_url_tls_fields.tsx | 49 ++- .../fleet_package/common/common_fields.tsx | 23 +- .../fleet_package/common/default_values.ts | 14 +- .../fleet_package/common/formatters.ts | 20 +- .../fleet_package/common/normalizers.ts | 28 +- .../contexts/browser_context.tsx | 54 ++-- .../contexts/browser_context_advanced.tsx | 44 +-- .../contexts/browser_provider.tsx | 14 +- .../fleet_package/contexts/http_context.tsx | 32 +- .../contexts/http_context_advanced.tsx | 54 ++-- .../fleet_package/contexts/http_provider.tsx | 12 +- .../fleet_package/contexts/icmp_context.tsx | 30 +- .../contexts/synthetics_context_providers.tsx | 4 +- .../fleet_package/contexts/tcp_context.tsx | 30 +- .../contexts/tcp_context_advanced.tsx | 32 +- .../fleet_package/contexts/tcp_provider.tsx | 14 +- .../contexts/tls_fields_context.tsx | 24 +- .../fleet_package/custom_fields.test.tsx | 30 +- .../fleet_package/custom_fields.tsx | 6 +- .../fleet_package/hooks/use_policy.ts | 22 +- .../hooks/use_update_policy.test.tsx | 218 +++++++------- .../fleet_package/hooks/use_update_policy.ts | 12 +- .../http/advanced_fields.test.tsx | 20 +- .../fleet_package/http/advanced_fields.tsx | 64 ++-- .../fleet_package/http/formatters.ts | 46 +-- .../fleet_package/http/normalizers.ts | 60 ++-- .../fleet_package/http/simple_fields.tsx | 24 +- .../fleet_package/icmp/formatters.ts | 6 +- .../fleet_package/icmp/normalizers.ts | 10 +- .../fleet_package/icmp/simple_fields.tsx | 24 +- .../fleet_package/schedule_field.tsx | 4 +- .../synthetics_policy_create_extension.tsx | 3 +- ...s_policy_create_extension_wrapper.test.tsx | 38 +-- .../synthetics_policy_edit_extension.tsx | 4 +- ...ics_policy_edit_extension_wrapper.test.tsx | 80 +++-- ...nthetics_policy_edit_extension_wrapper.tsx | 43 +-- .../tcp/advanced_fields.test.tsx | 10 +- .../fleet_package/tcp/advanced_fields.tsx | 22 +- .../fleet_package/tcp/formatters.ts | 14 +- .../fleet_package/tcp/normalizers.ts | 18 +- .../fleet_package/tcp/simple_fields.tsx | 18 +- .../fleet_package/tls/default_values.ts | 16 +- .../fleet_package/tls/formatters.ts | 24 +- .../fleet_package/tls/normalizers.ts | 40 +-- .../fleet_package/tls_fields.test.tsx | 30 +- .../components/fleet_package/tls_fields.tsx | 38 +-- .../public/components/fleet_package/types.tsx | 278 ++---------------- .../components/fleet_package/validation.tsx | 65 ++-- .../monitor_management/formatters/browser.ts | 52 ++-- .../monitor_management/formatters/common.ts | 20 +- .../monitor_management/formatters/http.ts | 42 +-- .../monitor_management/formatters/icmp.ts | 6 +- .../monitor_management/formatters/tcp.ts | 14 +- .../monitor_management/formatters/tls.ts | 16 +- .../hooks/use_format_monitor.ts | 22 +- .../uptime/public/pages/edit_monitor.tsx | 44 +-- 71 files changed, 1495 insertions(+), 1287 deletions(-) create mode 100644 x-pack/plugins/uptime/common/runtime_types/monitor_management/config_key.ts create mode 100644 x-pack/plugins/uptime/common/runtime_types/monitor_management/index.ts create mode 100644 x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_configs.ts create mode 100644 x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_meta_data.ts create mode 100644 x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts create mode 100644 x-pack/plugins/uptime/common/utils/t_enum.ts diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/config_key.ts b/x-pack/plugins/uptime/common/runtime_types/monitor_management/config_key.ts new file mode 100644 index 00000000000000..13a7c1e1f2f2da --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/monitor_management/config_key.ts @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; +import { tEnum } from '../../utils/t_enum'; + +// values must match keys in the integration package +export enum ConfigKey { + APM_SERVICE_NAME = 'service.name', + HOSTS = 'hosts', + IGNORE_HTTPS_ERRORS = 'ignore_https_errors', + JOURNEY_FILTERS_MATCH = 'filter_journeys.match', + JOURNEY_FILTERS_TAGS = 'filter_journeys.tags', + MAX_REDIRECTS = 'max_redirects', + METADATA = '__ui', + MONITOR_TYPE = 'type', + NAME = 'name', + PARAMS = 'params', + PASSWORD = 'password', + PROXY_URL = 'proxy_url', + PROXY_USE_LOCAL_RESOLVER = 'proxy_use_local_resolver', + RESPONSE_BODY_CHECK_NEGATIVE = 'check.response.body.negative', + RESPONSE_BODY_CHECK_POSITIVE = 'check.response.body.positive', + RESPONSE_BODY_INDEX = 'response.include_body', + RESPONSE_HEADERS_CHECK = 'check.response.headers', + RESPONSE_HEADERS_INDEX = 'response.include_headers', + RESPONSE_RECEIVE_CHECK = 'check.receive', + RESPONSE_STATUS_CHECK = 'check.response.status', + REQUEST_BODY_CHECK = 'check.request.body', + REQUEST_HEADERS_CHECK = 'check.request.headers', + REQUEST_METHOD_CHECK = 'check.request.method', + REQUEST_SEND_CHECK = 'check.send', + SCHEDULE = 'schedule', + SCREENSHOTS = 'screenshots', + SOURCE_INLINE = 'source.inline.script', + SOURCE_ZIP_URL = 'source.zip_url.url', + SOURCE_ZIP_USERNAME = 'source.zip_url.username', + SOURCE_ZIP_PASSWORD = 'source.zip_url.password', + SOURCE_ZIP_FOLDER = 'source.zip_url.folder', + SOURCE_ZIP_PROXY_URL = 'source.zip_url.proxy_url', + SYNTHETICS_ARGS = 'synthetics_args', + TLS_CERTIFICATE_AUTHORITIES = 'ssl.certificate_authorities', + TLS_CERTIFICATE = 'ssl.certificate', + TLS_KEY = 'ssl.key', + TLS_KEY_PASSPHRASE = 'ssl.key_passphrase', + TLS_VERIFICATION_MODE = 'ssl.verification_mode', + TLS_VERSION = 'ssl.supported_protocols', + TAGS = 'tags', + TIMEOUT = 'timeout', + THROTTLING_CONFIG = 'throttling.config', + IS_THROTTLING_ENABLED = 'throttling.is_enabled', + DOWNLOAD_SPEED = 'throttling.download_speed', + UPLOAD_SPEED = 'throttling.upload_speed', + LATENCY = 'throttling.latency', + URLS = 'urls', + USERNAME = 'username', + WAIT = 'wait', + ZIP_URL_TLS_CERTIFICATE_AUTHORITIES = 'source.zip_url.ssl.certificate_authorities', + ZIP_URL_TLS_CERTIFICATE = 'source.zip_url.ssl.certificate', + ZIP_URL_TLS_KEY = 'source.zip_url.ssl.key', + ZIP_URL_TLS_KEY_PASSPHRASE = 'source.zip_url.ssl.key_passphrase', + ZIP_URL_TLS_VERIFICATION_MODE = 'source.zip_url.ssl.verification_mode', + ZIP_URL_TLS_VERSION = 'source.zip_url.ssl.supported_protocols', +} + +export const ConfigKeyCodec = tEnum('ConfigKey', ConfigKey); +export type ConfigKeyType = t.TypeOf; diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/index.ts b/x-pack/plugins/uptime/common/runtime_types/monitor_management/index.ts new file mode 100644 index 00000000000000..9e9ea0ab1f246c --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/monitor_management/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './config_key'; +export * from './monitor_configs'; +export * from './monitor_meta_data'; +export * from './monitor_types'; diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_configs.ts b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_configs.ts new file mode 100644 index 00000000000000..ac917dda0e1420 --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_configs.ts @@ -0,0 +1,121 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; +import { tEnum } from '../../utils/t_enum'; + +export enum DataStream { + HTTP = 'http', + TCP = 'tcp', + ICMP = 'icmp', + BROWSER = 'browser', +} + +export const DataStreamCodec = tEnum('DataStream', DataStream); +export type DataStreamType = t.TypeOf; + +export enum HTTPMethod { + GET = 'GET', + POST = 'POST', + PUT = 'PUT', + DELETE = 'DELETE', + HEAD = 'HEAD', +} + +export const HTTPMethodCodec = tEnum('HTTPMethod', HTTPMethod); +export type HTTPMethodType = t.TypeOf; + +export enum ResponseBodyIndexPolicy { + ALWAYS = 'always', + NEVER = 'never', + ON_ERROR = 'on_error', +} + +export const ResponseBodyIndexPolicyCodec = tEnum( + 'ResponseBodyIndexPolicy', + ResponseBodyIndexPolicy +); +export type ResponseBodyIndexPolicyType = t.TypeOf; + +export enum MonacoEditorLangId { + JSON = 'xjson', + PLAINTEXT = 'plaintext', + XML = 'xml', + JAVASCRIPT = 'javascript', +} + +export const MonacoEditorLangIdCodec = tEnum( + 'MonacoEditorLangId', + MonacoEditorLangId +); +export type MonacoEditorLangIdType = t.TypeOf; + +export enum Mode { + FORM = 'form', + JSON = 'json', + PLAINTEXT = 'text', + XML = 'xml', +} + +export const ModeCodec = tEnum('Mode', Mode); +export type ModeType = t.TypeOf; + +export enum ContentType { + JSON = 'application/json', + TEXT = 'text/plain', + XML = 'application/xml', + FORM = 'application/x-www-form-urlencoded', +} + +export const ContentTypeCodec = tEnum('ContentType', ContentType); +export type ContentTypeType = t.TypeOf; + +export enum ScheduleUnit { + MINUTES = 'm', + SECONDS = 's', +} + +export const ScheduleUnitCodec = tEnum('ScheduleUnit', ScheduleUnit); +export type ScheduleUnitType = t.TypeOf; + +export enum VerificationMode { + CERTIFICATE = 'certificate', + FULL = 'full', + NONE = 'none', + STRICT = 'strict', +} + +export const VerificationModeCodec = tEnum('VerificationMode', VerificationMode); +export type VerificationModeType = t.TypeOf; + +export enum TLSVersion { + ONE_ZERO = 'TLSv1.0', + ONE_ONE = 'TLSv1.1', + ONE_TWO = 'TLSv1.2', + ONE_THREE = 'TLSv1.3', +} + +export const TLSVersionCodec = tEnum('TLSVersion', TLSVersion); +export type TLSVersionType = t.TypeOf; + +export enum ScreenshotOption { + ON = 'on', + OFF = 'off', + ONLY_ON_FAILURE = 'only-on-failure', +} + +export const ScreenshotOptionCodec = tEnum('ScreenshotOption', ScreenshotOption); +export type ScreenshotOptionType = t.TypeOf; + +export enum ThrottlingSuffix { + DOWNLOAD = 'd', + UPLOAD = 'u', + LATENCY = 'l', +} + +export const ThrottlingSuffixCodec = tEnum('ThrottlingSuffix', ThrottlingSuffix); +export type ThrottlingSuffixType = t.TypeOf; diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_meta_data.ts b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_meta_data.ts new file mode 100644 index 00000000000000..da3ce0fab60212 --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_meta_data.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; + +const ScriptSourceCodec = t.interface({ + is_generated_script: t.boolean, + file_name: t.string, +}); + +export const MetadataCodec = t.partial({ + is_tls_enabled: t.boolean, + is_zip_url_tls_enabled: t.boolean, + script_source: ScriptSourceCodec, +}); + +export type Metadata = t.TypeOf; diff --git a/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts new file mode 100644 index 00000000000000..f54035b7f69ffb --- /dev/null +++ b/x-pack/plugins/uptime/common/runtime_types/monitor_management/monitor_types.ts @@ -0,0 +1,195 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; +import { ConfigKey } from './config_key'; +import { + DataStreamCodec, + ModeCodec, + ResponseBodyIndexPolicyCodec, + ScheduleUnitCodec, +} from './monitor_configs'; +import { MetadataCodec } from './monitor_meta_data'; +import { TLSVersionCodec, VerificationModeCodec } from './monitor_configs'; + +const Schedule = t.interface({ + number: t.string, + unit: ScheduleUnitCodec, +}); + +// TLSFields +export const TLSFieldsCodec = t.partial({ + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: t.string, + [ConfigKey.TLS_CERTIFICATE]: t.string, + [ConfigKey.TLS_KEY]: t.string, + [ConfigKey.TLS_KEY_PASSPHRASE]: t.string, + [ConfigKey.TLS_VERIFICATION_MODE]: VerificationModeCodec, + [ConfigKey.TLS_VERSION]: t.array(TLSVersionCodec), +}); + +export type TLSFields = t.TypeOf; + +// ZipUrlTLSFields +export const ZipUrlTLSFieldsCodec = t.partial({ + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: t.string, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: t.string, + [ConfigKey.ZIP_URL_TLS_KEY]: t.string, + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: t.string, + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: VerificationModeCodec, + [ConfigKey.ZIP_URL_TLS_VERSION]: t.array(TLSVersionCodec), +}); + +export type ZipUrlTLSFields = t.TypeOf; + +// CommonFields +export const CommonFieldsCodec = t.interface({ + [ConfigKey.MONITOR_TYPE]: DataStreamCodec, + [ConfigKey.SCHEDULE]: Schedule, + [ConfigKey.APM_SERVICE_NAME]: t.string, + [ConfigKey.TIMEOUT]: t.string, + [ConfigKey.TAGS]: t.array(t.string), +}); + +export type CommonFields = t.TypeOf; + +// TCP Simple Fields +export const TCPSimpleFieldsCodec = t.intersection([ + t.interface({ + [ConfigKey.METADATA]: MetadataCodec, + [ConfigKey.HOSTS]: t.string, + }), + CommonFieldsCodec, +]); + +export type TCPSimpleFields = t.TypeOf; + +// TCPAdvancedFields +export const TCPAdvancedFieldsCodec = t.interface({ + [ConfigKey.PROXY_URL]: t.string, + [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: t.boolean, + [ConfigKey.RESPONSE_RECEIVE_CHECK]: t.string, + [ConfigKey.REQUEST_SEND_CHECK]: t.string, +}); + +export type TCPAdvancedFields = t.TypeOf; + +// TCPFields +export const TCPFieldsCodec = t.intersection([ + TCPSimpleFieldsCodec, + TCPAdvancedFieldsCodec, + TLSFieldsCodec, +]); + +export type TCPFields = t.TypeOf; + +// ICMP SimpleFields +export const ICMPSimpleFieldsCodec = t.intersection([ + t.interface({ + [ConfigKey.HOSTS]: t.string, + [ConfigKey.WAIT]: t.string, + }), + CommonFieldsCodec, +]); + +export type ICMPSimpleFields = t.TypeOf; +export type ICMPFields = t.TypeOf; + +// HTTPSimpleFields +export const HTTPSimpleFieldsCodec = t.intersection([ + t.interface({ + [ConfigKey.METADATA]: MetadataCodec, + [ConfigKey.MAX_REDIRECTS]: t.string, + [ConfigKey.URLS]: t.string, + }), + CommonFieldsCodec, +]); + +export type HTTPSimpleFields = t.TypeOf; + +// HTTPAdvancedFields +export const HTTPAdvancedFieldsCodec = t.interface({ + [ConfigKey.PASSWORD]: t.string, + [ConfigKey.PROXY_URL]: t.string, + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: t.array(t.string), + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: t.array(t.string), + [ConfigKey.RESPONSE_BODY_INDEX]: ResponseBodyIndexPolicyCodec, + [ConfigKey.RESPONSE_HEADERS_CHECK]: t.record(t.string, t.string), + [ConfigKey.RESPONSE_HEADERS_INDEX]: t.boolean, + [ConfigKey.RESPONSE_STATUS_CHECK]: t.array(t.string), + [ConfigKey.REQUEST_BODY_CHECK]: t.interface({ value: t.string, type: ModeCodec }), + [ConfigKey.REQUEST_HEADERS_CHECK]: t.record(t.string, t.string), + [ConfigKey.REQUEST_METHOD_CHECK]: t.string, + [ConfigKey.USERNAME]: t.string, +}); + +export type HTTPAdvancedFields = t.TypeOf; + +// HTTPFields +export const HTTPFieldsCodec = t.intersection([ + HTTPSimpleFieldsCodec, + HTTPAdvancedFieldsCodec, + TLSFieldsCodec, +]); +export type HTTPFields = t.TypeOf; + +// Browser Fields +export const ThrottlingConfigKeyCodec = t.union([ + t.literal(ConfigKey.DOWNLOAD_SPEED), + t.literal(ConfigKey.UPLOAD_SPEED), + t.literal(ConfigKey.LATENCY), +]); + +export type ThrottlingConfigKey = t.TypeOf; + +export const BrowserSimpleFieldsCodec = t.intersection([ + t.interface({ + [ConfigKey.METADATA]: MetadataCodec, + [ConfigKey.SOURCE_INLINE]: t.string, + [ConfigKey.SOURCE_ZIP_URL]: t.string, + [ConfigKey.SOURCE_ZIP_FOLDER]: t.string, + [ConfigKey.SOURCE_ZIP_USERNAME]: t.string, + [ConfigKey.SOURCE_ZIP_PASSWORD]: t.string, + [ConfigKey.SOURCE_ZIP_PROXY_URL]: t.string, + [ConfigKey.PARAMS]: t.string, + }), + ZipUrlTLSFieldsCodec, + CommonFieldsCodec, +]); + +export const BrowserAdvancedFieldsCodec = t.interface({ + [ConfigKey.SYNTHETICS_ARGS]: t.array(t.string), + [ConfigKey.SCREENSHOTS]: t.string, + [ConfigKey.JOURNEY_FILTERS_MATCH]: t.string, + [ConfigKey.JOURNEY_FILTERS_TAGS]: t.array(t.string), + [ConfigKey.IGNORE_HTTPS_ERRORS]: t.boolean, + [ConfigKey.IS_THROTTLING_ENABLED]: t.boolean, + [ConfigKey.DOWNLOAD_SPEED]: t.string, + [ConfigKey.UPLOAD_SPEED]: t.string, + [ConfigKey.LATENCY]: t.string, + [ConfigKey.THROTTLING_CONFIG]: t.string, +}); + +export const BrowserFieldsCodec = t.intersection([ + BrowserSimpleFieldsCodec, + BrowserAdvancedFieldsCodec, +]); + +export type BrowserFields = t.TypeOf; +export type BrowserSimpleFields = t.TypeOf; +export type BrowserAdvancedFields = t.TypeOf; + +export const MonitorFieldsCodec = t.intersection([ + HTTPFieldsCodec, + TCPFieldsCodec, + ICMPSimpleFieldsCodec, + BrowserFieldsCodec, + t.interface({ + [ConfigKey.NAME]: t.string, + }), +]); + +export type MonitorFields = t.TypeOf; diff --git a/x-pack/plugins/uptime/common/utils/t_enum.ts b/x-pack/plugins/uptime/common/utils/t_enum.ts new file mode 100644 index 00000000000000..e00a51dbdf4384 --- /dev/null +++ b/x-pack/plugins/uptime/common/utils/t_enum.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; + +/** + * This utility function can be used to turn a TypeScript enum into a io-ts codec. + * + * @example + * import { PathReporter } from "io-ts/lib/PathReporter"; + * + * enum Thing { + * FOO = "foo", + * BAR = "bar" + * } + * + * const ThingCodec = tEnum("Thing", Thing); + * + * console.log(PathReporter.report(ThingCodec.decode('invalidvalue'))); + * // prints [ 'Invalid value "invalidvalue" supplied to : Thing' ] + * console.log(PathReporter.report(ThingCodec.decode('foo'))); + * // prints [ 'No errors!' ] + */ +export function tEnum(enumName: string, theEnum: Record) { + const isEnumValue = (input: unknown): input is EnumType => + Object.values(theEnum).includes(input); + + return new t.Type( + enumName, + isEnumValue, + (input, context) => (isEnumValue(input) ? t.success(input) : t.failure(input, context)), + t.identity + ); +} diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx index f0900ae2595926..2675b6e4c617e2 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx @@ -10,11 +10,11 @@ import userEvent from '@testing-library/user-event'; import { render } from '../../../lib/helper/rtl_helpers'; import { BrowserAdvancedFields } from './advanced_fields'; import { - ConfigKeys, - DataStream, - IBrowserAdvancedFields, - IBrowserSimpleFields, + ConfigKey, + BrowserAdvancedFields as BrowserAdvancedFieldsType, + BrowserSimpleFields, Validation, + DataStream, } from '../types'; import { BrowserAdvancedFieldsContextProvider, @@ -38,8 +38,8 @@ describe('', () => { defaultSimpleFields = defaultBrowserSimpleFields, validate = defaultValidation, }: { - defaultValues?: IBrowserAdvancedFields; - defaultSimpleFields?: IBrowserSimpleFields; + defaultValues?: BrowserAdvancedFieldsType; + defaultSimpleFields?: BrowserSimpleFields; validate?: Validation; }) => { return ( @@ -59,7 +59,7 @@ describe('', () => { const syntheticsArgs = getByLabelText('Synthetics args'); const screenshots = getByLabelText('Screenshot options') as HTMLInputElement; - expect(screenshots.value).toEqual(defaultConfig[ConfigKeys.SCREENSHOTS]); + expect(screenshots.value).toEqual(defaultConfig[ConfigKey.SCREENSHOTS]); expect(syntheticsArgs).toBeInTheDocument(); }); @@ -86,7 +86,7 @@ describe('', () => { ); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx index 0133642b8c4b37..1d62ea7fe40c60 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx @@ -20,7 +20,7 @@ import { ComboBox } from '../combo_box'; import { useBrowserAdvancedFieldsContext, useBrowserSimpleFieldsContext } from '../contexts'; -import { ConfigKeys, Validation, ScreenshotOption } from '../types'; +import { ConfigKey, Validation, ScreenshotOption } from '../types'; import { OptionalLabel } from '../optional_label'; import { ThrottlingFields } from './throttling_fields'; @@ -34,7 +34,7 @@ export const BrowserAdvancedFields = memo(({ validate }) => { const { fields: simpleFields } = useBrowserSimpleFieldsContext(); const handleInputChange = useCallback( - ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }, [setFields] @@ -47,7 +47,7 @@ export const BrowserAdvancedFields = memo(({ validate }) => { data-test-subj="syntheticsBrowserAdvancedFieldsAccordion" > - {simpleFields[ConfigKeys.SOURCE_ZIP_URL] && ( + {simpleFields[ConfigKey.SOURCE_ZIP_URL] && ( @@ -81,11 +81,11 @@ export const BrowserAdvancedFields = memo(({ validate }) => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.JOURNEY_FILTERS_MATCH, + configKey: ConfigKey.JOURNEY_FILTERS_MATCH, }) } data-test-subj="syntheticsBrowserJourneyFiltersMatch" @@ -107,9 +107,9 @@ export const BrowserAdvancedFields = memo(({ validate }) => { } > - handleInputChange({ value, configKey: ConfigKeys.JOURNEY_FILTERS_TAGS }) + handleInputChange({ value, configKey: ConfigKey.JOURNEY_FILTERS_TAGS }) } data-test-subj="syntheticsBrowserJourneyFiltersTags" /> @@ -146,7 +146,7 @@ export const BrowserAdvancedFields = memo(({ validate }) => { > (({ validate }) => { onChange={(event) => handleInputChange({ value: event.target.checked, - configKey: ConfigKeys.IGNORE_HTTPS_ERRORS, + configKey: ConfigKey.IGNORE_HTTPS_ERRORS, }) } /> @@ -179,11 +179,11 @@ export const BrowserAdvancedFields = memo(({ validate }) => { > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.SCREENSHOTS, + configKey: ConfigKey.SCREENSHOTS, }) } data-test-subj="syntheticsBrowserScreenshots" @@ -205,10 +205,8 @@ export const BrowserAdvancedFields = memo(({ validate }) => { } > - handleInputChange({ value, configKey: ConfigKeys.SYNTHETICS_ARGS }) - } + selectedOptions={fields[ConfigKey.SYNTHETICS_ARGS]} + onChange={(value) => handleInputChange({ value, configKey: ConfigKey.SYNTHETICS_ARGS })} data-test-subj="syntheticsBrowserSyntheticsArgs" /> diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts index 5384122a186218..20ff3d5081ba63 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { BrowserFields, ConfigKeys } from '../types'; +import { BrowserFields, ConfigKey } from '../types'; import { Formatter, commonFormatters, @@ -22,53 +22,52 @@ import { export type BrowserFormatMap = Record; const throttlingFormatter: Formatter = (fields) => { - if (!fields[ConfigKeys.IS_THROTTLING_ENABLED]) return 'false'; + if (!fields[ConfigKey.IS_THROTTLING_ENABLED]) return 'false'; const getThrottlingValue = (v: string | undefined, suffix: 'd' | 'u' | 'l') => v !== '' && v !== undefined ? `${v}${suffix}` : null; return [ - getThrottlingValue(fields[ConfigKeys.DOWNLOAD_SPEED], 'd'), - getThrottlingValue(fields[ConfigKeys.UPLOAD_SPEED], 'u'), - getThrottlingValue(fields[ConfigKeys.LATENCY], 'l'), + getThrottlingValue(fields[ConfigKey.DOWNLOAD_SPEED], 'd'), + getThrottlingValue(fields[ConfigKey.UPLOAD_SPEED], 'u'), + getThrottlingValue(fields[ConfigKey.LATENCY], 'l'), ] .filter((v) => v !== null) .join('/'); }; export const browserFormatters: BrowserFormatMap = { - [ConfigKeys.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKeys.METADATA]), - [ConfigKeys.SOURCE_ZIP_URL]: null, - [ConfigKeys.SOURCE_ZIP_USERNAME]: null, - [ConfigKeys.SOURCE_ZIP_PASSWORD]: null, - [ConfigKeys.SOURCE_ZIP_FOLDER]: null, - [ConfigKeys.SOURCE_ZIP_PROXY_URL]: null, - [ConfigKeys.SOURCE_INLINE]: (fields) => stringToJsonFormatter(fields[ConfigKeys.SOURCE_INLINE]), - [ConfigKeys.PARAMS]: null, - [ConfigKeys.SCREENSHOTS]: null, - [ConfigKeys.IS_THROTTLING_ENABLED]: null, - [ConfigKeys.DOWNLOAD_SPEED]: null, - [ConfigKeys.UPLOAD_SPEED]: null, - [ConfigKeys.LATENCY]: null, - [ConfigKeys.SYNTHETICS_ARGS]: (fields) => - arrayToJsonFormatter(fields[ConfigKeys.SYNTHETICS_ARGS]), - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: (fields) => - tlsValueToYamlFormatter(fields[ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]), - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE]: (fields) => - tlsValueToYamlFormatter(fields[ConfigKeys.ZIP_URL_TLS_CERTIFICATE]), - [ConfigKeys.ZIP_URL_TLS_KEY]: (fields) => - tlsValueToYamlFormatter(fields[ConfigKeys.ZIP_URL_TLS_KEY]), - [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: (fields) => - tlsValueToStringFormatter(fields[ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]), - [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: (fields) => - tlsValueToStringFormatter(fields[ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]), - [ConfigKeys.ZIP_URL_TLS_VERSION]: (fields) => - tlsArrayToYamlFormatter(fields[ConfigKeys.ZIP_URL_TLS_VERSION]), - [ConfigKeys.JOURNEY_FILTERS_MATCH]: (fields) => - stringToJsonFormatter(fields[ConfigKeys.JOURNEY_FILTERS_MATCH]), - [ConfigKeys.JOURNEY_FILTERS_TAGS]: (fields) => - arrayToJsonFormatter(fields[ConfigKeys.JOURNEY_FILTERS_TAGS]), - [ConfigKeys.THROTTLING_CONFIG]: throttlingFormatter, - [ConfigKeys.IGNORE_HTTPS_ERRORS]: null, + [ConfigKey.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKey.METADATA]), + [ConfigKey.SOURCE_ZIP_URL]: null, + [ConfigKey.SOURCE_ZIP_USERNAME]: null, + [ConfigKey.SOURCE_ZIP_PASSWORD]: null, + [ConfigKey.SOURCE_ZIP_FOLDER]: null, + [ConfigKey.SOURCE_ZIP_PROXY_URL]: null, + [ConfigKey.SOURCE_INLINE]: (fields) => stringToJsonFormatter(fields[ConfigKey.SOURCE_INLINE]), + [ConfigKey.PARAMS]: null, + [ConfigKey.SCREENSHOTS]: null, + [ConfigKey.IS_THROTTLING_ENABLED]: null, + [ConfigKey.DOWNLOAD_SPEED]: null, + [ConfigKey.UPLOAD_SPEED]: null, + [ConfigKey.LATENCY]: null, + [ConfigKey.SYNTHETICS_ARGS]: (fields) => arrayToJsonFormatter(fields[ConfigKey.SYNTHETICS_ARGS]), + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: (fields) => + tlsValueToYamlFormatter(fields[ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]), + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: (fields) => + tlsValueToYamlFormatter(fields[ConfigKey.ZIP_URL_TLS_CERTIFICATE]), + [ConfigKey.ZIP_URL_TLS_KEY]: (fields) => + tlsValueToYamlFormatter(fields[ConfigKey.ZIP_URL_TLS_KEY]), + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: (fields) => + tlsValueToStringFormatter(fields[ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]), + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: (fields) => + tlsValueToStringFormatter(fields[ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]), + [ConfigKey.ZIP_URL_TLS_VERSION]: (fields) => + tlsArrayToYamlFormatter(fields[ConfigKey.ZIP_URL_TLS_VERSION]), + [ConfigKey.JOURNEY_FILTERS_MATCH]: (fields) => + stringToJsonFormatter(fields[ConfigKey.JOURNEY_FILTERS_MATCH]), + [ConfigKey.JOURNEY_FILTERS_TAGS]: (fields) => + arrayToJsonFormatter(fields[ConfigKey.JOURNEY_FILTERS_TAGS]), + [ConfigKey.THROTTLING_CONFIG]: throttlingFormatter, + [ConfigKey.IGNORE_HTTPS_ERRORS]: null, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts index 49a08a12454e36..9b70f5bba6e24e 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts @@ -5,62 +5,62 @@ * 2.0. */ -import { ConfigKeys } from '../types'; +import { ConfigKey } from '../types'; import { getThrottlingParamNormalizer, isThrottlingEnabledNormalizer } from './normalizers'; import { defaultBrowserAdvancedFields } from '../contexts'; describe('browser normalizers', () => { const makeThrottlingConfig = (value: string) => ({ - [ConfigKeys.THROTTLING_CONFIG]: { value }, + [ConfigKey.THROTTLING_CONFIG]: { value }, }); describe('throttlingToParameterNormalizer', () => { it('can extract download values', () => { const fields = makeThrottlingConfig('10d/5u/2.5l'); - expect(getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED)(fields)).toEqual('10'); + expect(getThrottlingParamNormalizer(ConfigKey.DOWNLOAD_SPEED)(fields)).toEqual('10'); }); it('can extract upload values', () => { const fields = makeThrottlingConfig('10d/5u/2.5l'); - expect(getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED)(fields)).toEqual('5'); + expect(getThrottlingParamNormalizer(ConfigKey.UPLOAD_SPEED)(fields)).toEqual('5'); }); it('can extract latency values', () => { const fields = makeThrottlingConfig('10d/5u/2.5l'); - expect(getThrottlingParamNormalizer(ConfigKeys.LATENCY)(fields)).toEqual('2.5'); + expect(getThrottlingParamNormalizer(ConfigKey.LATENCY)(fields)).toEqual('2.5'); }); it('returns default values when throttling is disabled', () => { const fields = makeThrottlingConfig('false'); - expect(getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED)(fields)).toEqual( - defaultBrowserAdvancedFields[ConfigKeys.DOWNLOAD_SPEED] + expect(getThrottlingParamNormalizer(ConfigKey.DOWNLOAD_SPEED)(fields)).toEqual( + defaultBrowserAdvancedFields[ConfigKey.DOWNLOAD_SPEED] ); - expect(getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED)(fields)).toEqual( - defaultBrowserAdvancedFields[ConfigKeys.UPLOAD_SPEED] + expect(getThrottlingParamNormalizer(ConfigKey.UPLOAD_SPEED)(fields)).toEqual( + defaultBrowserAdvancedFields[ConfigKey.UPLOAD_SPEED] ); - expect(getThrottlingParamNormalizer(ConfigKeys.LATENCY)(fields)).toEqual( - defaultBrowserAdvancedFields[ConfigKeys.LATENCY] + expect(getThrottlingParamNormalizer(ConfigKey.LATENCY)(fields)).toEqual( + defaultBrowserAdvancedFields[ConfigKey.LATENCY] ); }); it("returns default values when the desired suffix doesn't exist", () => { const noUploadFields = makeThrottlingConfig('10d/2.5l'); - expect(getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED)(noUploadFields)).toEqual( - defaultBrowserAdvancedFields[ConfigKeys.UPLOAD_SPEED] + expect(getThrottlingParamNormalizer(ConfigKey.UPLOAD_SPEED)(noUploadFields)).toEqual( + defaultBrowserAdvancedFields[ConfigKey.UPLOAD_SPEED] ); const noDownloadFields = makeThrottlingConfig('10u/2.5l'); - expect(getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED)(noDownloadFields)).toEqual( - defaultBrowserAdvancedFields[ConfigKeys.DOWNLOAD_SPEED] + expect(getThrottlingParamNormalizer(ConfigKey.DOWNLOAD_SPEED)(noDownloadFields)).toEqual( + defaultBrowserAdvancedFields[ConfigKey.DOWNLOAD_SPEED] ); const noLatencyFields = makeThrottlingConfig('10d/5u'); - expect(getThrottlingParamNormalizer(ConfigKeys.LATENCY)(noLatencyFields)).toEqual( - defaultBrowserAdvancedFields[ConfigKeys.LATENCY] + expect(getThrottlingParamNormalizer(ConfigKey.LATENCY)(noLatencyFields)).toEqual( + defaultBrowserAdvancedFields[ConfigKey.LATENCY] ); }); }); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts index 6d8b35673fba36..71d178494cff1f 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts @@ -7,7 +7,7 @@ import { BrowserFields, - ConfigKeys, + ConfigKey, ThrottlingSuffix, ThrottlingConfigKey, configKeyToThrottlingSuffix, @@ -28,11 +28,11 @@ const defaultBrowserFields = { ...defaultBrowserAdvancedFields, }; -export const getBrowserNormalizer = (key: ConfigKeys) => { +export const getBrowserNormalizer = (key: ConfigKey) => { return getNormalizer(key, defaultBrowserFields); }; -export const getBrowserJsonToJavascriptNormalizer = (key: ConfigKeys) => { +export const getBrowserJsonToJavascriptNormalizer = (key: ConfigKey) => { return getJsonToJavascriptNormalizer(key, defaultBrowserFields); }; @@ -52,7 +52,7 @@ export function throttlingToParameterNormalizer( export const isThrottlingEnabledNormalizer: Normalizer = function isThrottlingEnabledNormalizer( fields ) { - const throttlingEnabled = fields?.[ConfigKeys.THROTTLING_CONFIG]?.value; + const throttlingEnabled = fields?.[ConfigKey.THROTTLING_CONFIG]?.value; // If we have any value that's not an explicit "false" it means throttling is "on" return throttlingEnabled !== 'false'; @@ -61,48 +61,48 @@ export const isThrottlingEnabledNormalizer: Normalizer = function isThrottlingEn export function getThrottlingParamNormalizer(key: ThrottlingConfigKey): Normalizer { const paramSuffix = configKeyToThrottlingSuffix[key]; return (fields) => - throttlingToParameterNormalizer(paramSuffix, fields?.[ConfigKeys.THROTTLING_CONFIG]?.value) ?? + throttlingToParameterNormalizer(paramSuffix, fields?.[ConfigKey.THROTTLING_CONFIG]?.value) ?? defaultBrowserFields[key]; } export const browserNormalizers: BrowserNormalizerMap = { - [ConfigKeys.METADATA]: getBrowserJsonToJavascriptNormalizer(ConfigKeys.METADATA), - [ConfigKeys.SOURCE_ZIP_URL]: getBrowserNormalizer(ConfigKeys.SOURCE_ZIP_URL), - [ConfigKeys.SOURCE_ZIP_USERNAME]: getBrowserNormalizer(ConfigKeys.SOURCE_ZIP_USERNAME), - [ConfigKeys.SOURCE_ZIP_PASSWORD]: getBrowserNormalizer(ConfigKeys.SOURCE_ZIP_PASSWORD), - [ConfigKeys.SOURCE_ZIP_FOLDER]: getBrowserNormalizer(ConfigKeys.SOURCE_ZIP_FOLDER), - [ConfigKeys.SOURCE_INLINE]: getBrowserJsonToJavascriptNormalizer(ConfigKeys.SOURCE_INLINE), - [ConfigKeys.SOURCE_ZIP_PROXY_URL]: getBrowserNormalizer(ConfigKeys.SOURCE_ZIP_PROXY_URL), - [ConfigKeys.PARAMS]: getBrowserNormalizer(ConfigKeys.PARAMS), - [ConfigKeys.SCREENSHOTS]: getBrowserNormalizer(ConfigKeys.SCREENSHOTS), - [ConfigKeys.SYNTHETICS_ARGS]: getBrowserJsonToJavascriptNormalizer(ConfigKeys.SYNTHETICS_ARGS), - [ConfigKeys.IS_THROTTLING_ENABLED]: isThrottlingEnabledNormalizer, - [ConfigKeys.DOWNLOAD_SPEED]: getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED), - [ConfigKeys.UPLOAD_SPEED]: getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED), - [ConfigKeys.LATENCY]: getThrottlingParamNormalizer(ConfigKeys.LATENCY), - [ConfigKeys.THROTTLING_CONFIG]: getBrowserNormalizer(ConfigKeys.THROTTLING_CONFIG), - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: getBrowserJsonToJavascriptNormalizer( - ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES + [ConfigKey.METADATA]: getBrowserJsonToJavascriptNormalizer(ConfigKey.METADATA), + [ConfigKey.SOURCE_ZIP_URL]: getBrowserNormalizer(ConfigKey.SOURCE_ZIP_URL), + [ConfigKey.SOURCE_ZIP_USERNAME]: getBrowserNormalizer(ConfigKey.SOURCE_ZIP_USERNAME), + [ConfigKey.SOURCE_ZIP_PASSWORD]: getBrowserNormalizer(ConfigKey.SOURCE_ZIP_PASSWORD), + [ConfigKey.SOURCE_ZIP_FOLDER]: getBrowserNormalizer(ConfigKey.SOURCE_ZIP_FOLDER), + [ConfigKey.SOURCE_INLINE]: getBrowserJsonToJavascriptNormalizer(ConfigKey.SOURCE_INLINE), + [ConfigKey.SOURCE_ZIP_PROXY_URL]: getBrowserNormalizer(ConfigKey.SOURCE_ZIP_PROXY_URL), + [ConfigKey.PARAMS]: getBrowserNormalizer(ConfigKey.PARAMS), + [ConfigKey.SCREENSHOTS]: getBrowserNormalizer(ConfigKey.SCREENSHOTS), + [ConfigKey.SYNTHETICS_ARGS]: getBrowserJsonToJavascriptNormalizer(ConfigKey.SYNTHETICS_ARGS), + [ConfigKey.IS_THROTTLING_ENABLED]: isThrottlingEnabledNormalizer, + [ConfigKey.DOWNLOAD_SPEED]: getThrottlingParamNormalizer(ConfigKey.DOWNLOAD_SPEED), + [ConfigKey.UPLOAD_SPEED]: getThrottlingParamNormalizer(ConfigKey.UPLOAD_SPEED), + [ConfigKey.LATENCY]: getThrottlingParamNormalizer(ConfigKey.LATENCY), + [ConfigKey.THROTTLING_CONFIG]: getBrowserNormalizer(ConfigKey.THROTTLING_CONFIG), + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: getBrowserJsonToJavascriptNormalizer( + ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES ), - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE]: getBrowserJsonToJavascriptNormalizer( - ConfigKeys.ZIP_URL_TLS_CERTIFICATE + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: getBrowserJsonToJavascriptNormalizer( + ConfigKey.ZIP_URL_TLS_CERTIFICATE ), - [ConfigKeys.ZIP_URL_TLS_KEY]: getBrowserJsonToJavascriptNormalizer(ConfigKeys.ZIP_URL_TLS_KEY), - [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: getBrowserNormalizer( - ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE + [ConfigKey.ZIP_URL_TLS_KEY]: getBrowserJsonToJavascriptNormalizer(ConfigKey.ZIP_URL_TLS_KEY), + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: getBrowserNormalizer( + ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE ), - [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: getBrowserNormalizer( - ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: getBrowserNormalizer( + ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE ), - [ConfigKeys.ZIP_URL_TLS_VERSION]: getBrowserJsonToJavascriptNormalizer( - ConfigKeys.ZIP_URL_TLS_VERSION + [ConfigKey.ZIP_URL_TLS_VERSION]: getBrowserJsonToJavascriptNormalizer( + ConfigKey.ZIP_URL_TLS_VERSION ), - [ConfigKeys.JOURNEY_FILTERS_MATCH]: getBrowserJsonToJavascriptNormalizer( - ConfigKeys.JOURNEY_FILTERS_MATCH + [ConfigKey.JOURNEY_FILTERS_MATCH]: getBrowserJsonToJavascriptNormalizer( + ConfigKey.JOURNEY_FILTERS_MATCH ), - [ConfigKeys.JOURNEY_FILTERS_TAGS]: getBrowserJsonToJavascriptNormalizer( - ConfigKeys.JOURNEY_FILTERS_TAGS + [ConfigKey.JOURNEY_FILTERS_TAGS]: getBrowserJsonToJavascriptNormalizer( + ConfigKey.JOURNEY_FILTERS_TAGS ), - [ConfigKeys.IGNORE_HTTPS_ERRORS]: getBrowserNormalizer(ConfigKeys.IGNORE_HTTPS_ERRORS), + [ConfigKey.IGNORE_HTTPS_ERRORS]: getBrowserNormalizer(ConfigKey.IGNORE_HTTPS_ERRORS), ...commonNormalizers, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/simple_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/simple_fields.tsx index ae58df0e058afc..b0f3b295992423 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/simple_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/simple_fields.tsx @@ -8,7 +8,8 @@ import React, { memo, useMemo, useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFormRow } from '@elastic/eui'; -import { ConfigKeys, Validation } from '../types'; +import { Validation } from '../types'; +import { ConfigKey } from '../types'; import { useBrowserSimpleFieldsContext } from '../contexts'; import { ScheduleField } from '../schedule_field'; import { SourceField } from './source_field'; @@ -20,7 +21,7 @@ interface Props { export const BrowserSimpleFields = memo(({ validate }) => { const { fields, setFields, defaultValues } = useBrowserSimpleFieldsContext(); - const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }; const onChangeSourceField = useCallback( @@ -37,15 +38,15 @@ export const BrowserSimpleFields = memo(({ validate }) => { }) => { setFields((prevFields) => ({ ...prevFields, - [ConfigKeys.SOURCE_ZIP_URL]: zipUrl, - [ConfigKeys.SOURCE_ZIP_PROXY_URL]: proxyUrl, - [ConfigKeys.SOURCE_ZIP_FOLDER]: folder, - [ConfigKeys.SOURCE_ZIP_USERNAME]: username, - [ConfigKeys.SOURCE_ZIP_PASSWORD]: password, - [ConfigKeys.SOURCE_INLINE]: inlineScript, - [ConfigKeys.PARAMS]: params, - [ConfigKeys.METADATA]: { - ...prevFields[ConfigKeys.METADATA], + [ConfigKey.SOURCE_ZIP_URL]: zipUrl, + [ConfigKey.SOURCE_ZIP_PROXY_URL]: proxyUrl, + [ConfigKey.SOURCE_ZIP_FOLDER]: folder, + [ConfigKey.SOURCE_ZIP_USERNAME]: username, + [ConfigKey.SOURCE_ZIP_PASSWORD]: password, + [ConfigKey.SOURCE_INLINE]: inlineScript, + [ConfigKey.PARAMS]: params, + [ConfigKey.METADATA]: { + ...prevFields[ConfigKey.METADATA], script_source: { is_generated_script: isGeneratedScript, file_name: fileName, @@ -66,7 +67,7 @@ export const BrowserSimpleFields = memo(({ validate }) => { defaultMessage="Monitor interval" /> } - isInvalid={!!validate[ConfigKeys.SCHEDULE]?.(fields)} + isInvalid={!!validate[ConfigKey.SCHEDULE]?.(fields)} error={ (({ validate }) => { onChange={(schedule) => handleInputChange({ value: schedule, - configKey: ConfigKeys.SCHEDULE, + configKey: ConfigKey.SCHEDULE, }) } - number={fields[ConfigKeys.SCHEDULE].number} - unit={fields[ConfigKeys.SCHEDULE].unit} + number={fields[ConfigKey.SCHEDULE].number} + unit={fields[ConfigKey.SCHEDULE].unit} /> (({ validate }) => { onChange={onChangeSourceField} defaultConfig={useMemo( () => ({ - zipUrl: defaultValues[ConfigKeys.SOURCE_ZIP_URL], - proxyUrl: defaultValues[ConfigKeys.SOURCE_ZIP_PROXY_URL], - folder: defaultValues[ConfigKeys.SOURCE_ZIP_FOLDER], - username: defaultValues[ConfigKeys.SOURCE_ZIP_USERNAME], - password: defaultValues[ConfigKeys.SOURCE_ZIP_PASSWORD], - inlineScript: defaultValues[ConfigKeys.SOURCE_INLINE], - params: defaultValues[ConfigKeys.PARAMS], + zipUrl: defaultValues[ConfigKey.SOURCE_ZIP_URL], + proxyUrl: defaultValues[ConfigKey.SOURCE_ZIP_PROXY_URL], + folder: defaultValues[ConfigKey.SOURCE_ZIP_FOLDER], + username: defaultValues[ConfigKey.SOURCE_ZIP_USERNAME], + password: defaultValues[ConfigKey.SOURCE_ZIP_PASSWORD], + inlineScript: defaultValues[ConfigKey.SOURCE_INLINE], + params: defaultValues[ConfigKey.PARAMS], isGeneratedScript: - defaultValues[ConfigKeys.METADATA].script_source?.is_generated_script, - fileName: defaultValues[ConfigKeys.METADATA].script_source?.file_name, + defaultValues[ConfigKey.METADATA].script_source?.is_generated_script, + fileName: defaultValues[ConfigKey.METADATA].script_source?.file_name, }), [defaultValues] )} diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx index b27e848c98a139..8021253c80e997 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import userEvent from '@testing-library/user-event'; import { render } from '../../../lib/helper/rtl_helpers'; import { ThrottlingFields } from './throttling_fields'; -import { DataStream, IBrowserAdvancedFields, IBrowserSimpleFields, Validation } from '../types'; +import { DataStream, BrowserAdvancedFields, BrowserSimpleFields, Validation } from '../types'; import { BrowserAdvancedFieldsContextProvider, BrowserSimpleFieldsContextProvider, @@ -32,8 +32,8 @@ describe('', () => { defaultSimpleFields = defaultBrowserSimpleFields, validate = defaultValidation, }: { - defaultValues?: IBrowserAdvancedFields; - defaultSimpleFields?: IBrowserSimpleFields; + defaultValues?: BrowserAdvancedFields; + defaultSimpleFields?: BrowserSimpleFields; validate?: Validation; }) => { return ( diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx index 19bfd961f64616..8648b531ef3a85 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx @@ -18,17 +18,17 @@ import { import { OptionalLabel } from '../optional_label'; import { useBrowserAdvancedFieldsContext } from '../contexts'; -import { Validation, ConfigKeys } from '../types'; +import { Validation, ConfigKey } from '../types'; interface Props { validate: Validation; } type ThrottlingConfigs = - | ConfigKeys.IS_THROTTLING_ENABLED - | ConfigKeys.DOWNLOAD_SPEED - | ConfigKeys.UPLOAD_SPEED - | ConfigKeys.LATENCY; + | ConfigKey.IS_THROTTLING_ENABLED + | ConfigKey.DOWNLOAD_SPEED + | ConfigKey.UPLOAD_SPEED + | ConfigKey.LATENCY; export const ThrottlingFields = memo(({ validate }) => { const { fields, setFields } = useBrowserAdvancedFieldsContext(); @@ -40,7 +40,7 @@ export const ThrottlingFields = memo(({ validate }) => { [setFields] ); - const throttlingInputs = fields[ConfigKeys.IS_THROTTLING_ENABLED] ? ( + const throttlingInputs = fields[ConfigKey.IS_THROTTLING_ENABLED] ? ( <> (({ validate }) => { /> } labelAppend={} - isInvalid={!!validate[ConfigKeys.DOWNLOAD_SPEED]?.(fields)} + isInvalid={!!validate[ConfigKey.DOWNLOAD_SPEED]?.(fields)} error={ (({ validate }) => { { handleInputChange({ value: event.target.value, - configKey: ConfigKeys.DOWNLOAD_SPEED, + configKey: ConfigKey.DOWNLOAD_SPEED, }); }} data-test-subj="syntheticsBrowserDownloadSpeed" @@ -85,7 +85,7 @@ export const ThrottlingFields = memo(({ validate }) => { /> } labelAppend={} - isInvalid={!!validate[ConfigKeys.UPLOAD_SPEED]?.(fields)} + isInvalid={!!validate[ConfigKey.UPLOAD_SPEED]?.(fields)} error={ (({ validate }) => { handleInputChange({ value: event.target.value, - configKey: ConfigKeys.UPLOAD_SPEED, + configKey: ConfigKey.UPLOAD_SPEED, }) } data-test-subj="syntheticsBrowserUploadSpeed" @@ -119,7 +119,7 @@ export const ThrottlingFields = memo(({ validate }) => { /> } labelAppend={} - isInvalid={!!validate[ConfigKeys.LATENCY]?.(fields)} + isInvalid={!!validate[ConfigKey.LATENCY]?.(fields)} data-test-subj="syntheticsBrowserLatency" error={ (({ validate }) => { > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.LATENCY, + configKey: ConfigKey.LATENCY, }) } append={ @@ -168,7 +168,7 @@ export const ThrottlingFields = memo(({ validate }) => { id={'uptimeFleetIsThrottlingEnabled'} aria-label="enable throttling configuration" data-test-subj="syntheticsBrowserIsThrottlingEnabled" - checked={fields[ConfigKeys.IS_THROTTLING_ENABLED]} + checked={fields[ConfigKey.IS_THROTTLING_ENABLED]} label={ (({ validate }) => { onChange={(event) => handleInputChange({ value: event.target.checked, - configKey: ConfigKeys.IS_THROTTLING_ENABLED, + configKey: ConfigKey.IS_THROTTLING_ENABLED, }) } /> diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx index 334166e716ff3d..9be1d3746899f8 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.test.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { fireEvent } from '@testing-library/react'; import { render } from '../../../lib/helper/rtl_helpers'; import { ZipUrlTLSFields } from './zip_url_tls_fields'; -import { ConfigKeys, VerificationMode } from '../types'; +import { ConfigKey, VerificationMode } from '../types'; import { BrowserSimpleFieldsContextProvider, PolicyConfigContextProvider, @@ -57,31 +57,31 @@ describe('', () => { const verificationMode = getByLabelText('Verification mode') as HTMLInputElement; const newValues = { - [ConfigKeys.TLS_CERTIFICATE]: 'sampleClientCertificate', - [ConfigKeys.TLS_KEY]: 'sampleClientKey', - [ConfigKeys.TLS_KEY_PASSPHRASE]: 'sampleClientKeyPassphrase', - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: 'sampleCertificateAuthorities', - [ConfigKeys.TLS_VERIFICATION_MODE]: VerificationMode.NONE, + [ConfigKey.TLS_CERTIFICATE]: 'sampleClientCertificate', + [ConfigKey.TLS_KEY]: 'sampleClientKey', + [ConfigKey.TLS_KEY_PASSPHRASE]: 'sampleClientKeyPassphrase', + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: 'sampleCertificateAuthorities', + [ConfigKey.TLS_VERIFICATION_MODE]: VerificationMode.NONE, }; fireEvent.change(clientCertificate, { - target: { value: newValues[ConfigKeys.TLS_CERTIFICATE] }, + target: { value: newValues[ConfigKey.TLS_CERTIFICATE] }, }); - fireEvent.change(clientKey, { target: { value: newValues[ConfigKeys.TLS_KEY] } }); + fireEvent.change(clientKey, { target: { value: newValues[ConfigKey.TLS_KEY] } }); fireEvent.change(clientKeyPassphrase, { - target: { value: newValues[ConfigKeys.TLS_KEY_PASSPHRASE] }, + target: { value: newValues[ConfigKey.TLS_KEY_PASSPHRASE] }, }); fireEvent.change(certificateAuthorities, { - target: { value: newValues[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES] }, + target: { value: newValues[ConfigKey.TLS_CERTIFICATE_AUTHORITIES] }, }); fireEvent.change(verificationMode, { - target: { value: newValues[ConfigKeys.TLS_VERIFICATION_MODE] }, + target: { value: newValues[ConfigKey.TLS_VERIFICATION_MODE] }, }); - expect(clientCertificate.value).toEqual(newValues[ConfigKeys.TLS_CERTIFICATE]); - expect(clientKey.value).toEqual(newValues[ConfigKeys.TLS_KEY]); - expect(certificateAuthorities.value).toEqual(newValues[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]); - expect(verificationMode.value).toEqual(newValues[ConfigKeys.TLS_VERIFICATION_MODE]); + expect(clientCertificate.value).toEqual(newValues[ConfigKey.TLS_CERTIFICATE]); + expect(clientKey.value).toEqual(newValues[ConfigKey.TLS_KEY]); + expect(certificateAuthorities.value).toEqual(newValues[ConfigKey.TLS_CERTIFICATE_AUTHORITIES]); + expect(verificationMode.value).toEqual(newValues[ConfigKey.TLS_VERIFICATION_MODE]); }); it('shows warning when verification mode is set to none', () => { diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.tsx index caa58755044414..590c5d4f3abc58 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/zip_url_tls_fields.tsx @@ -18,7 +18,7 @@ import { defaultTLSFields, } from '../contexts'; -import { ConfigKeys } from '../types'; +import { ConfigKey } from '../types'; export const ZipUrlTLSFields = () => { const { defaultValues, setFields } = useBrowserSimpleFieldsContext(); @@ -28,12 +28,12 @@ export const ZipUrlTLSFields = () => { (tlsConfig: TLSConfig) => { setFields((prevFields) => ({ ...prevFields, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: tlsConfig.certificateAuthorities, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE]: tlsConfig.certificate, - [ConfigKeys.ZIP_URL_TLS_KEY]: tlsConfig.key, - [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: tlsConfig.keyPassphrase, - [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: tlsConfig.verificationMode, - [ConfigKeys.ZIP_URL_TLS_VERSION]: tlsConfig.version, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: tlsConfig.certificateAuthorities, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: tlsConfig.certificate, + [ConfigKey.ZIP_URL_TLS_KEY]: tlsConfig.key, + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: tlsConfig.keyPassphrase, + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: tlsConfig.verificationMode, + [ConfigKey.ZIP_URL_TLS_VERSION]: tlsConfig.version, })); }, [setFields] @@ -43,12 +43,12 @@ export const ZipUrlTLSFields = () => { if (!isZipUrlTLSEnabled) { setFields((prevFields) => ({ ...prevFields, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: undefined, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE]: undefined, - [ConfigKeys.ZIP_URL_TLS_KEY]: undefined, - [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: undefined, - [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: undefined, - [ConfigKeys.ZIP_URL_TLS_VERSION]: undefined, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: undefined, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: undefined, + [ConfigKey.ZIP_URL_TLS_KEY]: undefined, + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: undefined, + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: undefined, + [ConfigKey.ZIP_URL_TLS_VERSION]: undefined, })); } }, [setFields, isZipUrlTLSEnabled]); @@ -72,22 +72,21 @@ export const ZipUrlTLSFields = () => { void; + fields: CommonFieldsType; + onChange: ({ value, configKey }: { value: string | string[]; configKey: ConfigKey }) => void; } export function CommonFields({ fields, onChange, validate }: Props) { @@ -37,11 +38,11 @@ export function CommonFields({ fields, onChange, validate }: Props) { } > onChange({ value: event.target.value, - configKey: ConfigKeys.APM_SERVICE_NAME, + configKey: ConfigKey.APM_SERVICE_NAME, }) } data-test-subj="syntheticsAPMServiceName" @@ -54,9 +55,9 @@ export function CommonFields({ fields, onChange, validate }: Props) { defaultMessage="Timeout in seconds" /> } - isInvalid={!!validate[ConfigKeys.TIMEOUT]?.(fields)} + isInvalid={!!validate[ConfigKey.TIMEOUT]?.(fields)} error={ - parseInt(fields[ConfigKeys.TIMEOUT], 10) < 0 ? ( + parseInt(fields[ConfigKey.TIMEOUT], 10) < 0 ? ( onChange({ value: event.target.value, - configKey: ConfigKeys.TIMEOUT, + configKey: ConfigKey.TIMEOUT, }) } step={'any'} @@ -103,8 +104,8 @@ export function CommonFields({ fields, onChange, validate }: Props) { } > onChange({ value, configKey: ConfigKeys.TAGS })} + selectedOptions={fields[ConfigKey.TAGS]} + onChange={(value) => onChange({ value, configKey: ConfigKey.TAGS })} data-test-subj="syntheticsTags" /> diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/default_values.ts b/x-pack/plugins/uptime/public/components/fleet_package/common/default_values.ts index bba8cefd749ee3..50c540266724ad 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/common/default_values.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/common/default_values.ts @@ -5,15 +5,15 @@ * 2.0. */ -import { ICommonFields, ConfigKeys, ScheduleUnit, DataStream } from '../types'; +import { CommonFields, ConfigKey, ScheduleUnit, DataStream } from '../types'; -export const defaultValues: ICommonFields = { - [ConfigKeys.MONITOR_TYPE]: DataStream.HTTP, - [ConfigKeys.SCHEDULE]: { +export const defaultValues: CommonFields = { + [ConfigKey.MONITOR_TYPE]: DataStream.HTTP, + [ConfigKey.SCHEDULE]: { number: '3', unit: ScheduleUnit.MINUTES, }, - [ConfigKeys.APM_SERVICE_NAME]: '', - [ConfigKeys.TAGS]: [], - [ConfigKeys.TIMEOUT]: '16', + [ConfigKey.APM_SERVICE_NAME]: '', + [ConfigKey.TAGS]: [], + [ConfigKey.TIMEOUT]: '16', }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/common/formatters.ts index 278aa1b03bab1a..077e0fb0becda6 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/common/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/common/formatters.ts @@ -5,22 +5,22 @@ * 2.0. */ -import { ICommonFields, ICustomFields, ConfigKeys } from '../types'; +import { CommonFields, MonitorFields, ConfigKey } from '../types'; -export type Formatter = null | ((fields: Partial) => string | null); +export type Formatter = null | ((fields: Partial) => string | null); -export type CommonFormatMap = Record; +export type CommonFormatMap = Record; export const commonFormatters: CommonFormatMap = { - [ConfigKeys.NAME]: null, - [ConfigKeys.MONITOR_TYPE]: null, - [ConfigKeys.SCHEDULE]: (fields) => + [ConfigKey.NAME]: null, + [ConfigKey.MONITOR_TYPE]: null, + [ConfigKey.SCHEDULE]: (fields) => JSON.stringify( - `@every ${fields[ConfigKeys.SCHEDULE]?.number}${fields[ConfigKeys.SCHEDULE]?.unit}` + `@every ${fields[ConfigKey.SCHEDULE]?.number}${fields[ConfigKey.SCHEDULE]?.unit}` ), - [ConfigKeys.APM_SERVICE_NAME]: null, - [ConfigKeys.TAGS]: (fields) => arrayToJsonFormatter(fields[ConfigKeys.TAGS]), - [ConfigKeys.TIMEOUT]: (fields) => secondsToCronFormatter(fields[ConfigKeys.TIMEOUT]), + [ConfigKey.APM_SERVICE_NAME]: null, + [ConfigKey.TAGS]: (fields) => arrayToJsonFormatter(fields[ConfigKey.TAGS]), + [ConfigKey.TIMEOUT]: (fields) => secondsToCronFormatter(fields[ConfigKey.TIMEOUT]), }; export const arrayToJsonFormatter = (value: string[] = []) => diff --git a/x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.ts index 57c4904d711c7a..5710a99a656606 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/common/normalizers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ICommonFields, ConfigKeys } from '../types'; +import { CommonFields, ConfigKey } from '../types'; import { NewPackagePolicyInput } from '../../../../../fleet/common'; import { defaultValues as commonDefaultValues } from './default_values'; @@ -13,7 +13,7 @@ import { defaultValues as commonDefaultValues } from './default_values'; export type Normalizer = (fields: NewPackagePolicyInput['vars']) => unknown; // create a type of all the common policy fields, as well as the fleet managed 'name' field -export type CommonNormalizerMap = Record; +export type CommonNormalizerMap = Record; /** * Takes a cron formatted seconds and returns just the number of seconds. Assumes that cron is already in seconds format. @@ -43,25 +43,25 @@ export function getCronNormalizer(key: string, defaultValues: Fields): N cronToSecondsNormalizer(fields?.[key]?.value) ?? defaultValues[key as keyof Fields]; } -export const getCommonNormalizer = (key: ConfigKeys) => { +export const getCommonNormalizer = (key: ConfigKey) => { return getNormalizer(key, commonDefaultValues); }; -export const getCommonjsonToJavascriptNormalizer = (key: ConfigKeys) => { +export const getCommonjsonToJavascriptNormalizer = (key: ConfigKey) => { return getJsonToJavascriptNormalizer(key, commonDefaultValues); }; -export const getCommonCronToSecondsNormalizer = (key: ConfigKeys) => { +export const getCommonCronToSecondsNormalizer = (key: ConfigKey) => { return getCronNormalizer(key, commonDefaultValues); }; export const commonNormalizers: CommonNormalizerMap = { - [ConfigKeys.NAME]: (fields) => fields?.[ConfigKeys.NAME]?.value ?? '', - [ConfigKeys.MONITOR_TYPE]: getCommonNormalizer(ConfigKeys.MONITOR_TYPE), - [ConfigKeys.SCHEDULE]: (fields) => { - const value = fields?.[ConfigKeys.SCHEDULE]?.value; + [ConfigKey.NAME]: (fields) => fields?.[ConfigKey.NAME]?.value ?? '', + [ConfigKey.MONITOR_TYPE]: getCommonNormalizer(ConfigKey.MONITOR_TYPE), + [ConfigKey.SCHEDULE]: (fields) => { + const value = fields?.[ConfigKey.SCHEDULE]?.value; if (value) { - const fullString = JSON.parse(fields?.[ConfigKeys.SCHEDULE]?.value); + const fullString = JSON.parse(fields?.[ConfigKey.SCHEDULE]?.value); const fullSchedule = fullString.replace('@every ', ''); const unit = fullSchedule.slice(-1); const number = fullSchedule.slice(0, fullSchedule.length - 1); @@ -70,10 +70,10 @@ export const commonNormalizers: CommonNormalizerMap = { number, }; } else { - return commonDefaultValues[ConfigKeys.SCHEDULE]; + return commonDefaultValues[ConfigKey.SCHEDULE]; } }, - [ConfigKeys.APM_SERVICE_NAME]: getCommonNormalizer(ConfigKeys.APM_SERVICE_NAME), - [ConfigKeys.TAGS]: getCommonjsonToJavascriptNormalizer(ConfigKeys.TAGS), - [ConfigKeys.TIMEOUT]: getCommonCronToSecondsNormalizer(ConfigKeys.TIMEOUT), + [ConfigKey.APM_SERVICE_NAME]: getCommonNormalizer(ConfigKey.APM_SERVICE_NAME), + [ConfigKey.TAGS]: getCommonjsonToJavascriptNormalizer(ConfigKey.TAGS), + [ConfigKey.TIMEOUT]: getCommonCronToSecondsNormalizer(ConfigKey.TIMEOUT), }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context.tsx index 82b8a77d621c7a..c16a9639b3127c 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context.tsx @@ -6,47 +6,47 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { IBrowserSimpleFields, ConfigKeys, DataStream } from '../types'; +import { BrowserSimpleFields, ConfigKey, DataStream } from '../types'; import { defaultValues as commonDefaultValues } from '../common/default_values'; -interface IBrowserSimpleFieldsContext { - setFields: React.Dispatch>; - fields: IBrowserSimpleFields; - defaultValues: IBrowserSimpleFields; +interface BrowserSimpleFieldsContext { + setFields: React.Dispatch>; + fields: BrowserSimpleFields; + defaultValues: BrowserSimpleFields; } -interface IBrowserSimpleFieldsContextProvider { +interface BrowserSimpleFieldsContextProvider { children: React.ReactNode; - defaultValues?: IBrowserSimpleFields; + defaultValues?: BrowserSimpleFields; } -export const initialValues: IBrowserSimpleFields = { +export const initialValues: BrowserSimpleFields = { ...commonDefaultValues, - [ConfigKeys.METADATA]: { + [ConfigKey.METADATA]: { script_source: { is_generated_script: false, file_name: '', }, is_zip_url_tls_enabled: false, }, - [ConfigKeys.MONITOR_TYPE]: DataStream.BROWSER, - [ConfigKeys.SOURCE_ZIP_URL]: '', - [ConfigKeys.SOURCE_ZIP_USERNAME]: '', - [ConfigKeys.SOURCE_ZIP_PASSWORD]: '', - [ConfigKeys.SOURCE_ZIP_FOLDER]: '', - [ConfigKeys.SOURCE_ZIP_PROXY_URL]: '', - [ConfigKeys.SOURCE_INLINE]: '', - [ConfigKeys.PARAMS]: '', - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: undefined, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE]: undefined, - [ConfigKeys.ZIP_URL_TLS_KEY]: undefined, - [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: undefined, - [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: undefined, - [ConfigKeys.ZIP_URL_TLS_VERSION]: undefined, + [ConfigKey.MONITOR_TYPE]: DataStream.BROWSER, + [ConfigKey.SOURCE_ZIP_URL]: '', + [ConfigKey.SOURCE_ZIP_USERNAME]: '', + [ConfigKey.SOURCE_ZIP_PASSWORD]: '', + [ConfigKey.SOURCE_ZIP_FOLDER]: '', + [ConfigKey.SOURCE_ZIP_PROXY_URL]: '', + [ConfigKey.SOURCE_INLINE]: '', + [ConfigKey.PARAMS]: '', + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: undefined, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: undefined, + [ConfigKey.ZIP_URL_TLS_KEY]: undefined, + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: undefined, + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: undefined, + [ConfigKey.ZIP_URL_TLS_VERSION]: undefined, }; -const defaultContext: IBrowserSimpleFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: BrowserSimpleFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error( 'setFields was not initialized for Browser Simple Fields, set it when you invoke the context' ); @@ -60,8 +60,8 @@ export const BrowserSimpleFieldsContext = createContext(defaultContext); export const BrowserSimpleFieldsContextProvider = ({ children, defaultValues = initialValues, -}: IBrowserSimpleFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: BrowserSimpleFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx index 7dd279b1767618..3ddd7953a63109 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_context_advanced.tsx @@ -6,34 +6,34 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { IBrowserAdvancedFields, ConfigKeys, ScreenshotOption } from '../types'; +import { BrowserAdvancedFields, ConfigKey, ScreenshotOption } from '../types'; -interface IBrowserAdvancedFieldsContext { - setFields: React.Dispatch>; - fields: IBrowserAdvancedFields; - defaultValues: IBrowserAdvancedFields; +interface BrowserAdvancedFieldsContext { + setFields: React.Dispatch>; + fields: BrowserAdvancedFields; + defaultValues: BrowserAdvancedFields; } -interface IBrowserAdvancedFieldsContextProvider { +interface BrowserAdvancedFieldsContextProvider { children: React.ReactNode; - defaultValues?: IBrowserAdvancedFields; + defaultValues?: BrowserAdvancedFields; } -export const initialValues: IBrowserAdvancedFields = { - [ConfigKeys.SCREENSHOTS]: ScreenshotOption.ON, - [ConfigKeys.SYNTHETICS_ARGS]: [], - [ConfigKeys.JOURNEY_FILTERS_MATCH]: '', - [ConfigKeys.JOURNEY_FILTERS_TAGS]: [], - [ConfigKeys.IGNORE_HTTPS_ERRORS]: false, - [ConfigKeys.IS_THROTTLING_ENABLED]: true, - [ConfigKeys.DOWNLOAD_SPEED]: '5', - [ConfigKeys.UPLOAD_SPEED]: '3', - [ConfigKeys.LATENCY]: '20', - [ConfigKeys.THROTTLING_CONFIG]: '5d/3u/20l', +export const initialValues: BrowserAdvancedFields = { + [ConfigKey.SCREENSHOTS]: ScreenshotOption.ON, + [ConfigKey.SYNTHETICS_ARGS]: [], + [ConfigKey.JOURNEY_FILTERS_MATCH]: '', + [ConfigKey.JOURNEY_FILTERS_TAGS]: [], + [ConfigKey.IGNORE_HTTPS_ERRORS]: false, + [ConfigKey.IS_THROTTLING_ENABLED]: true, + [ConfigKey.DOWNLOAD_SPEED]: '5', + [ConfigKey.UPLOAD_SPEED]: '3', + [ConfigKey.LATENCY]: '20', + [ConfigKey.THROTTLING_CONFIG]: '5d/3u/20l', }; -const defaultContext: IBrowserAdvancedFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: BrowserAdvancedFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error( 'setFields was not initialized for Browser Advanced Fields, set it when you invoke the context' ); @@ -47,8 +47,8 @@ export const BrowserAdvancedFieldsContext = createContext(defaultContext); export const BrowserAdvancedFieldsContextProvider = ({ children, defaultValues = initialValues, -}: IBrowserAdvancedFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: BrowserAdvancedFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_provider.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_provider.tsx index e2ce88f84f7022..309784576818ff 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_provider.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/browser_provider.tsx @@ -6,7 +6,7 @@ */ import React, { ReactNode } from 'react'; -import { BrowserFields, IBrowserSimpleFields, IBrowserAdvancedFields } from '../types'; +import { BrowserFields, BrowserSimpleFields, BrowserAdvancedFields } from '../types'; import { BrowserSimpleFieldsContextProvider, BrowserAdvancedFieldsContextProvider, @@ -24,22 +24,22 @@ export const BrowserContextProvider = ({ defaultValues, children, }: BrowserContextProviderProps) => { - const simpleKeys = Object.keys(defaultBrowserSimpleFields) as Array; + const simpleKeys = Object.keys(defaultBrowserSimpleFields) as Array; const advancedKeys = Object.keys(defaultBrowserAdvancedFields) as Array< - keyof IBrowserAdvancedFields + keyof BrowserAdvancedFields >; - const formattedDefaultSimpleFields = formatDefaultValues( + const formattedDefaultSimpleFields = formatDefaultValues( simpleKeys, defaultValues || {} ); - const formattedDefaultAdvancedFields = formatDefaultValues( + const formattedDefaultAdvancedFields = formatDefaultValues( advancedKeys, defaultValues || {} ); - const simpleFields: IBrowserSimpleFields | undefined = defaultValues + const simpleFields: BrowserSimpleFields | undefined = defaultValues ? formattedDefaultSimpleFields : undefined; - const advancedFields: IBrowserAdvancedFields | undefined = defaultValues + const advancedFields: BrowserAdvancedFields | undefined = defaultValues ? formattedDefaultAdvancedFields : undefined; return ( diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context.tsx index c29080cfcaf90a..a4a0c7bb16aa8d 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context.tsx @@ -6,32 +6,32 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { IHTTPSimpleFields, ConfigKeys, DataStream } from '../types'; +import { HTTPSimpleFields, ConfigKey, DataStream } from '../types'; import { defaultValues as commonDefaultValues } from '../common/default_values'; -interface IHTTPSimpleFieldsContext { - setFields: React.Dispatch>; - fields: IHTTPSimpleFields; - defaultValues: IHTTPSimpleFields; +interface HTTPSimpleFieldsContext { + setFields: React.Dispatch>; + fields: HTTPSimpleFields; + defaultValues: HTTPSimpleFields; } -interface IHTTPSimpleFieldsContextProvider { +interface HTTPSimpleFieldsContextProvider { children: React.ReactNode; - defaultValues?: IHTTPSimpleFields; + defaultValues?: HTTPSimpleFields; } -export const initialValues: IHTTPSimpleFields = { +export const initialValues: HTTPSimpleFields = { ...commonDefaultValues, - [ConfigKeys.METADATA]: { + [ConfigKey.METADATA]: { is_tls_enabled: false, }, - [ConfigKeys.URLS]: '', - [ConfigKeys.MAX_REDIRECTS]: '0', - [ConfigKeys.MONITOR_TYPE]: DataStream.HTTP, + [ConfigKey.URLS]: '', + [ConfigKey.MAX_REDIRECTS]: '0', + [ConfigKey.MONITOR_TYPE]: DataStream.HTTP, }; -const defaultContext: IHTTPSimpleFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: HTTPSimpleFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error( 'setFields was not initialized for HTTP Simple Fields, set it when you invoke the context' ); @@ -45,8 +45,8 @@ export const HTTPSimpleFieldsContext = createContext(defaultContext); export const HTTPSimpleFieldsContextProvider = ({ children, defaultValues = initialValues, -}: IHTTPSimpleFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: HTTPSimpleFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context_advanced.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context_advanced.tsx index 11796050a545b8..4d64bd3cf1ad49 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context_advanced.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_context_advanced.tsx @@ -6,45 +6,39 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { - IHTTPAdvancedFields, - ConfigKeys, - Mode, - ResponseBodyIndexPolicy, - HTTPMethod, -} from '../types'; +import { HTTPAdvancedFields, ConfigKey, Mode, ResponseBodyIndexPolicy, HTTPMethod } from '../types'; -interface IHTTPAdvancedFieldsContext { - setFields: React.Dispatch>; - fields: IHTTPAdvancedFields; - defaultValues: IHTTPAdvancedFields; +interface HTTPAdvancedFieldsContext { + setFields: React.Dispatch>; + fields: HTTPAdvancedFields; + defaultValues: HTTPAdvancedFields; } -interface IHTTPAdvancedFieldsContextProvider { +interface HTTPAdvancedFieldsContextProvider { children: React.ReactNode; - defaultValues?: IHTTPAdvancedFields; + defaultValues?: HTTPAdvancedFields; } -export const initialValues: IHTTPAdvancedFields = { - [ConfigKeys.PASSWORD]: '', - [ConfigKeys.PROXY_URL]: '', - [ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]: [], - [ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]: [], - [ConfigKeys.RESPONSE_BODY_INDEX]: ResponseBodyIndexPolicy.ON_ERROR, - [ConfigKeys.RESPONSE_HEADERS_CHECK]: {}, - [ConfigKeys.RESPONSE_HEADERS_INDEX]: true, - [ConfigKeys.RESPONSE_STATUS_CHECK]: [], - [ConfigKeys.REQUEST_BODY_CHECK]: { +export const initialValues: HTTPAdvancedFields = { + [ConfigKey.PASSWORD]: '', + [ConfigKey.PROXY_URL]: '', + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: [], + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: [], + [ConfigKey.RESPONSE_BODY_INDEX]: ResponseBodyIndexPolicy.ON_ERROR, + [ConfigKey.RESPONSE_HEADERS_CHECK]: {}, + [ConfigKey.RESPONSE_HEADERS_INDEX]: true, + [ConfigKey.RESPONSE_STATUS_CHECK]: [], + [ConfigKey.REQUEST_BODY_CHECK]: { value: '', type: Mode.PLAINTEXT, }, - [ConfigKeys.REQUEST_HEADERS_CHECK]: {}, - [ConfigKeys.REQUEST_METHOD_CHECK]: HTTPMethod.GET, - [ConfigKeys.USERNAME]: '', + [ConfigKey.REQUEST_HEADERS_CHECK]: {}, + [ConfigKey.REQUEST_METHOD_CHECK]: HTTPMethod.GET, + [ConfigKey.USERNAME]: '', }; -export const defaultContext: IHTTPAdvancedFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +export const defaultContext: HTTPAdvancedFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error('setFields was not initialized, set it when you invoke the context'); }, fields: initialValues, @@ -56,8 +50,8 @@ export const HTTPAdvancedFieldsContext = createContext(defaultContext); export const HTTPAdvancedFieldsContextProvider = ({ children, defaultValues = initialValues, -}: IHTTPAdvancedFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: HTTPAdvancedFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_provider.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_provider.tsx index ea577f33369360..9141594dd5ccfa 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_provider.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/http_provider.tsx @@ -6,7 +6,7 @@ */ import React, { ReactNode } from 'react'; -import { HTTPFields, IHTTPSimpleFields, IHTTPAdvancedFields } from '../types'; +import { HTTPFields, HTTPSimpleFields, HTTPAdvancedFields } from '../types'; import { HTTPSimpleFieldsContextProvider, HTTPAdvancedFieldsContextProvider, @@ -21,18 +21,18 @@ interface HTTPContextProviderProps { } export const HTTPContextProvider = ({ defaultValues, children }: HTTPContextProviderProps) => { - const simpleKeys = Object.keys(defaultHTTPSimpleFields) as Array; - const advancedKeys = Object.keys(defaultHTTPAdvancedFields) as Array; - const formattedDefaultHTTPSimpleFields = formatDefaultValues( + const simpleKeys = Object.keys(defaultHTTPSimpleFields) as Array; + const advancedKeys = Object.keys(defaultHTTPAdvancedFields) as Array; + const formattedDefaultHTTPSimpleFields = formatDefaultValues( simpleKeys, defaultValues || {} ); - const formattedDefaultHTTPAdvancedFields = formatDefaultValues( + const formattedDefaultHTTPAdvancedFields = formatDefaultValues( advancedKeys, defaultValues || {} ); const httpAdvancedFields = defaultValues ? formattedDefaultHTTPAdvancedFields : undefined; - const httpSimpleFields: IHTTPSimpleFields | undefined = defaultValues + const httpSimpleFields: HTTPSimpleFields | undefined = defaultValues ? formattedDefaultHTTPSimpleFields : undefined; return ( diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/icmp_context.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/icmp_context.tsx index eb7227ebceb07b..f0547e621afc4c 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/icmp_context.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/icmp_context.tsx @@ -6,29 +6,29 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { IICMPSimpleFields, ConfigKeys, DataStream } from '../types'; +import { ICMPSimpleFields, ConfigKey, DataStream } from '../types'; import { defaultValues as commonDefaultValues } from '../common/default_values'; -interface IICMPSimpleFieldsContext { - setFields: React.Dispatch>; - fields: IICMPSimpleFields; - defaultValues: IICMPSimpleFields; +interface ICMPSimpleFieldsContext { + setFields: React.Dispatch>; + fields: ICMPSimpleFields; + defaultValues: ICMPSimpleFields; } -interface IICMPSimpleFieldsContextProvider { +interface ICMPSimpleFieldsContextProvider { children: React.ReactNode; - defaultValues?: IICMPSimpleFields; + defaultValues?: ICMPSimpleFields; } -export const initialValues: IICMPSimpleFields = { +export const initialValues: ICMPSimpleFields = { ...commonDefaultValues, - [ConfigKeys.HOSTS]: '', - [ConfigKeys.MONITOR_TYPE]: DataStream.ICMP, - [ConfigKeys.WAIT]: '1', + [ConfigKey.HOSTS]: '', + [ConfigKey.MONITOR_TYPE]: DataStream.ICMP, + [ConfigKey.WAIT]: '1', }; -const defaultContext: IICMPSimpleFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: ICMPSimpleFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error( 'setFields was not initialized for ICMP Simple Fields, set it when you invoke the context' ); @@ -42,8 +42,8 @@ export const ICMPSimpleFieldsContext = createContext(defaultContext); export const ICMPSimpleFieldsContextProvider = ({ children, defaultValues = initialValues, -}: IICMPSimpleFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: ICMPSimpleFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/synthetics_context_providers.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/synthetics_context_providers.tsx index 0d730c5f96e970..f096da7dda5734 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/synthetics_context_providers.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/synthetics_context_providers.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { HTTPFields, TCPFields, ICMPFields, BrowserFields, ITLSFields, DataStream } from '../types'; +import { HTTPFields, TCPFields, ICMPFields, BrowserFields, TLSFields, DataStream } from '../types'; import { PolicyConfigContextProvider, TCPContextProvider, @@ -22,7 +22,7 @@ interface Props { tcpDefaultValues?: TCPFields; icmpDefaultValues?: ICMPFields; browserDefaultValues?: BrowserFields; - tlsDefaultValues?: ITLSFields; + tlsDefaultValues?: TLSFields; policyDefaultValues?: { defaultMonitorType: DataStream; defaultIsTLSEnabled: boolean; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context.tsx index c084ea757035fa..38a15c3e394531 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context.tsx @@ -6,31 +6,31 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { ITCPSimpleFields, ConfigKeys, DataStream } from '../types'; +import { TCPSimpleFields, ConfigKey, DataStream } from '../types'; import { defaultValues as commonDefaultValues } from '../common/default_values'; -interface ITCPSimpleFieldsContext { - setFields: React.Dispatch>; - fields: ITCPSimpleFields; - defaultValues: ITCPSimpleFields; +interface TCPSimpleFieldsContext { + setFields: React.Dispatch>; + fields: TCPSimpleFields; + defaultValues: TCPSimpleFields; } -interface ITCPSimpleFieldsContextProvider { +interface TCPSimpleFieldsContextProvider { children: React.ReactNode; - defaultValues?: ITCPSimpleFields; + defaultValues?: TCPSimpleFields; } -export const initialValues: ITCPSimpleFields = { +export const initialValues: TCPSimpleFields = { ...commonDefaultValues, - [ConfigKeys.METADATA]: { + [ConfigKey.METADATA]: { is_tls_enabled: false, }, - [ConfigKeys.HOSTS]: '', - [ConfigKeys.MONITOR_TYPE]: DataStream.TCP, + [ConfigKey.HOSTS]: '', + [ConfigKey.MONITOR_TYPE]: DataStream.TCP, }; -const defaultContext: ITCPSimpleFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: TCPSimpleFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error( 'setFields was not initialized for TCP Simple Fields, set it when you invoke the context' ); @@ -44,8 +44,8 @@ export const TCPSimpleFieldsContext = createContext(defaultContext); export const TCPSimpleFieldsContextProvider = ({ children, defaultValues = initialValues, -}: ITCPSimpleFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: TCPSimpleFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context_advanced.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context_advanced.tsx index ef821b7e39dcaf..7fe29f76488412 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context_advanced.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_context_advanced.tsx @@ -6,28 +6,28 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { ITCPAdvancedFields, ConfigKeys } from '../types'; +import { TCPAdvancedFields, ConfigKey } from '../types'; -interface ITCPAdvancedFieldsContext { - setFields: React.Dispatch>; - fields: ITCPAdvancedFields; - defaultValues: ITCPAdvancedFields; +interface TCPAdvancedFieldsContext { + setFields: React.Dispatch>; + fields: TCPAdvancedFields; + defaultValues: TCPAdvancedFields; } -interface ITCPAdvancedFieldsContextProvider { +interface TCPAdvancedFieldsContextProvider { children: React.ReactNode; - defaultValues?: ITCPAdvancedFields; + defaultValues?: TCPAdvancedFields; } -export const initialValues: ITCPAdvancedFields = { - [ConfigKeys.PROXY_URL]: '', - [ConfigKeys.PROXY_USE_LOCAL_RESOLVER]: false, - [ConfigKeys.RESPONSE_RECEIVE_CHECK]: '', - [ConfigKeys.REQUEST_SEND_CHECK]: '', +export const initialValues: TCPAdvancedFields = { + [ConfigKey.PROXY_URL]: '', + [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: false, + [ConfigKey.RESPONSE_RECEIVE_CHECK]: '', + [ConfigKey.REQUEST_SEND_CHECK]: '', }; -const defaultContext: ITCPAdvancedFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: TCPAdvancedFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error('setFields was not initialized, set it when you invoke the context'); }, fields: initialValues, // mutable @@ -39,8 +39,8 @@ export const TCPAdvancedFieldsContext = createContext(defaultContext); export const TCPAdvancedFieldsContextProvider = ({ children, defaultValues = initialValues, -}: ITCPAdvancedFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: TCPAdvancedFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_provider.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_provider.tsx index b62e87a566b97c..76877319c0c485 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_provider.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tcp_provider.tsx @@ -6,7 +6,7 @@ */ import React, { ReactNode } from 'react'; -import { TCPFields, ITCPSimpleFields, ITCPAdvancedFields } from '../types'; +import { TCPFields, TCPSimpleFields, TCPAdvancedFields } from '../types'; import { TCPSimpleFieldsContextProvider, TCPAdvancedFieldsContextProvider, @@ -21,20 +21,20 @@ interface TCPContextProviderProps { } export const TCPContextProvider = ({ defaultValues, children }: TCPContextProviderProps) => { - const simpleKeys = Object.keys(defaultTCPSimpleFields) as Array; - const advancedKeys = Object.keys(defaultTCPAdvancedFields) as Array; - const formattedDefaultSimpleFields = formatDefaultValues( + const simpleKeys = Object.keys(defaultTCPSimpleFields) as Array; + const advancedKeys = Object.keys(defaultTCPAdvancedFields) as Array; + const formattedDefaultSimpleFields = formatDefaultValues( simpleKeys, defaultValues || {} ); - const formattedDefaultAdvancedFields = formatDefaultValues( + const formattedDefaultAdvancedFields = formatDefaultValues( advancedKeys, defaultValues || {} ); - const simpleFields: ITCPSimpleFields | undefined = defaultValues + const simpleFields: TCPSimpleFields | undefined = defaultValues ? formattedDefaultSimpleFields : undefined; - const advancedFields: ITCPAdvancedFields | undefined = defaultValues + const advancedFields: TCPAdvancedFields | undefined = defaultValues ? formattedDefaultAdvancedFields : undefined; return ( diff --git a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tls_fields_context.tsx b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tls_fields_context.tsx index e754d0ca03257f..a76655a235c4fc 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/contexts/tls_fields_context.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/contexts/tls_fields_context.tsx @@ -6,24 +6,24 @@ */ import React, { createContext, useContext, useMemo, useState } from 'react'; -import { ITLSFields } from '../types'; +import { TLSFields } from '../types'; import { defaultValues as tlsDefaultValues } from '../tls/default_values'; -interface ITLSFieldsContext { - setFields: React.Dispatch>; - fields: ITLSFields; - defaultValues: ITLSFields; +interface TLSFieldsContext { + setFields: React.Dispatch>; + fields: TLSFields; + defaultValues: TLSFields; } -interface ITLSFieldsContextProvider { +interface TLSFieldsContextProvider { children: React.ReactNode; - defaultValues?: ITLSFields; + defaultValues?: TLSFields; } -export const initialValues: ITLSFields = tlsDefaultValues; +export const initialValues: TLSFields = tlsDefaultValues; -const defaultContext: ITLSFieldsContext = { - setFields: (_fields: React.SetStateAction) => { +const defaultContext: TLSFieldsContext = { + setFields: (_fields: React.SetStateAction) => { throw new Error('setFields was not initialized, set it when you invoke the context'); }, fields: initialValues, // mutable @@ -35,8 +35,8 @@ export const TLSFieldsContext = createContext(defaultContext); export const TLSFieldsContextProvider = ({ children, defaultValues = initialValues, -}: ITLSFieldsContextProvider) => { - const [fields, setFields] = useState(defaultValues); +}: TLSFieldsContextProvider) => { + const [fields, setFields] = useState(defaultValues); const value = useMemo(() => { return { fields, setFields, defaultValues }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx index c70424f7910f4d..2aed5db789f44c 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.test.tsx @@ -18,7 +18,7 @@ import { TLSFieldsContextProvider, } from './contexts'; import { CustomFields } from './custom_fields'; -import { ConfigKeys, DataStream, ScheduleUnit } from './types'; +import { ConfigKey, DataStream, ScheduleUnit } from './types'; import { validate as centralValidation } from './validation'; import { defaultConfig } from './synthetics_policy_create_extension'; @@ -85,20 +85,20 @@ describe('', () => { const timeout = getByLabelText('Timeout in seconds') as HTMLInputElement; expect(monitorType).toBeInTheDocument(); expect(url).toBeInTheDocument(); - expect(url.value).toEqual(defaultHTTPConfig[ConfigKeys.URLS]); + expect(url.value).toEqual(defaultHTTPConfig[ConfigKey.URLS]); expect(proxyUrl).toBeInTheDocument(); - expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKeys.PROXY_URL]); + expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKey.PROXY_URL]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].unit); // expect(tags).toBeInTheDocument(); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKey.APM_SERVICE_NAME]); expect(maxRedirects).toBeInTheDocument(); - expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKeys.MAX_REDIRECTS]}`); + expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKey.MAX_REDIRECTS]}`); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKey.TIMEOUT]}`); // ensure other monitor type options are not in the DOM expect(queryByLabelText('Host')).not.toBeInTheDocument(); @@ -145,11 +145,11 @@ describe('', () => { expect(verificationMode).toBeInTheDocument(); await waitFor(() => { - expect(ca.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]); - expect(clientKey.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_KEY]); - expect(clientKeyPassphrase.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_KEY_PASSPHRASE]); - expect(clientCertificate.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_CERTIFICATE]); - expect(verificationMode.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_VERIFICATION_MODE]); + expect(ca.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_CERTIFICATE_AUTHORITIES]); + expect(clientKey.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_KEY]); + expect(clientKeyPassphrase.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_KEY_PASSPHRASE]); + expect(clientCertificate.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_CERTIFICATE]); + expect(verificationMode.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_VERIFICATION_MODE]); }); }); @@ -186,14 +186,14 @@ describe('', () => { ); const monitorType = getByLabelText('Monitor Type') as HTMLInputElement; expect(monitorType).toBeInTheDocument(); - expect(monitorType.value).toEqual(defaultHTTPConfig[ConfigKeys.MONITOR_TYPE]); + expect(monitorType.value).toEqual(defaultHTTPConfig[ConfigKey.MONITOR_TYPE]); fireEvent.change(monitorType, { target: { value: DataStream.TCP } }); // expect tcp fields to be in the DOM const host = getByLabelText('Host:Port') as HTMLInputElement; expect(host).toBeInTheDocument(); - expect(host.value).toEqual(defaultTCPConfig[ConfigKeys.HOSTS]); + expect(host.value).toEqual(defaultTCPConfig[ConfigKey.HOSTS]); // expect HTTP fields not to be in the DOM expect(queryByLabelText('URL')).not.toBeInTheDocument(); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx index e136ccf58a3406..50f8d93ca8f4ac 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/custom_fields.tsx @@ -19,7 +19,7 @@ import { EuiCallOut, EuiLink, } from '@elastic/eui'; -import { ConfigKeys, DataStream, Validation } from './types'; +import { ConfigKey, DataStream, Validation } from './types'; import { usePolicyConfigContext } from './contexts'; import { TLSFields } from './tls_fields'; import { HTTPSimpleFields } from './http/simple_fields'; @@ -109,8 +109,8 @@ export const CustomFields = memo(({ validate, dataStreams = [], children /> } isInvalid={ - !!validate[ConfigKeys.MONITOR_TYPE]?.({ - [ConfigKeys.MONITOR_TYPE]: monitorType, + !!validate[ConfigKey.MONITOR_TYPE]?.({ + [ConfigKey.MONITOR_TYPE]: monitorType as DataStream, }) } error={ diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_policy.ts b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_policy.ts index 477999abdc05ad..e28c5c5f9d5972 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_policy.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_policy.ts @@ -9,7 +9,7 @@ import { useMemo } from 'react'; import { PolicyConfig, DataStream, - ConfigKeys, + ConfigKey, HTTPFields, TCPFields, ICMPFields, @@ -84,34 +84,34 @@ export const usePolicy = (fleetPolicyName: string = '') => { ...httpSimpleFields, ...httpAdvancedFields, ...tlsFields, - [ConfigKeys.METADATA]: { - ...httpSimpleFields[ConfigKeys.METADATA], + [ConfigKey.METADATA]: { + ...httpSimpleFields[ConfigKey.METADATA], ...metadata, }, - [ConfigKeys.NAME]: fleetPolicyName || monitorName, + [ConfigKey.NAME]: fleetPolicyName || monitorName, } as HTTPFields, [DataStream.TCP]: { ...tcpSimpleFields, ...tcpAdvancedFields, ...tlsFields, - [ConfigKeys.METADATA]: { - ...tcpSimpleFields[ConfigKeys.METADATA], + [ConfigKey.METADATA]: { + ...tcpSimpleFields[ConfigKey.METADATA], ...metadata, }, - [ConfigKeys.NAME]: fleetPolicyName || monitorName, + [ConfigKey.NAME]: fleetPolicyName || monitorName, } as TCPFields, [DataStream.ICMP]: { ...icmpSimpleFields, - [ConfigKeys.NAME]: fleetPolicyName || monitorName, + [ConfigKey.NAME]: fleetPolicyName || monitorName, } as ICMPFields, [DataStream.BROWSER]: { ...browserSimpleFields, ...browserAdvancedFields, - [ConfigKeys.METADATA]: { - ...browserSimpleFields[ConfigKeys.METADATA], + [ConfigKey.METADATA]: { + ...browserSimpleFields[ConfigKey.METADATA], ...metadata, }, - [ConfigKeys.NAME]: fleetPolicyName || monitorName, + [ConfigKey.NAME]: fleetPolicyName || monitorName, } as BrowserFields, }), [ diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx index 40cfdfeba49a5a..c8a96c8eede836 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.test.tsx @@ -9,14 +9,14 @@ import { useUpdatePolicy } from './use_update_policy'; import { NewPackagePolicy } from '../../../../../fleet/public'; import { validate } from '../validation'; import { - ConfigKeys, + ConfigKey, DataStream, TLSVersion, - ICommonFields, + CommonFields, ScheduleUnit, ICMPFields, TCPFields, - ITLSFields, + TLSFields, HTTPFields, BrowserFields, } from '../types'; @@ -336,21 +336,21 @@ describe('useBarChartsHooks', () => { }, }; - const defaultCommonFields: Partial = { - [ConfigKeys.APM_SERVICE_NAME]: 'APM Service name', - [ConfigKeys.TAGS]: ['some', 'tags'], - [ConfigKeys.SCHEDULE]: { + const defaultCommonFields: Partial = { + [ConfigKey.APM_SERVICE_NAME]: 'APM Service name', + [ConfigKey.TAGS]: ['some', 'tags'], + [ConfigKey.SCHEDULE]: { number: '5', unit: ScheduleUnit.MINUTES, }, - [ConfigKeys.TIMEOUT]: '17', + [ConfigKey.TIMEOUT]: '17', }; - const defaultTLSFields: Partial = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: 'ca', - [ConfigKeys.TLS_CERTIFICATE]: 'cert', - [ConfigKeys.TLS_KEY]: 'key', - [ConfigKeys.TLS_KEY_PASSPHRASE]: 'password', + const defaultTLSFields: Partial = { + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: 'ca', + [ConfigKey.TLS_CERTIFICATE]: 'cert', + [ConfigKey.TLS_KEY]: 'key', + [ConfigKey.TLS_KEY_PASSPHRASE]: 'password', }; it('handles http data stream', async () => { @@ -373,8 +373,8 @@ describe('useBarChartsHooks', () => { ...defaultConfig[DataStream.HTTP], ...defaultCommonFields, ...defaultTLSFields, - [ConfigKeys.URLS]: 'url', - [ConfigKeys.PROXY_URL]: 'proxyUrl', + [ConfigKey.URLS]: 'url', + [ConfigKey.PROXY_URL]: 'proxyUrl', }; // expect only http to be enabled @@ -391,28 +391,26 @@ describe('useBarChartsHooks', () => { await waitFor(() => { const vars = result.current.updatedPolicy.inputs[0]?.streams[0]?.vars; - expect(vars?.[ConfigKeys.MONITOR_TYPE].value).toEqual(config[ConfigKeys.MONITOR_TYPE]); - expect(vars?.[ConfigKeys.URLS].value).toEqual(config[ConfigKeys.URLS]); - expect(vars?.[ConfigKeys.SCHEDULE].value).toEqual( + expect(vars?.[ConfigKey.MONITOR_TYPE].value).toEqual(config[ConfigKey.MONITOR_TYPE]); + expect(vars?.[ConfigKey.URLS].value).toEqual(config[ConfigKey.URLS]); + expect(vars?.[ConfigKey.SCHEDULE].value).toEqual( JSON.stringify( - `@every ${config[ConfigKeys.SCHEDULE].number}${config[ConfigKeys.SCHEDULE].unit}` + `@every ${config[ConfigKey.SCHEDULE].number}${config[ConfigKey.SCHEDULE].unit}` ) ); - expect(vars?.[ConfigKeys.PROXY_URL].value).toEqual(config[ConfigKeys.PROXY_URL]); - expect(vars?.[ConfigKeys.APM_SERVICE_NAME].value).toEqual( - config[ConfigKeys.APM_SERVICE_NAME] + expect(vars?.[ConfigKey.PROXY_URL].value).toEqual(config[ConfigKey.PROXY_URL]); + expect(vars?.[ConfigKey.APM_SERVICE_NAME].value).toEqual(config[ConfigKey.APM_SERVICE_NAME]); + expect(vars?.[ConfigKey.TIMEOUT].value).toEqual(`${config[ConfigKey.TIMEOUT]}s`); + expect(vars?.[ConfigKey.RESPONSE_BODY_CHECK_POSITIVE].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_STATUS_CHECK].value).toEqual(null); + expect(vars?.[ConfigKey.REQUEST_HEADERS_CHECK].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_HEADERS_CHECK].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_BODY_INDEX].value).toEqual( + config[ConfigKey.RESPONSE_BODY_INDEX] ); - expect(vars?.[ConfigKeys.TIMEOUT].value).toEqual(`${config[ConfigKeys.TIMEOUT]}s`); - expect(vars?.[ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE].value).toEqual(null); - expect(vars?.[ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE].value).toEqual(null); - expect(vars?.[ConfigKeys.RESPONSE_STATUS_CHECK].value).toEqual(null); - expect(vars?.[ConfigKeys.REQUEST_HEADERS_CHECK].value).toEqual(null); - expect(vars?.[ConfigKeys.RESPONSE_HEADERS_CHECK].value).toEqual(null); - expect(vars?.[ConfigKeys.RESPONSE_BODY_INDEX].value).toEqual( - config[ConfigKeys.RESPONSE_BODY_INDEX] - ); - expect(vars?.[ConfigKeys.RESPONSE_HEADERS_INDEX].value).toEqual( - config[ConfigKeys.RESPONSE_HEADERS_INDEX] + expect(vars?.[ConfigKey.RESPONSE_HEADERS_INDEX].value).toEqual( + config[ConfigKey.RESPONSE_HEADERS_INDEX] ); }); }); @@ -435,11 +433,11 @@ describe('useBarChartsHooks', () => { ...initialProps, config: { ...defaultConfig[DataStream.HTTP], - [ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]: ['test'], - [ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]: ['test'], - [ConfigKeys.RESPONSE_STATUS_CHECK]: ['test'], - [ConfigKeys.TAGS]: ['test'], - [ConfigKeys.TLS_VERSION]: [TLSVersion.ONE_ONE], + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: ['test'], + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: ['test'], + [ConfigKey.RESPONSE_STATUS_CHECK]: ['test'], + [ConfigKey.TAGS]: ['test'], + [ConfigKey.TLS_VERSION]: [TLSVersion.ONE_ONE], }, }); @@ -452,33 +450,33 @@ describe('useBarChartsHooks', () => { const vars = result.current.updatedPolicy.inputs[0]?.streams[0]?.vars; - expect(vars?.[ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE].value).toEqual('["test"]'); - expect(vars?.[ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE].value).toEqual('["test"]'); - expect(vars?.[ConfigKeys.RESPONSE_STATUS_CHECK].value).toEqual('["test"]'); - expect(vars?.[ConfigKeys.TAGS].value).toEqual('["test"]'); - expect(vars?.[ConfigKeys.TLS_VERSION].value).toEqual('["TLSv1.1"]'); + expect(vars?.[ConfigKey.RESPONSE_BODY_CHECK_POSITIVE].value).toEqual('["test"]'); + expect(vars?.[ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE].value).toEqual('["test"]'); + expect(vars?.[ConfigKey.RESPONSE_STATUS_CHECK].value).toEqual('["test"]'); + expect(vars?.[ConfigKey.TAGS].value).toEqual('["test"]'); + expect(vars?.[ConfigKey.TLS_VERSION].value).toEqual('["TLSv1.1"]'); }); rerender({ ...initialProps, config: { ...defaultConfig[DataStream.HTTP], - [ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]: [], - [ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]: [], - [ConfigKeys.RESPONSE_STATUS_CHECK]: [], - [ConfigKeys.TAGS]: [], - [ConfigKeys.TLS_VERSION]: [], + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: [], + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: [], + [ConfigKey.RESPONSE_STATUS_CHECK]: [], + [ConfigKey.TAGS]: [], + [ConfigKey.TLS_VERSION]: [], }, }); await waitFor(() => { const vars = result.current.updatedPolicy.inputs[0]?.streams[0]?.vars; - expect(vars?.[ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE].value).toEqual(null); - expect(vars?.[ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE].value).toEqual(null); - expect(vars?.[ConfigKeys.RESPONSE_STATUS_CHECK].value).toEqual(null); - expect(vars?.[ConfigKeys.TAGS].value).toEqual(null); - expect(vars?.[ConfigKeys.TLS_VERSION].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_BODY_CHECK_POSITIVE].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE].value).toEqual(null); + expect(vars?.[ConfigKey.RESPONSE_STATUS_CHECK].value).toEqual(null); + expect(vars?.[ConfigKey.TAGS].value).toEqual(null); + expect(vars?.[ConfigKey.TLS_VERSION].value).toEqual(null); }); }); @@ -506,11 +504,11 @@ describe('useBarChartsHooks', () => { ...defaultConfig[DataStream.TCP], ...defaultCommonFields, ...defaultTLSFields, - [ConfigKeys.HOSTS]: 'sampleHost', - [ConfigKeys.PROXY_URL]: 'proxyUrl', - [ConfigKeys.PROXY_USE_LOCAL_RESOLVER]: true, - [ConfigKeys.RESPONSE_RECEIVE_CHECK]: 'response', - [ConfigKeys.REQUEST_SEND_CHECK]: 'request', + [ConfigKey.HOSTS]: 'sampleHost', + [ConfigKey.PROXY_URL]: 'proxyUrl', + [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: true, + [ConfigKey.RESPONSE_RECEIVE_CHECK]: 'response', + [ConfigKey.REQUEST_SEND_CHECK]: 'request', }; rerender({ @@ -526,26 +524,24 @@ describe('useBarChartsHooks', () => { updatedPolicy: result.current.updatedPolicy, }); - expect(vars?.[ConfigKeys.MONITOR_TYPE].value).toEqual(config[ConfigKeys.MONITOR_TYPE]); - expect(vars?.[ConfigKeys.HOSTS].value).toEqual(config[ConfigKeys.HOSTS]); - expect(vars?.[ConfigKeys.SCHEDULE].value).toEqual( + expect(vars?.[ConfigKey.MONITOR_TYPE].value).toEqual(config[ConfigKey.MONITOR_TYPE]); + expect(vars?.[ConfigKey.HOSTS].value).toEqual(config[ConfigKey.HOSTS]); + expect(vars?.[ConfigKey.SCHEDULE].value).toEqual( JSON.stringify( - `@every ${config[ConfigKeys.SCHEDULE].number}${config[ConfigKeys.SCHEDULE].unit}` + `@every ${config[ConfigKey.SCHEDULE].number}${config[ConfigKey.SCHEDULE].unit}` ) ); - expect(vars?.[ConfigKeys.PROXY_URL].value).toEqual(config[ConfigKeys.PROXY_URL]); - expect(vars?.[ConfigKeys.APM_SERVICE_NAME].value).toEqual( - config[ConfigKeys.APM_SERVICE_NAME] - ); - expect(vars?.[ConfigKeys.TIMEOUT].value).toEqual(`${config[ConfigKeys.TIMEOUT]}s`); - expect(vars?.[ConfigKeys.PROXY_USE_LOCAL_RESOLVER].value).toEqual( - config[ConfigKeys.PROXY_USE_LOCAL_RESOLVER] + expect(vars?.[ConfigKey.PROXY_URL].value).toEqual(config[ConfigKey.PROXY_URL]); + expect(vars?.[ConfigKey.APM_SERVICE_NAME].value).toEqual(config[ConfigKey.APM_SERVICE_NAME]); + expect(vars?.[ConfigKey.TIMEOUT].value).toEqual(`${config[ConfigKey.TIMEOUT]}s`); + expect(vars?.[ConfigKey.PROXY_USE_LOCAL_RESOLVER].value).toEqual( + config[ConfigKey.PROXY_USE_LOCAL_RESOLVER] ); - expect(vars?.[ConfigKeys.RESPONSE_RECEIVE_CHECK].value).toEqual( - config[ConfigKeys.RESPONSE_RECEIVE_CHECK] + expect(vars?.[ConfigKey.RESPONSE_RECEIVE_CHECK].value).toEqual( + config[ConfigKey.RESPONSE_RECEIVE_CHECK] ); - expect(vars?.[ConfigKeys.REQUEST_SEND_CHECK].value).toEqual( - config[ConfigKeys.REQUEST_SEND_CHECK] + expect(vars?.[ConfigKey.REQUEST_SEND_CHECK].value).toEqual( + config[ConfigKey.REQUEST_SEND_CHECK] ); }); }); @@ -566,8 +562,8 @@ describe('useBarChartsHooks', () => { const config: ICMPFields = { ...defaultConfig[DataStream.ICMP], ...defaultCommonFields, - [ConfigKeys.WAIT]: '2', - [ConfigKeys.HOSTS]: 'sampleHost', + [ConfigKey.WAIT]: '2', + [ConfigKey.HOSTS]: 'sampleHost', }; // expect only icmp to be enabled @@ -585,18 +581,16 @@ describe('useBarChartsHooks', () => { await waitFor(() => { const vars = result.current.updatedPolicy.inputs[2]?.streams[0]?.vars; - expect(vars?.[ConfigKeys.MONITOR_TYPE].value).toEqual(config[ConfigKeys.MONITOR_TYPE]); - expect(vars?.[ConfigKeys.HOSTS].value).toEqual(config[ConfigKeys.HOSTS]); - expect(vars?.[ConfigKeys.SCHEDULE].value).toEqual( + expect(vars?.[ConfigKey.MONITOR_TYPE].value).toEqual(config[ConfigKey.MONITOR_TYPE]); + expect(vars?.[ConfigKey.HOSTS].value).toEqual(config[ConfigKey.HOSTS]); + expect(vars?.[ConfigKey.SCHEDULE].value).toEqual( JSON.stringify( - `@every ${config[ConfigKeys.SCHEDULE].number}${config[ConfigKeys.SCHEDULE].unit}` + `@every ${config[ConfigKey.SCHEDULE].number}${config[ConfigKey.SCHEDULE].unit}` ) ); - expect(vars?.[ConfigKeys.APM_SERVICE_NAME].value).toEqual( - config[ConfigKeys.APM_SERVICE_NAME] - ); - expect(vars?.[ConfigKeys.TIMEOUT].value).toEqual(`${config[ConfigKeys.TIMEOUT]}s`); - expect(vars?.[ConfigKeys.WAIT].value).toEqual(`${config[ConfigKeys.WAIT]}s`); + expect(vars?.[ConfigKey.APM_SERVICE_NAME].value).toEqual(config[ConfigKey.APM_SERVICE_NAME]); + expect(vars?.[ConfigKey.TIMEOUT].value).toEqual(`${config[ConfigKey.TIMEOUT]}s`); + expect(vars?.[ConfigKey.WAIT].value).toEqual(`${config[ConfigKey.WAIT]}s`); expect(onChange).toBeCalledWith({ isValid: false, @@ -629,16 +623,16 @@ describe('useBarChartsHooks', () => { const config: BrowserFields = { ...defaultConfig[DataStream.BROWSER], ...defaultCommonFields, - [ConfigKeys.SOURCE_INLINE]: 'inlineScript', - [ConfigKeys.SOURCE_ZIP_URL]: 'zipFolder', - [ConfigKeys.SOURCE_ZIP_FOLDER]: 'zipFolder', - [ConfigKeys.SOURCE_ZIP_USERNAME]: 'username', - [ConfigKeys.SOURCE_ZIP_PASSWORD]: 'password', - [ConfigKeys.SCREENSHOTS]: 'off', - [ConfigKeys.SYNTHETICS_ARGS]: ['args'], - [ConfigKeys.DOWNLOAD_SPEED]: '13', - [ConfigKeys.UPLOAD_SPEED]: '3', - [ConfigKeys.LATENCY]: '7', + [ConfigKey.SOURCE_INLINE]: 'inlineScript', + [ConfigKey.SOURCE_ZIP_URL]: 'zipFolder', + [ConfigKey.SOURCE_ZIP_FOLDER]: 'zipFolder', + [ConfigKey.SOURCE_ZIP_USERNAME]: 'username', + [ConfigKey.SOURCE_ZIP_PASSWORD]: 'password', + [ConfigKey.SCREENSHOTS]: 'off', + [ConfigKey.SYNTHETICS_ARGS]: ['args'], + [ConfigKey.DOWNLOAD_SPEED]: '13', + [ConfigKey.UPLOAD_SPEED]: '3', + [ConfigKey.LATENCY]: '7', }; rerender({ @@ -649,30 +643,28 @@ describe('useBarChartsHooks', () => { await waitFor(() => { const vars = result.current.updatedPolicy.inputs[3]?.streams[0]?.vars; - expect(vars?.[ConfigKeys.SOURCE_ZIP_FOLDER].value).toEqual( - config[ConfigKeys.SOURCE_ZIP_FOLDER] - ); - expect(vars?.[ConfigKeys.SOURCE_ZIP_PASSWORD].value).toEqual( - config[ConfigKeys.SOURCE_ZIP_PASSWORD] + expect(vars?.[ConfigKey.SOURCE_ZIP_FOLDER].value).toEqual( + config[ConfigKey.SOURCE_ZIP_FOLDER] ); - expect(vars?.[ConfigKeys.SOURCE_ZIP_URL].value).toEqual(config[ConfigKeys.SOURCE_ZIP_URL]); - expect(vars?.[ConfigKeys.SOURCE_INLINE].value).toEqual( - JSON.stringify(config[ConfigKeys.SOURCE_INLINE]) + expect(vars?.[ConfigKey.SOURCE_ZIP_PASSWORD].value).toEqual( + config[ConfigKey.SOURCE_ZIP_PASSWORD] ); - expect(vars?.[ConfigKeys.SOURCE_ZIP_PASSWORD].value).toEqual( - config[ConfigKeys.SOURCE_ZIP_PASSWORD] + expect(vars?.[ConfigKey.SOURCE_ZIP_URL].value).toEqual(config[ConfigKey.SOURCE_ZIP_URL]); + expect(vars?.[ConfigKey.SOURCE_INLINE].value).toEqual( + JSON.stringify(config[ConfigKey.SOURCE_INLINE]) ); - expect(vars?.[ConfigKeys.SCREENSHOTS].value).toEqual(config[ConfigKeys.SCREENSHOTS]); - expect(vars?.[ConfigKeys.SYNTHETICS_ARGS].value).toEqual( - JSON.stringify(config[ConfigKeys.SYNTHETICS_ARGS]) + expect(vars?.[ConfigKey.SOURCE_ZIP_PASSWORD].value).toEqual( + config[ConfigKey.SOURCE_ZIP_PASSWORD] ); - expect(vars?.[ConfigKeys.APM_SERVICE_NAME].value).toEqual( - config[ConfigKeys.APM_SERVICE_NAME] + expect(vars?.[ConfigKey.SCREENSHOTS].value).toEqual(config[ConfigKey.SCREENSHOTS]); + expect(vars?.[ConfigKey.SYNTHETICS_ARGS].value).toEqual( + JSON.stringify(config[ConfigKey.SYNTHETICS_ARGS]) ); - expect(vars?.[ConfigKeys.TIMEOUT].value).toEqual(`${config[ConfigKeys.TIMEOUT]}s`); - expect(vars?.[ConfigKeys.THROTTLING_CONFIG].value).toEqual( - `${config[ConfigKeys.DOWNLOAD_SPEED]}d/${config[ConfigKeys.UPLOAD_SPEED]}u/${ - config[ConfigKeys.LATENCY] + expect(vars?.[ConfigKey.APM_SERVICE_NAME].value).toEqual(config[ConfigKey.APM_SERVICE_NAME]); + expect(vars?.[ConfigKey.TIMEOUT].value).toEqual(`${config[ConfigKey.TIMEOUT]}s`); + expect(vars?.[ConfigKey.THROTTLING_CONFIG].value).toEqual( + `${config[ConfigKey.DOWNLOAD_SPEED]}d/${config[ConfigKey.UPLOAD_SPEED]}u/${ + config[ConfigKey.LATENCY] }l` ); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.ts b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.ts index 17ded6385da4fa..8c312c8c9abfa9 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/hooks/use_update_policy.ts @@ -6,13 +6,13 @@ */ import { useEffect, useRef, useState } from 'react'; import { NewPackagePolicy } from '../../../../../fleet/public'; -import { ConfigKeys, DataStream, Validation, ICustomFields } from '../types'; +import { ConfigKey, DataStream, Validation, MonitorFields } from '../types'; import { formatters } from '../helpers/formatters'; interface Props { monitorType: DataStream; - defaultConfig: Partial; - config: Partial; + defaultConfig: Partial; + config: Partial; newPolicy: NewPackagePolicy; onChange: (opts: { /** is current form state is valid */ @@ -33,11 +33,11 @@ export const useUpdatePolicy = ({ }: Props) => { const [updatedPolicy, setUpdatedPolicy] = useState(newPolicy); // Update the integration policy with our custom fields - const currentConfig = useRef>(defaultConfig); + const currentConfig = useRef>(defaultConfig); useEffect(() => { - const configKeys = Object.keys(config) as ConfigKeys[]; - const validationKeys = Object.keys(validate[monitorType]) as ConfigKeys[]; + const configKeys = Object.keys(config) as ConfigKey[]; + const validationKeys = Object.keys(validate[monitorType]) as ConfigKey[]; const configDidUpdate = configKeys.some((key) => config[key] !== currentConfig.current[key]); const isValid = !!newPolicy.name && !validationKeys.find((key) => validate[monitorType]?.[key]?.(config)); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.test.tsx index 0b434b6677353b..8467abbab6c47f 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.test.tsx @@ -9,7 +9,13 @@ import React from 'react'; import { fireEvent } from '@testing-library/react'; import { render } from '../../../lib/helper/rtl_helpers'; import { HTTPAdvancedFields } from './advanced_fields'; -import { ConfigKeys, DataStream, HTTPMethod, IHTTPAdvancedFields, Validation } from '../types'; +import { + ConfigKey, + DataStream, + HTTPMethod, + HTTPAdvancedFields as HTTPAdvancedFieldsType, + Validation, +} from '../types'; import { HTTPAdvancedFieldsContextProvider, defaultHTTPAdvancedFields as defaultConfig, @@ -44,7 +50,7 @@ describe('', () => { defaultValues, validate = defaultValidation, }: { - defaultValues?: IHTTPAdvancedFields; + defaultValues?: HTTPAdvancedFieldsType; validate?: Validation; }) => { return ( @@ -73,25 +79,25 @@ describe('', () => { const username = getByLabelText('Username') as HTMLInputElement; const password = getByLabelText('Password') as HTMLInputElement; expect(requestMethod).toBeInTheDocument(); - expect(requestMethod.value).toEqual(defaultConfig[ConfigKeys.REQUEST_METHOD_CHECK]); + expect(requestMethod.value).toEqual(defaultConfig[ConfigKey.REQUEST_METHOD_CHECK]); expect(requestHeaders).toBeInTheDocument(); expect(requestBody).toBeInTheDocument(); expect(indexResponseBody).toBeInTheDocument(); expect(indexResponseBody.checked).toBe(true); expect(indexResponseBodySelect).toBeInTheDocument(); - expect(indexResponseBodySelect.value).toEqual(defaultConfig[ConfigKeys.RESPONSE_BODY_INDEX]); + expect(indexResponseBodySelect.value).toEqual(defaultConfig[ConfigKey.RESPONSE_BODY_INDEX]); expect(indexResponseHeaders).toBeInTheDocument(); expect(indexResponseHeaders.checked).toBe(true); expect(proxyUrl).toBeInTheDocument(); - expect(proxyUrl.value).toEqual(defaultConfig[ConfigKeys.PROXY_URL]); + expect(proxyUrl.value).toEqual(defaultConfig[ConfigKey.PROXY_URL]); expect(responseStatusEquals).toBeInTheDocument(); expect(responseBodyContains).toBeInTheDocument(); expect(responseBodyDoesNotContain).toBeInTheDocument(); expect(responseHeadersContain).toBeInTheDocument(); expect(username).toBeInTheDocument(); - expect(username.value).toBe(defaultConfig[ConfigKeys.USERNAME]); + expect(username.value).toBe(defaultConfig[ConfigKey.USERNAME]); expect(password).toBeInTheDocument(); - expect(password.value).toBe(defaultConfig[ConfigKeys.PASSWORD]); + expect(password.value).toBe(defaultConfig[ConfigKey.PASSWORD]); }); it('handles changing fields', () => { diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.tsx index 5299fa93e6dab9..c112d7da7b8cda 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/http/advanced_fields.tsx @@ -22,7 +22,7 @@ import { import { useHTTPAdvancedFieldsContext } from '../contexts'; -import { ConfigKeys, HTTPMethod, Validation } from '../types'; +import { ConfigKey, HTTPMethod, Validation } from '../types'; import { OptionalLabel } from '../optional_label'; import { HeaderField } from '../header_field'; @@ -37,7 +37,7 @@ interface Props { export const HTTPAdvancedFields = memo(({ validate }) => { const { fields, setFields } = useHTTPAdvancedFieldsContext(); const handleInputChange = useCallback( - ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }, [setFields] @@ -89,11 +89,11 @@ export const HTTPAdvancedFields = memo(({ validate }) => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.USERNAME, + configKey: ConfigKey.USERNAME, }) } data-test-subj="syntheticsUsername" @@ -115,11 +115,11 @@ export const HTTPAdvancedFields = memo(({ validate }) => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.PASSWORD, + configKey: ConfigKey.PASSWORD, }) } data-test-subj="syntheticsPassword" @@ -141,11 +141,11 @@ export const HTTPAdvancedFields = memo(({ validate }) => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.PROXY_URL, + configKey: ConfigKey.PROXY_URL, }) } data-test-subj="syntheticsProxyUrl" @@ -167,11 +167,11 @@ export const HTTPAdvancedFields = memo(({ validate }) => { > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.REQUEST_METHOD_CHECK, + configKey: ConfigKey.REQUEST_METHOD_CHECK, }) } data-test-subj="syntheticsRequestMethod" @@ -186,7 +186,7 @@ export const HTTPAdvancedFields = memo(({ validate }) => { /> } labelAppend={} - isInvalid={!!validate[ConfigKeys.REQUEST_HEADERS_CHECK]?.(fields)} + isInvalid={!!validate[ConfigKey.REQUEST_HEADERS_CHECK]?.(fields)} error={ (({ validate }) => { > handleInputChange({ value, - configKey: ConfigKeys.REQUEST_HEADERS_CHECK, + configKey: ConfigKey.REQUEST_HEADERS_CHECK, }), [handleInputChange] )} @@ -235,13 +235,13 @@ export const HTTPAdvancedFields = memo(({ validate }) => { fullWidth > handleInputChange({ value, - configKey: ConfigKeys.REQUEST_BODY_CHECK, + configKey: ConfigKey.REQUEST_BODY_CHECK, }), [handleInputChange] )} @@ -280,7 +280,7 @@ export const HTTPAdvancedFields = memo(({ validate }) => { > (({ validate }) => { onChange={(event) => handleInputChange({ value: event.target.checked, - configKey: ConfigKeys.RESPONSE_HEADERS_INDEX, + configKey: ConfigKey.RESPONSE_HEADERS_INDEX, }) } /> @@ -307,10 +307,10 @@ export const HTTPAdvancedFields = memo(({ validate }) => { } > - handleInputChange({ value: policy, configKey: ConfigKeys.RESPONSE_BODY_INDEX }), + handleInputChange({ value: policy, configKey: ConfigKey.RESPONSE_BODY_INDEX }), [handleInputChange] )} /> @@ -340,7 +340,7 @@ export const HTTPAdvancedFields = memo(({ validate }) => { /> } labelAppend={} - isInvalid={!!validate[ConfigKeys.RESPONSE_STATUS_CHECK]?.(fields)} + isInvalid={!!validate[ConfigKey.RESPONSE_STATUS_CHECK]?.(fields)} error={ (({ validate }) => { )} > handleInputChange({ value, - configKey: ConfigKeys.RESPONSE_STATUS_CHECK, + configKey: ConfigKey.RESPONSE_STATUS_CHECK, }) } data-test-subj="syntheticsResponseStatusCheck" @@ -375,7 +375,7 @@ export const HTTPAdvancedFields = memo(({ validate }) => { /> } labelAppend={} - isInvalid={!!validate[ConfigKeys.RESPONSE_HEADERS_CHECK]?.(fields)} + isInvalid={!!validate[ConfigKey.RESPONSE_HEADERS_CHECK]?.(fields)} error={[ (({ validate }) => { } > handleInputChange({ value, - configKey: ConfigKeys.RESPONSE_HEADERS_CHECK, + configKey: ConfigKey.RESPONSE_HEADERS_CHECK, }), [handleInputChange] )} @@ -419,12 +419,12 @@ export const HTTPAdvancedFields = memo(({ validate }) => { )} > handleInputChange({ value, - configKey: ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE, + configKey: ConfigKey.RESPONSE_BODY_CHECK_POSITIVE, }), [handleInputChange] )} @@ -448,12 +448,12 @@ export const HTTPAdvancedFields = memo(({ validate }) => { )} > handleInputChange({ value, - configKey: ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE, + configKey: ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE, }), [handleInputChange] )} diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/http/formatters.ts index 0c27eb3be1a2d6..a7440805b242c4 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/http/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/http/formatters.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { HTTPFields, ConfigKeys } from '../types'; +import { HTTPFields, ConfigKey } from '../types'; import { Formatter, commonFormatters, @@ -17,29 +17,29 @@ import { tlsFormatters } from '../tls/formatters'; export type HTTPFormatMap = Record; export const httpFormatters: HTTPFormatMap = { - [ConfigKeys.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKeys.METADATA]), - [ConfigKeys.URLS]: null, - [ConfigKeys.MAX_REDIRECTS]: null, - [ConfigKeys.USERNAME]: null, - [ConfigKeys.PASSWORD]: null, - [ConfigKeys.PROXY_URL]: null, - [ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]: (fields) => - arrayToJsonFormatter(fields[ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]), - [ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]: (fields) => - arrayToJsonFormatter(fields[ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]), - [ConfigKeys.RESPONSE_BODY_INDEX]: null, - [ConfigKeys.RESPONSE_HEADERS_CHECK]: (fields) => - objectToJsonFormatter(fields[ConfigKeys.RESPONSE_HEADERS_CHECK]), - [ConfigKeys.RESPONSE_HEADERS_INDEX]: null, - [ConfigKeys.RESPONSE_STATUS_CHECK]: (fields) => - arrayToJsonFormatter(fields[ConfigKeys.RESPONSE_STATUS_CHECK]), - [ConfigKeys.REQUEST_BODY_CHECK]: (fields) => - fields[ConfigKeys.REQUEST_BODY_CHECK]?.value - ? JSON.stringify(fields[ConfigKeys.REQUEST_BODY_CHECK]?.value) + [ConfigKey.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKey.METADATA]), + [ConfigKey.URLS]: null, + [ConfigKey.MAX_REDIRECTS]: null, + [ConfigKey.USERNAME]: null, + [ConfigKey.PASSWORD]: null, + [ConfigKey.PROXY_URL]: null, + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: (fields) => + arrayToJsonFormatter(fields[ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]), + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: (fields) => + arrayToJsonFormatter(fields[ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]), + [ConfigKey.RESPONSE_BODY_INDEX]: null, + [ConfigKey.RESPONSE_HEADERS_CHECK]: (fields) => + objectToJsonFormatter(fields[ConfigKey.RESPONSE_HEADERS_CHECK]), + [ConfigKey.RESPONSE_HEADERS_INDEX]: null, + [ConfigKey.RESPONSE_STATUS_CHECK]: (fields) => + arrayToJsonFormatter(fields[ConfigKey.RESPONSE_STATUS_CHECK]), + [ConfigKey.REQUEST_BODY_CHECK]: (fields) => + fields[ConfigKey.REQUEST_BODY_CHECK]?.value + ? JSON.stringify(fields[ConfigKey.REQUEST_BODY_CHECK]?.value) : null, - [ConfigKeys.REQUEST_HEADERS_CHECK]: (fields) => - objectToJsonFormatter(fields[ConfigKeys.REQUEST_HEADERS_CHECK]), - [ConfigKeys.REQUEST_METHOD_CHECK]: null, + [ConfigKey.REQUEST_HEADERS_CHECK]: (fields) => + objectToJsonFormatter(fields[ConfigKey.REQUEST_HEADERS_CHECK]), + [ConfigKey.REQUEST_METHOD_CHECK]: null, ...tlsFormatters, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/http/normalizers.ts index e6e9b5121bf2ca..a4013a0e8024db 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/http/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/http/normalizers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { HTTPFields, ConfigKeys, ContentType, contentTypesToMode } from '../types'; +import { HTTPFields, ConfigKey, ContentType, contentTypesToMode } from '../types'; import { Normalizer, commonNormalizers, @@ -22,47 +22,47 @@ const defaultHTTPValues = { ...defaultHTTPAdvancedFields, }; -export const getHTTPNormalizer = (key: ConfigKeys) => { +export const getHTTPNormalizer = (key: ConfigKey) => { return getNormalizer(key, defaultHTTPValues); }; -export const getHTTPJsonToJavascriptNormalizer = (key: ConfigKeys) => { +export const getHTTPJsonToJavascriptNormalizer = (key: ConfigKey) => { return getJsonToJavascriptNormalizer(key, defaultHTTPValues); }; export const httpNormalizers: HTTPNormalizerMap = { - [ConfigKeys.METADATA]: getHTTPJsonToJavascriptNormalizer(ConfigKeys.METADATA), - [ConfigKeys.URLS]: getHTTPNormalizer(ConfigKeys.URLS), - [ConfigKeys.MAX_REDIRECTS]: getHTTPNormalizer(ConfigKeys.MAX_REDIRECTS), - [ConfigKeys.USERNAME]: getHTTPNormalizer(ConfigKeys.USERNAME), - [ConfigKeys.PASSWORD]: getHTTPNormalizer(ConfigKeys.PASSWORD), - [ConfigKeys.PROXY_URL]: getHTTPNormalizer(ConfigKeys.PROXY_URL), - [ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]: getHTTPJsonToJavascriptNormalizer( - ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE + [ConfigKey.METADATA]: getHTTPJsonToJavascriptNormalizer(ConfigKey.METADATA), + [ConfigKey.URLS]: getHTTPNormalizer(ConfigKey.URLS), + [ConfigKey.MAX_REDIRECTS]: getHTTPNormalizer(ConfigKey.MAX_REDIRECTS), + [ConfigKey.USERNAME]: getHTTPNormalizer(ConfigKey.USERNAME), + [ConfigKey.PASSWORD]: getHTTPNormalizer(ConfigKey.PASSWORD), + [ConfigKey.PROXY_URL]: getHTTPNormalizer(ConfigKey.PROXY_URL), + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: getHTTPJsonToJavascriptNormalizer( + ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE ), - [ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]: getHTTPJsonToJavascriptNormalizer( - ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: getHTTPJsonToJavascriptNormalizer( + ConfigKey.RESPONSE_BODY_CHECK_POSITIVE ), - [ConfigKeys.RESPONSE_BODY_INDEX]: getHTTPNormalizer(ConfigKeys.RESPONSE_BODY_INDEX), - [ConfigKeys.RESPONSE_HEADERS_CHECK]: getHTTPJsonToJavascriptNormalizer( - ConfigKeys.RESPONSE_HEADERS_CHECK + [ConfigKey.RESPONSE_BODY_INDEX]: getHTTPNormalizer(ConfigKey.RESPONSE_BODY_INDEX), + [ConfigKey.RESPONSE_HEADERS_CHECK]: getHTTPJsonToJavascriptNormalizer( + ConfigKey.RESPONSE_HEADERS_CHECK ), - [ConfigKeys.RESPONSE_HEADERS_INDEX]: getHTTPNormalizer(ConfigKeys.RESPONSE_HEADERS_INDEX), - [ConfigKeys.RESPONSE_STATUS_CHECK]: getHTTPJsonToJavascriptNormalizer( - ConfigKeys.RESPONSE_STATUS_CHECK + [ConfigKey.RESPONSE_HEADERS_INDEX]: getHTTPNormalizer(ConfigKey.RESPONSE_HEADERS_INDEX), + [ConfigKey.RESPONSE_STATUS_CHECK]: getHTTPJsonToJavascriptNormalizer( + ConfigKey.RESPONSE_STATUS_CHECK ), - [ConfigKeys.REQUEST_BODY_CHECK]: (fields) => { - const requestBody = fields?.[ConfigKeys.REQUEST_BODY_CHECK]?.value; - const requestHeaders = fields?.[ConfigKeys.REQUEST_HEADERS_CHECK]?.value; + [ConfigKey.REQUEST_BODY_CHECK]: (fields) => { + const requestBody = fields?.[ConfigKey.REQUEST_BODY_CHECK]?.value; + const requestHeaders = fields?.[ConfigKey.REQUEST_HEADERS_CHECK]?.value; if (requestBody) { const headers = requestHeaders - ? JSON.parse(fields?.[ConfigKeys.REQUEST_HEADERS_CHECK]?.value) - : defaultHTTPAdvancedFields[ConfigKeys.REQUEST_HEADERS_CHECK]; + ? JSON.parse(fields?.[ConfigKey.REQUEST_HEADERS_CHECK]?.value) + : defaultHTTPAdvancedFields[ConfigKey.REQUEST_HEADERS_CHECK]; const requestBodyValue = requestBody !== null && requestBody !== undefined ? JSON.parse(requestBody) - : defaultHTTPAdvancedFields[ConfigKeys.REQUEST_BODY_CHECK]?.value; - let requestBodyType = defaultHTTPAdvancedFields[ConfigKeys.REQUEST_BODY_CHECK]?.type; + : defaultHTTPAdvancedFields[ConfigKey.REQUEST_BODY_CHECK]?.value; + let requestBodyType = defaultHTTPAdvancedFields[ConfigKey.REQUEST_BODY_CHECK]?.type; Object.keys(headers || []).some((headerKey) => { if (headerKey === 'Content-Type' && contentTypesToMode[headers[headerKey] as ContentType]) { requestBodyType = contentTypesToMode[headers[headerKey] as ContentType]; @@ -74,13 +74,13 @@ export const httpNormalizers: HTTPNormalizerMap = { type: requestBodyType, }; } else { - return defaultHTTPAdvancedFields[ConfigKeys.REQUEST_BODY_CHECK]; + return defaultHTTPAdvancedFields[ConfigKey.REQUEST_BODY_CHECK]; } }, - [ConfigKeys.REQUEST_HEADERS_CHECK]: getHTTPJsonToJavascriptNormalizer( - ConfigKeys.REQUEST_HEADERS_CHECK + [ConfigKey.REQUEST_HEADERS_CHECK]: getHTTPJsonToJavascriptNormalizer( + ConfigKey.REQUEST_HEADERS_CHECK ), - [ConfigKeys.REQUEST_METHOD_CHECK]: getHTTPNormalizer(ConfigKeys.REQUEST_METHOD_CHECK), + [ConfigKey.REQUEST_METHOD_CHECK]: getHTTPNormalizer(ConfigKey.REQUEST_METHOD_CHECK), ...commonNormalizers, ...tlsNormalizers, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/http/simple_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/http/simple_fields.tsx index 8d487a02229793..bda0c9fa590560 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/http/simple_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/http/simple_fields.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFormRow, EuiFieldText, EuiFieldNumber } from '@elastic/eui'; -import { ConfigKeys, Validation } from '../types'; +import { ConfigKey, Validation } from '../types'; import { useHTTPSimpleFieldsContext } from '../contexts'; import { OptionalLabel } from '../optional_label'; import { ScheduleField } from '../schedule_field'; @@ -20,7 +20,7 @@ interface Props { export const HTTPSimpleFields = memo(({ validate }) => { const { fields, setFields } = useHTTPSimpleFieldsContext(); - const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }; @@ -33,7 +33,7 @@ export const HTTPSimpleFields = memo(({ validate }) => { defaultMessage="URL" /> } - isInvalid={!!validate[ConfigKeys.URLS]?.(fields)} + isInvalid={!!validate[ConfigKey.URLS]?.(fields)} error={ (({ validate }) => { } > - handleInputChange({ value: event.target.value, configKey: ConfigKeys.URLS }) + handleInputChange({ value: event.target.value, configKey: ConfigKey.URLS }) } data-test-subj="syntheticsUrlField" /> @@ -57,7 +57,7 @@ export const HTTPSimpleFields = memo(({ validate }) => { defaultMessage="Monitor interval" /> } - isInvalid={!!validate[ConfigKeys.SCHEDULE]?.(fields)} + isInvalid={!!validate[ConfigKey.SCHEDULE]?.(fields)} error={ (({ validate }) => { onChange={(schedule) => handleInputChange({ value: schedule, - configKey: ConfigKeys.SCHEDULE, + configKey: ConfigKey.SCHEDULE, }) } - number={fields[ConfigKeys.SCHEDULE].number} - unit={fields[ConfigKeys.SCHEDULE].unit} + number={fields[ConfigKey.SCHEDULE].number} + unit={fields[ConfigKey.SCHEDULE].unit} /> (({ validate }) => { defaultMessage="Max redirects" /> } - isInvalid={!!validate[ConfigKeys.MAX_REDIRECTS]?.(fields)} + isInvalid={!!validate[ConfigKey.MAX_REDIRECTS]?.(fields)} error={ (({ validate }) => { > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.MAX_REDIRECTS, + configKey: ConfigKey.MAX_REDIRECTS, }) } /> diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/icmp/formatters.ts index 138df2b1e9ced9..6d249b6d5660c6 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/icmp/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/icmp/formatters.ts @@ -5,13 +5,13 @@ * 2.0. */ -import { ICMPFields, ConfigKeys } from '../types'; +import { ICMPFields, ConfigKey } from '../types'; import { Formatter, commonFormatters, secondsToCronFormatter } from '../common/formatters'; export type ICMPFormatMap = Record; export const icmpFormatters: ICMPFormatMap = { - [ConfigKeys.HOSTS]: null, - [ConfigKeys.WAIT]: (fields) => secondsToCronFormatter(fields[ConfigKeys.WAIT]), + [ConfigKey.HOSTS]: null, + [ConfigKey.WAIT]: (fields) => secondsToCronFormatter(fields[ConfigKey.WAIT]), ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/icmp/normalizers.ts index 18ce1da00e117e..e954d1f4f66e59 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/icmp/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/icmp/normalizers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ICMPFields, ConfigKeys } from '../types'; +import { ICMPFields, ConfigKey } from '../types'; import { Normalizer, commonNormalizers, @@ -16,16 +16,16 @@ import { defaultICMPSimpleFields } from '../contexts'; export type ICMPNormalizerMap = Record; -export const getICMPNormalizer = (key: ConfigKeys) => { +export const getICMPNormalizer = (key: ConfigKey) => { return getNormalizer(key, defaultICMPSimpleFields); }; -export const getICMPCronToSecondsNormalizer = (key: ConfigKeys) => { +export const getICMPCronToSecondsNormalizer = (key: ConfigKey) => { return getCronNormalizer(key, defaultICMPSimpleFields); }; export const icmpNormalizers: ICMPNormalizerMap = { - [ConfigKeys.HOSTS]: getICMPNormalizer(ConfigKeys.HOSTS), - [ConfigKeys.WAIT]: getICMPCronToSecondsNormalizer(ConfigKeys.WAIT), + [ConfigKey.HOSTS]: getICMPNormalizer(ConfigKey.HOSTS), + [ConfigKey.WAIT]: getICMPCronToSecondsNormalizer(ConfigKey.WAIT), ...commonNormalizers, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/icmp/simple_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/icmp/simple_fields.tsx index 9c605dacdfd223..20bd9b422ea0b6 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/icmp/simple_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/icmp/simple_fields.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFormRow, EuiFieldText, EuiFieldNumber } from '@elastic/eui'; -import { ConfigKeys, Validation } from '../types'; +import { ConfigKey, Validation } from '../types'; import { useICMPSimpleFieldsContext } from '../contexts'; import { OptionalLabel } from '../optional_label'; import { ScheduleField } from '../schedule_field'; @@ -20,7 +20,7 @@ interface Props { export const ICMPSimpleFields = memo(({ validate }) => { const { fields, setFields } = useICMPSimpleFieldsContext(); - const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }; @@ -33,7 +33,7 @@ export const ICMPSimpleFields = memo(({ validate }) => { defaultMessage="Host" /> } - isInvalid={!!validate[ConfigKeys.HOSTS]?.(fields)} + isInvalid={!!validate[ConfigKey.HOSTS]?.(fields)} error={ (({ validate }) => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.HOSTS, + configKey: ConfigKey.HOSTS, }) } data-test-subj="syntheticsICMPHostField" @@ -60,7 +60,7 @@ export const ICMPSimpleFields = memo(({ validate }) => { defaultMessage="Monitor interval" /> } - isInvalid={!!validate[ConfigKeys.SCHEDULE]?.(fields)} + isInvalid={!!validate[ConfigKey.SCHEDULE]?.(fields)} error={ (({ validate }) => { onChange={(schedule) => handleInputChange({ value: schedule, - configKey: ConfigKeys.SCHEDULE, + configKey: ConfigKey.SCHEDULE, }) } - number={fields[ConfigKeys.SCHEDULE].number} - unit={fields[ConfigKeys.SCHEDULE].unit} + number={fields[ConfigKey.SCHEDULE].number} + unit={fields[ConfigKey.SCHEDULE].unit} /> (({ validate }) => { defaultMessage="Wait in seconds" /> } - isInvalid={!!validate[ConfigKeys.WAIT]?.(fields)} + isInvalid={!!validate[ConfigKey.WAIT]?.(fields)} error={ (({ validate }) => { > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.WAIT, + configKey: ConfigKey.WAIT, }) } step={'any'} diff --git a/x-pack/plugins/uptime/public/components/fleet_package/schedule_field.tsx b/x-pack/plugins/uptime/public/components/fleet_package/schedule_field.tsx index 047d200d0af02d..267127c59e6dca 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/schedule_field.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/schedule_field.tsx @@ -9,11 +9,11 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFieldNumber, EuiFlexGroup, EuiFlexItem, EuiSelect } from '@elastic/eui'; -import { ConfigKeys, ICustomFields, ScheduleUnit } from './types'; +import { ConfigKey, MonitorFields, ScheduleUnit } from './types'; interface Props { number: string; - onChange: (schedule: ICustomFields[ConfigKeys.SCHEDULE]) => void; + onChange: (schedule: MonitorFields[ConfigKey.SCHEDULE]) => void; unit: ScheduleUnit; } diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension.tsx b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension.tsx index 4fa101a329cd0a..db06f9dd8cd917 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension.tsx @@ -8,7 +8,8 @@ import React, { memo, useEffect, useMemo } from 'react'; import { PackagePolicyCreateExtensionComponentProps } from '../../../../fleet/public'; import { useTrackPageview } from '../../../../observability/public'; -import { PolicyConfig, DataStream } from './types'; +import { DataStream } from './types'; +import { PolicyConfig } from './types'; import { usePolicyConfigContext, defaultHTTPSimpleFields, diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx index 138174792708fb..313fc460c5c5e7 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_create_extension_wrapper.test.tsx @@ -13,7 +13,7 @@ import { render } from '../../lib/helper/rtl_helpers'; import { NewPackagePolicy } from '../../../../fleet/public'; import { SyntheticsPolicyCreateExtensionWrapper } from './synthetics_policy_create_extension_wrapper'; import { defaultConfig } from './synthetics_policy_create_extension'; -import { ConfigKeys, DataStream, ScheduleUnit, VerificationMode } from './types'; +import { ConfigKey, DataStream, ScheduleUnit, VerificationMode } from './types'; // ensures that fields appropriately match to their label jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ @@ -351,19 +351,19 @@ describe('', () => { expect(monitorType).toBeInTheDocument(); expect(monitorType.value).toEqual(DataStream.HTTP); expect(url).toBeInTheDocument(); - expect(url.value).toEqual(defaultHTTPConfig[ConfigKeys.URLS]); + expect(url.value).toEqual(defaultHTTPConfig[ConfigKey.URLS]); expect(proxyUrl).toBeInTheDocument(); - expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKeys.PROXY_URL]); + expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKey.PROXY_URL]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].unit); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKey.APM_SERVICE_NAME]); expect(maxRedirects).toBeInTheDocument(); - expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKeys.MAX_REDIRECTS]}`); + expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKey.MAX_REDIRECTS]}`); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKey.TIMEOUT]}`); // ensure other monitor type options are not in the DOM expect(queryByLabelText('Host')).not.toBeInTheDocument(); @@ -521,7 +521,7 @@ describe('', () => { const host = getByLabelText('Host:Port') as HTMLInputElement; expect(host).toBeInTheDocument(); - expect(host.value).toEqual(defaultTCPConfig[ConfigKeys.HOSTS]); + expect(host.value).toEqual(defaultTCPConfig[ConfigKey.HOSTS]); // expect HTTP fields not to be in the DOM expect(queryByLabelText('URL')).not.toBeInTheDocument(); @@ -767,23 +767,23 @@ describe('', () => { await waitFor(() => { fireEvent.change(ca, { target: { value: 'certificateAuthorities' } }); - expect(ca.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]); + expect(ca.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_CERTIFICATE_AUTHORITIES]); }); await waitFor(() => { fireEvent.change(clientCertificate, { target: { value: 'clientCertificate' } }); - expect(clientCertificate.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_KEY]); + expect(clientCertificate.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_KEY]); }); await waitFor(() => { fireEvent.change(clientKey, { target: { value: 'clientKey' } }); - expect(clientKey.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_KEY]); + expect(clientKey.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_KEY]); }); await waitFor(() => { fireEvent.change(clientKeyPassphrase, { target: { value: 'clientKeyPassphrase' } }); - expect(clientKeyPassphrase.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_KEY_PASSPHRASE]); + expect(clientKeyPassphrase.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_KEY_PASSPHRASE]); }); await waitFor(() => { fireEvent.change(verificationMode, { target: { value: VerificationMode.NONE } }); - expect(verificationMode.value).toEqual(defaultHTTPConfig[ConfigKeys.TLS_VERIFICATION_MODE]); + expect(verificationMode.value).toEqual(defaultHTTPConfig[ConfigKey.TLS_VERIFICATION_MODE]); }); await waitFor(() => { @@ -799,23 +799,23 @@ describe('', () => { ...defaultNewPolicy.inputs[0].streams[0], vars: { ...defaultNewPolicy.inputs[0].streams[0].vars, - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: { + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: { value: '"certificateAuthorities"', type: 'yaml', }, - [ConfigKeys.TLS_CERTIFICATE]: { + [ConfigKey.TLS_CERTIFICATE]: { value: '"clientCertificate"', type: 'yaml', }, - [ConfigKeys.TLS_KEY]: { + [ConfigKey.TLS_KEY]: { value: '"clientKey"', type: 'yaml', }, - [ConfigKeys.TLS_KEY_PASSPHRASE]: { + [ConfigKey.TLS_KEY_PASSPHRASE]: { value: 'clientKeyPassphrase', type: 'text', }, - [ConfigKeys.TLS_VERIFICATION_MODE]: { + [ConfigKey.TLS_VERIFICATION_MODE]: { value: VerificationMode.NONE, type: 'text', }, diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension.tsx b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension.tsx index 1e01f43439a314..db512537dfdb81 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension.tsx @@ -9,7 +9,7 @@ import React, { memo } from 'react'; import { PackagePolicyEditExtensionComponentProps } from '../../../../fleet/public'; import { useTrackPageview } from '../../../../observability/public'; import { usePolicyConfigContext } from './contexts'; -import { ICustomFields, PolicyConfig } from './types'; +import { MonitorFields, PolicyConfig } from './types'; import { CustomFields } from './custom_fields'; import { useUpdatePolicy } from './hooks/use_update_policy'; import { usePolicy } from './hooks/use_policy'; @@ -18,7 +18,7 @@ import { validate } from './validation'; interface SyntheticsPolicyEditExtensionProps { newPolicy: PackagePolicyEditExtensionComponentProps['newPolicy']; onChange: PackagePolicyEditExtensionComponentProps['onChange']; - defaultConfig: Partial; + defaultConfig: Partial; } /** diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx index 51b7ddd90a0522..5ad02ef2b9a504 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.test.tsx @@ -12,7 +12,7 @@ import { fireEvent, waitFor } from '@testing-library/react'; import { render } from '../../lib/helper/rtl_helpers'; import { NewPackagePolicy } from '../../../../fleet/public'; import { SyntheticsPolicyEditExtensionWrapper } from './synthetics_policy_edit_extension_wrapper'; -import { ConfigKeys, DataStream, ScheduleUnit } from './types'; +import { ConfigKey, DataStream, ScheduleUnit } from './types'; import { defaultConfig } from './synthetics_policy_create_extension'; // ensures that fields appropriately match to their label @@ -370,25 +370,23 @@ describe('', () => { const verificationMode = getByLabelText('Verification mode') as HTMLInputElement; const enableTLSConfig = getByLabelText('Enable TLS configuration') as HTMLInputElement; expect(url).toBeInTheDocument(); - expect(url.value).toEqual(defaultHTTPConfig[ConfigKeys.URLS]); + expect(url.value).toEqual(defaultHTTPConfig[ConfigKey.URLS]); expect(proxyUrl).toBeInTheDocument(); - expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKeys.PROXY_URL]); + expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKey.PROXY_URL]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].unit); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKey.APM_SERVICE_NAME]); expect(maxRedirects).toBeInTheDocument(); - expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKeys.MAX_REDIRECTS]}`); + expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKey.MAX_REDIRECTS]}`); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKey.TIMEOUT]}`); // expect TLS settings to be in the document when at least one tls key is populated expect(enableTLSConfig.getAttribute('aria-checked')).toEqual('true'); expect(verificationMode).toBeInTheDocument(); - expect(verificationMode.value).toEqual( - `${defaultHTTPConfig[ConfigKeys.TLS_VERIFICATION_MODE]}` - ); + expect(verificationMode.value).toEqual(`${defaultHTTPConfig[ConfigKey.TLS_VERIFICATION_MODE]}`); // ensure other monitor type options are not in the DOM expect(queryByLabelText('Host')).not.toBeInTheDocument(); @@ -606,7 +604,7 @@ describe('', () => { expect(enableTLSConfig.getAttribute('aria-checked')).toEqual('true'); expect(verificationMode).toBeInTheDocument(); expect(verificationMode.value).toEqual( - `${defaultHTTPConfig[ConfigKeys.TLS_VERIFICATION_MODE]}` + `${defaultHTTPConfig[ConfigKey.TLS_VERIFICATION_MODE]}` ); } ); @@ -839,7 +837,7 @@ describe('', () => { }; return acc; }, {}), - [ConfigKeys.MONITOR_TYPE]: { + [ConfigKey.MONITOR_TYPE]: { value: 'http', type: 'text', }, @@ -865,19 +863,19 @@ describe('', () => { const enableTLSConfig = getByLabelText('Enable TLS configuration') as HTMLInputElement; expect(url).toBeInTheDocument(); - expect(url.value).toEqual(defaultHTTPConfig[ConfigKeys.URLS]); + expect(url.value).toEqual(defaultHTTPConfig[ConfigKey.URLS]); expect(proxyUrl).toBeInTheDocument(); - expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKeys.PROXY_URL]); + expect(proxyUrl.value).toEqual(defaultHTTPConfig[ConfigKey.PROXY_URL]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultHTTPConfig[ConfigKey.SCHEDULE].unit); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultHTTPConfig[ConfigKey.APM_SERVICE_NAME]); expect(maxRedirects).toBeInTheDocument(); - expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKeys.MAX_REDIRECTS]}`); + expect(maxRedirects.value).toEqual(`${defaultHTTPConfig[ConfigKey.MAX_REDIRECTS]}`); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultHTTPConfig[ConfigKey.TIMEOUT]}`); /* expect TLS settings not to be in the document when and Enable TLS settings not to be checked * when all TLS values are falsey */ @@ -894,7 +892,7 @@ describe('', () => { await waitFor(() => { const requestMethod = getByLabelText('Request method') as HTMLInputElement; expect(requestMethod).toBeInTheDocument(); - expect(requestMethod.value).toEqual(`${defaultHTTPConfig[ConfigKeys.REQUEST_METHOD_CHECK]}`); + expect(requestMethod.value).toEqual(`${defaultHTTPConfig[ConfigKey.REQUEST_METHOD_CHECK]}`); }); }); @@ -923,7 +921,7 @@ describe('', () => { }; return acc; }, {}), - [ConfigKeys.MONITOR_TYPE]: { + [ConfigKey.MONITOR_TYPE]: { value: DataStream.TCP, type: 'text', }, @@ -944,17 +942,17 @@ describe('', () => { const apmServiceName = getByLabelText('APM service name') as HTMLInputElement; const timeout = getByLabelText('Timeout in seconds') as HTMLInputElement; expect(host).toBeInTheDocument(); - expect(host.value).toEqual(defaultTCPConfig[ConfigKeys.HOSTS]); + expect(host.value).toEqual(defaultTCPConfig[ConfigKey.HOSTS]); expect(proxyUrl).toBeInTheDocument(); - expect(proxyUrl.value).toEqual(defaultTCPConfig[ConfigKeys.PROXY_URL]); + expect(proxyUrl.value).toEqual(defaultTCPConfig[ConfigKey.PROXY_URL]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultTCPConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultTCPConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultTCPConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultTCPConfig[ConfigKey.SCHEDULE].unit); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultTCPConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultTCPConfig[ConfigKey.APM_SERVICE_NAME]); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultTCPConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultTCPConfig[ConfigKey.TIMEOUT]}`); // ensure other monitor type options are not in the DOM expect(queryByLabelText('Url')).not.toBeInTheDocument(); @@ -997,7 +995,7 @@ describe('', () => { }; return acc; }, {}), - [ConfigKeys.MONITOR_TYPE]: { + [ConfigKey.MONITOR_TYPE]: { value: DataStream.ICMP, type: 'text', }, @@ -1017,17 +1015,17 @@ describe('', () => { const timeout = getByLabelText('Timeout in seconds') as HTMLInputElement; const wait = getByLabelText('Wait in seconds') as HTMLInputElement; expect(host).toBeInTheDocument(); - expect(host.value).toEqual(defaultICMPConfig[ConfigKeys.HOSTS]); + expect(host.value).toEqual(defaultICMPConfig[ConfigKey.HOSTS]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultICMPConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultICMPConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultICMPConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultICMPConfig[ConfigKey.SCHEDULE].unit); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultICMPConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultICMPConfig[ConfigKey.APM_SERVICE_NAME]); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultICMPConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultICMPConfig[ConfigKey.TIMEOUT]}`); expect(wait).toBeInTheDocument(); - expect(wait.value).toEqual(`${defaultICMPConfig[ConfigKeys.WAIT]}`); + expect(wait.value).toEqual(`${defaultICMPConfig[ConfigKey.WAIT]}`); // ensure other monitor type options are not in the DOM expect(queryByLabelText('Url')).not.toBeInTheDocument(); @@ -1067,7 +1065,7 @@ describe('', () => { }; return acc; }, {}), - [ConfigKeys.MONITOR_TYPE]: { + [ConfigKey.MONITOR_TYPE]: { value: DataStream.BROWSER, type: 'text', }, @@ -1086,15 +1084,15 @@ describe('', () => { const apmServiceName = getByLabelText('APM service name') as HTMLInputElement; const timeout = getByLabelText('Timeout in seconds') as HTMLInputElement; expect(zipUrl).toBeInTheDocument(); - expect(zipUrl.value).toEqual(defaultBrowserConfig[ConfigKeys.SOURCE_ZIP_URL]); + expect(zipUrl.value).toEqual(defaultBrowserConfig[ConfigKey.SOURCE_ZIP_URL]); expect(monitorIntervalNumber).toBeInTheDocument(); - expect(monitorIntervalNumber.value).toEqual(defaultBrowserConfig[ConfigKeys.SCHEDULE].number); + expect(monitorIntervalNumber.value).toEqual(defaultBrowserConfig[ConfigKey.SCHEDULE].number); expect(monitorIntervalUnit).toBeInTheDocument(); - expect(monitorIntervalUnit.value).toEqual(defaultBrowserConfig[ConfigKeys.SCHEDULE].unit); + expect(monitorIntervalUnit.value).toEqual(defaultBrowserConfig[ConfigKey.SCHEDULE].unit); expect(apmServiceName).toBeInTheDocument(); - expect(apmServiceName.value).toEqual(defaultBrowserConfig[ConfigKeys.APM_SERVICE_NAME]); + expect(apmServiceName.value).toEqual(defaultBrowserConfig[ConfigKey.APM_SERVICE_NAME]); expect(timeout).toBeInTheDocument(); - expect(timeout.value).toEqual(`${defaultBrowserConfig[ConfigKeys.TIMEOUT]}`); + expect(timeout.value).toEqual(`${defaultBrowserConfig[ConfigKey.TIMEOUT]}`); // ensure other monitor type options are not in the DOM expect(queryByLabelText('Url')).not.toBeInTheDocument(); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx index 08f1f7e4f36718..ed676443202ab6 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/synthetics_policy_edit_extension_wrapper.tsx @@ -7,7 +7,8 @@ import React, { memo, useMemo } from 'react'; import { PackagePolicyEditExtensionComponentProps } from '../../../../fleet/public'; -import { PolicyConfig, ConfigKeys, DataStream, ITLSFields, ICustomFields } from './types'; +import { PolicyConfig, MonitorFields } from './types'; +import { ConfigKey, DataStream, TLSFields } from '././types'; import { SyntheticsPolicyEditExtension } from './synthetics_policy_edit_extension'; import { PolicyConfigContextProvider, @@ -46,36 +47,36 @@ export const SyntheticsPolicyEditExtensionWrapper = memo((acc: ICustomFields, key: ConfigKeys) => { + const configKeys: ConfigKey[] = Object.values(ConfigKey) || ([] as ConfigKey[]); + const formattedDefaultConfigForMonitorType: MonitorFields = + configKeys.reduce((acc: MonitorFields, key: ConfigKey) => { return { ...acc, [key]: normalizers[key]?.(vars), }; - }, {} as ICustomFields); + }, {} as MonitorFields); - const tlsConfig: ITLSFields = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES], - [ConfigKeys.TLS_CERTIFICATE]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_CERTIFICATE], - [ConfigKeys.TLS_KEY]: formattedDefaultConfigForMonitorType[ConfigKeys.TLS_KEY], - [ConfigKeys.TLS_KEY_PASSPHRASE]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_KEY_PASSPHRASE], - [ConfigKeys.TLS_VERIFICATION_MODE]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_VERIFICATION_MODE], - [ConfigKeys.TLS_VERSION]: formattedDefaultConfigForMonitorType[ConfigKeys.TLS_VERSION], + const tlsConfig: TLSFields = { + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_CERTIFICATE_AUTHORITIES], + [ConfigKey.TLS_CERTIFICATE]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_CERTIFICATE], + [ConfigKey.TLS_KEY]: formattedDefaultConfigForMonitorType[ConfigKey.TLS_KEY], + [ConfigKey.TLS_KEY_PASSPHRASE]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_KEY_PASSPHRASE], + [ConfigKey.TLS_VERIFICATION_MODE]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_VERIFICATION_MODE], + [ConfigKey.TLS_VERSION]: formattedDefaultConfigForMonitorType[ConfigKey.TLS_VERSION], }; enableTLS = - formattedDefaultConfigForMonitorType[ConfigKeys.METADATA].is_tls_enabled || - Boolean(vars?.[ConfigKeys.TLS_VERIFICATION_MODE]?.value); + formattedDefaultConfigForMonitorType[ConfigKey.METADATA].is_tls_enabled || + Boolean(vars?.[ConfigKey.TLS_VERIFICATION_MODE]?.value); enableZipUrlTLS = - formattedDefaultConfigForMonitorType[ConfigKeys.METADATA].is_zip_url_tls_enabled || - Boolean(vars?.[ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]?.value); + formattedDefaultConfigForMonitorType[ConfigKey.METADATA].is_zip_url_tls_enabled || + Boolean(vars?.[ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]?.value); const formattedDefaultConfig: Partial = { [type]: formattedDefaultConfigForMonitorType, diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.test.tsx index 78a6724fc8cfbf..b55fb733a8c869 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.test.tsx @@ -13,7 +13,7 @@ import { TCPAdvancedFieldsContextProvider, defaultTCPAdvancedFields as defaultConfig, } from '../contexts'; -import { ConfigKeys, ITCPAdvancedFields } from '../types'; +import { ConfigKey, TCPAdvancedFields as TCPAdvancedFieldsType } from '../types'; // ensures fields and labels map appropriately jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ @@ -24,7 +24,7 @@ describe('', () => { const WrappedComponent = ({ defaultValues = defaultConfig, }: { - defaultValues?: ITCPAdvancedFields; + defaultValues?: TCPAdvancedFieldsType; }) => { return ( @@ -41,11 +41,11 @@ describe('', () => { // ComboBox has an issue with associating labels with the field const responseContains = getByLabelText('Check response contains') as HTMLInputElement; expect(requestPayload).toBeInTheDocument(); - expect(requestPayload.value).toEqual(defaultConfig[ConfigKeys.REQUEST_SEND_CHECK]); + expect(requestPayload.value).toEqual(defaultConfig[ConfigKey.REQUEST_SEND_CHECK]); expect(proxyURL).toBeInTheDocument(); - expect(proxyURL.value).toEqual(defaultConfig[ConfigKeys.PROXY_URL]); + expect(proxyURL.value).toEqual(defaultConfig[ConfigKey.PROXY_URL]); expect(responseContains).toBeInTheDocument(); - expect(responseContains.value).toEqual(defaultConfig[ConfigKeys.RESPONSE_RECEIVE_CHECK]); + expect(responseContains.value).toEqual(defaultConfig[ConfigKey.RESPONSE_RECEIVE_CHECK]); }); it('handles changing fields', () => { diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.tsx index f96b5103a8edc3..8978fa92bb7f16 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/tcp/advanced_fields.tsx @@ -18,7 +18,7 @@ import { import { useTCPAdvancedFieldsContext } from '../contexts'; -import { ConfigKeys } from '../types'; +import { ConfigKey } from '../types'; import { OptionalLabel } from '../optional_label'; @@ -26,7 +26,7 @@ export const TCPAdvancedFields = () => { const { fields, setFields } = useTCPAdvancedFieldsContext(); const handleInputChange = useCallback( - ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }, [setFields] @@ -72,21 +72,21 @@ export const TCPAdvancedFields = () => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.PROXY_URL, + configKey: ConfigKey.PROXY_URL, }) } data-test-subj="syntheticsProxyUrl" /> - {!!fields[ConfigKeys.PROXY_URL] && ( + {!!fields[ConfigKey.PROXY_URL] && ( { onChange={(event) => handleInputChange({ value: event.target.checked, - configKey: ConfigKeys.PROXY_USE_LOCAL_RESOLVER, + configKey: ConfigKey.PROXY_USE_LOCAL_RESOLVER, }) } /> @@ -118,12 +118,12 @@ export const TCPAdvancedFields = () => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.REQUEST_SEND_CHECK, + configKey: ConfigKey.REQUEST_SEND_CHECK, }), [handleInputChange] )} @@ -163,12 +163,12 @@ export const TCPAdvancedFields = () => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.RESPONSE_RECEIVE_CHECK, + configKey: ConfigKey.RESPONSE_RECEIVE_CHECK, }), [handleInputChange] )} diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/tcp/formatters.ts index ce65c2c23d0d92..136edad6ce1983 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tcp/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/tcp/formatters.ts @@ -5,19 +5,19 @@ * 2.0. */ -import { TCPFields, ConfigKeys } from '../types'; +import { TCPFields, ConfigKey } from '../types'; import { Formatter, commonFormatters, objectToJsonFormatter } from '../common/formatters'; import { tlsFormatters } from '../tls/formatters'; export type TCPFormatMap = Record; export const tcpFormatters: TCPFormatMap = { - [ConfigKeys.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKeys.METADATA]), - [ConfigKeys.HOSTS]: null, - [ConfigKeys.PROXY_URL]: null, - [ConfigKeys.PROXY_USE_LOCAL_RESOLVER]: null, - [ConfigKeys.RESPONSE_RECEIVE_CHECK]: null, - [ConfigKeys.REQUEST_SEND_CHECK]: null, + [ConfigKey.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKey.METADATA]), + [ConfigKey.HOSTS]: null, + [ConfigKey.PROXY_URL]: null, + [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: null, + [ConfigKey.RESPONSE_RECEIVE_CHECK]: null, + [ConfigKey.REQUEST_SEND_CHECK]: null, ...tlsFormatters, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/tcp/normalizers.ts index 962bb9cc9785e5..ae36de49fb57c2 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tcp/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/tcp/normalizers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { TCPFields, ConfigKeys } from '../types'; +import { TCPFields, ConfigKey } from '../types'; import { Normalizer, commonNormalizers, @@ -22,21 +22,21 @@ const defaultTCPFields = { export type TCPNormalizerMap = Record; -export const getTCPNormalizer = (key: ConfigKeys) => { +export const getTCPNormalizer = (key: ConfigKey) => { return getNormalizer(key, defaultTCPFields); }; -export const getTCPJsonToJavascriptNormalizer = (key: ConfigKeys) => { +export const getTCPJsonToJavascriptNormalizer = (key: ConfigKey) => { return getJsonToJavascriptNormalizer(key, defaultTCPFields); }; export const tcpNormalizers: TCPNormalizerMap = { - [ConfigKeys.METADATA]: getTCPJsonToJavascriptNormalizer(ConfigKeys.METADATA), - [ConfigKeys.HOSTS]: getTCPNormalizer(ConfigKeys.HOSTS), - [ConfigKeys.PROXY_URL]: getTCPNormalizer(ConfigKeys.PROXY_URL), - [ConfigKeys.PROXY_USE_LOCAL_RESOLVER]: getTCPNormalizer(ConfigKeys.PROXY_USE_LOCAL_RESOLVER), - [ConfigKeys.RESPONSE_RECEIVE_CHECK]: getTCPNormalizer(ConfigKeys.RESPONSE_RECEIVE_CHECK), - [ConfigKeys.REQUEST_SEND_CHECK]: getTCPNormalizer(ConfigKeys.REQUEST_SEND_CHECK), + [ConfigKey.METADATA]: getTCPJsonToJavascriptNormalizer(ConfigKey.METADATA), + [ConfigKey.HOSTS]: getTCPNormalizer(ConfigKey.HOSTS), + [ConfigKey.PROXY_URL]: getTCPNormalizer(ConfigKey.PROXY_URL), + [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: getTCPNormalizer(ConfigKey.PROXY_USE_LOCAL_RESOLVER), + [ConfigKey.RESPONSE_RECEIVE_CHECK]: getTCPNormalizer(ConfigKey.RESPONSE_RECEIVE_CHECK), + [ConfigKey.REQUEST_SEND_CHECK]: getTCPNormalizer(ConfigKey.REQUEST_SEND_CHECK), ...tlsNormalizers, ...commonNormalizers, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tcp/simple_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/tcp/simple_fields.tsx index 28ee223c5f2f87..cb6ebf6430eb84 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tcp/simple_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/tcp/simple_fields.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiFormRow, EuiFieldText } from '@elastic/eui'; -import { ConfigKeys, Validation } from '../types'; +import { ConfigKey, Validation } from '../types'; import { useTCPSimpleFieldsContext } from '../contexts'; import { ScheduleField } from '../schedule_field'; import { CommonFields } from '../common/common_fields'; @@ -19,7 +19,7 @@ interface Props { export const TCPSimpleFields = memo(({ validate }) => { const { fields, setFields } = useTCPSimpleFieldsContext(); - const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKeys }) => { + const handleInputChange = ({ value, configKey }: { value: unknown; configKey: ConfigKey }) => { setFields((prevFields) => ({ ...prevFields, [configKey]: value })); }; @@ -32,7 +32,7 @@ export const TCPSimpleFields = memo(({ validate }) => { defaultMessage="Host:Port" /> } - isInvalid={!!validate[ConfigKeys.HOSTS]?.(fields)} + isInvalid={!!validate[ConfigKey.HOSTS]?.(fields)} error={ (({ validate }) => { } > handleInputChange({ value: event.target.value, - configKey: ConfigKeys.HOSTS, + configKey: ConfigKey.HOSTS, }) } data-test-subj="syntheticsTCPHostField" @@ -60,7 +60,7 @@ export const TCPSimpleFields = memo(({ validate }) => { defaultMessage="Monitor interval" /> } - isInvalid={!!validate[ConfigKeys.SCHEDULE]?.(fields)} + isInvalid={!!validate[ConfigKey.SCHEDULE]?.(fields)} error={ (({ validate }) => { onChange={(schedule) => handleInputChange({ value: schedule, - configKey: ConfigKeys.SCHEDULE, + configKey: ConfigKey.SCHEDULE, }) } - number={fields[ConfigKeys.SCHEDULE].number} - unit={fields[ConfigKeys.SCHEDULE].unit} + number={fields[ConfigKey.SCHEDULE].number} + unit={fields[ConfigKey.SCHEDULE].unit} /> diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls/default_values.ts b/x-pack/plugins/uptime/public/components/fleet_package/tls/default_values.ts index 6f44e2c1c22b5e..18f291ce20f358 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tls/default_values.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/tls/default_values.ts @@ -5,13 +5,13 @@ * 2.0. */ -import { ITLSFields, ConfigKeys, VerificationMode, TLSVersion } from '../types'; +import { TLSFields, ConfigKey, VerificationMode, TLSVersion } from '../types'; -export const defaultValues: ITLSFields = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: '', - [ConfigKeys.TLS_CERTIFICATE]: '', - [ConfigKeys.TLS_KEY]: '', - [ConfigKeys.TLS_KEY_PASSPHRASE]: '', - [ConfigKeys.TLS_VERIFICATION_MODE]: VerificationMode.FULL, - [ConfigKeys.TLS_VERSION]: [TLSVersion.ONE_ONE, TLSVersion.ONE_TWO, TLSVersion.ONE_THREE], +export const defaultValues: TLSFields = { + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: '', + [ConfigKey.TLS_CERTIFICATE]: '', + [ConfigKey.TLS_KEY]: '', + [ConfigKey.TLS_KEY_PASSPHRASE]: '', + [ConfigKey.TLS_VERIFICATION_MODE]: VerificationMode.FULL, + [ConfigKey.TLS_VERSION]: [TLSVersion.ONE_ONE, TLSVersion.ONE_TWO, TLSVersion.ONE_THREE], }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/tls/formatters.ts index 1191c7b0182372..c2ab88cbd49b23 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tls/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/tls/formatters.ts @@ -5,22 +5,22 @@ * 2.0. */ -import { ITLSFields, ConfigKeys } from '../types'; +import { TLSFields, ConfigKey } from '../types'; import { Formatter } from '../common/formatters'; -type TLSFormatMap = Record; +type TLSFormatMap = Record; export const tlsFormatters: TLSFormatMap = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: (fields) => - tlsValueToYamlFormatter(fields[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]), - [ConfigKeys.TLS_CERTIFICATE]: (fields) => - tlsValueToYamlFormatter(fields[ConfigKeys.TLS_CERTIFICATE]), - [ConfigKeys.TLS_KEY]: (fields) => tlsValueToYamlFormatter(fields[ConfigKeys.TLS_KEY]), - [ConfigKeys.TLS_KEY_PASSPHRASE]: (fields) => - tlsValueToStringFormatter(fields[ConfigKeys.TLS_KEY_PASSPHRASE]), - [ConfigKeys.TLS_VERIFICATION_MODE]: (fields) => - tlsValueToStringFormatter(fields[ConfigKeys.TLS_VERIFICATION_MODE]), - [ConfigKeys.TLS_VERSION]: (fields) => tlsArrayToYamlFormatter(fields[ConfigKeys.TLS_VERSION]), + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: (fields) => + tlsValueToYamlFormatter(fields[ConfigKey.TLS_CERTIFICATE_AUTHORITIES]), + [ConfigKey.TLS_CERTIFICATE]: (fields) => + tlsValueToYamlFormatter(fields[ConfigKey.TLS_CERTIFICATE]), + [ConfigKey.TLS_KEY]: (fields) => tlsValueToYamlFormatter(fields[ConfigKey.TLS_KEY]), + [ConfigKey.TLS_KEY_PASSPHRASE]: (fields) => + tlsValueToStringFormatter(fields[ConfigKey.TLS_KEY_PASSPHRASE]), + [ConfigKey.TLS_VERIFICATION_MODE]: (fields) => + tlsValueToStringFormatter(fields[ConfigKey.TLS_VERIFICATION_MODE]), + [ConfigKey.TLS_VERSION]: (fields) => tlsArrayToYamlFormatter(fields[ConfigKey.TLS_VERSION]), }; // only add tls settings if they are enabled by the user and isEnabled is true diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/tls/normalizers.ts index 6398362220de1b..a4cf9f280e9a72 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tls/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/tls/normalizers.ts @@ -5,40 +5,40 @@ * 2.0. */ -import { ITLSFields, ConfigKeys } from '../types'; +import { TLSFields, ConfigKey } from '../types'; import { Normalizer } from '../common/normalizers'; import { defaultTLSFields } from '../contexts'; -type TLSNormalizerMap = Record; +type TLSNormalizerMap = Record; export const tlsNormalizers: TLSNormalizerMap = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: (fields) => + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: (fields) => tlsJsonToObjectNormalizer( - fields?.[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]?.value, - ConfigKeys.TLS_CERTIFICATE_AUTHORITIES + fields?.[ConfigKey.TLS_CERTIFICATE_AUTHORITIES]?.value, + ConfigKey.TLS_CERTIFICATE_AUTHORITIES ), - [ConfigKeys.TLS_CERTIFICATE]: (fields) => + [ConfigKey.TLS_CERTIFICATE]: (fields) => tlsJsonToObjectNormalizer( - fields?.[ConfigKeys.TLS_CERTIFICATE]?.value, - ConfigKeys.TLS_CERTIFICATE + fields?.[ConfigKey.TLS_CERTIFICATE]?.value, + ConfigKey.TLS_CERTIFICATE ), - [ConfigKeys.TLS_KEY]: (fields) => - tlsJsonToObjectNormalizer(fields?.[ConfigKeys.TLS_KEY]?.value, ConfigKeys.TLS_KEY), - [ConfigKeys.TLS_KEY_PASSPHRASE]: (fields) => + [ConfigKey.TLS_KEY]: (fields) => + tlsJsonToObjectNormalizer(fields?.[ConfigKey.TLS_KEY]?.value, ConfigKey.TLS_KEY), + [ConfigKey.TLS_KEY_PASSPHRASE]: (fields) => tlsStringToObjectNormalizer( - fields?.[ConfigKeys.TLS_KEY_PASSPHRASE]?.value, - ConfigKeys.TLS_KEY_PASSPHRASE + fields?.[ConfigKey.TLS_KEY_PASSPHRASE]?.value, + ConfigKey.TLS_KEY_PASSPHRASE ), - [ConfigKeys.TLS_VERIFICATION_MODE]: (fields) => + [ConfigKey.TLS_VERIFICATION_MODE]: (fields) => tlsStringToObjectNormalizer( - fields?.[ConfigKeys.TLS_VERIFICATION_MODE]?.value, - ConfigKeys.TLS_VERIFICATION_MODE + fields?.[ConfigKey.TLS_VERIFICATION_MODE]?.value, + ConfigKey.TLS_VERIFICATION_MODE ), - [ConfigKeys.TLS_VERSION]: (fields) => - tlsJsonToObjectNormalizer(fields?.[ConfigKeys.TLS_VERSION]?.value, ConfigKeys.TLS_VERSION), + [ConfigKey.TLS_VERSION]: (fields) => + tlsJsonToObjectNormalizer(fields?.[ConfigKey.TLS_VERSION]?.value, ConfigKey.TLS_VERSION), }; -export const tlsStringToObjectNormalizer = (value: string = '', key: keyof ITLSFields) => +export const tlsStringToObjectNormalizer = (value: string = '', key: keyof TLSFields) => value ?? defaultTLSFields[key]; -export const tlsJsonToObjectNormalizer = (value: string = '', key: keyof ITLSFields) => +export const tlsJsonToObjectNormalizer = (value: string = '', key: keyof TLSFields) => value ? JSON.parse(value) : defaultTLSFields[key]; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.test.tsx index 1c9c4f4e69f439..8f38669976ef4f 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { fireEvent } from '@testing-library/react'; import { render } from '../../lib/helper/rtl_helpers'; import { TLSFields } from './tls_fields'; -import { ConfigKeys, VerificationMode } from './types'; +import { ConfigKey, VerificationMode } from './types'; import { TLSFieldsContextProvider, PolicyConfigContextProvider, @@ -52,31 +52,31 @@ describe('', () => { const verificationMode = getByLabelText('Verification mode') as HTMLInputElement; const newValues = { - [ConfigKeys.TLS_CERTIFICATE]: 'sampleClientCertificate', - [ConfigKeys.TLS_KEY]: 'sampleClientKey', - [ConfigKeys.TLS_KEY_PASSPHRASE]: 'sampleClientKeyPassphrase', - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: 'sampleCertificateAuthorities', - [ConfigKeys.TLS_VERIFICATION_MODE]: VerificationMode.NONE, + [ConfigKey.TLS_CERTIFICATE]: 'sampleClientCertificate', + [ConfigKey.TLS_KEY]: 'sampleClientKey', + [ConfigKey.TLS_KEY_PASSPHRASE]: 'sampleClientKeyPassphrase', + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: 'sampleCertificateAuthorities', + [ConfigKey.TLS_VERIFICATION_MODE]: VerificationMode.NONE, }; fireEvent.change(clientCertificate, { - target: { value: newValues[ConfigKeys.TLS_CERTIFICATE] }, + target: { value: newValues[ConfigKey.TLS_CERTIFICATE] }, }); - fireEvent.change(clientKey, { target: { value: newValues[ConfigKeys.TLS_KEY] } }); + fireEvent.change(clientKey, { target: { value: newValues[ConfigKey.TLS_KEY] } }); fireEvent.change(clientKeyPassphrase, { - target: { value: newValues[ConfigKeys.TLS_KEY_PASSPHRASE] }, + target: { value: newValues[ConfigKey.TLS_KEY_PASSPHRASE] }, }); fireEvent.change(certificateAuthorities, { - target: { value: newValues[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES] }, + target: { value: newValues[ConfigKey.TLS_CERTIFICATE_AUTHORITIES] }, }); fireEvent.change(verificationMode, { - target: { value: newValues[ConfigKeys.TLS_VERIFICATION_MODE] }, + target: { value: newValues[ConfigKey.TLS_VERIFICATION_MODE] }, }); - expect(clientCertificate.value).toEqual(newValues[ConfigKeys.TLS_CERTIFICATE]); - expect(clientKey.value).toEqual(newValues[ConfigKeys.TLS_KEY]); - expect(certificateAuthorities.value).toEqual(newValues[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]); - expect(verificationMode.value).toEqual(newValues[ConfigKeys.TLS_VERIFICATION_MODE]); + expect(clientCertificate.value).toEqual(newValues[ConfigKey.TLS_CERTIFICATE]); + expect(clientKey.value).toEqual(newValues[ConfigKey.TLS_KEY]); + expect(certificateAuthorities.value).toEqual(newValues[ConfigKey.TLS_CERTIFICATE_AUTHORITIES]); + expect(verificationMode.value).toEqual(newValues[ConfigKey.TLS_VERIFICATION_MODE]); }); it('shows warning when verification mode is set to none', () => { diff --git a/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.tsx index e33b4ef3fbb1b6..8b627929731155 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/tls_fields.tsx @@ -10,7 +10,7 @@ import React, { useCallback, useEffect } from 'react'; import { TLSOptions, TLSConfig } from './common/tls_options'; import { useTLSFieldsContext, usePolicyConfigContext } from './contexts'; -import { ConfigKeys } from './types'; +import { ConfigKey } from './types'; export const TLSFields = () => { const { defaultValues, setFields } = useTLSFieldsContext(); @@ -19,12 +19,12 @@ export const TLSFields = () => { const handleOnChange = useCallback( (tlsConfig: TLSConfig) => { setFields({ - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: tlsConfig.certificateAuthorities, - [ConfigKeys.TLS_CERTIFICATE]: tlsConfig.certificate, - [ConfigKeys.TLS_KEY]: tlsConfig.key, - [ConfigKeys.TLS_KEY_PASSPHRASE]: tlsConfig.keyPassphrase, - [ConfigKeys.TLS_VERIFICATION_MODE]: tlsConfig.verificationMode, - [ConfigKeys.TLS_VERSION]: tlsConfig.version, + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: tlsConfig.certificateAuthorities, + [ConfigKey.TLS_CERTIFICATE]: tlsConfig.certificate, + [ConfigKey.TLS_KEY]: tlsConfig.key, + [ConfigKey.TLS_KEY_PASSPHRASE]: tlsConfig.keyPassphrase, + [ConfigKey.TLS_VERIFICATION_MODE]: tlsConfig.verificationMode, + [ConfigKey.TLS_VERSION]: tlsConfig.version, }); }, [setFields] @@ -33,12 +33,12 @@ export const TLSFields = () => { useEffect(() => { if (!isTLSEnabled) { setFields({ - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: undefined, - [ConfigKeys.TLS_CERTIFICATE]: undefined, - [ConfigKeys.TLS_KEY]: undefined, - [ConfigKeys.TLS_KEY_PASSPHRASE]: undefined, - [ConfigKeys.TLS_VERIFICATION_MODE]: undefined, - [ConfigKeys.TLS_VERSION]: undefined, + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: undefined, + [ConfigKey.TLS_CERTIFICATE]: undefined, + [ConfigKey.TLS_KEY]: undefined, + [ConfigKey.TLS_KEY_PASSPHRASE]: undefined, + [ConfigKey.TLS_VERIFICATION_MODE]: undefined, + [ConfigKey.TLS_VERSION]: undefined, }); } }, [setFields, isTLSEnabled]); @@ -46,12 +46,12 @@ export const TLSFields = () => { return isTLSEnabled ? ( ; - [ConfigKeys.RESPONSE_HEADERS_INDEX]: boolean; - [ConfigKeys.RESPONSE_STATUS_CHECK]: string[]; - [ConfigKeys.REQUEST_BODY_CHECK]: { value: string; type: Mode }; - [ConfigKeys.REQUEST_HEADERS_CHECK]: Record; - [ConfigKeys.REQUEST_METHOD_CHECK]: string; - [ConfigKeys.USERNAME]: string; -} - -export interface ITCPAdvancedFields { - [ConfigKeys.PROXY_URL]: string; - [ConfigKeys.PROXY_USE_LOCAL_RESOLVER]: boolean; - [ConfigKeys.RESPONSE_RECEIVE_CHECK]: string; - [ConfigKeys.REQUEST_SEND_CHECK]: string; -} - -export type IBrowserSimpleFields = { - [ConfigKeys.METADATA]: Metadata; - [ConfigKeys.SOURCE_INLINE]: string; - [ConfigKeys.SOURCE_ZIP_URL]: string; - [ConfigKeys.SOURCE_ZIP_FOLDER]: string; - [ConfigKeys.SOURCE_ZIP_USERNAME]: string; - [ConfigKeys.SOURCE_ZIP_PASSWORD]: string; - [ConfigKeys.SOURCE_ZIP_PROXY_URL]: string; - [ConfigKeys.PARAMS]: string; -} & ICommonFields & - IZipUrlTLSFields; - -export interface IBrowserAdvancedFields { - [ConfigKeys.SYNTHETICS_ARGS]: string[]; - [ConfigKeys.SCREENSHOTS]: string; - [ConfigKeys.JOURNEY_FILTERS_MATCH]: string; - [ConfigKeys.JOURNEY_FILTERS_TAGS]: string[]; - [ConfigKeys.IGNORE_HTTPS_ERRORS]: boolean; - [ConfigKeys.IS_THROTTLING_ENABLED]: boolean; - [ConfigKeys.DOWNLOAD_SPEED]: string; - [ConfigKeys.UPLOAD_SPEED]: string; - [ConfigKeys.LATENCY]: string; - [ConfigKeys.THROTTLING_CONFIG]: string; -} - -export type HTTPFields = IHTTPSimpleFields & IHTTPAdvancedFields & ITLSFields; -export type TCPFields = ITCPSimpleFields & ITCPAdvancedFields & ITLSFields; -export type ICMPFields = IICMPSimpleFields; -export type BrowserFields = IBrowserSimpleFields & IBrowserAdvancedFields; - -export type ICustomFields = HTTPFields & - TCPFields & - ICMPFields & - BrowserFields & { - [ConfigKeys.NAME]: string; - }; - -export type Monitor = Partial; +import { + HTTPFields, + TCPFields, + ICMPFields, + BrowserFields, + ConfigKey, + ContentType, + DataStream, + MonitorFields, + Mode, + ThrottlingConfigKey, + ThrottlingSuffix, + ThrottlingSuffixType, +} from '../../../common/runtime_types/monitor_management'; +export * from '../../../common/runtime_types/monitor_management'; + +export type Monitor = Partial; export interface PolicyConfig { [DataStream.HTTP]: HTTPFields; @@ -256,9 +29,9 @@ export interface PolicyConfig { [DataStream.BROWSER]: BrowserFields; } -export type Validator = (config: Partial) => boolean; +export type Validator = (config: Partial) => boolean; -export type Validation = Partial>; +export type Validation = Partial>; export const contentTypesToMode = { [ContentType.FORM]: Mode.FORM, @@ -267,13 +40,8 @@ export const contentTypesToMode = { [ContentType.XML]: Mode.XML, }; -export type ThrottlingConfigKey = - | ConfigKeys.DOWNLOAD_SPEED - | ConfigKeys.UPLOAD_SPEED - | ConfigKeys.LATENCY; - -export const configKeyToThrottlingSuffix: Record = { - [ConfigKeys.DOWNLOAD_SPEED]: ThrottlingSuffix.DOWNLOAD, - [ConfigKeys.UPLOAD_SPEED]: ThrottlingSuffix.UPLOAD, - [ConfigKeys.LATENCY]: ThrottlingSuffix.LATENCY, +export const configKeyToThrottlingSuffix: Record = { + [ConfigKey.DOWNLOAD_SPEED]: ThrottlingSuffix.DOWNLOAD, + [ConfigKey.UPLOAD_SPEED]: ThrottlingSuffix.UPLOAD, + [ConfigKey.LATENCY]: ThrottlingSuffix.LATENCY, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx b/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx index 5191297119440e..96611d8305f89e 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/validation.tsx @@ -4,14 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { - ConfigKeys, - DataStream, - ICustomFields, - Validator, - Validation, - ScheduleUnit, -} from './types'; +import { ConfigKey, DataStream, ScheduleUnit, MonitorFields, Validator, Validation } from './types'; export const digitsOnly = /^[0-9]*$/g; export const includesValidPort = /[^\:]+:[0-9]{1,5}$/g; @@ -57,13 +50,13 @@ const validateTimeout = ({ // validation functions return true when invalid const validateCommon: ValidationLibrary = { - [ConfigKeys.SCHEDULE]: ({ [ConfigKeys.SCHEDULE]: value }) => { - const { number, unit } = value as ICustomFields[ConfigKeys.SCHEDULE]; + [ConfigKey.SCHEDULE]: ({ [ConfigKey.SCHEDULE]: value }) => { + const { number, unit } = value as MonitorFields[ConfigKey.SCHEDULE]; const parsedFloat = parseFloat(number); return !parsedFloat || !unit || parsedFloat < 1; }, - [ConfigKeys.TIMEOUT]: ({ [ConfigKeys.TIMEOUT]: timeout, [ConfigKeys.SCHEDULE]: schedule }) => { - const { number, unit } = schedule as ICustomFields[ConfigKeys.SCHEDULE]; + [ConfigKey.TIMEOUT]: ({ [ConfigKey.TIMEOUT]: timeout, [ConfigKey.SCHEDULE]: schedule }) => { + const { number, unit } = schedule as MonitorFields[ConfigKey.SCHEDULE]; return ( !timeout || @@ -78,38 +71,38 @@ const validateCommon: ValidationLibrary = { }; const validateHTTP: ValidationLibrary = { - [ConfigKeys.RESPONSE_STATUS_CHECK]: ({ [ConfigKeys.RESPONSE_STATUS_CHECK]: value }) => { - const statusCodes = value as ICustomFields[ConfigKeys.RESPONSE_STATUS_CHECK]; + [ConfigKey.RESPONSE_STATUS_CHECK]: ({ [ConfigKey.RESPONSE_STATUS_CHECK]: value }) => { + const statusCodes = value as MonitorFields[ConfigKey.RESPONSE_STATUS_CHECK]; return statusCodes.length ? statusCodes.some((code) => !`${code}`.match(digitsOnly)) : false; }, - [ConfigKeys.RESPONSE_HEADERS_CHECK]: ({ [ConfigKeys.RESPONSE_HEADERS_CHECK]: value }) => { - const headers = value as ICustomFields[ConfigKeys.RESPONSE_HEADERS_CHECK]; - return validateHeaders(headers); + [ConfigKey.RESPONSE_HEADERS_CHECK]: ({ [ConfigKey.RESPONSE_HEADERS_CHECK]: value }) => { + const headers = value as MonitorFields[ConfigKey.RESPONSE_HEADERS_CHECK]; + return validateHeaders(headers); }, - [ConfigKeys.REQUEST_HEADERS_CHECK]: ({ [ConfigKeys.REQUEST_HEADERS_CHECK]: value }) => { - const headers = value as ICustomFields[ConfigKeys.REQUEST_HEADERS_CHECK]; - return validateHeaders(headers); + [ConfigKey.REQUEST_HEADERS_CHECK]: ({ [ConfigKey.REQUEST_HEADERS_CHECK]: value }) => { + const headers = value as MonitorFields[ConfigKey.REQUEST_HEADERS_CHECK]; + return validateHeaders(headers); }, - [ConfigKeys.MAX_REDIRECTS]: ({ [ConfigKeys.MAX_REDIRECTS]: value }) => + [ConfigKey.MAX_REDIRECTS]: ({ [ConfigKey.MAX_REDIRECTS]: value }) => (!!value && !`${value}`.match(digitsOnly)) || - parseFloat(value as ICustomFields[ConfigKeys.MAX_REDIRECTS]) < 0, - [ConfigKeys.URLS]: ({ [ConfigKeys.URLS]: value }) => !value, + parseFloat(value as MonitorFields[ConfigKey.MAX_REDIRECTS]) < 0, + [ConfigKey.URLS]: ({ [ConfigKey.URLS]: value }) => !value, ...validateCommon, }; const validateTCP: Record = { - [ConfigKeys.HOSTS]: ({ [ConfigKeys.HOSTS]: value }) => { + [ConfigKey.HOSTS]: ({ [ConfigKey.HOSTS]: value }) => { return !value || !`${value}`.match(includesValidPort); }, ...validateCommon, }; const validateICMP: ValidationLibrary = { - [ConfigKeys.HOSTS]: ({ [ConfigKeys.HOSTS]: value }) => !value, - [ConfigKeys.WAIT]: ({ [ConfigKeys.WAIT]: value }) => + [ConfigKey.HOSTS]: ({ [ConfigKey.HOSTS]: value }) => !value, + [ConfigKey.WAIT]: ({ [ConfigKey.WAIT]: value }) => !!value && !digitsOnly.test(`${value}`) && - parseFloat(value as ICustomFields[ConfigKeys.WAIT]) < 0, + parseFloat(value as MonitorFields[ConfigKey.WAIT]) < 0, ...validateCommon, }; @@ -121,19 +114,19 @@ const validateThrottleValue = (speed: string | undefined, allowZero?: boolean) = const validateBrowser: ValidationLibrary = { ...validateCommon, - [ConfigKeys.SOURCE_ZIP_URL]: ({ - [ConfigKeys.SOURCE_ZIP_URL]: zipUrl, - [ConfigKeys.SOURCE_INLINE]: inlineScript, + [ConfigKey.SOURCE_ZIP_URL]: ({ + [ConfigKey.SOURCE_ZIP_URL]: zipUrl, + [ConfigKey.SOURCE_INLINE]: inlineScript, }) => !zipUrl && !inlineScript, - [ConfigKeys.SOURCE_INLINE]: ({ - [ConfigKeys.SOURCE_ZIP_URL]: zipUrl, - [ConfigKeys.SOURCE_INLINE]: inlineScript, + [ConfigKey.SOURCE_INLINE]: ({ + [ConfigKey.SOURCE_ZIP_URL]: zipUrl, + [ConfigKey.SOURCE_INLINE]: inlineScript, }) => !zipUrl && !inlineScript, - [ConfigKeys.DOWNLOAD_SPEED]: ({ [ConfigKeys.DOWNLOAD_SPEED]: downloadSpeed }) => + [ConfigKey.DOWNLOAD_SPEED]: ({ [ConfigKey.DOWNLOAD_SPEED]: downloadSpeed }) => validateThrottleValue(downloadSpeed), - [ConfigKeys.UPLOAD_SPEED]: ({ [ConfigKeys.UPLOAD_SPEED]: uploadSpeed }) => + [ConfigKey.UPLOAD_SPEED]: ({ [ConfigKey.UPLOAD_SPEED]: uploadSpeed }) => validateThrottleValue(uploadSpeed), - [ConfigKeys.LATENCY]: ({ [ConfigKeys.LATENCY]: latency }) => validateThrottleValue(latency, true), + [ConfigKey.LATENCY]: ({ [ConfigKey.LATENCY]: latency }) => validateThrottleValue(latency, true), }; export type ValidateDictionary = Record; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts index a4af2333333f69..a2792e7e8e3178 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/browser.ts @@ -5,36 +5,36 @@ * 2.0. */ -import { BrowserFields, ConfigKeys } from '../../fleet_package/types'; +import { BrowserFields, ConfigKey } from '../../fleet_package/types'; import { Formatter, commonFormatters, objectFormatter, arrayFormatter } from './common'; export type BrowserFormatMap = Record; export const browserFormatters: BrowserFormatMap = { - [ConfigKeys.METADATA]: (fields) => objectFormatter(fields[ConfigKeys.METADATA]), - [ConfigKeys.SOURCE_ZIP_URL]: null, - [ConfigKeys.SOURCE_ZIP_USERNAME]: null, - [ConfigKeys.SOURCE_ZIP_PASSWORD]: null, - [ConfigKeys.SOURCE_ZIP_FOLDER]: null, - [ConfigKeys.SOURCE_ZIP_PROXY_URL]: null, - [ConfigKeys.SOURCE_INLINE]: null, - [ConfigKeys.PARAMS]: null, - [ConfigKeys.SCREENSHOTS]: null, - [ConfigKeys.SYNTHETICS_ARGS]: (fields) => null, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: null, - [ConfigKeys.ZIP_URL_TLS_CERTIFICATE]: null, - [ConfigKeys.ZIP_URL_TLS_KEY]: null, - [ConfigKeys.ZIP_URL_TLS_KEY_PASSPHRASE]: null, - [ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE]: null, - [ConfigKeys.IS_THROTTLING_ENABLED]: null, - [ConfigKeys.THROTTLING_CONFIG]: null, - [ConfigKeys.DOWNLOAD_SPEED]: null, - [ConfigKeys.UPLOAD_SPEED]: null, - [ConfigKeys.LATENCY]: null, - [ConfigKeys.ZIP_URL_TLS_VERSION]: (fields) => - arrayFormatter(fields[ConfigKeys.ZIP_URL_TLS_VERSION]), - [ConfigKeys.JOURNEY_FILTERS_MATCH]: null, - [ConfigKeys.JOURNEY_FILTERS_TAGS]: null, - [ConfigKeys.IGNORE_HTTPS_ERRORS]: null, + [ConfigKey.METADATA]: (fields) => objectFormatter(fields[ConfigKey.METADATA]), + [ConfigKey.SOURCE_ZIP_URL]: null, + [ConfigKey.SOURCE_ZIP_USERNAME]: null, + [ConfigKey.SOURCE_ZIP_PASSWORD]: null, + [ConfigKey.SOURCE_ZIP_FOLDER]: null, + [ConfigKey.SOURCE_ZIP_PROXY_URL]: null, + [ConfigKey.SOURCE_INLINE]: null, + [ConfigKey.PARAMS]: null, + [ConfigKey.SCREENSHOTS]: null, + [ConfigKey.SYNTHETICS_ARGS]: (fields) => null, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: null, + [ConfigKey.ZIP_URL_TLS_CERTIFICATE]: null, + [ConfigKey.ZIP_URL_TLS_KEY]: null, + [ConfigKey.ZIP_URL_TLS_KEY_PASSPHRASE]: null, + [ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE]: null, + [ConfigKey.IS_THROTTLING_ENABLED]: null, + [ConfigKey.THROTTLING_CONFIG]: null, + [ConfigKey.DOWNLOAD_SPEED]: null, + [ConfigKey.UPLOAD_SPEED]: null, + [ConfigKey.LATENCY]: null, + [ConfigKey.ZIP_URL_TLS_VERSION]: (fields) => + arrayFormatter(fields[ConfigKey.ZIP_URL_TLS_VERSION]), + [ConfigKey.JOURNEY_FILTERS_MATCH]: null, + [ConfigKey.JOURNEY_FILTERS_TAGS]: null, + [ConfigKey.IGNORE_HTTPS_ERRORS]: null, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/common.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/common.ts index 92d2b28f1283d1..da50dfd4b08604 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/common.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/common.ts @@ -5,22 +5,22 @@ * 2.0. */ -import { ICommonFields, ICustomFields, ConfigKeys } from '../../fleet_package/types'; +import { CommonFields, MonitorFields, ConfigKey } from '../../fleet_package/types'; export type Formatter = | null - | ((fields: Partial) => string | string[] | Record | null); + | ((fields: Partial) => string | string[] | Record | null); -export type CommonFormatMap = Record; +export type CommonFormatMap = Record; export const commonFormatters: CommonFormatMap = { - [ConfigKeys.NAME]: null, - [ConfigKeys.MONITOR_TYPE]: null, - [ConfigKeys.SCHEDULE]: (fields) => - `@every ${fields[ConfigKeys.SCHEDULE]?.number}${fields[ConfigKeys.SCHEDULE]?.unit}`, - [ConfigKeys.APM_SERVICE_NAME]: null, - [ConfigKeys.TAGS]: null, - [ConfigKeys.TIMEOUT]: (fields) => secondsToCronFormatter(fields[ConfigKeys.TIMEOUT]), + [ConfigKey.NAME]: null, + [ConfigKey.MONITOR_TYPE]: null, + [ConfigKey.SCHEDULE]: (fields) => + `@every ${fields[ConfigKey.SCHEDULE]?.number}${fields[ConfigKey.SCHEDULE]?.unit}`, + [ConfigKey.APM_SERVICE_NAME]: null, + [ConfigKey.TAGS]: null, + [ConfigKey.TIMEOUT]: (fields) => secondsToCronFormatter(fields[ConfigKey.TIMEOUT]), }; export const arrayFormatter = (value: string[] = []) => (value.length ? value : null); diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/http.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/http.ts index 41e162cff2d05d..67a8bed8dc8b90 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/http.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/http.ts @@ -5,33 +5,33 @@ * 2.0. */ -import { HTTPFields, ConfigKeys } from '../../fleet_package/types'; +import { HTTPFields, ConfigKey } from '../../fleet_package/types'; import { Formatter, commonFormatters, objectFormatter, arrayFormatter } from './common'; import { tlsFormatters } from './tls'; export type HTTPFormatMap = Record; export const httpFormatters: HTTPFormatMap = { - [ConfigKeys.METADATA]: (fields) => objectFormatter(fields[ConfigKeys.METADATA]), - [ConfigKeys.URLS]: null, - [ConfigKeys.MAX_REDIRECTS]: null, - [ConfigKeys.USERNAME]: null, - [ConfigKeys.PASSWORD]: null, - [ConfigKeys.PROXY_URL]: null, - [ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]: (fields) => - arrayFormatter(fields[ConfigKeys.RESPONSE_BODY_CHECK_NEGATIVE]), - [ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]: (fields) => - arrayFormatter(fields[ConfigKeys.RESPONSE_BODY_CHECK_POSITIVE]), - [ConfigKeys.RESPONSE_BODY_INDEX]: null, - [ConfigKeys.RESPONSE_HEADERS_CHECK]: (fields) => - objectFormatter(fields[ConfigKeys.RESPONSE_HEADERS_CHECK]), - [ConfigKeys.RESPONSE_HEADERS_INDEX]: null, - [ConfigKeys.RESPONSE_STATUS_CHECK]: (fields) => - arrayFormatter(fields[ConfigKeys.RESPONSE_STATUS_CHECK]), - [ConfigKeys.REQUEST_BODY_CHECK]: (fields) => fields[ConfigKeys.REQUEST_BODY_CHECK]?.value || null, - [ConfigKeys.REQUEST_HEADERS_CHECK]: (fields) => - objectFormatter(fields[ConfigKeys.REQUEST_HEADERS_CHECK]), - [ConfigKeys.REQUEST_METHOD_CHECK]: null, + [ConfigKey.METADATA]: (fields) => objectFormatter(fields[ConfigKey.METADATA]), + [ConfigKey.URLS]: null, + [ConfigKey.MAX_REDIRECTS]: null, + [ConfigKey.USERNAME]: null, + [ConfigKey.PASSWORD]: null, + [ConfigKey.PROXY_URL]: null, + [ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]: (fields) => + arrayFormatter(fields[ConfigKey.RESPONSE_BODY_CHECK_NEGATIVE]), + [ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]: (fields) => + arrayFormatter(fields[ConfigKey.RESPONSE_BODY_CHECK_POSITIVE]), + [ConfigKey.RESPONSE_BODY_INDEX]: null, + [ConfigKey.RESPONSE_HEADERS_CHECK]: (fields) => + objectFormatter(fields[ConfigKey.RESPONSE_HEADERS_CHECK]), + [ConfigKey.RESPONSE_HEADERS_INDEX]: null, + [ConfigKey.RESPONSE_STATUS_CHECK]: (fields) => + arrayFormatter(fields[ConfigKey.RESPONSE_STATUS_CHECK]), + [ConfigKey.REQUEST_BODY_CHECK]: (fields) => fields[ConfigKey.REQUEST_BODY_CHECK]?.value || null, + [ConfigKey.REQUEST_HEADERS_CHECK]: (fields) => + objectFormatter(fields[ConfigKey.REQUEST_HEADERS_CHECK]), + [ConfigKey.REQUEST_METHOD_CHECK]: null, ...tlsFormatters, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/icmp.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/icmp.ts index 841f9863094829..891ee07c3a2458 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/icmp.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/icmp.ts @@ -5,13 +5,13 @@ * 2.0. */ -import { ICMPFields, ConfigKeys } from '../../fleet_package/types'; +import { ICMPFields, ConfigKey } from '../../fleet_package/types'; import { Formatter, commonFormatters, secondsToCronFormatter } from './common'; export type ICMPFormatMap = Record; export const icmpFormatters: ICMPFormatMap = { - [ConfigKeys.HOSTS]: null, - [ConfigKeys.WAIT]: (fields) => secondsToCronFormatter(fields[ConfigKeys.WAIT]), + [ConfigKey.HOSTS]: null, + [ConfigKey.WAIT]: (fields) => secondsToCronFormatter(fields[ConfigKey.WAIT]), ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/tcp.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/tcp.ts index cdf77307a6938d..065ac693bfcef1 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/tcp.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/tcp.ts @@ -5,19 +5,19 @@ * 2.0. */ -import { TCPFields, ConfigKeys } from '../../fleet_package/types'; +import { TCPFields, ConfigKey } from '../../fleet_package/types'; import { Formatter, commonFormatters } from './common'; import { tlsFormatters } from './tls'; export type TCPFormatMap = Record; export const tcpFormatters: TCPFormatMap = { - [ConfigKeys.METADATA]: null, - [ConfigKeys.HOSTS]: null, - [ConfigKeys.PROXY_URL]: null, - [ConfigKeys.PROXY_USE_LOCAL_RESOLVER]: null, - [ConfigKeys.RESPONSE_RECEIVE_CHECK]: null, - [ConfigKeys.REQUEST_SEND_CHECK]: null, + [ConfigKey.METADATA]: null, + [ConfigKey.HOSTS]: null, + [ConfigKey.PROXY_URL]: null, + [ConfigKey.PROXY_USE_LOCAL_RESOLVER]: null, + [ConfigKey.RESPONSE_RECEIVE_CHECK]: null, + [ConfigKey.REQUEST_SEND_CHECK]: null, ...tlsFormatters, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/formatters/tls.ts b/x-pack/plugins/uptime/public/components/monitor_management/formatters/tls.ts index 5f7ce27637f3e2..9de353677649de 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/formatters/tls.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/formatters/tls.ts @@ -5,16 +5,16 @@ * 2.0. */ -import { ITLSFields, ConfigKeys } from '../../fleet_package/types'; +import { TLSFields, ConfigKey } from '../../fleet_package/types'; import { arrayFormatter, Formatter } from './common'; -type TLSFormatMap = Record; +type TLSFormatMap = Record; export const tlsFormatters: TLSFormatMap = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: null, - [ConfigKeys.TLS_CERTIFICATE]: null, - [ConfigKeys.TLS_KEY]: null, - [ConfigKeys.TLS_KEY_PASSPHRASE]: null, - [ConfigKeys.TLS_VERIFICATION_MODE]: null, - [ConfigKeys.TLS_VERSION]: (fields) => arrayFormatter(fields[ConfigKeys.TLS_VERSION]), + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: null, + [ConfigKey.TLS_CERTIFICATE]: null, + [ConfigKey.TLS_KEY]: null, + [ConfigKey.TLS_KEY_PASSPHRASE]: null, + [ConfigKey.TLS_VERIFICATION_MODE]: null, + [ConfigKey.TLS_VERSION]: (fields) => arrayFormatter(fields[ConfigKey.TLS_VERSION]), }; diff --git a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_format_monitor.ts b/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_format_monitor.ts index 9027aa45204184..c895965700c458 100644 --- a/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_format_monitor.ts +++ b/x-pack/plugins/uptime/public/components/monitor_management/hooks/use_format_monitor.ts @@ -6,18 +6,18 @@ */ import { useEffect, useRef, useState } from 'react'; import { omitBy, isNil } from 'lodash'; -import { ConfigKeys, DataStream, Validation, ICustomFields } from '../../fleet_package/types'; +import { ConfigKey, DataStream, Validation, MonitorFields } from '../../fleet_package/types'; import { formatters } from '../formatters'; interface Props { monitorType: DataStream; - defaultConfig: Partial; - config: Partial; + defaultConfig: Partial; + config: Partial; validate: Record; } -const formatMonitorConfig = (configKeys: ConfigKeys[], config: Partial) => { - const formattedMonitor = {} as Record; +const formatMonitorConfig = (configKeys: ConfigKey[], config: Partial) => { + const formattedMonitor = {} as Record; configKeys.forEach((key) => { const value = config[key] ?? null; @@ -28,19 +28,19 @@ const formatMonitorConfig = (configKeys: ConfigKeys[], config: Partial; + return omitBy(formattedMonitor, isNil) as Partial; }; export const useFormatMonitor = ({ monitorType, defaultConfig, config, validate }: Props) => { - const [formattedMonitor, setFormattedMonitor] = useState>( - formatMonitorConfig(Object.keys(config) as ConfigKeys[], config) + const [formattedMonitor, setFormattedMonitor] = useState>( + formatMonitorConfig(Object.keys(config) as ConfigKey[], config) ); const [isValid, setIsValid] = useState(false); - const currentConfig = useRef>(defaultConfig); + const currentConfig = useRef>(defaultConfig); useEffect(() => { - const configKeys = Object.keys(config) as ConfigKeys[]; - const validationKeys = Object.keys(validate[monitorType]) as ConfigKeys[]; + const configKeys = Object.keys(config) as ConfigKey[]; + const validationKeys = Object.keys(validate[monitorType]) as ConfigKey[]; const configDidUpdate = configKeys.some((key) => config[key] !== currentConfig.current[key]); const isValidT = !!config.name && !validationKeys.find((key) => validate[monitorType]?.[key]?.(config)); diff --git a/x-pack/plugins/uptime/public/pages/edit_monitor.tsx b/x-pack/plugins/uptime/public/pages/edit_monitor.tsx index 965639bd121452..724d9cdc44fc8c 100644 --- a/x-pack/plugins/uptime/public/pages/edit_monitor.tsx +++ b/x-pack/plugins/uptime/public/pages/edit_monitor.tsx @@ -7,9 +7,9 @@ import React, { useMemo } from 'react'; import { - ConfigKeys, - ICustomFields, - ITLSFields, + ConfigKey, + MonitorFields, + TLSFields, PolicyConfig, DataStream, } from '../components/fleet_package/types'; @@ -30,40 +30,40 @@ export const EditMonitorPage: React.FC = () => { tlsConfig: defaultTLSConfig, } = useMemo(() => { /* TODO: fetch current monitor to be edited from saved objects based on url param */ - const monitor = {} as Record; // fetch + const monitor = {} as Record; // fetch let enableTLS = false; let enableZipUrlTLS = false; const getDefaultConfig = () => { - const type: DataStream = monitor[ConfigKeys.MONITOR_TYPE] as DataStream; + const type: DataStream = monitor[ConfigKey.MONITOR_TYPE] as DataStream; - const configKeys: ConfigKeys[] = Object.values(ConfigKeys) || ([] as ConfigKeys[]); - const formattedDefaultConfigForMonitorType: ICustomFields = configKeys.reduce( - (acc: ICustomFields, key: ConfigKeys) => { + const configKeys: ConfigKey[] = Object.values(ConfigKey) || ([] as ConfigKey[]); + const formattedDefaultConfigForMonitorType: MonitorFields = configKeys.reduce( + (acc: MonitorFields, key: ConfigKey) => { return { ...acc, key, }; }, - {} as ICustomFields + {} as MonitorFields ); - const tlsConfig: ITLSFields = { - [ConfigKeys.TLS_CERTIFICATE_AUTHORITIES]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_CERTIFICATE_AUTHORITIES], - [ConfigKeys.TLS_CERTIFICATE]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_CERTIFICATE], - [ConfigKeys.TLS_KEY]: formattedDefaultConfigForMonitorType[ConfigKeys.TLS_KEY], - [ConfigKeys.TLS_KEY_PASSPHRASE]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_KEY_PASSPHRASE], - [ConfigKeys.TLS_VERIFICATION_MODE]: - formattedDefaultConfigForMonitorType[ConfigKeys.TLS_VERIFICATION_MODE], - [ConfigKeys.TLS_VERSION]: formattedDefaultConfigForMonitorType[ConfigKeys.TLS_VERSION], + const tlsConfig: TLSFields = { + [ConfigKey.TLS_CERTIFICATE_AUTHORITIES]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_CERTIFICATE_AUTHORITIES], + [ConfigKey.TLS_CERTIFICATE]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_CERTIFICATE], + [ConfigKey.TLS_KEY]: formattedDefaultConfigForMonitorType[ConfigKey.TLS_KEY], + [ConfigKey.TLS_KEY_PASSPHRASE]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_KEY_PASSPHRASE], + [ConfigKey.TLS_VERIFICATION_MODE]: + formattedDefaultConfigForMonitorType[ConfigKey.TLS_VERIFICATION_MODE], + [ConfigKey.TLS_VERSION]: formattedDefaultConfigForMonitorType[ConfigKey.TLS_VERSION], }; - enableTLS = Boolean(formattedDefaultConfigForMonitorType[ConfigKeys.TLS_VERIFICATION_MODE]); + enableTLS = Boolean(formattedDefaultConfigForMonitorType[ConfigKey.TLS_VERIFICATION_MODE]); enableZipUrlTLS = Boolean( - formattedDefaultConfigForMonitorType[ConfigKeys.ZIP_URL_TLS_VERIFICATION_MODE] + formattedDefaultConfigForMonitorType[ConfigKey.ZIP_URL_TLS_VERIFICATION_MODE] ); const formattedDefaultConfig: Partial = { From 70a1b3892a6d2a3d57cc9851b276087c29b6e1e3 Mon Sep 17 00:00:00 2001 From: Orhan Toy Date: Thu, 2 Dec 2021 15:52:41 +0100 Subject: [PATCH 058/126] [App Search, Crawler] Use consistent casing for validation step titles (#120064) --- .../components/add_domain/add_domain_logic.test.ts | 12 ++++++------ .../components/add_domain/add_domain_validation.tsx | 2 +- .../crawler/components/add_domain/utils.ts | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts index 4b229b3687174c..466ccc61838f0c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts @@ -507,16 +507,16 @@ describe('AddDomainLogic', () => { networkConnectivity: { state: 'invalid', message: - 'Unable to establish a network connection because the "Initial Validation" check failed.', + 'Unable to establish a network connection because the "Initial validation" check failed.', }, indexingRestrictions: { state: 'invalid', message: - 'Unable to determine indexing restrictions because the "Network Connectivity" check failed.', + 'Unable to determine indexing restrictions because the "Network connectivity" check failed.', }, contentVerification: { state: 'invalid', - message: 'Unable to verify content because the "Indexing Restrictions" check failed.', + message: 'Unable to verify content because the "Indexing restrictions" check failed.', }, }); }); @@ -602,16 +602,16 @@ describe('AddDomainLogic', () => { networkConnectivity: { state: 'invalid', message: - 'Unable to establish a network connection because the "Initial Validation" check failed.', + 'Unable to establish a network connection because the "Initial validation" check failed.', }, indexingRestrictions: { state: 'invalid', message: - 'Unable to determine indexing restrictions because the "Network Connectivity" check failed.', + 'Unable to determine indexing restrictions because the "Network connectivity" check failed.', }, contentVerification: { state: 'invalid', - message: 'Unable to verify content because the "Indexing Restrictions" check failed.', + message: 'Unable to verify content because the "Indexing restrictions" check failed.', }, }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx index 8840b8d355864a..817c43df4f8b63 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_validation.tsx @@ -86,7 +86,7 @@ export const AddDomainValidation: React.FC = () => { label={i18n.translate( 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationLabel', { - defaultMessage: 'Content Verification', + defaultMessage: 'Content verification', } )} /> diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts index e5886a726f2616..1f744d5eabf9b0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts @@ -82,7 +82,7 @@ const allFailureResultChanges: CrawlerDomainValidationResultChange = { 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFailureMessage', { defaultMessage: - 'Unable to establish a network connection because the "Initial Validation" check failed.', + 'Unable to establish a network connection because the "Initial validation" check failed.', } ), }, @@ -92,7 +92,7 @@ const allFailureResultChanges: CrawlerDomainValidationResultChange = { 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFailureMessage', { defaultMessage: - 'Unable to determine indexing restrictions because the "Network Connectivity" check failed.', + 'Unable to determine indexing restrictions because the "Network connectivity" check failed.', } ), }, @@ -102,7 +102,7 @@ const allFailureResultChanges: CrawlerDomainValidationResultChange = { 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFailureMessage', { defaultMessage: - 'Unable to verify content because the "Indexing Restrictions" check failed.', + 'Unable to verify content because the "Indexing restrictions" check failed.', } ), }, From 8b762138091c4608b66cba2ffa63ab58f9481d6b Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Thu, 2 Dec 2021 17:11:06 +0200 Subject: [PATCH 059/126] [Storybook] Fixes Storybook is endlessly refreshed. (#120216) --- packages/kbn-storybook/src/lib/theme_switcher.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kbn-storybook/src/lib/theme_switcher.tsx b/packages/kbn-storybook/src/lib/theme_switcher.tsx index c06e57035819f2..3d6f7999545a0e 100644 --- a/packages/kbn-storybook/src/lib/theme_switcher.tsx +++ b/packages/kbn-storybook/src/lib/theme_switcher.tsx @@ -20,7 +20,7 @@ export function ThemeSwitcher() { const [globals, updateGlobals] = useGlobals(); const selectedTheme = globals.euiTheme; - if (!selectedTheme || selectedTheme === defaultTheme) { + if (!selectedTheme) { updateGlobals({ euiTheme: defaultTheme }); } From 482aae27686946364c3e6c0b11ea995223a557ce Mon Sep 17 00:00:00 2001 From: Kuldeep M Date: Thu, 2 Dec 2021 15:49:45 +0000 Subject: [PATCH 060/126] Workplace Search fix overview page spacing (#120224) --- .../views/content_sources/components/overview.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx index a33f5ec90e3a04..fd29b5f5909674 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/overview.tsx @@ -257,6 +257,7 @@ export const Overview: React.FC = () => { const groupsSummary = ( <> +
{GROUP_ACCESS_TITLE}
@@ -479,7 +480,6 @@ export const Overview: React.FC = () => { const syncTriggerCallout = ( -
{SOURCE_SYNCHRONIZATION_TITLE}
From 2c4dfde1740ea3456ce905cb8dcb48a4234e7b44 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Thu, 2 Dec 2021 08:01:01 -0800 Subject: [PATCH 061/126] [Fleet] Re-enable registry version check (#120045) * Re-enable registry version check * Update registry image * Use dockerized registry for base x-pack api integration and functional tests * Revert "Use dockerized registry for base x-pack api integration and functional tests" This reverts commit 2fd4ec17d486a584e729a277c96bca3b66f8971f. --- x-pack/plugins/apm/ftr_e2e/ftr_config_run.ts | 2 +- x-pack/plugins/fleet/server/index.ts | 3 +-- x-pack/plugins/fleet/server/services/epm/registry/index.ts | 3 +-- x-pack/test/fleet_api_integration/config.ts | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/apm/ftr_e2e/ftr_config_run.ts b/x-pack/plugins/apm/ftr_e2e/ftr_config_run.ts index a5a0b52e3fbef6..8fc87b49a66078 100644 --- a/x-pack/plugins/apm/ftr_e2e/ftr_config_run.ts +++ b/x-pack/plugins/apm/ftr_e2e/ftr_config_run.ts @@ -13,7 +13,7 @@ import { packageRegistryPort } from './ftr_config'; import { FtrProviderContext } from './ftr_provider_context'; export const dockerImage = - 'docker.elastic.co/package-registry/distribution@sha256:13d9996dd24161624784704e080f5f5b7f0ef34ff0d9259f8f05010ccae00058'; + 'docker.elastic.co/package-registry/distribution@sha256:de952debe048d903fc73e8a4472bb48bb95028d440cba852f21b863d47020c61'; async function ftrConfigRun({ readConfigFile }: FtrConfigProviderContext) { const kibanaConfig = await readConfigFile(require.resolve('./ftr_config.ts')); diff --git a/x-pack/plugins/fleet/server/index.ts b/x-pack/plugins/fleet/server/index.ts index 9fc0edd0b7cf81..8cbfa311081d23 100644 --- a/x-pack/plugins/fleet/server/index.ts +++ b/x-pack/plugins/fleet/server/index.ts @@ -94,8 +94,7 @@ export const config: PluginConfigDescriptor = { outputs: PreconfiguredOutputsSchema, agentIdVerificationEnabled: schema.boolean({ defaultValue: true }), developer: schema.object({ - // TODO: change default to false as soon as EPR issue fixed. Blocker for 8.0. - disableRegistryVersionCheck: schema.boolean({ defaultValue: true }), + disableRegistryVersionCheck: schema.boolean({ defaultValue: false }), }), }), }; diff --git a/x-pack/plugins/fleet/server/services/epm/registry/index.ts b/x-pack/plugins/fleet/server/services/epm/registry/index.ts index ff829eca5ec188..1b6e28a07f8e0b 100644 --- a/x-pack/plugins/fleet/server/services/epm/registry/index.ts +++ b/x-pack/plugins/fleet/server/services/epm/registry/index.ts @@ -138,9 +138,8 @@ export async function fetchFile(filePath: string): Promise { } function setKibanaVersion(url: URL) { - // TODO: change default to false as soon as EPR issue fixed. Blocker for 8.0. const disableVersionCheck = - appContextService.getConfig()?.developer?.disableRegistryVersionCheck ?? true; + appContextService.getConfig()?.developer?.disableRegistryVersionCheck ?? false; if (disableVersionCheck) { return; } diff --git a/x-pack/test/fleet_api_integration/config.ts b/x-pack/test/fleet_api_integration/config.ts index 308c4ab66f15c1..fb9dc7b6b4ce68 100644 --- a/x-pack/test/fleet_api_integration/config.ts +++ b/x-pack/test/fleet_api_integration/config.ts @@ -15,7 +15,7 @@ import { defineDockerServersConfig } from '@kbn/test'; // example: https://beats-ci.elastic.co/blue/organizations/jenkins/Ingest-manager%2Fpackage-storage/detail/snapshot/74/pipeline/257#step-302-log-1. // It should be updated any time there is a new Docker image published for the Snapshot Distribution of the Package Registry. export const dockerImage = - 'docker.elastic.co/package-registry/distribution@sha256:13d9996dd24161624784704e080f5f5b7f0ef34ff0d9259f8f05010ccae00058'; + 'docker.elastic.co/package-registry/distribution@sha256:de952debe048d903fc73e8a4472bb48bb95028d440cba852f21b863d47020c61'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xPackAPITestsConfig = await readConfigFile(require.resolve('../api_integration/config.ts')); From fcb1b9d08a0b02d8a3709f770549702a43454ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= Date: Thu, 2 Dec 2021 17:12:24 +0100 Subject: [PATCH 062/126] [Security Solution] [Endpoint] Adds new artifact hook to remove policies from endpoint artifacts (#120085) * Adds new artifact hook to remove policies from endpoint artifacts. Removed dedicated one for Trusted Apps and updated test * Removes trusted app hook * Add comment, remove unused async statements and fix wrong test name * removes unused import Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../endpoint/endpoint_app_context_services.ts | 5 +- .../fleet_integration.test.ts | 56 +++++-------- .../fleet_integration/fleet_integration.ts | 10 +-- .../handlers/remove_policy_from_artifacts.ts | 79 +++++++++++++++++++ .../remove_policy_from_trusted_apps.ts | 61 -------------- 5 files changed, 104 insertions(+), 107 deletions(-) create mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts delete mode 100644 x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_trusted_apps.ts diff --git a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts index 79436c66d073f2..5d6dbeca3e0c65 100644 --- a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts +++ b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts @@ -114,10 +114,7 @@ export class EndpointAppContextService { dependencies.registerIngestCallback( 'postPackagePolicyDelete', - getPackagePolicyDeleteCallback( - dependencies.exceptionListsClient, - dependencies.config.experimentalFeatures - ) + getPackagePolicyDeleteCallback(dependencies.exceptionListsClient) ); } } diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts index 71c093e0781b0c..2a4c59f94c8c67 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts @@ -40,11 +40,8 @@ import { getMockArtifacts, toArtifactRecords } from '../endpoint/lib/artifacts/m import { Manifest } from '../endpoint/lib/artifacts'; import { NewPackagePolicy } from '../../../fleet/common/types/models'; import { ManifestSchema } from '../../common/endpoint/schema/manifest'; -import { - allowedExperimentalValues, - ExperimentalFeatures, -} from '../../common/experimental_features'; import { DeletePackagePoliciesResponse } from '../../../fleet/common'; +import { ARTIFACT_LISTS_IDS_TO_REMOVE } from './handlers/remove_policy_from_artifacts'; describe('ingest_integration tests ', () => { let endpointAppContextMock: EndpointAppContextServiceStartContract; @@ -286,44 +283,41 @@ describe('ingest_integration tests ', () => { }); }); - describe('package policy delete callback with trusted apps by policy enabled', () => { - const invokeDeleteCallback = async ( - experimentalFeatures?: ExperimentalFeatures - ): Promise => { - const callback = getPackagePolicyDeleteCallback(exceptionListClient, experimentalFeatures); + describe('package policy delete callback', () => { + const invokeDeleteCallback = async (): Promise => { + const callback = getPackagePolicyDeleteCallback(exceptionListClient); await callback(deletePackagePolicyMock()); }; let removedPolicies: DeletePackagePoliciesResponse; let policyId: string; - let fakeTA: ExceptionListSchema; + let fakeArtifact: ExceptionListSchema; beforeEach(() => { removedPolicies = deletePackagePolicyMock(); policyId = removedPolicies[0].id; - fakeTA = { + fakeArtifact = { ...getExceptionListSchemaMock(), tags: [`policy:${policyId}`], }; - exceptionListClient.findExceptionListItem = jest + exceptionListClient.findExceptionListsItem = jest .fn() - .mockResolvedValueOnce({ data: [fakeTA], total: 1 }); + .mockResolvedValueOnce({ data: [fakeArtifact], total: 1 }); exceptionListClient.updateExceptionListItem = jest .fn() - .mockResolvedValueOnce({ ...fakeTA, tags: [] }); + .mockResolvedValueOnce({ ...fakeArtifact, tags: [] }); }); - it('removes policy from trusted app FF enabled', async () => { - await invokeDeleteCallback({ - ...allowedExperimentalValues, - trustedAppsByPolicyEnabled: true, // Needs to be enabled, it needs also a test with this disabled. - }); + it('removes policy from artifact', async () => { + await invokeDeleteCallback(); - expect(exceptionListClient.findExceptionListItem).toHaveBeenCalledWith({ - filter: `exception-list-agnostic.attributes.tags:"policy:${policyId}"`, - listId: 'endpoint_trusted_apps', - namespaceType: 'agnostic', + expect(exceptionListClient.findExceptionListsItem).toHaveBeenCalledWith({ + listId: ARTIFACT_LISTS_IDS_TO_REMOVE, + filter: ARTIFACT_LISTS_IDS_TO_REMOVE.map( + () => `exception-list-agnostic.attributes.tags:"policy:${policyId}"` + ), + namespaceType: ARTIFACT_LISTS_IDS_TO_REMOVE.map(() => 'agnostic'), page: 1, perPage: 50, sortField: undefined, @@ -331,21 +325,11 @@ describe('ingest_integration tests ', () => { }); expect(exceptionListClient.updateExceptionListItem).toHaveBeenCalledWith({ - ...fakeTA, - namespaceType: fakeTA.namespace_type, - osTypes: fakeTA.os_types, + ...fakeArtifact, + namespaceType: fakeArtifact.namespace_type, + osTypes: fakeArtifact.os_types, tags: [], }); }); - - it("doesn't remove policy from trusted app if feature flag is disabled", async () => { - await invokeDeleteCallback({ - ...allowedExperimentalValues, - trustedAppsByPolicyEnabled: false, // since it was changed to `true` by default - }); - - expect(exceptionListClient.findExceptionListItem).toHaveBeenCalledTimes(0); - expect(exceptionListClient.updateExceptionListItem).toHaveBeenCalledTimes(0); - }); }); }); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts index a53d5d43de5248..4c54dcb0f7725a 100644 --- a/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts +++ b/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.ts @@ -17,7 +17,6 @@ import { import { NewPackagePolicy, UpdatePackagePolicy } from '../../../fleet/common'; import { NewPolicyData, PolicyConfig } from '../../common/endpoint/types'; -import { ExperimentalFeatures } from '../../common/experimental_features'; import { LicenseService } from '../../common/license'; import { ManifestManager } from '../endpoint/services'; import { IRequestContextFactory } from '../request_context_factory'; @@ -25,7 +24,7 @@ import { installPrepackagedRules } from './handlers/install_prepackaged_rules'; import { createPolicyArtifactManifest } from './handlers/create_policy_artifact_manifest'; import { createDefaultPolicy } from './handlers/create_default_policy'; import { validatePolicyAgainstLicense } from './handlers/validate_policy_against_license'; -import { removePolicyFromTrustedApps } from './handlers/remove_policy_from_trusted_apps'; +import { removePolicyFromArtifacts } from './handlers/remove_policy_from_artifacts'; const isEndpointPackagePolicy = ( packagePolicy: T @@ -131,8 +130,7 @@ export const getPackagePolicyUpdateCallback = ( }; export const getPackagePolicyDeleteCallback = ( - exceptionsClient: ExceptionListClient | undefined, - experimentalFeatures: ExperimentalFeatures | undefined + exceptionsClient: ExceptionListClient | undefined ): PostPackagePolicyDeleteCallback => { return async (deletePackagePolicy): Promise => { if (!exceptionsClient) { @@ -140,8 +138,8 @@ export const getPackagePolicyDeleteCallback = ( } const policiesToRemove: Array> = []; for (const policy of deletePackagePolicy) { - if (isEndpointPackagePolicy(policy) && experimentalFeatures?.trustedAppsByPolicyEnabled) { - policiesToRemove.push(removePolicyFromTrustedApps(exceptionsClient, policy)); + if (isEndpointPackagePolicy(policy)) { + policiesToRemove.push(removePolicyFromArtifacts(exceptionsClient, policy)); } } await Promise.all(policiesToRemove); diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts new file mode 100644 index 00000000000000..57a23d677e014d --- /dev/null +++ b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_artifacts.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import pMap from 'p-map'; + +import { + ENDPOINT_TRUSTED_APPS_LIST_ID, + ENDPOINT_EVENT_FILTERS_LIST_ID, + ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID, +} from '@kbn/securitysolution-list-constants'; +import { ExceptionListClient } from '../../../../lists/server'; +import { PostPackagePolicyDeleteCallback } from '../../../../fleet/server'; + +export const ARTIFACT_LISTS_IDS_TO_REMOVE = [ + ENDPOINT_TRUSTED_APPS_LIST_ID, + ENDPOINT_EVENT_FILTERS_LIST_ID, + ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID, +]; + +/** + * Removes policy from artifacts + */ +export const removePolicyFromArtifacts = async ( + exceptionsClient: ExceptionListClient, + policy: Parameters[0][0] +) => { + let page = 1; + + const findArtifactsByPolicy = (currentPage: number) => { + return exceptionsClient.findExceptionListsItem({ + listId: ARTIFACT_LISTS_IDS_TO_REMOVE, + filter: ARTIFACT_LISTS_IDS_TO_REMOVE.map( + () => `exception-list-agnostic.attributes.tags:"policy:${policy.id}"` + ), + namespaceType: ARTIFACT_LISTS_IDS_TO_REMOVE.map(() => 'agnostic'), + page: currentPage, + perPage: 50, + sortField: undefined, + sortOrder: undefined, + }); + }; + + let findResponse = await findArtifactsByPolicy(page); + if (!findResponse) { + return; + } + const artifacts = findResponse.data; + + while (findResponse && (artifacts.length < findResponse.total || findResponse.data.length)) { + page += 1; + findResponse = await findArtifactsByPolicy(page); + if (findResponse) { + artifacts.push(...findResponse.data); + } + } + + await pMap( + artifacts, + (artifact) => + exceptionsClient.updateExceptionListItem({ + ...artifact, + itemId: artifact.item_id, + namespaceType: artifact.namespace_type, + osTypes: artifact.os_types, + tags: artifact.tags.filter((currentPolicy) => currentPolicy !== `policy:${policy.id}`), + }), + { + /** Number of concurrent executions till the end of the artifacts array */ + concurrency: 5, + /** When set to false, instead of stopping when a promise rejects, it will wait for all the promises to + * settle and then reject with an aggregated error containing all the errors from the rejected promises. */ + stopOnError: false, + } + ); +}; diff --git a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_trusted_apps.ts b/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_trusted_apps.ts deleted file mode 100644 index 88af71508f33a0..00000000000000 --- a/x-pack/plugins/security_solution/server/fleet_integration/handlers/remove_policy_from_trusted_apps.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ENDPOINT_TRUSTED_APPS_LIST_ID } from '@kbn/securitysolution-list-constants'; -import { ExceptionListClient } from '../../../../lists/server'; -import { PostPackagePolicyDeleteCallback } from '../../../../fleet/server'; - -/** - * Removes policy from trusted apps - */ -export const removePolicyFromTrustedApps = async ( - exceptionsClient: ExceptionListClient, - policy: Parameters[0][0] -) => { - let page = 1; - - const findTrustedAppsByPolicy = async (currentPage: number) => { - return exceptionsClient.findExceptionListItem({ - listId: ENDPOINT_TRUSTED_APPS_LIST_ID, - filter: `exception-list-agnostic.attributes.tags:"policy:${policy.id}"`, - namespaceType: 'agnostic', - page: currentPage, - perPage: 50, - sortField: undefined, - sortOrder: undefined, - }); - }; - - let findResponse = await findTrustedAppsByPolicy(page); - if (!findResponse) { - return; - } - const trustedApps = findResponse.data; - - while (findResponse && (trustedApps.length < findResponse.total || findResponse.data.length)) { - page += 1; - findResponse = await findTrustedAppsByPolicy(page); - if (findResponse) { - trustedApps.push(...findResponse.data); - } - } - - const updates = []; - for (const trustedApp of trustedApps) { - updates.push( - exceptionsClient.updateExceptionListItem({ - ...trustedApp, - itemId: trustedApp.item_id, - namespaceType: trustedApp.namespace_type, - osTypes: trustedApp.os_types, - tags: trustedApp.tags.filter((currentPolicy) => currentPolicy !== `policy:${policy.id}`), - }) - ); - } - - await Promise.all(updates); -}; From d874c4c798f2faaf4219d7568f0c900325fb94bd Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Thu, 2 Dec 2021 09:42:51 -0700 Subject: [PATCH 063/126] Removes tech debt from export all (#120170) ## Summary See: https://github.com/elastic/kibana/issues/110903 This removes the `export *` from: * lists plugin This also adds `import type` and `export type` in a few areas and fixes the `LicenseType` by changing it from `server` to using the version from `common` to remove the restricted paths. This extra addition prevents more memory leaks when we run jest. --- x-pack/plugins/lists/public/index.ts | 6 +- .../security/common/licensing/index.mock.ts | 6 +- .../add_exception_modal/index.test.tsx | 65 +++++++++++-------- .../exceptions/add_exception_modal/index.tsx | 5 +- .../edit_exception_modal/index.test.tsx | 60 ++++++++--------- .../exceptions/edit_exception_modal/index.tsx | 4 +- .../view/components/form/index.tsx | 8 +-- .../security_solution/public/plugin.tsx | 2 +- .../public/shared_imports.ts | 2 - .../plugins/security_solution/public/types.ts | 64 +++++++++--------- 10 files changed, 109 insertions(+), 113 deletions(-) diff --git a/x-pack/plugins/lists/public/index.ts b/x-pack/plugins/lists/public/index.ts index 977b7f462777e0..f35de2328714b7 100644 --- a/x-pack/plugins/lists/public/index.ts +++ b/x-pack/plugins/lists/public/index.ts @@ -5,10 +5,8 @@ * 2.0. */ -// TODO: https://github.com/elastic/kibana/issues/110903 -/* eslint-disable @kbn/eslint/no_export_all */ - -export * from './shared_exports'; +export { getExceptionBuilderComponentLazy } from './exceptions/components/builder/index'; +export type { OnChangeProps } from './exceptions/components/builder/index'; import type { PluginInitializerContext } from '../../../../src/core/public'; diff --git a/x-pack/plugins/security/common/licensing/index.mock.ts b/x-pack/plugins/security/common/licensing/index.mock.ts index bd85df3dea638c..f9e6a0b756d006 100644 --- a/x-pack/plugins/security/common/licensing/index.mock.ts +++ b/x-pack/plugins/security/common/licensing/index.mock.ts @@ -7,10 +7,8 @@ import { of } from 'rxjs'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { LICENSE_TYPE } from '../../../licensing/server'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import type { LicenseType } from '../../../licensing/server'; +import type { LicenseType } from '../../../licensing/common/types'; +import { LICENSE_TYPE } from '../../../licensing/common/types'; import type { SecurityLicenseFeatures } from './license_features'; import type { SecurityLicense } from './license_service'; diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.test.tsx index ac70d5276beb9c..0e118d527c69bf 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.test.tsx @@ -12,7 +12,7 @@ import { waitFor } from '@testing-library/react'; import { AddExceptionModal } from './'; import { useCurrentUser } from '../../../../common/lib/kibana'; -import { ExceptionBuilder } from '../../../../shared_imports'; +import { getExceptionBuilderComponentLazy } from '../../../../../../lists/public'; import { useAsync } from '@kbn/securitysolution-hook-utils'; import { getExceptionListSchemaMock } from '../../../../../../lists/common/schemas/response/exception_list_schema.mock'; import { useFetchIndex } from '../../../containers/source'; @@ -54,47 +54,58 @@ jest.mock('@kbn/securitysolution-hook-utils', () => ({ useAsync: jest.fn(), })); jest.mock('../../../../detections/containers/detection_engine/rules/use_rule_async'); +jest.mock('../../../../../../lists/public'); + +const mockGetExceptionBuilderComponentLazy = getExceptionBuilderComponentLazy as jest.Mock< + ReturnType +>; +const mockUseAsync = useAsync as jest.Mock>; +const mockUseAddOrUpdateException = useAddOrUpdateException as jest.Mock< + ReturnType +>; +const mockUseFetchOrCreateRuleExceptionList = useFetchOrCreateRuleExceptionList as jest.Mock< + ReturnType +>; +const mockUseSignalIndex = useSignalIndex as jest.Mock>>; +const mockUseFetchIndex = useFetchIndex as jest.Mock; +const mockUseCurrentUser = useCurrentUser as jest.Mock>>; +const mockUseRuleAsync = useRuleAsync as jest.Mock; describe('When the add exception modal is opened', () => { const ruleName = 'test rule'; let defaultEndpointItems: jest.SpyInstance< ReturnType >; - let ExceptionBuilderComponent: jest.SpyInstance< - ReturnType - >; beforeEach(() => { - const emptyComp = ; + mockGetExceptionBuilderComponentLazy.mockReturnValue( + + ); defaultEndpointItems = jest.spyOn(helpers, 'defaultEndpointExceptionItems'); - ExceptionBuilderComponent = jest - .spyOn(ExceptionBuilder, 'getExceptionBuilderComponentLazy') - .mockReturnValue(emptyComp); - (useAsync as jest.Mock).mockImplementation(() => ({ + mockUseAsync.mockImplementation(() => ({ start: jest.fn(), loading: false, + error: {}, + result: true, })); - (useAddOrUpdateException as jest.Mock).mockImplementation(() => [ - { isLoading: false }, - jest.fn(), - ]); - (useFetchOrCreateRuleExceptionList as jest.Mock).mockImplementation(() => [ + mockUseAddOrUpdateException.mockImplementation(() => [{ isLoading: false }, jest.fn()]); + mockUseFetchOrCreateRuleExceptionList.mockImplementation(() => [ false, getExceptionListSchemaMock(), ]); - (useSignalIndex as jest.Mock).mockImplementation(() => ({ + mockUseSignalIndex.mockImplementation(() => ({ loading: false, signalIndexName: 'mock-siem-signals-index', })); - (useFetchIndex as jest.Mock).mockImplementation(() => [ + mockUseFetchIndex.mockImplementation(() => [ false, { indexPatterns: stubIndexPattern, }, ]); - (useCurrentUser as jest.Mock).mockReturnValue({ username: 'test-username' }); - (useRuleAsync as jest.Mock).mockImplementation(() => ({ + mockUseCurrentUser.mockReturnValue({ username: 'test-username' }); + mockUseRuleAsync.mockImplementation(() => ({ rule: getRulesSchemaMock(), })); }); @@ -108,7 +119,7 @@ describe('When the add exception modal is opened', () => { let wrapper: ReactWrapper; beforeEach(() => { // Mocks one of the hooks as loading - (useFetchIndex as jest.Mock).mockImplementation(() => [ + mockUseFetchIndex.mockImplementation(() => [ true, { indexPatterns: stubIndexPattern, @@ -147,7 +158,7 @@ describe('When the add exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [] })); }); it('has the add exception button disabled', () => { @@ -192,7 +203,7 @@ describe('When the add exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }) ); @@ -252,7 +263,7 @@ describe('When the add exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [getExceptionListItemSchemaMock()] }) ); @@ -288,7 +299,7 @@ describe('When the add exception modal is opened', () => { describe('when there is an exception being created on a sequence eql rule type', () => { let wrapper: ReactWrapper; beforeEach(async () => { - (useRuleAsync as jest.Mock).mockImplementation(() => ({ + mockUseRuleAsync.mockImplementation(() => ({ rule: { ...getRulesEqlSchemaMock(), query: @@ -313,7 +324,7 @@ describe('When the add exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [getExceptionListItemSchemaMock()] }) ); @@ -354,7 +365,7 @@ describe('When the add exception modal is opened', () => { }; beforeEach(async () => { // Mocks the index patterns to contain the pre-populated endpoint fields so that the exception qualifies as bulk closable - (useFetchIndex as jest.Mock).mockImplementation(() => [ + mockUseFetchIndex.mockImplementation(() => [ false, { indexPatterns: { @@ -387,7 +398,7 @@ describe('When the add exception modal is opened', () => { /> ); - callProps = ExceptionBuilderComponent.mock.calls[0][0]; + callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }) ); @@ -456,7 +467,7 @@ describe('When the add exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [], errorExists: true })); expect( wrapper.find('button[data-test-subj="add-exception-confirm-button"]').getDOMNode() diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx index 228b7a2491fde5..afff935619740f 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/add_exception_modal/index.tsx @@ -38,8 +38,7 @@ import { isThresholdRule, } from '../../../../../common/detection_engine/utils'; import { Status } from '../../../../../common/detection_engine/schemas/common/schemas'; -import { ExceptionBuilder } from '../../../../../public/shared_imports'; - +import { getExceptionBuilderComponentLazy } from '../../../../../../lists/public'; import * as i18nCommon from '../../../translations'; import * as i18n from './translations'; import * as sharedI18n from '../translations'; @@ -475,7 +474,7 @@ export const AddExceptionModal = memo(function AddExceptionModal({ )} - {ExceptionBuilder.getExceptionBuilderComponentLazy({ + {getExceptionBuilderComponentLazy({ allowLargeValueLists: !isEqlRule(maybeRule?.type) && !isThresholdRule(maybeRule?.type), httpService: http, diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.test.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.test.tsx index 8c719373eda717..7a634b7fe10ec4 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.test.tsx @@ -24,7 +24,7 @@ import { } from '../../../../../common/detection_engine/schemas/response/rules_schema.mocks'; import { useRuleAsync } from '../../../../detections/containers/detection_engine/rules/use_rule_async'; import { getMockTheme } from '../../../lib/kibana/kibana_react.mock'; -import { ExceptionBuilder } from '../../../../shared_imports'; +import { getExceptionBuilderComponentLazy } from '../../../../../../lists/public'; const mockTheme = getMockTheme({ eui: { @@ -44,39 +44,31 @@ jest.mock('../../../containers/source'); jest.mock('../use_fetch_or_create_rule_exception_list'); jest.mock('../../../../detections/containers/detection_engine/alerts/use_signal_index'); jest.mock('../../../../detections/containers/detection_engine/rules/use_rule_async'); -jest.mock('../../../../shared_imports', () => { - const originalModule = jest.requireActual('../../../../shared_imports'); - const emptyComp = ; - return { - ...originalModule, - ExceptionBuilder: { - getExceptionBuilderComponentLazy: () => emptyComp, - }, - }; -}); +jest.mock('../../../../../../lists/public'); + +const mockGetExceptionBuilderComponentLazy = getExceptionBuilderComponentLazy as jest.Mock< + ReturnType +>; +const mockUseSignalIndex = useSignalIndex as jest.Mock>>; +const mockUseAddOrUpdateException = useAddOrUpdateException as jest.Mock< + ReturnType +>; +const mockUseFetchIndex = useFetchIndex as jest.Mock; +const mockUseCurrentUser = useCurrentUser as jest.Mock>>; +const mockUseRuleAsync = useRuleAsync as jest.Mock; describe('When the edit exception modal is opened', () => { const ruleName = 'test rule'; - let ExceptionBuilderComponent: jest.SpyInstance< - ReturnType - >; - beforeEach(() => { const emptyComp = ; - ExceptionBuilderComponent = jest - .spyOn(ExceptionBuilder, 'getExceptionBuilderComponentLazy') - .mockReturnValue(emptyComp); - - (useSignalIndex as jest.Mock).mockReturnValue({ + mockGetExceptionBuilderComponentLazy.mockReturnValue(emptyComp); + mockUseSignalIndex.mockReturnValue({ loading: false, signalIndexName: 'test-signal', }); - (useAddOrUpdateException as jest.Mock).mockImplementation(() => [ - { isLoading: false }, - jest.fn(), - ]); - (useFetchIndex as jest.Mock).mockImplementation(() => [ + mockUseAddOrUpdateException.mockImplementation(() => [{ isLoading: false }, jest.fn()]); + mockUseFetchIndex.mockImplementation(() => [ false, { indexPatterns: createStubIndexPattern({ @@ -96,8 +88,8 @@ describe('When the edit exception modal is opened', () => { }), }, ]); - (useCurrentUser as jest.Mock).mockReturnValue({ username: 'test-username' }); - (useRuleAsync as jest.Mock).mockImplementation(() => ({ + mockUseCurrentUser.mockReturnValue({ username: 'test-username' }); + mockUseRuleAsync.mockImplementation(() => ({ rule: getRulesSchemaMock(), })); }); @@ -109,7 +101,7 @@ describe('When the edit exception modal is opened', () => { describe('when the modal is loading', () => { it('renders the loading spinner', async () => { - (useFetchIndex as jest.Mock).mockImplementation(() => [ + mockUseFetchIndex.mockImplementation(() => [ true, { indexPatterns: stubIndexPattern, @@ -157,7 +149,7 @@ describe('When the edit exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => { callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }); }); @@ -202,7 +194,7 @@ describe('When the edit exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => { callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }); }); @@ -255,7 +247,7 @@ describe('When the edit exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = (getExceptionBuilderComponentLazy as jest.Mock).mock.calls[0][0]; await waitFor(() => { callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }); }); @@ -299,7 +291,7 @@ describe('When the edit exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => { callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }); }); @@ -344,7 +336,7 @@ describe('When the edit exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => { callProps.onChange({ exceptionItems: [...callProps.exceptionListItems] }); }); @@ -380,7 +372,7 @@ describe('When the edit exception modal is opened', () => { /> ); - const callProps = ExceptionBuilderComponent.mock.calls[0][0]; + const callProps = mockGetExceptionBuilderComponentLazy.mock.calls[0][0]; await waitFor(() => callProps.onChange({ exceptionItems: [], errorExists: true })); expect( diff --git a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx index 375648e0abc8db..1724f616e7fc84 100644 --- a/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/exceptions/edit_exception_modal/index.tsx @@ -37,7 +37,7 @@ import { import { useFetchIndex } from '../../../containers/source'; import { useSignalIndex } from '../../../../detections/containers/detection_engine/alerts/use_signal_index'; import { useRuleAsync } from '../../../../detections/containers/detection_engine/rules/use_rule_async'; -import { ExceptionBuilder } from '../../../../../public/shared_imports'; +import { getExceptionBuilderComponentLazy } from '../../../../../../lists/public'; import * as i18n from './translations'; import * as sharedI18n from '../translations'; @@ -344,7 +344,7 @@ export const EditExceptionModal = memo(function EditExceptionModal({ )} - {ExceptionBuilder.getExceptionBuilderComponentLazy({ + {getExceptionBuilderComponentLazy({ allowLargeValueLists: !isEqlRule(maybeRule?.type) && !isThresholdRule(maybeRule?.type), httpService: http, diff --git a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx index 8f0737067ec6af..703c6c098d11e3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form/index.tsx @@ -30,8 +30,8 @@ import { Loader } from '../../../../../../common/components/loader'; import { useKibana } from '../../../../../../common/lib/kibana'; import { useFetchIndex } from '../../../../../../common/containers/source'; import { AppAction } from '../../../../../../common/store/actions'; -import { ExceptionBuilder } from '../../../../../../shared_imports'; - +import { getExceptionBuilderComponentLazy } from '../../../../../../../../lists/public'; +import type { OnChangeProps } from '../../../../../../../../lists/public'; import { useEventFiltersSelector } from '../../hooks'; import { getFormEntryStateMutable, getHasNameError, getNewComment } from '../../../store/selector'; import { NAME_LABEL, NAME_ERROR, NAME_PLACEHOLDER, OS_LABEL, RULE_NAME } from './translations'; @@ -67,7 +67,7 @@ export const EventFiltersForm: React.FC = memo( ); const handleOnBuilderChange = useCallback( - (arg: ExceptionBuilder.OnChangeProps) => { + (arg: OnChangeProps) => { dispatch({ type: 'eventFiltersChangeForm', payload: { @@ -121,7 +121,7 @@ export const EventFiltersForm: React.FC = memo( const exceptionBuilderComponentMemo = useMemo( () => - ExceptionBuilder.getExceptionBuilderComponentLazy({ + getExceptionBuilderComponentLazy({ allowLargeValueLists: false, httpService: http, autocompleteService: data.autocomplete, diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 1d60175d56f60c..d3a88004bc8dc4 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -10,7 +10,7 @@ import reduceReducers from 'reduce-reducers'; import { BehaviorSubject, Subject, Subscription } from 'rxjs'; import { pluck } from 'rxjs/operators'; import { AnyAction, Reducer } from 'redux'; -import { +import type { PluginSetup, PluginStart, SetupPlugins, diff --git a/x-pack/plugins/security_solution/public/shared_imports.ts b/x-pack/plugins/security_solution/public/shared_imports.ts index 8934ad9dab4cdc..421b92a6e8b7fd 100644 --- a/x-pack/plugins/security_solution/public/shared_imports.ts +++ b/x-pack/plugins/security_solution/public/shared_imports.ts @@ -30,5 +30,3 @@ export { export { Field, SelectField } from '../../../../src/plugins/es_ui_shared/static/forms/components'; export { fieldValidators } from '../../../../src/plugins/es_ui_shared/static/forms/helpers'; export type { ERROR_CODE } from '../../../../src/plugins/es_ui_shared/static/forms/helpers/field_validators/types'; - -export { ExceptionBuilder } from '../../lists/public'; diff --git a/x-pack/plugins/security_solution/public/types.ts b/x-pack/plugins/security_solution/public/types.ts index cfca95fddc5077..6a5a0f3b42e044 100644 --- a/x-pack/plugins/security_solution/public/types.ts +++ b/x-pack/plugins/security_solution/public/types.ts @@ -5,43 +5,43 @@ * 2.0. */ -import { CoreStart } from '../../../../src/core/public'; -import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; +import type { CoreStart } from '../../../../src/core/public'; +import type { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; import type { DataPublicPluginStart } from '../../../../src/plugins/data/public'; -import { EmbeddableStart } from '../../../../src/plugins/embeddable/public'; -import { LensPublicStart } from '../../../plugins/lens/public'; -import { NewsfeedPublicPluginStart } from '../../../../src/plugins/newsfeed/public'; -import { Start as InspectorStart } from '../../../../src/plugins/inspector/public'; -import { UiActionsStart } from '../../../../src/plugins/ui_actions/public'; -import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; -import { Storage } from '../../../../src/plugins/kibana_utils/public'; -import { FleetStart } from '../../fleet/public'; -import { PluginStart as ListsPluginStart } from '../../lists/public'; -import { SpacesPluginStart } from '../../spaces/public'; -import { +import type { EmbeddableStart } from '../../../../src/plugins/embeddable/public'; +import type { LensPublicStart } from '../../../plugins/lens/public'; +import type { NewsfeedPublicPluginStart } from '../../../../src/plugins/newsfeed/public'; +import type { Start as InspectorStart } from '../../../../src/plugins/inspector/public'; +import type { UiActionsStart } from '../../../../src/plugins/ui_actions/public'; +import type { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; +import type { Storage } from '../../../../src/plugins/kibana_utils/public'; +import type { FleetStart } from '../../fleet/public'; +import type { PluginStart as ListsPluginStart } from '../../lists/public'; +import type { SpacesPluginStart } from '../../spaces/public'; +import type { TriggersAndActionsUIPublicPluginSetup as TriggersActionsSetup, TriggersAndActionsUIPublicPluginStart as TriggersActionsStart, } from '../../triggers_actions_ui/public'; -import { CasesUiStart } from '../../cases/public'; -import { SecurityPluginSetup } from '../../security/public'; -import { TimelinesUIStart } from '../../timelines/public'; -import { ResolverPluginSetup } from './resolver/types'; -import { Inspect } from '../common/search_strategy'; -import { MlPluginSetup, MlPluginStart } from '../../ml/public'; +import type { CasesUiStart } from '../../cases/public'; +import type { SecurityPluginSetup } from '../../security/public'; +import type { TimelinesUIStart } from '../../timelines/public'; +import type { ResolverPluginSetup } from './resolver/types'; +import type { Inspect } from '../common/search_strategy'; +import type { MlPluginSetup, MlPluginStart } from '../../ml/public'; -import { Detections } from './detections'; -import { Cases } from './cases'; -import { Exceptions } from './exceptions'; -import { Hosts } from './hosts'; -import { Network } from './network'; -import { Overview } from './overview'; -import { Rules } from './rules'; -import { Timelines } from './timelines'; -import { Management } from './management'; -import { Ueba } from './ueba'; -import { LicensingPluginStart, LicensingPluginSetup } from '../../licensing/public'; -import { DashboardStart } from '../../../../src/plugins/dashboard/public'; -import { IndexPatternFieldEditorStart } from '../../../../src/plugins/data_view_field_editor/public'; +import type { Detections } from './detections'; +import type { Cases } from './cases'; +import type { Exceptions } from './exceptions'; +import type { Hosts } from './hosts'; +import type { Network } from './network'; +import type { Overview } from './overview'; +import type { Rules } from './rules'; +import type { Timelines } from './timelines'; +import type { Management } from './management'; +import type { Ueba } from './ueba'; +import type { LicensingPluginStart, LicensingPluginSetup } from '../../licensing/public'; +import type { DashboardStart } from '../../../../src/plugins/dashboard/public'; +import type { IndexPatternFieldEditorStart } from '../../../../src/plugins/data_view_field_editor/public'; export interface SetupPlugins { home?: HomePublicPluginSetup; From 319fc9fb7f898b50d37d9c8955413d0a31ff65f6 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Thu, 2 Dec 2021 19:11:10 +0200 Subject: [PATCH 064/126] [Cases] Move disabling features to the cases context (#119864) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/cases/common/constants.ts | 9 +++ x-pack/plugins/cases/common/ui/types.ts | 13 +++++ .../public/common/mock/test_providers.tsx | 41 +++++++++----- .../all_cases/all_cases_list.test.tsx | 56 +++++++++---------- .../components/all_cases/all_cases_list.tsx | 3 - .../public/components/all_cases/columns.tsx | 24 +++----- .../components/all_cases/index.test.tsx | 14 ++--- .../public/components/all_cases/index.tsx | 8 +-- .../cases/public/components/app/routes.tsx | 6 +- .../cases/public/components/app/types.ts | 2 - .../components/case_action_bar/index.test.tsx | 4 +- .../components/case_action_bar/index.tsx | 6 +- .../public/components/case_view/index.tsx | 5 -- .../public/components/cases_context/index.tsx | 24 ++++---- .../cases_context/use_cases_features.tsx | 22 ++++++++ .../create/flyout/create_case_flyout.tsx | 6 +- .../public/components/create/form.test.tsx | 12 ++-- .../cases/public/components/create/form.tsx | 21 +++---- .../components/create/form_context.test.tsx | 9 ++- .../public/components/create/form_context.tsx | 8 +-- .../cases/public/components/create/index.tsx | 2 - .../cases/public/methods/get_cases.tsx | 7 +-- .../public/methods/get_create_case_flyout.tsx | 5 +- .../public/pages/cases/cases.tsx | 3 +- .../timeline/cases/add_to_case_action.tsx | 10 ++-- .../components/t_grid/standalone/index.tsx | 4 +- 26 files changed, 169 insertions(+), 155 deletions(-) create mode 100644 x-pack/plugins/cases/public/components/cases_context/use_cases_features.tsx diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index bc0578191f8b75..70ccb1ddebd105 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -5,6 +5,7 @@ * 2.0. */ import { ConnectorTypes } from './api'; +import { CasesContextValue } from './ui/types'; export const DEFAULT_DATE_FORMAT = 'dateFormat'; export const DEFAULT_DATE_FORMAT_TZ = 'dateFormat:tz'; @@ -104,3 +105,11 @@ export const MAX_CONCURRENT_SEARCHES = 10; */ export const MAX_TITLE_LENGTH = 64; + +/** + * Cases features + */ + +export const DEFAULT_FEATURES: CasesContextValue['features'] = Object.freeze({ + alerts: { sync: true }, +}); diff --git a/x-pack/plugins/cases/common/ui/types.ts b/x-pack/plugins/cases/common/ui/types.ts index 402e44618c7ccf..c51c25c5b976c5 100644 --- a/x-pack/plugins/cases/common/ui/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -19,6 +19,19 @@ import { ActionConnector, } from '../api'; +interface CasesFeatures { + alerts: { sync: boolean }; +} + +export interface CasesContextValue { + owner: string[]; + appId: string; + appTitle: string; + userCanCrud: boolean; + basePath: string; + features: CasesFeatures; +} + export interface CasesUiConfigType { markdownPlugins: { lens: boolean; diff --git a/x-pack/plugins/cases/public/common/mock/test_providers.tsx b/x-pack/plugins/cases/public/common/mock/test_providers.tsx index 41754fad836b00..d016dce48a24e1 100644 --- a/x-pack/plugins/cases/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/cases/public/common/mock/test_providers.tsx @@ -5,11 +5,12 @@ * 2.0. */ +import React from 'react'; +import { merge } from 'lodash'; import { euiDarkVars } from '@kbn/ui-shared-deps-src/theme'; import { I18nProvider } from '@kbn/i18n-react'; -import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { SECURITY_SOLUTION_OWNER } from '../../../common'; +import { CasesContextValue, DEFAULT_FEATURES, SECURITY_SOLUTION_OWNER } from '../../../common'; import { CasesProvider } from '../../components/cases_context'; import { createKibanaContextProviderMock } from '../lib/kibana/kibana_react.mock'; import { FieldHook } from '../shared_imports'; @@ -17,23 +18,37 @@ import { FieldHook } from '../shared_imports'; interface Props { children: React.ReactNode; userCanCrud?: boolean; + features?: CasesContextValue['features']; } window.scrollTo = jest.fn(); const MockKibanaContextProvider = createKibanaContextProviderMock(); /** A utility for wrapping children in the providers required to run most tests */ -const TestProvidersComponent: React.FC = ({ children, userCanCrud = true }) => ( - - - ({ eui: euiDarkVars, darkMode: true })}> - - {children} - - - - -); +const TestProvidersComponent: React.FC = ({ + children, + userCanCrud = true, + features = {}, +}) => { + /** + * The empty object at the beginning avoids the mutation + * of the DEFAULT_FEATURES object + */ + const featuresOptions = merge({}, DEFAULT_FEATURES, features); + return ( + + + ({ eui: euiDarkVars, darkMode: true })}> + + {children} + + + + + ); +}; export const TestProviders = React.memo(TestProvidersComponent); diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx index 9cde5da159960d..bf02202ff83b28 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.test.tsx @@ -29,7 +29,7 @@ import { useUpdateCases } from '../../containers/use_bulk_update_case'; import { useGetActionLicense } from '../../containers/use_get_action_license'; import { useConnectors } from '../../containers/configure/use_connectors'; import { useKibana } from '../../common/lib/kibana'; -import { AllCasesList, AllCasesListProps } from './all_cases_list'; +import { AllCasesList } from './all_cases_list'; import { CasesColumns, GetCasesColumn, useCasesColumns } from './columns'; import { triggersActionsUiMock } from '../../../../triggers_actions_ui/public/mocks'; import { registerConnectorsToMockActionRegistry } from '../../common/mock/register_connectors'; @@ -64,10 +64,6 @@ const mockKibana = () => { }; describe('AllCasesListGeneric', () => { - const defaultAllCasesListProps: AllCasesListProps = { - disableAlerts: false, - }; - const dispatchResetIsDeleted = jest.fn(); const dispatchResetIsUpdated = jest.fn(); const dispatchUpdateCaseProperty = jest.fn(); @@ -161,7 +157,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); @@ -215,7 +211,7 @@ describe('AllCasesListGeneric', () => { }); const wrapper = mount( - + ); const checkIt = (columnName: string, key: number) => { @@ -245,7 +241,7 @@ describe('AllCasesListGeneric', () => { }); const wrapper = mount( - + ); await waitFor(() => { @@ -281,7 +277,7 @@ describe('AllCasesListGeneric', () => { }); const wrapper = mount( - + ); @@ -293,7 +289,7 @@ describe('AllCasesListGeneric', () => { it('should tableHeaderSortButton AllCasesList', async () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="tableHeaderSortButton"]').first().simulate('click'); @@ -310,7 +306,7 @@ describe('AllCasesListGeneric', () => { it('Updates status when status context menu is updated', async () => { const wrapper = mount( - + ); wrapper.find(`[data-test-subj="case-view-status-dropdown"] button`).first().simulate('click'); @@ -351,7 +347,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); @@ -388,7 +384,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); @@ -431,7 +427,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -458,7 +454,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -481,7 +477,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -500,7 +496,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="case-table-bulk-actions"] button').first().simulate('click'); @@ -521,7 +517,7 @@ describe('AllCasesListGeneric', () => { mount( - + ); await waitFor(() => { @@ -539,7 +535,7 @@ describe('AllCasesListGeneric', () => { mount( - + ); await waitFor(() => { @@ -552,7 +548,7 @@ describe('AllCasesListGeneric', () => { it('should not render table utility bar when isSelectorView=true', async () => { const wrapper = mount( - + ); await waitFor(() => { @@ -566,7 +562,7 @@ describe('AllCasesListGeneric', () => { it('case table should not be selectable when isSelectorView=true', async () => { const wrapper = mount( - + ); await waitFor(() => { @@ -588,7 +584,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="cases-table-add-case"]').first().simulate('click'); @@ -600,7 +596,7 @@ describe('AllCasesListGeneric', () => { it('should call onRowClick when clicking a case with modal=true', async () => { const wrapper = mount( - + ); @@ -657,7 +653,7 @@ describe('AllCasesListGeneric', () => { it('should NOT call onRowClick when clicking a case with modal=true', async () => { const wrapper = mount( - + ); wrapper.find('[data-test-subj="cases-table-row-1"]').first().simulate('click'); @@ -669,7 +665,7 @@ describe('AllCasesListGeneric', () => { it('should change the status to closed', async () => { const wrapper = mount( - + ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -684,7 +680,7 @@ describe('AllCasesListGeneric', () => { it('should change the status to in-progress', async () => { const wrapper = mount( - + ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -699,7 +695,7 @@ describe('AllCasesListGeneric', () => { it('should change the status to open', async () => { const wrapper = mount( - + ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -714,7 +710,7 @@ describe('AllCasesListGeneric', () => { it('should show the correct count on stats', async () => { const wrapper = mount( - + ); wrapper.find('button[data-test-subj="case-status-filter"]').simulate('click'); @@ -734,7 +730,7 @@ describe('AllCasesListGeneric', () => { it('should not render status when isSelectorView=true', async () => { const wrapper = mount( - + ); @@ -769,7 +765,7 @@ describe('AllCasesListGeneric', () => { const wrapper = mount( - + ); diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx index bf42cfe38863e5..58c17695d0dfe5 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx @@ -53,7 +53,6 @@ const getSortField = (field: string): SortFieldCase => export interface AllCasesListProps { alertData?: Omit; - disableAlerts?: boolean; hiddenStatuses?: CaseStatusWithAllStatus[]; isSelectorView?: boolean; onRowClick?: (theCase?: Case | SubCase) => void; @@ -64,7 +63,6 @@ export interface AllCasesListProps { export const AllCasesList = React.memo( ({ alertData, - disableAlerts, hiddenStatuses = [], isSelectorView = false, onRowClick, @@ -168,7 +166,6 @@ export const AllCasesList = React.memo( const showActions = userCanCrud && !isSelectorView; const columns = useCasesColumns({ - disableAlerts, dispatchUpdateCaseProperty, filterStatus: filterOptions.status, handleIsLoading, diff --git a/x-pack/plugins/cases/public/components/all_cases/columns.tsx b/x-pack/plugins/cases/public/components/all_cases/columns.tsx index 67d44094440168..c30ddd199fc497 100644 --- a/x-pack/plugins/cases/public/components/all_cases/columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/columns.tsx @@ -69,7 +69,6 @@ const renderStringField = (field: string, dataTestSubj: string) => field != null ? {field} : getEmptyTagValue(); export interface GetCasesColumn { - disableAlerts?: boolean; dispatchUpdateCaseProperty: (u: UpdateCase) => void; filterStatus: string; handleIsLoading: (a: boolean) => void; @@ -84,7 +83,6 @@ export interface GetCasesColumn { updateCase?: (newCase: Case) => void; } export const useCasesColumns = ({ - disableAlerts = false, dispatchUpdateCaseProperty, filterStatus, handleIsLoading, @@ -246,19 +244,15 @@ export const useCasesColumns = ({ }, truncateText: true, }, - ...(!disableAlerts - ? [ - { - align: RIGHT_ALIGNMENT, - field: 'totalAlerts', - name: ALERTS, - render: (totalAlerts: Case['totalAlerts']) => - totalAlerts != null - ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) - : getEmptyTagValue(), - }, - ] - : []), + { + align: RIGHT_ALIGNMENT, + field: 'totalAlerts', + name: ALERTS, + render: (totalAlerts: Case['totalAlerts']) => + totalAlerts != null + ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) + : getEmptyTagValue(), + }, { align: RIGHT_ALIGNMENT, field: 'totalComment', diff --git a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx index 8429712a30f744..681bb65870c1e7 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { mount } from 'enzyme'; import { waitFor } from '@testing-library/react'; -import { AllCases, AllCasesProps } from '.'; +import { AllCases } from '.'; import { TestProviders } from '../../common/mock'; import { useGetTags } from '../../containers/use_get_tags'; import { useGetReporters } from '../../containers/use_get_reporters'; @@ -31,10 +31,6 @@ jest.mock('../../common/lib/kibana'); jest.mock('../../containers/use_get_cases'); jest.mock('../../containers/use_get_cases_status'); -const defaultAllCasesProps: AllCasesProps = { - disableAlerts: false, -}; - const useKibanaMock = useKibana as jest.Mocked; const useConnectorsMock = useConnectors as jest.Mock; const useGetCasesMock = useGetCases as jest.Mock; @@ -105,7 +101,7 @@ describe('AllCases', () => { const wrapper = mount( - + ); @@ -141,7 +137,7 @@ describe('AllCases', () => { const wrapper = mount( - + ); @@ -173,7 +169,7 @@ describe('AllCases', () => { const wrapper = mount( - + ); @@ -199,7 +195,7 @@ describe('AllCases', () => { const wrapper = mount( - + ); diff --git a/x-pack/plugins/cases/public/components/all_cases/index.tsx b/x-pack/plugins/cases/public/components/all_cases/index.tsx index 7f7de11a3435c9..e163d9ada4a515 100644 --- a/x-pack/plugins/cases/public/components/all_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/index.tsx @@ -14,11 +14,7 @@ import { getActionLicenseError } from '../use_push_to_service/helpers'; import { AllCasesList } from './all_cases_list'; import { CasesTableHeader } from './header'; -export interface AllCasesProps { - disableAlerts?: boolean; -} - -export const AllCases: React.FC = ({ disableAlerts }) => { +export const AllCases: React.FC = () => { const { userCanCrud } = useCasesContext(); const [refresh, setRefresh] = useState(0); useCasesBreadcrumbs(CasesDeepLinkId.cases); @@ -33,7 +29,7 @@ export const AllCases: React.FC = ({ disableAlerts }) => { return ( <> - + ); }; diff --git a/x-pack/plugins/cases/public/components/app/routes.tsx b/x-pack/plugins/cases/public/components/app/routes.tsx index bd4450baaf3fbd..06387072c2323f 100644 --- a/x-pack/plugins/cases/public/components/app/routes.tsx +++ b/x-pack/plugins/cases/public/components/app/routes.tsx @@ -28,14 +28,12 @@ import * as i18n from './translations'; import { useReadonlyHeader } from './use_readonly_header'; const CasesRoutesComponent: React.FC = ({ - disableAlerts, onComponentInitialized, actionsNavigation, ruleDetailsNavigation, showAlertDetails, useFetchAlertData, refreshRef, - hideSyncAlerts, timelineIntegration, }) => { const { basePath, userCanCrud } = useCasesContext(); @@ -51,7 +49,7 @@ const CasesRoutesComponent: React.FC = ({ return ( - + @@ -59,7 +57,6 @@ const CasesRoutesComponent: React.FC = ({ ) : ( @@ -91,7 +88,6 @@ const CasesRoutesComponent: React.FC = ({ showAlertDetails={showAlertDetails} useFetchAlertData={useFetchAlertData} refreshRef={refreshRef} - hideSyncAlerts={hideSyncAlerts} timelineIntegration={timelineIntegration} /> diff --git a/x-pack/plugins/cases/public/components/app/types.ts b/x-pack/plugins/cases/public/components/app/types.ts index 943cf5fcad96de..9c825ad95618a0 100644 --- a/x-pack/plugins/cases/public/components/app/types.ts +++ b/x-pack/plugins/cases/public/components/app/types.ts @@ -11,7 +11,6 @@ import { CasesNavigation } from '../links'; import { CasesTimelineIntegration } from '../timeline_context'; export interface CasesRoutesProps { - disableAlerts?: boolean; onComponentInitialized?: () => void; actionsNavigation?: CasesNavigation; ruleDetailsNavigation?: CasesNavigation; @@ -22,6 +21,5 @@ export interface CasesRoutesProps { * **NOTE**: Do not hold on to the `.current` object, as it could become stale */ refreshRef?: MutableRefObject; - hideSyncAlerts?: boolean; timelineIntegration?: CasesTimelineIntegration; } diff --git a/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx b/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx index 371d6dcf3063e5..f36ecd5b6b5d12 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/index.test.tsx @@ -118,8 +118,8 @@ describe('CaseActionBar', () => { it('should not show the sync alerts toggle when alerting is disabled', () => { const { queryByText } = render( - - + + ); diff --git a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx index e95410c1967b67..9b326f3216084e 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx @@ -25,6 +25,7 @@ import { StatusContextMenu } from './status_context_menu'; import { getStatusDate, getStatusTitle } from './helpers'; import { SyncAlertsSwitch } from '../case_settings/sync_alerts_switch'; import { OnUpdateFields } from '../case_view'; +import { useCasesFeatures } from '../cases_context/use_cases_features'; const MyDescriptionList = styled(EuiDescriptionList)` ${({ theme }) => css` @@ -43,7 +44,6 @@ interface CaseActionBarProps { caseData: Case; currentExternalIncident: CaseService | null; userCanCrud: boolean; - disableAlerting: boolean; isLoading: boolean; onRefresh: () => void; onUpdateField: (args: OnUpdateFields) => void; @@ -51,12 +51,12 @@ interface CaseActionBarProps { const CaseActionBarComponent: React.FC = ({ caseData, currentExternalIncident, - disableAlerting, userCanCrud, isLoading, onRefresh, onUpdateField, }) => { + const { isSyncAlertsEnabled } = useCasesFeatures(); const date = useMemo(() => getStatusDate(caseData), [caseData]); const title = useMemo(() => getStatusTitle(caseData.status), [caseData.status]); const onStatusChanged = useCallback( @@ -114,7 +114,7 @@ const CaseActionBarComponent: React.FC = ({ responsive={false} justifyContent="spaceBetween" > - {userCanCrud && !disableAlerting && ( + {userCanCrud && isSyncAlertsEnabled && ( ; - hideSyncAlerts?: boolean; } export interface CaseViewProps extends Omit { @@ -98,7 +97,6 @@ export const CaseComponent = React.memo( updateCase, useFetchAlertData, refreshRef, - hideSyncAlerts = false, }) => { const { userCanCrud } = useCasesContext(); const { getCaseViewUrl } = useCaseViewNavigation(); @@ -388,7 +386,6 @@ export const CaseComponent = React.memo( caseData={caseData} currentExternalIncident={currentExternalIncident} userCanCrud={userCanCrud} - disableAlerting={ruleDetailsNavigation == null || hideSyncAlerts} isLoading={isLoading && (updateKey === 'status' || updateKey === 'settings')} onRefresh={handleRefresh} onUpdateField={onUpdateField} @@ -506,7 +503,6 @@ export const CaseView = React.memo( timelineIntegration, useFetchAlertData, refreshRef, - hideSyncAlerts, }: CaseViewProps) => { const { spaces: spacesApi } = useKibana().services; const { detailName: caseId, subCaseId } = useCaseViewParams(); @@ -562,7 +558,6 @@ export const CaseView = React.memo( updateCase={updateCase} useFetchAlertData={useFetchAlertData} refreshRef={refreshRef} - hideSyncAlerts={hideSyncAlerts} /> ) diff --git a/x-pack/plugins/cases/public/components/cases_context/index.tsx b/x-pack/plugins/cases/public/components/cases_context/index.tsx index 932ce69372110a..588bda245b0447 100644 --- a/x-pack/plugins/cases/public/components/cases_context/index.tsx +++ b/x-pack/plugins/cases/public/components/cases_context/index.tsx @@ -6,40 +6,38 @@ */ import React, { useState, useEffect } from 'react'; +import { merge } from 'lodash'; +import { CasesContextValue, DEFAULT_FEATURES } from '../../../common'; import { DEFAULT_BASE_PATH } from '../../common/navigation'; import { useApplication } from './use_application'; -export interface CasesContextValue { - owner: string[]; - appId: string; - appTitle: string; - userCanCrud: boolean; - basePath: string; -} - export const CasesContext = React.createContext(undefined); export interface CasesContextProps - extends Omit { + extends Omit { basePath?: string; + features?: Partial; } -export interface CasesContextStateValue - extends Omit { +export interface CasesContextStateValue extends Omit { appId?: string; appTitle?: string; - userCanCrud?: boolean; } export const CasesProvider: React.FC<{ value: CasesContextProps }> = ({ children, - value: { owner, userCanCrud, basePath = DEFAULT_BASE_PATH }, + value: { owner, userCanCrud, basePath = DEFAULT_BASE_PATH, features = {} }, }) => { const { appId, appTitle } = useApplication(); const [value, setValue] = useState({ owner, userCanCrud, basePath, + /** + * The empty object at the beginning avoids the mutation + * of the DEFAULT_FEATURES object + */ + features: merge({}, DEFAULT_FEATURES, features), }); /** diff --git a/x-pack/plugins/cases/public/components/cases_context/use_cases_features.tsx b/x-pack/plugins/cases/public/components/cases_context/use_cases_features.tsx new file mode 100644 index 00000000000000..93efdcabd8c380 --- /dev/null +++ b/x-pack/plugins/cases/public/components/cases_context/use_cases_features.tsx @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useMemo } from 'react'; +import { useCasesContext } from './use_cases_context'; + +interface UseCasesFeaturesReturn { + isSyncAlertsEnabled: boolean; +} + +export const useCasesFeatures = (): UseCasesFeaturesReturn => { + const { features } = useCasesContext(); + const memoizedReturnValue = useMemo( + () => ({ isSyncAlertsEnabled: features.alerts.sync }), + [features] + ); + return memoizedReturnValue; +}; diff --git a/x-pack/plugins/cases/public/components/create/flyout/create_case_flyout.tsx b/x-pack/plugins/cases/public/components/create/flyout/create_case_flyout.tsx index 5723f78649b5ca..e77f72929ecd82 100644 --- a/x-pack/plugins/cases/public/components/create/flyout/create_case_flyout.tsx +++ b/x-pack/plugins/cases/public/components/create/flyout/create_case_flyout.tsx @@ -17,7 +17,6 @@ export interface CreateCaseFlyoutProps { afterCaseCreated?: (theCase: Case) => Promise; onClose: () => void; onSuccess: (theCase: Case) => Promise; - disableAlerts?: boolean; } const StyledFlyout = styled(EuiFlyout)` @@ -50,7 +49,7 @@ const StyledEuiFlyoutBody = styled(EuiFlyoutBody)` overflow-y: auto; overflow-x: hidden; } - + && .euiFlyoutBody__overflowContent { display: block; padding: ${theme.eui.paddingSizes.l} ${theme.eui.paddingSizes.l} 70px; @@ -64,7 +63,7 @@ const FormWrapper = styled.div` `; export const CreateCaseFlyout = React.memo( - ({ afterCaseCreated, onClose, onSuccess, disableAlerts }) => ( + ({ afterCaseCreated, onClose, onSuccess }) => ( <> ( onCancel={onClose} onSuccess={onSuccess} withSteps={false} - disableAlerts={disableAlerts} /> diff --git a/x-pack/plugins/cases/public/components/create/form.test.tsx b/x-pack/plugins/cases/public/components/create/form.test.tsx index 06b07ebd396a86..9f1e2e6c6dda33 100644 --- a/x-pack/plugins/cases/public/components/create/form.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form.test.tsx @@ -44,7 +44,10 @@ const casesFormProps: CreateCaseFormProps = { describe('CreateCaseForm', () => { let globalForm: FormHook; - const MockHookWrapperComponent: React.FC = ({ children }) => { + const MockHookWrapperComponent: React.FC<{ testProviderProps?: unknown }> = ({ + children, + testProviderProps = {}, + }) => { const { form } = useForm({ defaultValue: initialCaseValue, options: { stripEmptyFields: false }, @@ -54,7 +57,7 @@ describe('CreateCaseForm', () => { globalForm = form; return ( - +
{children}
); @@ -103,8 +106,8 @@ describe('CreateCaseForm', () => { it('hides the sync alerts toggle', () => { const { queryByText } = render( - - + + ); @@ -118,7 +121,6 @@ describe('CreateCaseForm', () => { diff --git a/x-pack/plugins/cases/public/components/create/form.tsx b/x-pack/plugins/cases/public/components/create/form.tsx index 6105fdbb2aef39..2c775cb5fd86d4 100644 --- a/x-pack/plugins/cases/public/components/create/form.tsx +++ b/x-pack/plugins/cases/public/components/create/form.tsx @@ -30,6 +30,7 @@ import { InsertTimeline } from '../insert_timeline'; import { UsePostComment } from '../../containers/use_post_comment'; import { SubmitCaseButton } from './submit_button'; import { FormContext } from './form_context'; +import { useCasesFeatures } from '../cases_context/use_cases_features'; interface ContainerProps { big?: boolean; @@ -51,15 +52,11 @@ const MySpinner = styled(EuiLoadingSpinner)` export interface CreateCaseFormFieldsProps { connectors: ActionConnector[]; isLoadingConnectors: boolean; - disableAlerts: boolean; hideConnectorServiceNowSir: boolean; withSteps: boolean; } export interface CreateCaseFormProps - extends Pick< - Partial, - 'disableAlerts' | 'hideConnectorServiceNowSir' | 'withSteps' - > { + extends Pick, 'hideConnectorServiceNowSir' | 'withSteps'> { onCancel: () => void; onSuccess: (theCase: Case) => Promise; afterCaseCreated?: (theCase: Case, postComment: UsePostComment['postComment']) => Promise; @@ -69,8 +66,10 @@ export interface CreateCaseFormProps const empty: ActionConnector[] = []; export const CreateCaseFormFields: React.FC = React.memo( - ({ connectors, disableAlerts, isLoadingConnectors, hideConnectorServiceNowSir, withSteps }) => { + ({ connectors, isLoadingConnectors, hideConnectorServiceNowSir, withSteps }) => { const { isSubmitting } = useFormContext(); + const { isSyncAlertsEnabled } = useCasesFeatures(); + const firstStep = useMemo( () => ({ title: i18n.STEP_ONE_TITLE, @@ -119,8 +118,8 @@ export const CreateCaseFormFields: React.FC = React.m ); const allSteps = useMemo( - () => [firstStep, ...(!disableAlerts ? [secondStep] : []), thirdStep], - [disableAlerts, firstStep, secondStep, thirdStep] + () => [firstStep, ...(isSyncAlertsEnabled ? [secondStep] : []), thirdStep], + [isSyncAlertsEnabled, firstStep, secondStep, thirdStep] ); return ( @@ -135,7 +134,7 @@ export const CreateCaseFormFields: React.FC = React.m ) : ( <> {firstStep.children} - {!disableAlerts && secondStep.children} + {isSyncAlertsEnabled && secondStep.children} {thirdStep.children} )} @@ -148,7 +147,6 @@ CreateCaseFormFields.displayName = 'CreateCaseFormFields'; export const CreateCaseForm: React.FC = React.memo( ({ - disableAlerts = false, hideConnectorServiceNowSir = false, withSteps = true, afterCaseCreated, @@ -163,12 +161,9 @@ export const CreateCaseForm: React.FC = React.memo( caseType={caseType} hideConnectorServiceNowSir={hideConnectorServiceNowSir} onSuccess={onSuccess} - // if we are disabling alerts, then we should not sync alerts - syncAlertsDefaultValue={!disableAlerts} > { ); }); - it('should set sync alerts to false when the sync setting is passed in as false and alerts are disabled', async () => { + it('should set sync alerts to false when the sync feature setting is false', async () => { useConnectorsMock.mockReturnValue({ ...sampleConnectorData, connectors: connectorsMock, }); const wrapper = mount( - - - + + + diff --git a/x-pack/plugins/cases/public/components/create/form_context.tsx b/x-pack/plugins/cases/public/components/create/form_context.tsx index 10bfa2e78acc43..a513056ba31a58 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.tsx @@ -17,6 +17,7 @@ import { Case } from '../../containers/types'; import { CaseType } from '../../../common'; import { UsePostComment, usePostComment } from '../../containers/use_post_comment'; import { useCasesContext } from '../cases_context/use_cases_context'; +import { useCasesFeatures } from '../cases_context/use_cases_features'; import { getConnectorById } from '../utils'; const initialCaseValue: FormProps = { @@ -34,7 +35,6 @@ interface Props { children?: JSX.Element | JSX.Element[]; hideConnectorServiceNowSir?: boolean; onSuccess?: (theCase: Case) => Promise; - syncAlertsDefaultValue?: boolean; } export const FormContext: React.FC = ({ @@ -43,10 +43,10 @@ export const FormContext: React.FC = ({ children, hideConnectorServiceNowSir, onSuccess, - syncAlertsDefaultValue = true, }) => { const { connectors, loading: isLoadingConnectors } = useConnectors(); const { owner } = useCasesContext(); + const { isSyncAlertsEnabled } = useCasesFeatures(); const { postCase } = usePostCase(); const { postComment } = usePostComment(); const { pushCaseToExternalService } = usePostPushToService(); @@ -56,7 +56,7 @@ export const FormContext: React.FC = ({ { connectorId: dataConnectorId, fields, - syncAlerts = syncAlertsDefaultValue, + syncAlerts = isSyncAlertsEnabled, ...dataWithoutConnectorId }, isValid @@ -93,6 +93,7 @@ export const FormContext: React.FC = ({ } }, [ + isSyncAlertsEnabled, connectors, postCase, caseType, @@ -101,7 +102,6 @@ export const FormContext: React.FC = ({ onSuccess, postComment, pushCaseToExternalService, - syncAlertsDefaultValue, ] ); diff --git a/x-pack/plugins/cases/public/components/create/index.tsx b/x-pack/plugins/cases/public/components/create/index.tsx index 97a1c1d2e8ff36..76c31d6f8c4c4d 100644 --- a/x-pack/plugins/cases/public/components/create/index.tsx +++ b/x-pack/plugins/cases/public/components/create/index.tsx @@ -21,7 +21,6 @@ export const CreateCase = React.memo( afterCaseCreated, caseType, hideConnectorServiceNowSir, - disableAlerts, onCancel, onSuccess, timelineIntegration, @@ -40,7 +39,6 @@ export const CreateCase = React.memo( afterCaseCreated={afterCaseCreated} caseType={caseType} hideConnectorServiceNowSir={hideConnectorServiceNowSir} - disableAlerts={disableAlerts} onCancel={onCancel} onSuccess={onSuccess} timelineIntegration={timelineIntegration} diff --git a/x-pack/plugins/cases/public/methods/get_cases.tsx b/x-pack/plugins/cases/public/methods/get_cases.tsx index 432c2d9fc5b2b1..94e7d321840a87 100644 --- a/x-pack/plugins/cases/public/methods/get_cases.tsx +++ b/x-pack/plugins/cases/public/methods/get_cases.tsx @@ -17,27 +17,24 @@ export const getCasesLazy = ({ owner, userCanCrud, basePath, - disableAlerts, onComponentInitialized, actionsNavigation, ruleDetailsNavigation, showAlertDetails, useFetchAlertData, refreshRef, - hideSyncAlerts, timelineIntegration, + features, }: GetCasesProps) => ( - + }> diff --git a/x-pack/plugins/cases/public/methods/get_create_case_flyout.tsx b/x-pack/plugins/cases/public/methods/get_create_case_flyout.tsx index 2128063ea90847..1e2143888bf1e6 100644 --- a/x-pack/plugins/cases/public/methods/get_create_case_flyout.tsx +++ b/x-pack/plugins/cases/public/methods/get_create_case_flyout.tsx @@ -18,18 +18,17 @@ const CreateCaseFlyoutLazy: React.FC = lazy( export const getCreateCaseFlyoutLazy = ({ owner, userCanCrud, + features, afterCaseCreated, onClose, onSuccess, - disableAlerts, }: GetCreateCaseFlyoutProps) => ( - + }> diff --git a/x-pack/plugins/observability/public/pages/cases/cases.tsx b/x-pack/plugins/observability/public/pages/cases/cases.tsx index d947f9aa864894..19eb16a3bd52be 100644 --- a/x-pack/plugins/observability/public/pages/cases/cases.tsx +++ b/x-pack/plugins/observability/public/pages/cases/cases.tsx @@ -43,9 +43,9 @@ export const Cases = React.memo(({ userCanCrud }) => { )} {casesUi.getCases({ basePath: CASES_PATH, - disableAlerts: true, userCanCrud, owner: [CASES_OWNER], + features: { alerts: { sync: false } }, useFetchAlertData, showAlertDetails: (alertId: string) => { setSelectedAlertId(alertId); @@ -65,7 +65,6 @@ export const Cases = React.memo(({ userCanCrud }) => { }); }, }, - hideSyncAlerts: true, })} ); diff --git a/x-pack/plugins/timelines/public/components/actions/timeline/cases/add_to_case_action.tsx b/x-pack/plugins/timelines/public/components/actions/timeline/cases/add_to_case_action.tsx index 05b18da3293bdf..c734442d5a77bd 100644 --- a/x-pack/plugins/timelines/public/components/actions/timeline/cases/add_to_case_action.tsx +++ b/x-pack/plugins/timelines/public/components/actions/timeline/cases/add_to_case_action.tsx @@ -7,7 +7,7 @@ import React, { memo, useMemo, useCallback } from 'react'; import { useDispatch } from 'react-redux'; -import { CaseStatuses, StatusAll } from '../../../../../../cases/common'; +import { CaseStatuses, StatusAll, CasesContextValue } from '../../../../../../cases/common'; import { TimelineItem } from '../../../../../common/'; import { useAddToCase, normalizedEventFields } from '../../../../hooks/use_add_to_case'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; @@ -24,7 +24,7 @@ export interface AddToCaseActionProps { appId: string; owner: string; onClose?: Function; - disableAlerts?: boolean; + casesFeatures?: CasesContextValue['features']; } const AddToCaseActionComponent: React.FC = ({ @@ -34,7 +34,7 @@ const AddToCaseActionComponent: React.FC = ({ appId, owner, onClose, - disableAlerts, + casesFeatures, }) => { const eventId = event?.ecs._id ?? ''; const eventIndex = event?.ecs._index ?? ''; @@ -94,8 +94,8 @@ const AddToCaseActionComponent: React.FC = ({ onSuccess: onCaseSuccess, useInsertTimeline, owner: [owner], - disableAlerts, userCanCrud: casePermissions?.crud ?? false, + features: casesFeatures, }; }, [ attachAlertToCase, @@ -103,8 +103,8 @@ const AddToCaseActionComponent: React.FC = ({ onCaseSuccess, useInsertTimeline, owner, - disableAlerts, casePermissions, + casesFeatures, ]); return ( diff --git a/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx b/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx index a95683e7de4aad..18009d9e176a8f 100644 --- a/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx +++ b/x-pack/plugins/timelines/public/components/t_grid/standalone/index.tsx @@ -75,6 +75,8 @@ const ScrollableFlexItem = styled(EuiFlexItem)` overflow: auto; `; +const casesFeatures = { alerts: { sync: false } }; + export interface TGridStandaloneProps { appId: string; casesOwner: string; @@ -416,7 +418,7 @@ const TGridStandaloneComponent: React.FC = ({ ) : null} - + ); From 9e12416d32a86a5b9cc136d66528096a3e642b76 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Thu, 2 Dec 2021 19:27:15 +0200 Subject: [PATCH 065/126] Normalize apm transaction names (#119740) * update task manager apm transactions * normalize reporting apm transaction names * update core transaction names * fix tests * typo + test * task manager types * consts * reporting transaction type * dummy * dummy * remove unused consts * Update src/core/server/server.ts Co-authored-by: Mikhail Shustov * Update src/core/server/server.ts Co-authored-by: Mikhail Shustov * Update src/core/server/server.ts Co-authored-by: Mikhail Shustov * new line * Update x-pack/plugins/task_manager/server/task_running/ephemeral_task_runner.ts Co-authored-by: ymao1 * Update x-pack/plugins/task_manager/server/task_running/ephemeral_task_runner.ts Co-authored-by: ymao1 * alerting code review * ok Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Mikhail Shustov Co-authored-by: ymao1 --- dev_docs/contributing/standards.mdx | 8 ++++++++ src/core/public/apm_system.ts | 2 +- src/core/server/server.ts | 6 +++--- x-pack/plugins/reporting/common/constants.ts | 2 ++ .../export_types/common/generate_png.ts | 11 ++++++----- .../export_types/png/execute_job/index.ts | 8 ++++---- .../server/export_types/png_v2/execute_job.ts | 8 ++++---- .../printable_pdf/execute_job/index.ts | 8 ++++---- .../export_types/printable_pdf/lib/tracker.ts | 17 +++++++++-------- .../printable_pdf_v2/execute_job.ts | 8 ++++---- .../printable_pdf_v2/lib/tracker.ts | 17 +++++++++-------- .../server/lib/screenshots/observable.ts | 5 +++-- .../lib/screenshots/observable_handler.ts | 2 +- .../server/queries/task_claiming.test.ts | 16 +++++++++++----- .../server/queries/task_claiming.ts | 8 ++++++-- .../task_running/ephemeral_task_runner.ts | 13 +++++++++++-- .../server/task_running/task_runner.test.ts | 19 +++++++++++++------ .../server/task_running/task_runner.ts | 12 ++++++++++-- 18 files changed, 109 insertions(+), 61 deletions(-) diff --git a/dev_docs/contributing/standards.mdx b/dev_docs/contributing/standards.mdx index 172a83935b9663..d2f31f3a4faa21 100644 --- a/dev_docs/contributing/standards.mdx +++ b/dev_docs/contributing/standards.mdx @@ -67,6 +67,14 @@ Every public API should have a release tag specified at the top of it’s docume Every team should be collecting telemetry metrics on it’s public API usage. This will be important for knowing when it’s safe to make breaking changes. The Core team will be looking into ways to make this easier and an automatic part of registration (see [#112291](https://github.com/elastic/kibana/issues/112291)). +### APM + +Kibana server and client are instrumented with APM node and APM RUM clients respectively, tracking serveral types of transactions by default, such as `page-load`, `request`, etc. +You may introduce custom transactions. Please refer to the [APM documentation](https://www.elastic.co/guide/en/apm/get-started/current/index.html) and follow these guidelines when doing so: + +- Use dashed syntax for transaction types and names: `my-transaction-type` and `my-transaction-name` +- [Refrain from adding too many custom labels](https://www.elastic.co/guide/en/apm/get-started/current/metadata.html) + ### Documentation Every public API should be documented inside the [docs/api](https://github.com/elastic/kibana/tree/main/docs/api) folder in asciidoc (this content will eventually be migrated to mdx to support the new docs system). If a public REST API is undocumented, you should either document it, or make it internal. diff --git a/src/core/public/apm_system.ts b/src/core/public/apm_system.ts index 5201b7005c66e1..f15a317f9f9349 100644 --- a/src/core/public/apm_system.ts +++ b/src/core/public/apm_system.ts @@ -71,7 +71,7 @@ export class ApmSystem { start.application.currentAppId$.subscribe((appId) => { if (appId && this.apm) { this.closePageLoadTransaction(); - this.apm.startTransaction(`/app/${appId}`, 'route-change', { + this.apm.startTransaction(appId, 'app-change', { managed: true, canReuse: true, }); diff --git a/src/core/server/server.ts b/src/core/server/server.ts index e8c7ce6abb0294..c35fde302578a4 100644 --- a/src/core/server/server.ts +++ b/src/core/server/server.ts @@ -128,7 +128,7 @@ export class Server { public async preboot() { this.log.debug('prebooting server'); - const prebootTransaction = apm.startTransaction('server_preboot', 'kibana_platform'); + const prebootTransaction = apm.startTransaction('server-preboot', 'kibana-platform'); const environmentPreboot = await this.environment.preboot(); @@ -184,7 +184,7 @@ export class Server { public async setup() { this.log.debug('setting up server'); - const setupTransaction = apm.startTransaction('server_setup', 'kibana_platform'); + const setupTransaction = apm.startTransaction('server-setup', 'kibana-platform'); const environmentSetup = this.environment.setup(); @@ -291,7 +291,7 @@ export class Server { public async start() { this.log.debug('starting server'); - const startTransaction = apm.startTransaction('server_start', 'kibana_platform'); + const startTransaction = apm.startTransaction('server-start', 'kibana-platform'); const executionContextStart = this.executionContext.start(); const elasticsearchStart = await this.elasticsearch.start(); diff --git a/x-pack/plugins/reporting/common/constants.ts b/x-pack/plugins/reporting/common/constants.ts index 1eef032945e69d..65d196b6e068a5 100644 --- a/x-pack/plugins/reporting/common/constants.ts +++ b/x-pack/plugins/reporting/common/constants.ts @@ -7,6 +7,8 @@ export const PLUGIN_ID = 'reporting'; +export const REPORTING_TRANSACTION_TYPE = PLUGIN_ID; + export const REPORTING_SYSTEM_INDEX = '.reporting'; export const JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY = diff --git a/x-pack/plugins/reporting/server/export_types/common/generate_png.ts b/x-pack/plugins/reporting/server/export_types/common/generate_png.ts index 5ad39a3f913035..c5e70a6c93eff6 100644 --- a/x-pack/plugins/reporting/server/export_types/common/generate_png.ts +++ b/x-pack/plugins/reporting/server/export_types/common/generate_png.ts @@ -8,6 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { finalize, map, tap } from 'rxjs/operators'; +import { REPORTING_TRANSACTION_TYPE } from '../../../common/constants'; import { ReportingCore } from '../../'; import { UrlOrUrlLocatorTuple } from '../../../common/types'; import { LevelLogger } from '../../lib'; @@ -27,8 +28,8 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { conditionalHeaders: ConditionalHeaders, layoutParams: LayoutParams & { selectors?: Partial } ): Rx.Observable<{ buffer: Buffer; warnings: string[] }> { - const apmTrans = apm.startTransaction('reporting generate_png', 'reporting'); - const apmLayout = apmTrans?.startSpan('create_layout', 'setup'); + const apmTrans = apm.startTransaction('generate-png', REPORTING_TRANSACTION_TYPE); + const apmLayout = apmTrans?.startSpan('create-layout', 'setup'); if (!layoutParams || !layoutParams.dimensions) { throw new Error(`LayoutParams.Dimensions is undefined.`); } @@ -36,7 +37,7 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { if (apmLayout) apmLayout.end(); - const apmScreenshots = apmTrans?.startSpan('screenshots_pipeline', 'setup'); + const apmScreenshots = apmTrans?.startSpan('screenshots-pipeline', 'setup'); let apmBuffer: typeof apm.currentSpan; const screenshots$ = getScreenshots$(captureConfig, browserDriverFactory, { logger, @@ -47,7 +48,7 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { }).pipe( tap(() => { apmScreenshots?.end(); - apmBuffer = apmTrans?.startSpan('get_buffer', 'output') ?? null; + apmBuffer = apmTrans?.startSpan('get-buffer', 'output') ?? null; }), map((results: ScreenshotResults[]) => ({ buffer: results[0].screenshots[0].data, @@ -63,7 +64,7 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { })), tap(({ buffer }) => { logger.debug(`PNG buffer byte length: ${buffer.byteLength}`); - apmTrans?.setLabel('byte_length', buffer.byteLength, false); + apmTrans?.setLabel('byte-length', buffer.byteLength, false); }), finalize(() => { apmBuffer?.end(); diff --git a/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts b/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts index fba6ea7b491c6a..2446e7a7d1c510 100644 --- a/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts +++ b/x-pack/plugins/reporting/server/export_types/png/execute_job/index.ts @@ -8,7 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, finalize, map, mergeMap, takeUntil, tap } from 'rxjs/operators'; -import { PNG_JOB_TYPE } from '../../../../common/constants'; +import { PNG_JOB_TYPE, REPORTING_TRANSACTION_TYPE } from '../../../../common/constants'; import { TaskRunResult } from '../../../lib/tasks'; import { RunTaskFn, RunTaskFnFactory } from '../../../types'; import { @@ -26,8 +26,8 @@ export const runTaskFnFactory: RunTaskFnFactory> = const encryptionKey = config.get('encryptionKey'); return async function runTask(jobId, job, cancellationToken, stream) { - const apmTrans = apm.startTransaction('reporting execute_job png', 'reporting'); - const apmGetAssets = apmTrans?.startSpan('get_assets', 'setup'); + const apmTrans = apm.startTransaction('execute-job-png', REPORTING_TRANSACTION_TYPE); + const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup'); let apmGeneratePng: { end: () => void } | null | undefined; const generatePngObservable = await generatePngObservableFactory(reporting); @@ -41,7 +41,7 @@ export const runTaskFnFactory: RunTaskFnFactory> = const hashUrl = urls[0]; if (apmGetAssets) apmGetAssets.end(); - apmGeneratePng = apmTrans?.startSpan('generate_png_pipeline', 'execute'); + apmGeneratePng = apmTrans?.startSpan('generate-png-pipeline', 'execute'); return generatePngObservable( jobLogger, hashUrl, diff --git a/x-pack/plugins/reporting/server/export_types/png_v2/execute_job.ts b/x-pack/plugins/reporting/server/export_types/png_v2/execute_job.ts index a7478de1cc96e3..00652309b88c1e 100644 --- a/x-pack/plugins/reporting/server/export_types/png_v2/execute_job.ts +++ b/x-pack/plugins/reporting/server/export_types/png_v2/execute_job.ts @@ -8,7 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, finalize, map, mergeMap, takeUntil, tap } from 'rxjs/operators'; -import { PNG_JOB_TYPE_V2 } from '../../../common/constants'; +import { PNG_JOB_TYPE_V2, REPORTING_TRANSACTION_TYPE } from '../../../common/constants'; import { TaskRunResult } from '../../lib/tasks'; import { RunTaskFn, RunTaskFnFactory } from '../../types'; import { @@ -26,8 +26,8 @@ export const runTaskFnFactory: RunTaskFnFactory> = const encryptionKey = config.get('encryptionKey'); return async function runTask(jobId, job, cancellationToken, stream) { - const apmTrans = apm.startTransaction('reporting execute_job pngV2', 'reporting'); - const apmGetAssets = apmTrans?.startSpan('get_assets', 'setup'); + const apmTrans = apm.startTransaction('execute-job-png-v2', REPORTING_TRANSACTION_TYPE); + const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup'); let apmGeneratePng: { end: () => void } | null | undefined; const generatePngObservable = await generatePngObservableFactory(reporting); @@ -42,7 +42,7 @@ export const runTaskFnFactory: RunTaskFnFactory> = apmGetAssets?.end(); - apmGeneratePng = apmTrans?.startSpan('generate_png_pipeline', 'execute'); + apmGeneratePng = apmTrans?.startSpan('generate-png-pipeline', 'execute'); return generatePngObservable( jobLogger, [url, locatorParams], diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts index f4b95e0e20e510..2358333bbe7ef5 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/execute_job/index.ts @@ -8,7 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil, tap } from 'rxjs/operators'; -import { PDF_JOB_TYPE } from '../../../../common/constants'; +import { PDF_JOB_TYPE, REPORTING_TRANSACTION_TYPE } from '../../../../common/constants'; import { TaskRunResult } from '../../../lib/tasks'; import { RunTaskFn, RunTaskFnFactory } from '../../../types'; import { @@ -28,8 +28,8 @@ export const runTaskFnFactory: RunTaskFnFactory> = return async function runTask(jobId, job, cancellationToken, stream) { const jobLogger = parentLogger.clone([PDF_JOB_TYPE, 'execute-job', jobId]); - const apmTrans = apm.startTransaction('reporting execute_job pdf', 'reporting'); - const apmGetAssets = apmTrans?.startSpan('get_assets', 'setup'); + const apmTrans = apm.startTransaction('execute-job-pdf', REPORTING_TRANSACTION_TYPE); + const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup'); let apmGeneratePdf: { end: () => void } | null | undefined; const generatePdfObservable = await generatePdfObservableFactory(reporting); @@ -47,7 +47,7 @@ export const runTaskFnFactory: RunTaskFnFactory> = const { browserTimezone, layout, title } = job; apmGetAssets?.end(); - apmGeneratePdf = apmTrans?.startSpan('generate_pdf_pipeline', 'execute'); + apmGeneratePdf = apmTrans?.startSpan('generate-pdf-pipeline', 'execute'); return generatePdfObservable( jobLogger, title, diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/tracker.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/tracker.ts index 4b5a0a7bdade71..3d720ccade546c 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/tracker.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf/lib/tracker.ts @@ -6,6 +6,7 @@ */ import apm from 'elastic-apm-node'; +import { REPORTING_TRANSACTION_TYPE } from '../../../../common/constants'; interface PdfTracker { setByteLength: (byteLength: number) => void; @@ -32,7 +33,7 @@ interface ApmSpan { } export function getTracker(): PdfTracker { - const apmTrans = apm.startTransaction('reporting generate_pdf', 'reporting'); + const apmTrans = apm.startTransaction('generate-pdf', REPORTING_TRANSACTION_TYPE); let apmLayout: ApmSpan | null = null; let apmScreenshots: ApmSpan | null = null; @@ -43,43 +44,43 @@ export function getTracker(): PdfTracker { return { startLayout() { - apmLayout = apmTrans?.startSpan('create_layout', SPANTYPE_SETUP) || null; + apmLayout = apmTrans?.startSpan('create-layout', SPANTYPE_SETUP) || null; }, endLayout() { if (apmLayout) apmLayout.end(); }, startScreenshots() { - apmScreenshots = apmTrans?.startSpan('screenshots_pipeline', SPANTYPE_SETUP) || null; + apmScreenshots = apmTrans?.startSpan('screenshots-pipeline', SPANTYPE_SETUP) || null; }, endScreenshots() { if (apmScreenshots) apmScreenshots.end(); }, startSetup() { - apmSetup = apmTrans?.startSpan('setup_pdf', SPANTYPE_SETUP) || null; + apmSetup = apmTrans?.startSpan('setup-pdf', SPANTYPE_SETUP) || null; }, endSetup() { if (apmSetup) apmSetup.end(); }, startAddImage() { - apmAddImage = apmTrans?.startSpan('add_pdf_image', SPANTYPE_OUTPUT) || null; + apmAddImage = apmTrans?.startSpan('add-pdf-image', SPANTYPE_OUTPUT) || null; }, endAddImage() { if (apmAddImage) apmAddImage.end(); }, startCompile() { - apmCompilePdf = apmTrans?.startSpan('compile_pdf', SPANTYPE_OUTPUT) || null; + apmCompilePdf = apmTrans?.startSpan('compile-pdf', SPANTYPE_OUTPUT) || null; }, endCompile() { if (apmCompilePdf) apmCompilePdf.end(); }, startGetBuffer() { - apmGetBuffer = apmTrans?.startSpan('get_buffer', SPANTYPE_OUTPUT) || null; + apmGetBuffer = apmTrans?.startSpan('get-buffer', SPANTYPE_OUTPUT) || null; }, endGetBuffer() { if (apmGetBuffer) apmGetBuffer.end(); }, setByteLength(byteLength: number) { - apmTrans?.setLabel('byte_length', byteLength, false); + apmTrans?.setLabel('byte-length', byteLength, false); }, end() { if (apmTrans) apmTrans.end(); diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/execute_job.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/execute_job.ts index 2c553295aa840d..b1b6f3f79aee36 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/execute_job.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/execute_job.ts @@ -8,7 +8,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil, tap } from 'rxjs/operators'; -import { PDF_JOB_TYPE_V2 } from '../../../common/constants'; +import { PDF_JOB_TYPE_V2, REPORTING_TRANSACTION_TYPE } from '../../../common/constants'; import { TaskRunResult } from '../../lib/tasks'; import { RunTaskFn, RunTaskFnFactory } from '../../types'; import { @@ -27,8 +27,8 @@ export const runTaskFnFactory: RunTaskFnFactory> = return async function runTask(jobId, job, cancellationToken, stream) { const jobLogger = parentLogger.clone([PDF_JOB_TYPE_V2, 'execute-job', jobId]); - const apmTrans = apm.startTransaction('reporting execute_job pdf_v2', 'reporting'); - const apmGetAssets = apmTrans?.startSpan('get_assets', 'setup'); + const apmTrans = apm.startTransaction('execute-job-pdf-v2', REPORTING_TRANSACTION_TYPE); + const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup'); let apmGeneratePdf: { end: () => void } | null | undefined; const generatePdfObservable = await generatePdfObservableFactory(reporting); @@ -44,7 +44,7 @@ export const runTaskFnFactory: RunTaskFnFactory> = const { browserTimezone, layout, title, locatorParams } = job; apmGetAssets?.end(); - apmGeneratePdf = apmTrans?.startSpan('generate_pdf_pipeline', 'execute'); + apmGeneratePdf = apmTrans?.startSpan('generate-pdf-pipeline', 'execute'); return generatePdfObservable( jobLogger, job, diff --git a/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/tracker.ts b/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/tracker.ts index 4b5a0a7bdade71..3d720ccade546c 100644 --- a/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/tracker.ts +++ b/x-pack/plugins/reporting/server/export_types/printable_pdf_v2/lib/tracker.ts @@ -6,6 +6,7 @@ */ import apm from 'elastic-apm-node'; +import { REPORTING_TRANSACTION_TYPE } from '../../../../common/constants'; interface PdfTracker { setByteLength: (byteLength: number) => void; @@ -32,7 +33,7 @@ interface ApmSpan { } export function getTracker(): PdfTracker { - const apmTrans = apm.startTransaction('reporting generate_pdf', 'reporting'); + const apmTrans = apm.startTransaction('generate-pdf', REPORTING_TRANSACTION_TYPE); let apmLayout: ApmSpan | null = null; let apmScreenshots: ApmSpan | null = null; @@ -43,43 +44,43 @@ export function getTracker(): PdfTracker { return { startLayout() { - apmLayout = apmTrans?.startSpan('create_layout', SPANTYPE_SETUP) || null; + apmLayout = apmTrans?.startSpan('create-layout', SPANTYPE_SETUP) || null; }, endLayout() { if (apmLayout) apmLayout.end(); }, startScreenshots() { - apmScreenshots = apmTrans?.startSpan('screenshots_pipeline', SPANTYPE_SETUP) || null; + apmScreenshots = apmTrans?.startSpan('screenshots-pipeline', SPANTYPE_SETUP) || null; }, endScreenshots() { if (apmScreenshots) apmScreenshots.end(); }, startSetup() { - apmSetup = apmTrans?.startSpan('setup_pdf', SPANTYPE_SETUP) || null; + apmSetup = apmTrans?.startSpan('setup-pdf', SPANTYPE_SETUP) || null; }, endSetup() { if (apmSetup) apmSetup.end(); }, startAddImage() { - apmAddImage = apmTrans?.startSpan('add_pdf_image', SPANTYPE_OUTPUT) || null; + apmAddImage = apmTrans?.startSpan('add-pdf-image', SPANTYPE_OUTPUT) || null; }, endAddImage() { if (apmAddImage) apmAddImage.end(); }, startCompile() { - apmCompilePdf = apmTrans?.startSpan('compile_pdf', SPANTYPE_OUTPUT) || null; + apmCompilePdf = apmTrans?.startSpan('compile-pdf', SPANTYPE_OUTPUT) || null; }, endCompile() { if (apmCompilePdf) apmCompilePdf.end(); }, startGetBuffer() { - apmGetBuffer = apmTrans?.startSpan('get_buffer', SPANTYPE_OUTPUT) || null; + apmGetBuffer = apmTrans?.startSpan('get-buffer', SPANTYPE_OUTPUT) || null; }, endGetBuffer() { if (apmGetBuffer) apmGetBuffer.end(); }, setByteLength(byteLength: number) { - apmTrans?.setLabel('byte_length', byteLength, false); + apmTrans?.setLabel('byte-length', byteLength, false); }, end() { if (apmTrans) apmTrans.end(); diff --git a/x-pack/plugins/reporting/server/lib/screenshots/observable.ts b/x-pack/plugins/reporting/server/lib/screenshots/observable.ts index d400c423c5e04b..8ba2a125a5504c 100644 --- a/x-pack/plugins/reporting/server/lib/screenshots/observable.ts +++ b/x-pack/plugins/reporting/server/lib/screenshots/observable.ts @@ -9,6 +9,7 @@ import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, concatMap, first, mergeMap, take, takeUntil, toArray } from 'rxjs/operators'; import { durationToNumber } from '../../../common/schema_utils'; +import { REPORTING_TRANSACTION_TYPE } from '../../../common/constants'; import { HeadlessChromiumDriverFactory } from '../../browsers'; import { CaptureConfig } from '../../types'; import { @@ -46,8 +47,8 @@ export function getScreenshots$( browserDriverFactory: HeadlessChromiumDriverFactory, opts: ScreenshotObservableOpts ): Rx.Observable { - const apmTrans = apm.startTransaction(`reporting screenshot pipeline`, 'reporting'); - const apmCreatePage = apmTrans?.startSpan('create_page', 'wait'); + const apmTrans = apm.startTransaction('screenshot-pipeline', REPORTING_TRANSACTION_TYPE); + const apmCreatePage = apmTrans?.startSpan('create-page', 'wait'); const { browserTimezone, logger } = opts; return browserDriverFactory.createPage({ browserTimezone }, logger).pipe( diff --git a/x-pack/plugins/reporting/server/lib/screenshots/observable_handler.ts b/x-pack/plugins/reporting/server/lib/screenshots/observable_handler.ts index cdbddb8d89c89c..c241a529818fa3 100644 --- a/x-pack/plugins/reporting/server/lib/screenshots/observable_handler.ts +++ b/x-pack/plugins/reporting/server/lib/screenshots/observable_handler.ts @@ -110,7 +110,7 @@ export class ScreenshotObservableHandler { // allows for them to be displayed properly in many cases await injectCustomCss(driver, layout, logger); - const apmPositionElements = apmTrans?.startSpan('position_elements', 'correction'); + const apmPositionElements = apmTrans?.startSpan('position-elements', 'correction'); // position panel elements for print layout await layout.positionElements?.(driver, logger); apmPositionElements?.end(); diff --git a/x-pack/plugins/task_manager/server/queries/task_claiming.test.ts b/x-pack/plugins/task_manager/server/queries/task_claiming.test.ts index eed8858dc95d8f..ed656b51449561 100644 --- a/x-pack/plugins/task_manager/server/queries/task_claiming.test.ts +++ b/x-pack/plugins/task_manager/server/queries/task_claiming.test.ts @@ -17,10 +17,16 @@ import { asOk, asErr } from '../lib/result_type'; import { TaskTypeDictionary } from '../task_type_dictionary'; import type { MustNotCondition } from '../queries/query_clauses'; import { mockLogger } from '../test_utils'; -import { TaskClaiming, OwnershipClaimingOpts, TaskClaimingOpts } from './task_claiming'; +import { + TaskClaiming, + OwnershipClaimingOpts, + TaskClaimingOpts, + TASK_MANAGER_MARK_AS_CLAIMED, +} from './task_claiming'; import { Observable } from 'rxjs'; import { taskStoreMock } from '../task_store.mock'; import apm from 'elastic-apm-node'; +import { TASK_MANAGER_TRANSACTION_TYPE } from '../task_running'; const taskManagerLogger = mockLogger(); @@ -190,8 +196,8 @@ describe('TaskClaiming', () => { const results = await getAllAsPromise(taskClaiming.claimAvailableTasks(claimingOpts)); expect(apm.startTransaction).toHaveBeenCalledWith( - 'markAvailableTasksAsClaimed', - 'taskManager markAvailableTasksAsClaimed' + TASK_MANAGER_MARK_AS_CLAIMED, + TASK_MANAGER_TRANSACTION_TYPE ); expect(mockApmTrans.end).toHaveBeenCalledWith('success'); @@ -250,8 +256,8 @@ describe('TaskClaiming', () => { ).rejects.toMatchInlineSnapshot(`[Error: Oh no]`); expect(apm.startTransaction).toHaveBeenCalledWith( - 'markAvailableTasksAsClaimed', - 'taskManager markAvailableTasksAsClaimed' + TASK_MANAGER_MARK_AS_CLAIMED, + TASK_MANAGER_TRANSACTION_TYPE ); expect(mockApmTrans.end).toHaveBeenCalledWith('failure'); }); diff --git a/x-pack/plugins/task_manager/server/queries/task_claiming.ts b/x-pack/plugins/task_manager/server/queries/task_claiming.ts index fb0b92e87a4245..b45591a233e192 100644 --- a/x-pack/plugins/task_manager/server/queries/task_claiming.ts +++ b/x-pack/plugins/task_manager/server/queries/task_claiming.ts @@ -52,6 +52,7 @@ import { SearchOpts, } from '../task_store'; import { FillPoolResult } from '../lib/fill_pool'; +import { TASK_MANAGER_TRANSACTION_TYPE } from '../task_running'; export interface TaskClaimingOpts { logger: Logger; @@ -106,6 +107,8 @@ interface TaskClaimingBatch { type UnlimitedBatch = TaskClaimingBatch>; type LimitedBatch = TaskClaimingBatch; +export const TASK_MANAGER_MARK_AS_CLAIMED = 'mark-available-tasks-as-claimed'; + export class TaskClaiming { public readonly errors$ = new Subject(); public readonly maxAttempts: number; @@ -412,9 +415,10 @@ export class TaskClaiming { ); const apmTrans = apm.startTransaction( - 'markAvailableTasksAsClaimed', - `taskManager markAvailableTasksAsClaimed` + TASK_MANAGER_MARK_AS_CLAIMED, + TASK_MANAGER_TRANSACTION_TYPE ); + try { const result = await this.taskStore.updateByQuery( { diff --git a/x-pack/plugins/task_manager/server/task_running/ephemeral_task_runner.ts b/x-pack/plugins/task_manager/server/task_running/ephemeral_task_runner.ts index 0695ed149c9a4a..0085329cd66e61 100644 --- a/x-pack/plugins/task_manager/server/task_running/ephemeral_task_runner.ts +++ b/x-pack/plugins/task_manager/server/task_running/ephemeral_task_runner.ts @@ -48,6 +48,9 @@ import { TaskRunner, TaskRunningInstance, TaskRunResult, + TASK_MANAGER_RUN_TRANSACTION_TYPE, + TASK_MANAGER_TRANSACTION_TYPE, + TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING, } from './task_runner'; type Opts = { @@ -206,9 +209,11 @@ export class EphemeralTaskManagerRunner implements TaskRunner { ); } this.logger.debug(`Running ephemeral task ${this}`); - const apmTrans = apm.startTransaction(this.taskType, 'taskManager ephemeral run', { + const apmTrans = apm.startTransaction(this.taskType, TASK_MANAGER_RUN_TRANSACTION_TYPE, { childOf: this.instance.task.traceparent, }); + apmTrans?.addLabels({ ephemeral: true }); + const modifiedContext = await this.beforeRun({ taskInstance: asConcreteInstance(this.instance.task), }); @@ -261,7 +266,11 @@ export class EphemeralTaskManagerRunner implements TaskRunner { ); } - const apmTrans = apm.startTransaction('taskManager', 'taskManager markTaskAsRunning'); + const apmTrans = apm.startTransaction( + TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING, + TASK_MANAGER_TRANSACTION_TYPE + ); + apmTrans?.addLabels({ entityId: this.taskType }); const now = new Date(); try { diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts index 02be86c3db0c20..1408fadc102e46 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.test.ts @@ -26,6 +26,11 @@ import { throwUnrecoverableError } from './errors'; import { taskStoreMock } from '../task_store.mock'; import apm from 'elastic-apm-node'; import { executionContextServiceMock } from '../../../../../src/core/server/mocks'; +import { + TASK_MANAGER_RUN_TRANSACTION_TYPE, + TASK_MANAGER_TRANSACTION_TYPE, + TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING, +} from './task_runner'; const executionContext = executionContextServiceMock.createSetupContract(); const minutesFromNow = (mins: number): Date => secondsFromNow(mins * 60); @@ -47,6 +52,8 @@ describe('TaskManagerRunner', () => { const readyToRunStageSetup = (opts: TestOpts) => testOpts(TaskRunningStage.READY_TO_RUN, opts); const mockApmTrans = { end: jest.fn(), + addLabels: jest.fn(), + setLabel: jest.fn(), }; test('execution ID', async () => { @@ -88,8 +95,8 @@ describe('TaskManagerRunner', () => { }); await runner.markTaskAsRunning(); expect(apm.startTransaction).toHaveBeenCalledWith( - 'taskManager', - 'taskManager markTaskAsRunning' + TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING, + TASK_MANAGER_TRANSACTION_TYPE ); expect(mockApmTrans.end).toHaveBeenCalledWith('success'); }); @@ -117,8 +124,8 @@ describe('TaskManagerRunner', () => { ); // await runner.markTaskAsRunning(); expect(apm.startTransaction).toHaveBeenCalledWith( - 'taskManager', - 'taskManager markTaskAsRunning' + TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING, + TASK_MANAGER_TRANSACTION_TYPE ); expect(mockApmTrans.end).toHaveBeenCalledWith('failure'); }); @@ -706,7 +713,7 @@ describe('TaskManagerRunner', () => { }, }); await runner.run(); - expect(apm.startTransaction).toHaveBeenCalledWith('bar', 'taskManager run', { + expect(apm.startTransaction).toHaveBeenCalledWith('bar', TASK_MANAGER_RUN_TRANSACTION_TYPE, { childOf: 'apmTraceparent', }); expect(mockApmTrans.end).toHaveBeenCalledWith('success'); @@ -729,7 +736,7 @@ describe('TaskManagerRunner', () => { }, }); await runner.run(); - expect(apm.startTransaction).toHaveBeenCalledWith('bar', 'taskManager run', { + expect(apm.startTransaction).toHaveBeenCalledWith('bar', TASK_MANAGER_RUN_TRANSACTION_TYPE, { childOf: 'apmTraceparent', }); expect(mockApmTrans.end).toHaveBeenCalledWith('failure'); diff --git a/x-pack/plugins/task_manager/server/task_running/task_runner.ts b/x-pack/plugins/task_manager/server/task_running/task_runner.ts index cd07b4db728c42..cf5ee80d2a82a0 100644 --- a/x-pack/plugins/task_manager/server/task_running/task_runner.ts +++ b/x-pack/plugins/task_manager/server/task_running/task_runner.ts @@ -60,6 +60,10 @@ import { isUnrecoverableError } from './errors'; const defaultBackoffPerFailure = 5 * 60 * 1000; export const EMPTY_RUN_RESULT: SuccessfulRunResult = { state: {} }; +export const TASK_MANAGER_RUN_TRANSACTION_TYPE = 'task-run'; +export const TASK_MANAGER_TRANSACTION_TYPE = 'task-manager'; +export const TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING = 'mark-task-as-running'; + export interface TaskRunner { isExpired: boolean; expiration: Date; @@ -276,7 +280,7 @@ export class TaskManagerRunner implements TaskRunner { } this.logger.debug(`Running task ${this}`); - const apmTrans = apm.startTransaction(this.taskType, 'taskManager run', { + const apmTrans = apm.startTransaction(this.taskType, TASK_MANAGER_RUN_TRANSACTION_TYPE, { childOf: this.instance.task.traceparent, }); @@ -333,7 +337,11 @@ export class TaskManagerRunner implements TaskRunner { ); } - const apmTrans = apm.startTransaction('taskManager', 'taskManager markTaskAsRunning'); + const apmTrans = apm.startTransaction( + TASK_MANAGER_TRANSACTION_TYPE_MARK_AS_RUNNING, + TASK_MANAGER_TRANSACTION_TYPE + ); + apmTrans?.addLabels({ entityId: this.taskType }); const now = new Date(); try { From 41cc382269afecee2de4da60238c1959cddbbeb7 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Thu, 2 Dec 2021 11:42:14 -0600 Subject: [PATCH 066/126] [Enterprise Search] Remove `external_id` from UI code (#120143) * [Enterprise Search] Remove `external_id` from UI code Ports https://github.com/elastic/ent-search/pull/5441 to Kibana. `external_id` was an alias for regular `id` was removed in the Enterprise Search API. * Add path to logic file Not really related to this PR, but needed for debugging in the Redux dev tools * Rename missed argument name Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../components/schema/reindex_job/reindex_job_logic.test.ts | 4 ++-- .../shared/schema/errors_accordion/index.test.tsx | 4 ++-- .../applications/shared/schema/errors_accordion/index.tsx | 4 ++-- .../public/applications/shared/schema/types.ts | 2 +- .../workplace_search/__mocks__/content_sources.mock.ts | 2 +- .../public/applications/workplace_search/types.ts | 2 +- .../components/display_settings/display_settings_logic.ts | 1 + .../content_sources/components/schema/schema_logic.test.ts | 2 +- 8 files changed, 11 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/reindex_job/reindex_job_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/reindex_job/reindex_job_logic.test.ts index 706dc3549badca..bb8156a8b55fab 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/reindex_job/reindex_job_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/reindex_job/reindex_job_logic.test.ts @@ -25,13 +25,13 @@ describe('ReindexJobLogic', () => { fieldCoercionErrors: { some_erroring_field: [ { - external_id: 'document-1', + id: 'document-1', error: "Value 'some text' cannot be parsed as a number", }, ], another_erroring_field: [ { - external_id: 'document-2', + id: 'document-2', error: "Value '123' cannot be parsed as a date", }, ], diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.test.tsx index 5413da9d56161e..19d04ea3de17ec 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.test.tsx @@ -22,11 +22,11 @@ describe('SchemaErrorsAccordion', () => { fieldCoercionErrors: { id: [ { - external_id: 'foo', + id: 'foo', error: 'this is an error', }, { - external_id: 'bar', + id: 'bar', error: 'this is another error', }, ], diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.tsx index 35675d246a15e6..99f3d30c6caae6 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/schema/errors_accordion/index.tsx @@ -36,7 +36,7 @@ import './schema_errors_accordion.scss'; interface Props { fieldCoercionErrors: FieldCoercionErrors; schema: Schema; - generateViewPath?(externalId: string): string; + generateViewPath?(id: string): string; } export const SchemaErrorsAccordion: React.FC = ({ @@ -89,7 +89,7 @@ export const SchemaErrorsAccordion: React.FC = ({ {errors.map((error) => { - const { external_id: id, error: errorMessage } = error; + const { id, error: errorMessage } = error; return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/schema/types.ts b/x-pack/plugins/enterprise_search/public/applications/shared/schema/types.ts index 5a423ad510af14..58ad584fd5b60c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/schema/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/schema/types.ts @@ -58,7 +58,7 @@ export interface IndexJob extends IIndexingStatus { } export interface FieldCoercionError { - external_id: string; + id: string; error: string; } export type FieldCoercionErrors = Record; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts index 48cbf4ba00d87c..85ffde0acfea3d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/__mocks__/content_sources.mock.ts @@ -370,7 +370,7 @@ export const exampleResult = { myLink: 'http://foo', otherTitle: 'foo', content_source_id: '60e85e7ea2564c265a88a4f0', - external_id: 'doc-60e85eb7a2564c937a88a4f3', + id: 'doc-60e85eb7a2564c937a88a4f3', last_updated: '2021-07-09T14:35:35+00:00', updated_at: '2021-07-09T14:35:35+00:00', source: 'custom', diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts index 2a982c2be1cfc8..0fa8c00409d1a5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/types.ts @@ -257,7 +257,7 @@ export type CustomAPIFieldValue = export interface Result { content_source_id: string; last_updated: string; - external_id: string; + id: string; updated_at: string; source: string; [key: string]: CustomAPIFieldValue; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings_logic.ts index d62bd6252f1306..f7076b4d02afb9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings_logic.ts @@ -123,6 +123,7 @@ export const defaultSearchResultConfig = { export const DisplaySettingsLogic = kea< MakeLogicType >({ + path: ['enterprise_search', 'workplace_search', 'display_settings_logic'], actions: { onInitializeDisplaySettings: (displaySettingsProps: DisplaySettingsInitialData) => displaySettingsProps, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts index d284f5c741eb30..748e5068833cf0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts @@ -67,7 +67,7 @@ describe('SchemaLogic', () => { const fieldCoercionErrors = [ { - external_id: '123', + id: '123', error: 'error', }, ] as any; From 392325ceae5de27739b7967e706a98866b259d93 Mon Sep 17 00:00:00 2001 From: Oleksiy Kovyrin Date: Thu, 2 Dec 2021 13:29:31 -0500 Subject: [PATCH 067/126] Remove links to docs about different auth methods in Enterprise Search (#120127) * Remove links to docs about different auth methods in Enterprise Search --- ...-plugin-core-public.doclinksstart.links.md | 4 - ...kibana-plugin-core-public.doclinksstart.md | 2 +- .../public/doc_links/doc_links_service.ts | 8 -- src/core/public/public.api.md | 4 - .../components/setup_guide/setup_guide.tsx | 8 +- .../public/applications/app_search/routes.ts | 2 - .../components/setup_guide/setup_guide.tsx | 3 - .../shared/doc_links/doc_links.ts | 12 --- .../shared/setup_guide/instructions.test.tsx | 17 +--- .../shared/setup_guide/instructions.tsx | 80 +------------------ .../shared/setup_guide/setup_guide.tsx | 16 +--- .../applications/workplace_search/routes.ts | 2 - .../views/setup_guide/setup_guide.tsx | 8 +- .../translations/translations/ja-JP.json | 5 -- .../translations/translations/zh-CN.json | 5 -- 15 files changed, 7 insertions(+), 169 deletions(-) diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md index 7669b9b6449169..403d8594999a7c 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.links.md @@ -72,13 +72,11 @@ readonly links: { readonly indexingDocumentsSchema: string; readonly logSettings: string; readonly metaEngines: string; - readonly nativeAuth: string; readonly precisionTuning: string; readonly relevanceTuning: string; readonly resultSettings: string; readonly searchUI: string; readonly security: string; - readonly standardAuth: string; readonly synonyms: string; readonly webCrawler: string; readonly webCrawlerEventLogs: string; @@ -105,7 +103,6 @@ readonly links: { readonly indexingSchedule: string; readonly jiraCloud: string; readonly jiraServer: string; - readonly nativeAuth: string; readonly oneDrive: string; readonly permissions: string; readonly salesforce: string; @@ -113,7 +110,6 @@ readonly links: { readonly serviceNow: string; readonly sharePoint: string; readonly slack: string; - readonly standardAuth: string; readonly synch: string; readonly zendesk: string; }; diff --git a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md index 6aa528d4f04d14..131d4452c980c8 100644 --- a/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md +++ b/docs/development/core/public/kibana-plugin-core-public.doclinksstart.md @@ -17,5 +17,5 @@ export interface DocLinksStart | --- | --- | --- | | [DOC\_LINK\_VERSION](./kibana-plugin-core-public.doclinksstart.doc_link_version.md) | string | | | [ELASTIC\_WEBSITE\_URL](./kibana-plugin-core-public.doclinksstart.elastic_website_url.md) | string | | -| [links](./kibana-plugin-core-public.doclinksstart.links.md) | { readonly settings: string; readonly elasticStackGetStarted: string; readonly upgrade: { readonly upgradingElasticStack: string; }; readonly apm: { readonly kibanaSettings: string; readonly supportedServiceMaps: string; readonly customLinks: string; readonly droppedTransactionSpans: string; readonly upgrading: string; readonly metaData: string; }; readonly canvas: { readonly guide: string; }; readonly cloud: { readonly indexManagement: string; }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; readonly drilldownsTriggerPicker: string; readonly urlDrilldownTemplateSyntax: string; readonly urlDrilldownVariables: string; }; readonly discover: Record<string, string>; readonly filebeat: { readonly base: string; readonly installation: string; readonly configuration: string; readonly elasticsearchOutput: string; readonly elasticsearchModule: string; readonly startup: string; readonly exportedFields: string; readonly suricataModule: string; readonly zeekModule: string; }; readonly auditbeat: { readonly base: string; readonly auditdModule: string; readonly systemModule: string; }; readonly metricbeat: { readonly base: string; readonly configure: string; readonly httpEndpoint: string; readonly install: string; readonly start: string; }; readonly appSearch: { readonly apiRef: string; readonly apiClients: string; readonly apiKeys: string; readonly authentication: string; readonly crawlRules: string; readonly curations: string; readonly duplicateDocuments: string; readonly entryPoints: string; readonly guide: string; readonly indexingDocuments: string; readonly indexingDocumentsSchema: string; readonly logSettings: string; readonly metaEngines: string; readonly nativeAuth: string; readonly precisionTuning: string; readonly relevanceTuning: string; readonly resultSettings: string; readonly searchUI: string; readonly security: string; readonly standardAuth: string; readonly synonyms: string; readonly webCrawler: string; readonly webCrawlerEventLogs: string; }; readonly enterpriseSearch: { readonly configuration: string; readonly licenseManagement: string; readonly mailService: string; readonly usersAccess: string; }; readonly workplaceSearch: { readonly box: string; readonly confluenceCloud: string; readonly confluenceServer: string; readonly customSources: string; readonly customSourcePermissions: string; readonly documentPermissions: string; readonly dropbox: string; readonly externalIdentities: string; readonly gitHub: string; readonly gettingStarted: string; readonly gmail: string; readonly googleDrive: string; readonly indexingSchedule: string; readonly jiraCloud: string; readonly jiraServer: string; readonly nativeAuth: string; readonly oneDrive: string; readonly permissions: string; readonly salesforce: string; readonly security: string; readonly serviceNow: string; readonly sharePoint: string; readonly slack: string; readonly standardAuth: string; readonly synch: string; readonly zendesk: string; }; readonly heartbeat: { readonly base: string; }; readonly libbeat: { readonly getStarted: 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 terms\_doc\_count\_error: 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: { readonly overview: string; readonly mapping: 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 search: { readonly sessions: string; readonly sessionLimits: string; }; readonly indexPatterns: { readonly introduction: string; readonly fieldFormattersNumber: string; readonly fieldFormattersString: string; readonly runtimeFields: string; }; readonly addData: string; readonly kibana: string; readonly upgradeAssistant: { readonly overview: string; readonly batchReindex: string; readonly remoteReindex: string; }; readonly rollupJobs: string; readonly elasticsearch: Record<string, string>; readonly siem: { readonly privileges: string; readonly guide: string; readonly gettingStarted: string; readonly ml: string; readonly ruleChangeLog: string; readonly detectionsReq: string; readonly networkMap: string; readonly troubleshootGaps: string; }; readonly securitySolution: { readonly trustedApps: string; }; readonly query: { readonly eql: string; readonly kueryQuerySyntax: string; readonly luceneQuerySyntax: string; readonly percolate: string; readonly queryDsl: string; }; readonly date: { readonly dateMath: string; readonly dateMathIndexNames: string; }; readonly management: Record<string, string>; readonly ml: Record<string, string>; readonly transforms: Record<string, string>; readonly visualize: Record<string, string>; readonly apis: Readonly<{ bulkIndexAlias: string; byteSizeUnits: string; createAutoFollowPattern: string; createFollower: string; createIndex: string; createSnapshotLifecyclePolicy: string; createRoleMapping: string; createRoleMappingTemplates: string; createRollupJobsRequest: 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; putIndexTemplateV1: string; putWatch: string; simulatePipeline: string; timeUnits: string; updateTransform: string; }>; readonly observability: Readonly<{ guide: string; infrastructureThreshold: string; logsThreshold: string; metricsThreshold: string; monitorStatus: string; monitorUptime: string; tlsCertificate: string; uptimeDurationAnomaly: string; }>; readonly alerting: Record<string, string>; readonly maps: Readonly<{ guide: string; importGeospatialPrivileges: string; gdalTutorial: string; }>; readonly monitoring: Record<string, string>; readonly security: Readonly<{ apiKeyServiceSettings: string; clusterPrivileges: string; elasticsearchSettings: string; elasticsearchEnableSecurity: string; elasticsearchEnableApiKeys: string; indicesPrivileges: string; kibanaTLS: string; kibanaPrivileges: string; mappingRoles: string; mappingRolesFieldRules: string; runAsPrivilege: string; }>; readonly spaces: Readonly<{ kibanaLegacyUrlAliases: string; kibanaDisableLegacyUrlAliasesApi: string; }>; readonly watcher: Record<string, string>; readonly ccs: Record<string, string>; readonly plugins: Record<string, string>; readonly snapshotRestore: Record<string, string>; readonly ingest: Record<string, string>; readonly fleet: Readonly<{ beatsAgentComparison: string; guide: string; fleetServer: string; fleetServerAddFleetServer: string; settings: string; settingsFleetServerHostSettings: string; settingsFleetServerProxySettings: string; troubleshooting: string; elasticAgent: string; datastreams: string; datastreamsNamingScheme: string; installElasticAgent: string; installElasticAgentStandalone: string; upgradeElasticAgent: string; upgradeElasticAgent712lower: string; learnMoreBlog: string; apiKeysLearnMore: string; onPremRegistry: string; }>; readonly ecs: { readonly guide: string; }; readonly clients: { readonly guide: string; readonly goOverview: string; readonly javaIndex: string; readonly jsIntro: string; readonly netGuide: string; readonly perlGuide: string; readonly phpGuide: string; readonly pythonGuide: string; readonly rubyOverview: string; readonly rustGuide: string; }; readonly endpoints: { readonly troubleshooting: string; }; } | | +| [links](./kibana-plugin-core-public.doclinksstart.links.md) | { readonly settings: string; readonly elasticStackGetStarted: string; readonly upgrade: { readonly upgradingElasticStack: string; }; readonly apm: { readonly kibanaSettings: string; readonly supportedServiceMaps: string; readonly customLinks: string; readonly droppedTransactionSpans: string; readonly upgrading: string; readonly metaData: string; }; readonly canvas: { readonly guide: string; }; readonly cloud: { readonly indexManagement: string; }; readonly dashboard: { readonly guide: string; readonly drilldowns: string; readonly drilldownsTriggerPicker: string; readonly urlDrilldownTemplateSyntax: string; readonly urlDrilldownVariables: string; }; readonly discover: Record<string, string>; readonly filebeat: { readonly base: string; readonly installation: string; readonly configuration: string; readonly elasticsearchOutput: string; readonly elasticsearchModule: string; readonly startup: string; readonly exportedFields: string; readonly suricataModule: string; readonly zeekModule: string; }; readonly auditbeat: { readonly base: string; readonly auditdModule: string; readonly systemModule: string; }; readonly metricbeat: { readonly base: string; readonly configure: string; readonly httpEndpoint: string; readonly install: string; readonly start: string; }; readonly appSearch: { readonly apiRef: string; readonly apiClients: string; readonly apiKeys: string; readonly authentication: string; readonly crawlRules: string; readonly curations: string; readonly duplicateDocuments: string; readonly entryPoints: string; readonly guide: string; readonly indexingDocuments: string; readonly indexingDocumentsSchema: string; readonly logSettings: string; readonly metaEngines: string; readonly precisionTuning: string; readonly relevanceTuning: string; readonly resultSettings: string; readonly searchUI: string; readonly security: string; readonly synonyms: string; readonly webCrawler: string; readonly webCrawlerEventLogs: string; }; readonly enterpriseSearch: { readonly configuration: string; readonly licenseManagement: string; readonly mailService: string; readonly usersAccess: string; }; readonly workplaceSearch: { readonly box: string; readonly confluenceCloud: string; readonly confluenceServer: string; readonly customSources: string; readonly customSourcePermissions: string; readonly documentPermissions: string; readonly dropbox: string; readonly externalIdentities: string; readonly gitHub: string; readonly gettingStarted: string; readonly gmail: string; readonly googleDrive: string; readonly indexingSchedule: string; readonly jiraCloud: string; readonly jiraServer: string; readonly oneDrive: string; readonly permissions: string; readonly salesforce: string; readonly security: string; readonly serviceNow: string; readonly sharePoint: string; readonly slack: string; readonly synch: string; readonly zendesk: string; }; readonly heartbeat: { readonly base: string; }; readonly libbeat: { readonly getStarted: 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 terms\_doc\_count\_error: 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: { readonly overview: string; readonly mapping: 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 search: { readonly sessions: string; readonly sessionLimits: string; }; readonly indexPatterns: { readonly introduction: string; readonly fieldFormattersNumber: string; readonly fieldFormattersString: string; readonly runtimeFields: string; }; readonly addData: string; readonly kibana: string; readonly upgradeAssistant: { readonly overview: string; readonly batchReindex: string; readonly remoteReindex: string; }; readonly rollupJobs: string; readonly elasticsearch: Record<string, string>; readonly siem: { readonly privileges: string; readonly guide: string; readonly gettingStarted: string; readonly ml: string; readonly ruleChangeLog: string; readonly detectionsReq: string; readonly networkMap: string; readonly troubleshootGaps: string; }; readonly securitySolution: { readonly trustedApps: string; }; readonly query: { readonly eql: string; readonly kueryQuerySyntax: string; readonly luceneQuerySyntax: string; readonly percolate: string; readonly queryDsl: string; }; readonly date: { readonly dateMath: string; readonly dateMathIndexNames: string; }; readonly management: Record<string, string>; readonly ml: Record<string, string>; readonly transforms: Record<string, string>; readonly visualize: Record<string, string>; readonly apis: Readonly<{ bulkIndexAlias: string; byteSizeUnits: string; createAutoFollowPattern: string; createFollower: string; createIndex: string; createSnapshotLifecyclePolicy: string; createRoleMapping: string; createRoleMappingTemplates: string; createRollupJobsRequest: 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; putIndexTemplateV1: string; putWatch: string; simulatePipeline: string; timeUnits: string; updateTransform: string; }>; readonly observability: Readonly<{ guide: string; infrastructureThreshold: string; logsThreshold: string; metricsThreshold: string; monitorStatus: string; monitorUptime: string; tlsCertificate: string; uptimeDurationAnomaly: string; }>; readonly alerting: Record<string, string>; readonly maps: Readonly<{ guide: string; importGeospatialPrivileges: string; gdalTutorial: string; }>; readonly monitoring: Record<string, string>; readonly security: Readonly<{ apiKeyServiceSettings: string; clusterPrivileges: string; elasticsearchSettings: string; elasticsearchEnableSecurity: string; elasticsearchEnableApiKeys: string; indicesPrivileges: string; kibanaTLS: string; kibanaPrivileges: string; mappingRoles: string; mappingRolesFieldRules: string; runAsPrivilege: string; }>; readonly spaces: Readonly<{ kibanaLegacyUrlAliases: string; kibanaDisableLegacyUrlAliasesApi: string; }>; readonly watcher: Record<string, string>; readonly ccs: Record<string, string>; readonly plugins: Record<string, string>; readonly snapshotRestore: Record<string, string>; readonly ingest: Record<string, string>; readonly fleet: Readonly<{ beatsAgentComparison: string; guide: string; fleetServer: string; fleetServerAddFleetServer: string; settings: string; settingsFleetServerHostSettings: string; settingsFleetServerProxySettings: string; troubleshooting: string; elasticAgent: string; datastreams: string; datastreamsNamingScheme: string; installElasticAgent: string; installElasticAgentStandalone: string; upgradeElasticAgent: string; upgradeElasticAgent712lower: string; learnMoreBlog: string; apiKeysLearnMore: string; onPremRegistry: string; }>; readonly ecs: { readonly guide: string; }; readonly clients: { readonly guide: string; readonly goOverview: string; readonly javaIndex: string; readonly jsIntro: string; readonly netGuide: string; readonly perlGuide: string; readonly phpGuide: string; readonly pythonGuide: string; readonly rubyOverview: string; readonly rustGuide: string; }; readonly endpoints: { readonly troubleshooting: string; }; } | | diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index 7a599e7c84acf1..f99f621a52c83a 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -97,13 +97,11 @@ export class DocLinksService { indexingDocumentsSchema: `${APP_SEARCH_DOCS}indexing-documents-guide.html#indexing-documents-guide-schema`, logSettings: `${APP_SEARCH_DOCS}logs.html`, metaEngines: `${APP_SEARCH_DOCS}meta-engines-guide.html`, - nativeAuth: `${APP_SEARCH_DOCS}security-and-users.html#app-search-self-managed-security-and-user-management-elasticsearch-native-realm`, precisionTuning: `${APP_SEARCH_DOCS}precision-tuning.html`, relevanceTuning: `${APP_SEARCH_DOCS}relevance-tuning-guide.html`, resultSettings: `${APP_SEARCH_DOCS}result-settings-guide.html`, searchUI: `${APP_SEARCH_DOCS}reference-ui-guide.html`, security: `${APP_SEARCH_DOCS}security-and-users.html`, - standardAuth: `${APP_SEARCH_DOCS}security-and-users.html#app-search-self-managed-security-and-user-management-standard`, synonyms: `${APP_SEARCH_DOCS}synonyms-guide.html`, webCrawler: `${APP_SEARCH_DOCS}web-crawler.html`, webCrawlerEventLogs: `${APP_SEARCH_DOCS}view-web-crawler-events-logs.html`, @@ -130,7 +128,6 @@ export class DocLinksService { indexingSchedule: `${WORKPLACE_SEARCH_DOCS}workplace-search-customizing-indexing-rules.html#_indexing_schedule`, jiraCloud: `${WORKPLACE_SEARCH_DOCS}workplace-search-jira-cloud-connector.html`, jiraServer: `${WORKPLACE_SEARCH_DOCS}workplace-search-jira-server-connector.html`, - nativeAuth: `${WORKPLACE_SEARCH_DOCS}workplace-search-security.html#elasticsearch-native-realm`, oneDrive: `${WORKPLACE_SEARCH_DOCS}workplace-search-onedrive-connector.html`, permissions: `${WORKPLACE_SEARCH_DOCS}workplace-search-permissions.html#organizational-sources-private-sources`, salesforce: `${WORKPLACE_SEARCH_DOCS}workplace-search-salesforce-connector.html`, @@ -138,7 +135,6 @@ export class DocLinksService { serviceNow: `${WORKPLACE_SEARCH_DOCS}workplace-search-servicenow-connector.html`, sharePoint: `${WORKPLACE_SEARCH_DOCS}workplace-search-sharepoint-online-connector.html`, slack: `${WORKPLACE_SEARCH_DOCS}workplace-search-slack-connector.html`, - standardAuth: `${WORKPLACE_SEARCH_DOCS}workplace-search-security.html#standard`, synch: `${WORKPLACE_SEARCH_DOCS}workplace-search-customizing-indexing-rules.html`, zendesk: `${WORKPLACE_SEARCH_DOCS}workplace-search-zendesk-connector.html`, }, @@ -659,13 +655,11 @@ export interface DocLinksStart { readonly indexingDocumentsSchema: string; readonly logSettings: string; readonly metaEngines: string; - readonly nativeAuth: string; readonly precisionTuning: string; readonly relevanceTuning: string; readonly resultSettings: string; readonly searchUI: string; readonly security: string; - readonly standardAuth: string; readonly synonyms: string; readonly webCrawler: string; readonly webCrawlerEventLogs: string; @@ -692,7 +686,6 @@ export interface DocLinksStart { readonly indexingSchedule: string; readonly jiraCloud: string; readonly jiraServer: string; - readonly nativeAuth: string; readonly oneDrive: string; readonly permissions: string; readonly salesforce: string; @@ -700,7 +693,6 @@ export interface DocLinksStart { readonly serviceNow: string; readonly sharePoint: string; readonly slack: string; - readonly standardAuth: string; readonly synch: string; readonly zendesk: string; }; diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index cec80af843c4c0..9bb65a9dd0b573 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -554,13 +554,11 @@ export interface DocLinksStart { readonly indexingDocumentsSchema: string; readonly logSettings: string; readonly metaEngines: string; - readonly nativeAuth: string; readonly precisionTuning: string; readonly relevanceTuning: string; readonly resultSettings: string; readonly searchUI: string; readonly security: string; - readonly standardAuth: string; readonly synonyms: string; readonly webCrawler: string; readonly webCrawlerEventLogs: string; @@ -587,7 +585,6 @@ export interface DocLinksStart { readonly indexingSchedule: string; readonly jiraCloud: string; readonly jiraServer: string; - readonly nativeAuth: string; readonly oneDrive: string; readonly permissions: string; readonly salesforce: string; @@ -595,7 +592,6 @@ export interface DocLinksStart { readonly serviceNow: string; readonly sharePoint: string; readonly slack: string; - readonly standardAuth: string; readonly synch: string; readonly zendesk: string; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx index f1d9beaca51364..1cf1cf8a0d5bd1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/setup_guide/setup_guide.tsx @@ -15,17 +15,11 @@ import { APP_SEARCH_PLUGIN } from '../../../../../common/constants'; import { SetAppSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuideLayout, SETUP_GUIDE_TITLE } from '../../../shared/setup_guide'; import { SendAppSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; -import { NATIVE_AUTH_DOCS_URL, STANDARD_AUTH_DOCS_URL } from '../../routes'; import GettingStarted from './assets/getting_started.png'; export const SetupGuide: React.FC = () => ( - + diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/routes.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/routes.ts index 1f2e7c883e1cb0..1a41004c882e36 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/routes.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/routes.ts @@ -20,13 +20,11 @@ export const INDEXING_DOCS_URL = docLinks.appSearchIndexingDocs; export const INDEXING_SCHEMA_DOCS_URL = docLinks.appSearchIndexingDocsSchema; export const LOG_SETTINGS_DOCS_URL = docLinks.appSearchLogSettings; export const META_ENGINES_DOCS_URL = docLinks.appSearchMetaEngines; -export const NATIVE_AUTH_DOCS_URL = docLinks.appSearchNativeAuth; export const PRECISION_DOCS_URL = docLinks.appSearchPrecision; export const RELEVANCE_DOCS_URL = docLinks.appSearchRelevance; export const RESULT_SETTINGS_DOCS_URL = docLinks.appSearchResultSettings; export const SEARCH_UI_DOCS_URL = docLinks.appSearchSearchUI; export const SECURITY_DOCS_URL = docLinks.appSearchSecurity; -export const STANDARD_AUTH_DOCS_URL = docLinks.appSearchStandardAuth; export const SYNONYMS_DOCS_URL = docLinks.appSearchSynonyms; export const WEB_CRAWLER_DOCS_URL = docLinks.appSearchWebCrawler; export const WEB_CRAWLER_LOG_DOCS_URL = docLinks.appSearchWebCrawlerEventLogs; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide.tsx index c7c85fdd49359a..1a25d1a7a8d1e2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search/components/setup_guide/setup_guide.tsx @@ -12,7 +12,6 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { ENTERPRISE_SEARCH_PLUGIN } from '../../../../../common/constants'; -import { NATIVE_AUTH_DOCS_URL, STANDARD_AUTH_DOCS_URL } from '../../../app_search/routes'; import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuideLayout, SETUP_GUIDE_TITLE } from '../../../shared/setup_guide'; import { SendEnterpriseSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; @@ -23,8 +22,6 @@ export const SetupGuide: React.FC = () => ( diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts b/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts index 93bead4d31f4c8..8cd5b86314a2c7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts @@ -21,13 +21,11 @@ class DocLinks { public appSearchIndexingDocsSchema: string; public appSearchLogSettings: string; public appSearchMetaEngines: string; - public appSearchNativeAuth: string; public appSearchPrecision: string; public appSearchRelevance: string; public appSearchResultSettings: string; public appSearchSearchUI: string; public appSearchSecurity: string; - public appSearchStandardAuth: string; public appSearchSynonyms: string; public appSearchWebCrawler: string; public appSearchWebCrawlerEventLogs: string; @@ -51,7 +49,6 @@ class DocLinks { public workplaceSearchIndexingSchedule: string; public workplaceSearchJiraCloud: string; public workplaceSearchJiraServer: string; - public workplaceSearchNativeAuth: string; public workplaceSearchOneDrive: string; public workplaceSearchPermissions: string; public workplaceSearchSalesforce: string; @@ -59,7 +56,6 @@ class DocLinks { public workplaceSearchServiceNow: string; public workplaceSearchSharePoint: string; public workplaceSearchSlack: string; - public workplaceSearchStandardAuth: string; public workplaceSearchSynch: string; public workplaceSearchZendesk: string; @@ -77,13 +73,11 @@ class DocLinks { this.appSearchIndexingDocsSchema = ''; this.appSearchLogSettings = ''; this.appSearchMetaEngines = ''; - this.appSearchNativeAuth = ''; this.appSearchPrecision = ''; this.appSearchRelevance = ''; this.appSearchResultSettings = ''; this.appSearchSearchUI = ''; this.appSearchSecurity = ''; - this.appSearchStandardAuth = ''; this.appSearchSynonyms = ''; this.appSearchWebCrawler = ''; this.appSearchWebCrawlerEventLogs = ''; @@ -107,7 +101,6 @@ class DocLinks { this.workplaceSearchIndexingSchedule = ''; this.workplaceSearchJiraCloud = ''; this.workplaceSearchJiraServer = ''; - this.workplaceSearchNativeAuth = ''; this.workplaceSearchOneDrive = ''; this.workplaceSearchPermissions = ''; this.workplaceSearchSalesforce = ''; @@ -115,7 +108,6 @@ class DocLinks { this.workplaceSearchServiceNow = ''; this.workplaceSearchSharePoint = ''; this.workplaceSearchSlack = ''; - this.workplaceSearchStandardAuth = ''; this.workplaceSearchSynch = ''; this.workplaceSearchZendesk = ''; } @@ -134,13 +126,11 @@ class DocLinks { this.appSearchIndexingDocsSchema = docLinks.links.appSearch.indexingDocumentsSchema; this.appSearchLogSettings = docLinks.links.appSearch.logSettings; this.appSearchMetaEngines = docLinks.links.appSearch.metaEngines; - this.appSearchNativeAuth = docLinks.links.appSearch.nativeAuth; this.appSearchPrecision = docLinks.links.appSearch.precisionTuning; this.appSearchRelevance = docLinks.links.appSearch.relevanceTuning; this.appSearchResultSettings = docLinks.links.appSearch.resultSettings; this.appSearchSearchUI = docLinks.links.appSearch.searchUI; this.appSearchSecurity = docLinks.links.appSearch.security; - this.appSearchStandardAuth = docLinks.links.appSearch.standardAuth; this.appSearchSynonyms = docLinks.links.appSearch.synonyms; this.appSearchWebCrawler = docLinks.links.appSearch.webCrawler; this.appSearchWebCrawlerEventLogs = docLinks.links.appSearch.webCrawlerEventLogs; @@ -165,7 +155,6 @@ class DocLinks { this.workplaceSearchIndexingSchedule = docLinks.links.workplaceSearch.indexingSchedule; this.workplaceSearchJiraCloud = docLinks.links.workplaceSearch.jiraCloud; this.workplaceSearchJiraServer = docLinks.links.workplaceSearch.jiraServer; - this.workplaceSearchNativeAuth = docLinks.links.workplaceSearch.nativeAuth; this.workplaceSearchOneDrive = docLinks.links.workplaceSearch.oneDrive; this.workplaceSearchPermissions = docLinks.links.workplaceSearch.permissions; this.workplaceSearchSalesforce = docLinks.links.workplaceSearch.salesforce; @@ -173,7 +162,6 @@ class DocLinks { this.workplaceSearchServiceNow = docLinks.links.workplaceSearch.serviceNow; this.workplaceSearchSharePoint = docLinks.links.workplaceSearch.sharePoint; this.workplaceSearchSlack = docLinks.links.workplaceSearch.slack; - this.workplaceSearchStandardAuth = docLinks.links.workplaceSearch.standardAuth; this.workplaceSearchSynch = docLinks.links.workplaceSearch.synch; this.workplaceSearchZendesk = docLinks.links.workplaceSearch.zendesk; } diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.test.tsx index 9f65e6b599a98d..e162b126c06795 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.test.tsx @@ -9,9 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { EuiSteps, EuiLink } from '@elastic/eui'; - -import { mountWithIntl } from '../../test_helpers'; +import { EuiSteps } from '@elastic/eui'; import { SetupInstructions } from './instructions'; @@ -20,17 +18,4 @@ describe('SetupInstructions', () => { const wrapper = shallow(); expect(wrapper.find(EuiSteps)).toHaveLength(1); }); - - it('renders with auth links', () => { - const wrapper = mountWithIntl( - - ); - - expect(wrapper.find(EuiLink).first().prop('href')).toEqual('http://bar.com'); - expect(wrapper.find(EuiLink).last().prop('href')).toEqual('http://foo.com'); - }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.tsx index aa8bbd6970f865..4fc12f62305fa4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/instructions.tsx @@ -9,28 +9,20 @@ import React from 'react'; import { EuiPageContent, - EuiSpacer, EuiText, EuiSteps, EuiCode, EuiCodeBlock, EuiAccordion, - EuiLink, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; interface Props { productName: string; - standardAuthLink?: string; - elasticsearchNativeAuthLink?: string; } -export const SetupInstructions: React.FC = ({ - productName, - standardAuthLink, - elasticsearchNativeAuthLink, -}) => ( +export const SetupInstructions: React.FC = ({ productName }) => ( = ({ defaultMessage="Restart Kibana to pick up the configuration changes from the previous step." />

-

- - Elasticsearch Native Auth - - ) : ( - 'Elasticsearch Native Auth' - ), - }} - /> -

), }, @@ -118,60 +94,6 @@ export const SetupInstructions: React.FC = ({

- - - -

- -

-
-
- - - -

- - Standard Auth - - ) : ( - 'Standard Auth' - ), - }} - /> -

-
-
), }, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/setup_guide.tsx index d041f1b294e7a0..4314dc1465f943 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/setup_guide/setup_guide.tsx @@ -37,17 +37,9 @@ interface Props { children: React.ReactNode; productName: string; productEuiIcon: 'logoAppSearch' | 'logoWorkplaceSearch' | 'logoEnterpriseSearch'; - standardAuthLink?: string; - elasticsearchNativeAuthLink?: string; } -export const SetupGuideLayout: React.FC = ({ - children, - productName, - productEuiIcon, - standardAuthLink, - elasticsearchNativeAuthLink, -}) => { +export const SetupGuideLayout: React.FC = ({ children, productName, productEuiIcon }) => { const { cloud } = useValues(KibanaLogic); const isCloudEnabled = Boolean(cloud.isCloudEnabled); const cloudDeploymentLink = cloud.deploymentUrl || ''; @@ -81,11 +73,7 @@ export const SetupGuideLayout: React.FC = ({ cloudDeploymentLink={cloudDeploymentLink} /> ) : ( - + )} diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts index b28343f37ea25b..5f3c79f9432e79 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/routes.ts @@ -35,7 +35,6 @@ export const GMAIL_DOCS_URL = docLinks.workplaceSearchGmail; export const GOOGLE_DRIVE_DOCS_URL = docLinks.workplaceSearchGoogleDrive; export const JIRA_DOCS_URL = docLinks.workplaceSearchJiraCloud; export const JIRA_SERVER_DOCS_URL = docLinks.workplaceSearchJiraServer; -export const NATIVE_AUTH_DOCS_URL = docLinks.workplaceSearchNativeAuth; export const OBJECTS_AND_ASSETS_DOCS_URL = docLinks.workplaceSearchSynch; export const ONEDRIVE_DOCS_URL = docLinks.workplaceSearchOneDrive; export const PRIVATE_SOURCES_DOCS_URL = docLinks.workplaceSearchPermissions; @@ -44,7 +43,6 @@ export const SECURITY_DOCS_URL = docLinks.workplaceSearchSecurity; export const SERVICENOW_DOCS_URL = docLinks.workplaceSearchServiceNow; export const SHAREPOINT_DOCS_URL = docLinks.workplaceSearchSharePoint; export const SLACK_DOCS_URL = docLinks.workplaceSearchSlack; -export const STANDARD_AUTH_DOCS_URL = docLinks.workplaceSearchStandardAuth; export const SYNCHRONIZATION_DOCS_URL = docLinks.workplaceSearchSynch; export const ZENDESK_DOCS_URL = docLinks.workplaceSearchZendesk; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/setup_guide/setup_guide.tsx index e52a174850c4c0..009dbffafebd81 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/setup_guide/setup_guide.tsx @@ -15,11 +15,7 @@ import { WORKPLACE_SEARCH_PLUGIN } from '../../../../../common/constants'; import { SetWorkplaceSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuideLayout, SETUP_GUIDE_TITLE } from '../../../shared/setup_guide'; import { SendWorkplaceSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; -import { - GETTING_STARTED_DOCS_URL, - NATIVE_AUTH_DOCS_URL, - STANDARD_AUTH_DOCS_URL, -} from '../../routes'; +import { GETTING_STARTED_DOCS_URL } from '../../routes'; import GettingStarted from './assets/getting_started.png'; @@ -30,8 +26,6 @@ export const SetupGuide: React.FC = () => { diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 409caee7d4b4b2..76d3f07facf05b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -9354,19 +9354,14 @@ "xpack.enterpriseSearch.setupGuide.step1.instruction1": "{configFile} ファイルで、{configSetting} を {productName} インスタンスの URL に設定します。例:", "xpack.enterpriseSearch.setupGuide.step1.title": "{productName}ホストURLをKibana構成に追加", "xpack.enterpriseSearch.setupGuide.step2.instruction1": "Kibanaを再起動して、前のステップから構成変更を取得します。", - "xpack.enterpriseSearch.setupGuide.step2.instruction2": "{productName}で{elasticsearchNativeAuthLink}を使用している場合は、すべて設定済みです。ユーザーは、現在の{productName}アクセスおよび権限を使用して、Kibanaで{productName}にアクセスできます。", "xpack.enterpriseSearch.setupGuide.step2.title": "Kibanaインスタンスの再読み込み", "xpack.enterpriseSearch.setupGuide.step3.title": "トラブルシューティングのヒント", "xpack.enterpriseSearch.setupGuide.title": "セットアップガイド", "xpack.enterpriseSearch.shared.flashMessages.defaultErrorMessage": "予期しないエラーが発生しました", "xpack.enterpriseSearch.shared.unsavedChangesMessage": "変更は保存されていません。終了してよろしいですか?", "xpack.enterpriseSearch.trialCalloutLink": "Elastic Stackライセンスの詳細を参照してください。", - "xpack.enterpriseSearch.troubleshooting.differentAuth.description": "このプラグインは現在、異なる認証方法で運用されている{productName}およびKibanaをサポートしています。たとえば、Kibana以外のSAMLプロバイダーを使用している{productName}はサポートされません。", - "xpack.enterpriseSearch.troubleshooting.differentAuth.title": "{productName}とKibanaは別の認証方法を使用しています", "xpack.enterpriseSearch.troubleshooting.differentEsClusters.description": "このプラグインは現在、異なるクラスターで実行されている{productName}とKibanaをサポートしていません。", "xpack.enterpriseSearch.troubleshooting.differentEsClusters.title": "{productName}とKibanaは別のElasticsearchクラスターにあります", - "xpack.enterpriseSearch.troubleshooting.standardAuth.description": "このプラグインは、{standardAuthLink}の{productName}を完全にはサポートしていません。{productName}で作成されたユーザーはKibanaアクセス権が必要です。Kibanaで作成されたユーザーは、ナビゲーションメニューに{productName}が表示されません。", - "xpack.enterpriseSearch.troubleshooting.standardAuth.title": "標準認証の{productName}はサポートされていません", "xpack.enterpriseSearch.units.allDaysLabel": "すべての日", "xpack.enterpriseSearch.units.daysLabel": "日", "xpack.enterpriseSearch.units.daysOfWeekLabel.friday": "金曜日", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index cf24a857c9723a..01997e32f243e6 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -9440,7 +9440,6 @@ "xpack.enterpriseSearch.setupGuide.step1.instruction1": "在 {configFile} 文件中,将 {configSetting} 设置为 {productName} 实例的 URL。例如:", "xpack.enterpriseSearch.setupGuide.step1.title": "将 {productName} 主机 URL 添加到 Kibana 配置", "xpack.enterpriseSearch.setupGuide.step2.instruction1": "重新启动 Kibana 以应用上一步骤中的配置更改。", - "xpack.enterpriseSearch.setupGuide.step2.instruction2": "如果正在 {productName} 中使用 {elasticsearchNativeAuthLink},则全部就绪。您的用户现在可以使用自己当前的 {productName} 访问权限在 Kibana 中访问 {productName}。", "xpack.enterpriseSearch.setupGuide.step2.title": "重新加载 Kibana 实例", "xpack.enterpriseSearch.setupGuide.step3.title": "解决问题", "xpack.enterpriseSearch.setupGuide.title": "设置指南", @@ -9448,12 +9447,8 @@ "xpack.enterpriseSearch.shared.unsavedChangesMessage": "您的更改尚未更改。是否确定要离开?", "xpack.enterpriseSearch.trialCalloutLink": "详细了解 Elastic Stack 许可证。", "xpack.enterpriseSearch.trialCalloutTitle": "您的可启用白金级功能的 Elastic Stack 试用版许可证将 {days, plural, other {# 天}}后过期。", - "xpack.enterpriseSearch.troubleshooting.differentAuth.description": "此插件当前不支持使用不同身份验证方法的 {productName} 和 Kibana,例如 {productName} 使用与 Kibana 不同的 SAML 提供程序。", - "xpack.enterpriseSearch.troubleshooting.differentAuth.title": "{productName} 和 Kibana 使用不同的身份验证方法", "xpack.enterpriseSearch.troubleshooting.differentEsClusters.description": "此插件当前不支持在不同集群中运行的 {productName} 和 Kibana。", "xpack.enterpriseSearch.troubleshooting.differentEsClusters.title": "{productName} 和 Kibana 在不同的 Elasticsearch 集群中", - "xpack.enterpriseSearch.troubleshooting.standardAuth.description": "此插件不完全支持使用 {standardAuthLink} 的 {productName}。{productName} 中创建的用户必须具有 Kibana 访问权限。Kibana 中创建的用户在导航菜单中将看不到 {productName}。", - "xpack.enterpriseSearch.troubleshooting.standardAuth.title": "不支持使用标准身份验证的 {productName}", "xpack.enterpriseSearch.units.allDaysLabel": "所有日期", "xpack.enterpriseSearch.units.daysLabel": "天", "xpack.enterpriseSearch.units.daysOfWeekLabel.friday": "星期五", From 3360b6a53c836d138d588ef4f96012a6cb9b7171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Thu, 2 Dec 2021 13:55:50 -0500 Subject: [PATCH 068/126] [APM] Service maps: Add sparklines to the detail popover (#120021) * adding error rate and latency timeseries * adding sparklines * fixing ui * fixing spaces * adjusting error color * fixing api tests * deleting unnecessary test * changing loading spinner * addressing pr comments * fixing ci --- x-pack/plugins/apm/common/service_map.ts | 28 +- .../service_map/Popover/backend_contents.tsx | 3 +- .../app/service_map/Popover/index.tsx | 2 +- .../service_map/Popover/service_contents.tsx | 8 +- .../app/service_map/Popover/stats_list.tsx | 196 ++++---- .../app/service_map/cytoscape_options.ts | 2 +- .../server/lib/helpers/transactions/index.ts | 2 +- .../lib/transaction_groups/get_error_rate.ts | 3 + .../get_transaction_group_stats.ts | 10 +- .../chart_preview/get_transaction_duration.ts | 4 +- ...egister_transaction_duration_alert_type.ts | 4 +- .../get_service_map_backend_node_info.ts | 91 +++- .../get_service_map_service_node_info.test.ts | 96 ---- .../get_service_map_service_node_info.ts | 161 +++++-- ...ervice_instances_transaction_statistics.ts | 6 +- ...e_transaction_group_detailed_statistics.ts | 6 +- .../get_service_transaction_groups.ts | 6 +- .../get_service_transaction_stats.ts | 6 +- ...service_transaction_detailed_statistics.ts | 6 +- .../transactions/get_latency_charts/index.ts | 4 +- .../tests/service_maps/service_maps.spec.ts | 439 ++++++++++-------- 21 files changed, 615 insertions(+), 468 deletions(-) delete mode 100644 x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.test.ts diff --git a/x-pack/plugins/apm/common/service_map.ts b/x-pack/plugins/apm/common/service_map.ts index b8e6922414ebf9..d10785d614cd32 100644 --- a/x-pack/plugins/apm/common/service_map.ts +++ b/x-pack/plugins/apm/common/service_map.ts @@ -7,6 +7,7 @@ import { i18n } from '@kbn/i18n'; import cytoscape from 'cytoscape'; +import { Coordinate } from '../typings/timeseries'; import { ServiceAnomalyStats } from './anomaly_detection'; // These should be imported, but until TypeScript 4.2 we're inlining them here. @@ -59,13 +60,28 @@ export interface Connection { } export interface NodeStats { - avgMemoryUsage?: number | null; - avgCpuUsage?: number | null; - transactionStats: { - avgTransactionDuration: number | null; - avgRequestsPerMinute: number | null; + transactionStats?: { + latency?: { + value: number | null; + timeseries?: Coordinate[]; + }; + throughput?: { + value: number | null; + timeseries?: Coordinate[]; + }; + }; + failedTransactionsRate?: { + value: number | null; + timeseries?: Coordinate[]; + }; + cpuUsage?: { + value?: number | null; + timeseries?: Coordinate[]; + }; + memoryUsage?: { + value?: number | null; + timeseries?: Coordinate[]; }; - avgErrorRate: number | null; } export const invalidLicenseMessage = i18n.translate( diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx index 6b9954465f39da..b61b225c2fe946 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { EuiButton, EuiFlexItem } from '@elastic/eui'; +import { EuiButton, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { TypeOf } from '@kbn/typed-react-router-config'; import { METRIC_TYPE } from '@kbn/analytics'; @@ -73,6 +73,7 @@ export function BackendContents({ + {/* eslint-disable-next-line @elastic/eui/href-or-on-click*/} diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/service_contents.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/service_contents.tsx index 5c41a1b4db7e6d..10d558e6483764 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/service_contents.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/service_contents.tsx @@ -7,7 +7,12 @@ /* eslint-disable @elastic/eui/href-or-on-click */ -import { EuiButton, EuiFlexItem, EuiHorizontalRule } from '@elastic/eui'; +import { + EuiButton, + EuiFlexItem, + EuiHorizontalRule, + EuiSpacer, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { useApmParams } from '../../../../hooks/use_apm_params'; @@ -89,6 +94,7 @@ export function ServiceContents({ )} + {i18n.translate('xpack.apm.serviceMap.serviceDetailsButtonText', { diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/stats_list.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/stats_list.tsx index b46b7a0986179a..002c4805034544 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/stats_list.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/stats_list.tsx @@ -5,30 +5,23 @@ * 2.0. */ -import { EuiFlexGroup, EuiLoadingSpinner, EuiText } from '@elastic/eui'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiLoadingChart, + EuiText, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { isNumber } from 'lodash'; -import React from 'react'; -import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; +import React, { useMemo } from 'react'; import { NodeStats } from '../../../../../common/service_map'; import { asDuration, asPercent, asTransactionRate, } from '../../../../../common/utils/formatters'; - -export const ItemRow = euiStyled.tr` - line-height: 2; -`; - -export const ItemTitle = euiStyled.td` - color: ${({ theme }) => theme.eui.euiTextSubduedColor}; - padding-right: 1rem; -`; - -export const ItemDescription = euiStyled.td` - text-align: right; -`; +import { Coordinate } from '../../../../../typings/timeseries'; +import { SparkPlot, Color } from '../../../shared/charts/spark_plot'; function LoadingSpinner() { return ( @@ -37,7 +30,7 @@ function LoadingSpinner() { justifyContent="spaceAround" style={{ height: 170 }} > - +
); } @@ -57,22 +50,82 @@ interface StatsListProps { data: NodeStats; } +interface Item { + title: string; + valueLabel: string | null; + timeseries?: Coordinate[]; + color: Color; +} + export function StatsList({ data, isLoading }: StatsListProps) { - const { - avgCpuUsage, - avgErrorRate, - avgMemoryUsage, - transactionStats: { avgRequestsPerMinute, avgTransactionDuration }, - } = data; + const { cpuUsage, failedTransactionsRate, memoryUsage, transactionStats } = + data; const hasData = [ - avgCpuUsage, - avgErrorRate, - avgMemoryUsage, - avgRequestsPerMinute, - avgTransactionDuration, + cpuUsage?.value, + failedTransactionsRate?.value, + memoryUsage?.value, + transactionStats?.throughput?.value, + transactionStats?.latency?.value, ].some((stat) => isNumber(stat)); + const items: Item[] = useMemo( + () => [ + { + title: i18n.translate( + 'xpack.apm.serviceMap.avgTransDurationPopoverStat', + { + defaultMessage: 'Latency (avg.)', + } + ), + valueLabel: isNumber(transactionStats?.latency?.value) + ? asDuration(transactionStats?.latency?.value) + : null, + timeseries: transactionStats?.latency?.timeseries, + color: 'euiColorVis1', + }, + { + title: i18n.translate( + 'xpack.apm.serviceMap.avgReqPerMinutePopoverMetric', + { + defaultMessage: 'Throughput (avg.)', + } + ), + valueLabel: asTransactionRate(transactionStats?.throughput?.value), + timeseries: transactionStats?.throughput?.timeseries, + color: 'euiColorVis0', + }, + { + title: i18n.translate('xpack.apm.serviceMap.errorRatePopoverStat', { + defaultMessage: 'Failed transaction rate (avg.)', + }), + valueLabel: asPercent(failedTransactionsRate?.value, 1, ''), + timeseries: failedTransactionsRate?.timeseries, + color: 'euiColorVis7', + }, + { + title: i18n.translate('xpack.apm.serviceMap.avgCpuUsagePopoverStat', { + defaultMessage: 'CPU usage (avg.)', + }), + valueLabel: asPercent(cpuUsage?.value, 1, ''), + timeseries: cpuUsage?.timeseries, + color: 'euiColorVis3', + }, + { + title: i18n.translate( + 'xpack.apm.serviceMap.avgMemoryUsagePopoverStat', + { + defaultMessage: 'Memory usage (avg.)', + } + ), + valueLabel: asPercent(memoryUsage?.value, 1, ''), + timeseries: memoryUsage?.timeseries, + color: 'euiColorVis8', + }, + ], + [cpuUsage, failedTransactionsRate, memoryUsage, transactionStats] + ); + if (isLoading) { return ; } @@ -81,59 +134,40 @@ export function StatsList({ data, isLoading }: StatsListProps) { return ; } - const items = [ - { - title: i18n.translate( - 'xpack.apm.serviceMap.avgTransDurationPopoverStat', - { - defaultMessage: 'Latency (avg.)', - } - ), - description: isNumber(avgTransactionDuration) - ? asDuration(avgTransactionDuration) - : null, - }, - { - title: i18n.translate( - 'xpack.apm.serviceMap.avgReqPerMinutePopoverMetric', - { - defaultMessage: 'Throughput (avg.)', - } - ), - description: asTransactionRate(avgRequestsPerMinute), - }, - { - title: i18n.translate('xpack.apm.serviceMap.errorRatePopoverStat', { - defaultMessage: 'Failed transaction rate (avg.)', - }), - description: asPercent(avgErrorRate, 1, ''), - }, - { - title: i18n.translate('xpack.apm.serviceMap.avgCpuUsagePopoverStat', { - defaultMessage: 'CPU usage (avg.)', - }), - description: asPercent(avgCpuUsage, 1, ''), - }, - { - title: i18n.translate('xpack.apm.serviceMap.avgMemoryUsagePopoverStat', { - defaultMessage: 'Memory usage (avg.)', - }), - description: asPercent(avgMemoryUsage, 1, ''), - }, - ]; - return ( - - - {items.map(({ title, description }) => { - return description ? ( - - {title} - {description} - - ) : null; - })} - -
+ + {items.map(({ title, valueLabel, timeseries, color }) => { + if (!valueLabel) { + return null; + } + return ( + + + + + {title} + + + + {timeseries ? ( + + ) : ( +
{valueLabel}
+ )} +
+
+
+ ); + })} +
); } diff --git a/x-pack/plugins/apm/public/components/app/service_map/cytoscape_options.ts b/x-pack/plugins/apm/public/components/app/service_map/cytoscape_options.ts index 1e2386c8743fe4..e137f2dbb0f78f 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/cytoscape_options.ts +++ b/x-pack/plugins/apm/public/components/app/service_map/cytoscape_options.ts @@ -20,7 +20,7 @@ import { import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { iconForNode } from './icons'; -export const popoverWidth = 280; +export const popoverWidth = 350; function getServiceAnomalyStats(el: cytoscape.NodeSingular) { const serviceAnomalyStats: ServiceAnomalyStats | undefined = el.data( diff --git a/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts b/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts index edaae8cadc1d51..577a7544d93ea4 100644 --- a/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/transactions/index.ts @@ -82,7 +82,7 @@ export async function getSearchAggregatedTransactions({ } } -export function getTransactionDurationFieldForTransactions( +export function getDurationFieldForTransactions( searchAggregatedTransactions: boolean ) { return searchAggregatedTransactions diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts index 328d2da0f6df0c..e1dde61bfc3ffa 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts @@ -42,6 +42,7 @@ export async function getErrorRate({ searchAggregatedTransactions, start, end, + numBuckets, }: { environment: string; kuery: string; @@ -52,6 +53,7 @@ export async function getErrorRate({ searchAggregatedTransactions: boolean; start: number; end: number; + numBuckets?: number; }): Promise<{ timeseries: Coordinate[]; average: number | null; @@ -91,6 +93,7 @@ export async function getErrorRate({ start, end, searchAggregatedTransactions, + numBuckets, }).intervalString, min_doc_count: 0, extended_bounds: { min: start, max: end }, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts index fd638a6731c631..04cee211c78db8 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts @@ -13,7 +13,7 @@ import { } from '../../../common/elasticsearch_fieldnames'; import { arrayUnionToCallable } from '../../../common/utils/array_union_to_callable'; import { TransactionGroupRequestBase, TransactionGroupSetup } from './fetcher'; -import { getTransactionDurationFieldForTransactions } from '../helpers/transactions'; +import { getDurationFieldForTransactions } from '../helpers/transactions'; import { AgentName } from '../../../typings/es_schemas/ui/fields/agent'; interface MetricParams { request: TransactionGroupRequestBase; @@ -49,9 +49,7 @@ export async function getAverages({ const params = mergeRequestWithAggs(request, { avg: { avg: { - field: getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ), + field: getDurationFieldForTransactions(searchAggregatedTransactions), }, }, }); @@ -119,9 +117,7 @@ export async function getSums({ const params = mergeRequestWithAggs(request, { sum: { sum: { - field: getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ), + field: getDurationFieldForTransactions(searchAggregatedTransactions), }, }, }); diff --git a/x-pack/plugins/apm/server/routes/alerts/chart_preview/get_transaction_duration.ts b/x-pack/plugins/apm/server/routes/alerts/chart_preview/get_transaction_duration.ts index 0338f78a0a8926..6b5fb0c5fb1b48 100644 --- a/x-pack/plugins/apm/server/routes/alerts/chart_preview/get_transaction_duration.ts +++ b/x-pack/plugins/apm/server/routes/alerts/chart_preview/get_transaction_duration.ts @@ -16,7 +16,7 @@ import { AlertParams } from '../route'; import { getSearchAggregatedTransactions, getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../../lib/helpers/transactions'; import { Setup } from '../../../lib/helpers/setup_request'; @@ -55,7 +55,7 @@ export async function getTransactionDurationChartPreview({ }, }; - const transactionDurationField = getTransactionDurationFieldForTransactions( + const transactionDurationField = getDurationFieldForTransactions( searchAggregatedTransactions ); diff --git a/x-pack/plugins/apm/server/routes/alerts/register_transaction_duration_alert_type.ts b/x-pack/plugins/apm/server/routes/alerts/register_transaction_duration_alert_type.ts index 1e39b02655adad..7ad78cdff9545d 100644 --- a/x-pack/plugins/apm/server/routes/alerts/register_transaction_duration_alert_type.ts +++ b/x-pack/plugins/apm/server/routes/alerts/register_transaction_duration_alert_type.ts @@ -36,7 +36,7 @@ import { environmentQuery } from '../../../common/utils/environment_query'; import { getDurationFormatter } from '../../../common/utils/formatters'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, } from '../../lib/helpers/transactions'; import { getApmIndices } from '../../routes/settings/apm_indices/get_apm_indices'; import { apmActionVariables } from './action_variables'; @@ -110,7 +110,7 @@ export function registerTransactionDurationAlertType({ ? indices.metric : indices.transaction; - const field = getTransactionDurationFieldForTransactions( + const field = getDurationFieldForTransactions( searchAggregatedTransactions ); diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_map_backend_node_info.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_map_backend_node_info.ts index 3866bac88ef44c..6922fc04f2e71f 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_map_backend_node_info.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_map_backend_node_info.ts @@ -16,8 +16,11 @@ import { EventOutcome } from '../../../common/event_outcome'; import { ProcessorEvent } from '../../../common/processor_event'; import { environmentQuery } from '../../../common/utils/environment_query'; import { withApmSpan } from '../../utils/with_apm_span'; -import { calculateThroughput } from '../../lib/helpers/calculate_throughput'; +import { calculateThroughputWithRange } from '../../lib/helpers/calculate_throughput'; import { Setup } from '../../lib/helpers/setup_request'; +import { getBucketSize } from '../../lib/helpers/get_bucket_size'; +import { getFailedTransactionRateTimeSeries } from '../../lib/helpers/transaction_error_rate'; +import { NodeStats } from '../../../common/service_map'; interface Options { setup: Setup; @@ -33,10 +36,24 @@ export function getServiceMapBackendNodeInfo({ setup, start, end, -}: Options) { +}: Options): Promise { return withApmSpan('get_service_map_backend_node_stats', async () => { const { apmEventClient } = setup; + const { intervalString } = getBucketSize({ start, end, numBuckets: 20 }); + + const subAggs = { + latency_sum: { + sum: { field: SPAN_DESTINATION_SERVICE_RESPONSE_TIME_SUM }, + }, + count: { + sum: { field: SPAN_DESTINATION_SERVICE_RESPONSE_TIME_COUNT }, + }, + outcomes: { + terms: { field: EVENT_OUTCOME, include: [EventOutcome.failure] }, + }, + }; + const response = await apmEventClient.search( 'get_service_map_backend_node_stats', { @@ -55,18 +72,15 @@ export function getServiceMapBackendNodeInfo({ }, }, aggs: { - latency_sum: { - sum: { - field: SPAN_DESTINATION_SERVICE_RESPONSE_TIME_SUM, + ...subAggs, + timeseries: { + date_histogram: { + field: '@timestamp', + fixed_interval: intervalString, + min_doc_count: 0, + extended_bounds: { min: start, max: end }, }, - }, - count: { - sum: { - field: SPAN_DESTINATION_SERVICE_RESPONSE_TIME_COUNT, - }, - }, - [EVENT_OUTCOME]: { - terms: { field: EVENT_OUTCOME, include: [EventOutcome.failure] }, + aggs: subAggs, }, }, }, @@ -74,13 +88,13 @@ export function getServiceMapBackendNodeInfo({ ); const count = response.aggregations?.count.value ?? 0; - const errorCount = - response.aggregations?.[EVENT_OUTCOME].buckets[0]?.doc_count ?? 0; + const failedTransactionsRateCount = + response.aggregations?.outcomes.buckets[0]?.doc_count ?? 0; const latencySum = response.aggregations?.latency_sum.value ?? 0; - const avgErrorRate = errorCount / count; - const avgTransactionDuration = latencySum / count; - const avgRequestsPerMinute = calculateThroughput({ + const avgFailedTransactionsRate = failedTransactionsRateCount / count; + const latency = latencySum / count; + const throughput = calculateThroughputWithRange({ start, end, value: count, @@ -88,19 +102,48 @@ export function getServiceMapBackendNodeInfo({ if (count === 0) { return { - avgErrorRate: null, + failedTransactionsRate: undefined, transactionStats: { - avgRequestsPerMinute: null, - avgTransactionDuration: null, + throughput: undefined, + latency: undefined, }, }; } return { - avgErrorRate, + failedTransactionsRate: { + value: avgFailedTransactionsRate, + timeseries: response.aggregations?.timeseries + ? getFailedTransactionRateTimeSeries( + response.aggregations.timeseries.buckets + ) + : undefined, + }, transactionStats: { - avgRequestsPerMinute, - avgTransactionDuration, + throughput: { + value: throughput, + timeseries: response.aggregations?.timeseries.buckets.map( + (bucket) => { + return { + x: bucket.key, + y: calculateThroughputWithRange({ + start, + end, + value: bucket.doc_count ?? 0, + }), + }; + } + ), + }, + latency: { + value: latency, + timeseries: response.aggregations?.timeseries.buckets.map( + (bucket) => ({ + x: bucket.key, + y: bucket.latency_sum.value, + }) + ), + }, }, }; }); diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.test.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.test.ts deleted file mode 100644 index 9f65481d07489a..00000000000000 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.test.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { getServiceMapServiceNodeInfo } from './get_service_map_service_node_info'; -import { Setup } from '../../lib/helpers/setup_request'; -import * as getErrorRateModule from '../../lib/transaction_groups/get_error_rate'; -import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; - -describe('getServiceMapServiceNodeInfo', () => { - describe('with no results', () => { - it('returns null data', async () => { - const setup = { - apmEventClient: { - search: () => - Promise.resolve({ - hits: { total: { value: 0 } }, - }), - }, - indices: {}, - uiFilters: {}, - } as unknown as Setup; - const serviceName = 'test service name'; - const result = await getServiceMapServiceNodeInfo({ - environment: 'test environment', - setup, - serviceName, - searchAggregatedTransactions: false, - start: 1528113600000, - end: 1528977600000, - }); - - expect(result).toEqual({ - avgCpuUsage: null, - avgErrorRate: null, - avgMemoryUsage: null, - transactionStats: { - avgRequestsPerMinute: null, - avgTransactionDuration: null, - }, - }); - }); - }); - - describe('with some results', () => { - it('returns data', async () => { - jest.spyOn(getErrorRateModule, 'getErrorRate').mockResolvedValueOnce({ - average: 0.5, - timeseries: [{ x: 1634808240000, y: 0 }], - }); - - const setup = { - apmEventClient: { - search: () => - Promise.resolve({ - hits: { - total: { value: 1 }, - }, - aggregations: { - duration: { value: null }, - avgCpuUsage: { value: null }, - avgMemoryUsage: { value: null }, - }, - }), - }, - indices: {}, - start: 1593460053026000, - end: 1593497863217000, - config: { metricsInterval: 30 }, - uiFilters: { environment: 'test environment' }, - } as unknown as Setup; - const serviceName = 'test service name'; - const result = await getServiceMapServiceNodeInfo({ - setup, - serviceName, - searchAggregatedTransactions: false, - environment: ENVIRONMENT_ALL.value, - start: 1593460053026000, - end: 1593497863217000, - }); - - expect(result).toEqual({ - avgCpuUsage: null, - avgErrorRate: 0.5, - avgMemoryUsage: null, - transactionStats: { - avgRequestsPerMinute: 0.000001586873761097901, - avgTransactionDuration: null, - }, - }); - }); - }); -}); diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts index d6eb7729effaf5..ad2ab74098c228 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts @@ -6,6 +6,7 @@ */ import { ESFilter } from '../../../../../../src/core/types/elasticsearch'; +import { rangeQuery } from '../../../../observability/server'; import { METRIC_CGROUP_MEMORY_USAGE_BYTES, METRIC_SYSTEM_CPU_PERCENT, @@ -15,24 +16,25 @@ import { TRANSACTION_TYPE, } from '../../../common/elasticsearch_fieldnames'; import { ProcessorEvent } from '../../../common/processor_event'; +import { NodeStats } from '../../../common/service_map'; import { TRANSACTION_PAGE_LOAD, TRANSACTION_REQUEST, } from '../../../common/transaction_types'; -import { rangeQuery } from '../../../../observability/server'; import { environmentQuery } from '../../../common/utils/environment_query'; -import { withApmSpan } from '../../utils/with_apm_span'; +import { getBucketSizeForAggregatedTransactions } from '../../lib/helpers/get_bucket_size_for_aggregated_transactions'; +import { Setup } from '../../lib/helpers/setup_request'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../lib/helpers/transactions'; -import { Setup } from '../../lib/helpers/setup_request'; +import { getErrorRate } from '../../lib/transaction_groups/get_error_rate'; +import { withApmSpan } from '../../utils/with_apm_span'; import { percentCgroupMemoryUsedScript, percentSystemMemoryUsedScript, } from '../metrics/by_agent/shared/memory'; -import { getErrorRate } from '../../lib/transaction_groups/get_error_rate'; interface Options { setup: Setup; @@ -48,8 +50,13 @@ interface TaskParameters { filter: ESFilter[]; searchAggregatedTransactions: boolean; minutes: number; - serviceName?: string; + serviceName: string; setup: Setup; + start: number; + end: number; + intervalString: string; + bucketSize: number; + numBuckets: number; } export function getServiceMapServiceNodeInfo({ @@ -59,7 +66,7 @@ export function getServiceMapServiceNodeInfo({ searchAggregatedTransactions, start, end, -}: Options) { +}: Options): Promise { return withApmSpan('get_service_map_node_stats', async () => { const filter: ESFilter[] = [ { term: { [SERVICE_NAME]: serviceName } }, @@ -68,6 +75,14 @@ export function getServiceMapServiceNodeInfo({ ]; const minutes = Math.abs((end - start) / (1000 * 60)); + const numBuckets = 20; + const { intervalString, bucketSize } = + getBucketSizeForAggregatedTransactions({ + start, + end, + searchAggregatedTransactions, + numBuckets, + }); const taskParams = { environment, filter, @@ -77,34 +92,38 @@ export function getServiceMapServiceNodeInfo({ setup, start, end, + intervalString, + bucketSize, + numBuckets, }; - const [errorStats, transactionStats, cpuStats, memoryStats] = + const [failedTransactionsRate, transactionStats, cpuUsage, memoryUsage] = await Promise.all([ - getErrorStats(taskParams), + getFailedTransactionsRateStats(taskParams), getTransactionStats(taskParams), getCpuStats(taskParams), getMemoryStats(taskParams), ]); return { - ...errorStats, + failedTransactionsRate, transactionStats, - ...cpuStats, - ...memoryStats, + cpuUsage, + memoryUsage, }; }); } -async function getErrorStats({ +async function getFailedTransactionsRateStats({ setup, serviceName, environment, searchAggregatedTransactions, start, end, -}: Options) { + numBuckets, +}: TaskParameters): Promise { return withApmSpan('get_error_rate_for_service_map_node', async () => { - const { average } = await getErrorRate({ + const { average, timeseries } = await getErrorRate({ environment, setup, serviceName, @@ -112,8 +131,9 @@ async function getErrorStats({ start, end, kuery: '', + numBuckets, }); - return { avgErrorRate: average }; + return { value: average, timeseries }; }); } @@ -122,12 +142,16 @@ async function getTransactionStats({ filter, minutes, searchAggregatedTransactions, -}: TaskParameters): Promise<{ - avgTransactionDuration: number | null; - avgRequestsPerMinute: number | null; -}> { + start, + end, + intervalString, +}: TaskParameters): Promise { const { apmEventClient } = setup; + const durationField = getDurationFieldForTransactions( + searchAggregatedTransactions + ); + const params = { apm: { events: [getProcessorEventForTransactions(searchAggregatedTransactions)], @@ -154,11 +178,16 @@ async function getTransactionStats({ }, track_total_hits: true, aggs: { - duration: { - avg: { - field: getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ), + duration: { avg: { field: durationField } }, + timeseries: { + date_histogram: { + field: '@timestamp', + fixed_interval: intervalString, + min_doc_count: 0, + extended_bounds: { min: start, max: end }, + }, + aggs: { + latency: { avg: { field: durationField } }, }, }, }, @@ -172,15 +201,32 @@ async function getTransactionStats({ const totalRequests = response.hits.total.value; return { - avgTransactionDuration: response.aggregations?.duration.value ?? null, - avgRequestsPerMinute: totalRequests > 0 ? totalRequests / minutes : null, + latency: { + value: response.aggregations?.duration.value ?? null, + timeseries: response.aggregations?.timeseries.buckets.map((bucket) => ({ + x: bucket.key, + y: bucket.latency.value, + })), + }, + throughput: { + value: totalRequests > 0 ? totalRequests / minutes : null, + timeseries: response.aggregations?.timeseries.buckets.map((bucket) => { + return { + x: bucket.key, + y: bucket.doc_count ?? 0, + }; + }), + }, }; } async function getCpuStats({ setup, filter, -}: TaskParameters): Promise<{ avgCpuUsage: number | null }> { + intervalString, + start, + end, +}: TaskParameters): Promise { const { apmEventClient } = setup; const response = await apmEventClient.search( @@ -199,22 +245,44 @@ async function getCpuStats({ ], }, }, - aggs: { avgCpuUsage: { avg: { field: METRIC_SYSTEM_CPU_PERCENT } } }, + aggs: { + avgCpuUsage: { avg: { field: METRIC_SYSTEM_CPU_PERCENT } }, + timeseries: { + date_histogram: { + field: '@timestamp', + fixed_interval: intervalString, + min_doc_count: 0, + extended_bounds: { min: start, max: end }, + }, + aggs: { + cpuAvg: { avg: { field: METRIC_SYSTEM_CPU_PERCENT } }, + }, + }, + }, }, } ); - return { avgCpuUsage: response.aggregations?.avgCpuUsage.value ?? null }; + return { + value: response.aggregations?.avgCpuUsage.value ?? null, + timeseries: response.aggregations?.timeseries.buckets.map((bucket) => ({ + x: bucket.key, + y: bucket.cpuAvg.value, + })), + }; } function getMemoryStats({ setup, filter, -}: TaskParameters): Promise<{ avgMemoryUsage: number | null }> { + intervalString, + start, + end, +}: TaskParameters) { return withApmSpan('get_memory_stats_for_service_map_node', async () => { const { apmEventClient } = setup; - const getAvgMemoryUsage = async ({ + const getMemoryUsage = async ({ additionalFilters, script, }: { @@ -222,7 +290,7 @@ function getMemoryStats({ script: | typeof percentCgroupMemoryUsedScript | typeof percentSystemMemoryUsedScript; - }) => { + }): Promise => { const response = await apmEventClient.search( 'get_avg_memory_for_service_map_node', { @@ -238,22 +306,39 @@ function getMemoryStats({ }, aggs: { avgMemoryUsage: { avg: { script } }, + timeseries: { + date_histogram: { + field: '@timestamp', + fixed_interval: intervalString, + min_doc_count: 0, + extended_bounds: { min: start, max: end }, + }, + aggs: { + memoryAvg: { avg: { script } }, + }, + }, }, }, } ); - return response.aggregations?.avgMemoryUsage.value ?? null; + return { + value: response.aggregations?.avgMemoryUsage.value ?? null, + timeseries: response.aggregations?.timeseries.buckets.map((bucket) => ({ + x: bucket.key, + y: bucket.memoryAvg.value, + })), + }; }; - let avgMemoryUsage = await getAvgMemoryUsage({ + let memoryUsage = await getMemoryUsage({ additionalFilters: [ { exists: { field: METRIC_CGROUP_MEMORY_USAGE_BYTES } }, ], script: percentCgroupMemoryUsedScript, }); - if (!avgMemoryUsage) { - avgMemoryUsage = await getAvgMemoryUsage({ + if (!memoryUsage) { + memoryUsage = await getMemoryUsage({ additionalFilters: [ { exists: { field: METRIC_SYSTEM_FREE_MEMORY } }, { exists: { field: METRIC_SYSTEM_TOTAL_MEMORY } }, @@ -262,6 +347,6 @@ function getMemoryStats({ }); } - return { avgMemoryUsage }; + return memoryUsage; }); } diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts index 166e8d61142eac..ec081916f455de 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts @@ -18,7 +18,7 @@ import { kqlQuery, rangeQuery } from '../../../../../observability/server'; import { environmentQuery } from '../../../../common/utils/environment_query'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../../lib/helpers/transactions'; import { calculateThroughput } from '../../../lib/helpers/calculate_throughput'; @@ -89,9 +89,7 @@ export async function getServiceInstancesTransactionStatistics< } ); - const field = getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ); + const field = getDurationFieldForTransactions(searchAggregatedTransactions); const subAggs = { ...getLatencyAggregation(latencyAggregationType, field), diff --git a/x-pack/plugins/apm/server/routes/services/get_service_transaction_group_detailed_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_transaction_group_detailed_statistics.ts index 70f77c26fdbf9f..b14329985db90f 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_transaction_group_detailed_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_transaction_group_detailed_statistics.ts @@ -20,7 +20,7 @@ import { environmentQuery } from '../../../common/utils/environment_query'; import { Coordinate } from '../../../typings/timeseries'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../lib/helpers/transactions'; import { getBucketSizeForAggregatedTransactions } from '../../lib/helpers/get_bucket_size_for_aggregated_transactions'; @@ -72,9 +72,7 @@ export async function getServiceTransactionGroupDetailedStatistics({ searchAggregatedTransactions, }); - const field = getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ); + const field = getDurationFieldForTransactions(searchAggregatedTransactions); const response = await apmEventClient.search( 'get_service_transaction_group_detailed_statistics', diff --git a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts index 711d6964221bd3..979d79c84578a8 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_transaction_groups.ts @@ -17,7 +17,7 @@ import { rangeQuery, kqlQuery } from '../../../../observability/server'; import { environmentQuery } from '../../../common/utils/environment_query'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../lib/helpers/transactions'; import { calculateThroughput } from '../../lib/helpers/calculate_throughput'; @@ -59,9 +59,7 @@ export async function getServiceTransactionGroups({ const { apmEventClient, config } = setup; const bucketSize = config.ui.transactionGroupBucketSize; - const field = getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ); + const field = getDurationFieldForTransactions(searchAggregatedTransactions); const response = await apmEventClient.search( 'get_service_transaction_groups', diff --git a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts index 3eaa8053b6709e..9576c018c1c270 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services/get_service_transaction_stats.ts @@ -20,7 +20,7 @@ import { environmentQuery } from '../../../../common/utils/environment_query'; import { AgentName } from '../../../../typings/es_schemas/ui/fields/agent'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../../lib/helpers/transactions'; import { calculateThroughput } from '../../../lib/helpers/calculate_throughput'; @@ -56,9 +56,7 @@ export async function getServiceTransactionStats({ const metrics = { avg_duration: { avg: { - field: getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ), + field: getDurationFieldForTransactions(searchAggregatedTransactions), }, }, outcomes, diff --git a/x-pack/plugins/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts index 95f2c6f400de95..744cd70e9eeb2f 100644 --- a/x-pack/plugins/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_services_detailed_statistics/get_service_transaction_detailed_statistics.ts @@ -19,7 +19,7 @@ import { environmentQuery } from '../../../../common/utils/environment_query'; import { getOffsetInMs } from '../../../../common/utils/get_offset_in_ms'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../../lib/helpers/transactions'; import { calculateThroughput } from '../../../lib/helpers/calculate_throughput'; @@ -61,9 +61,7 @@ export async function getServiceTransactionDetailedStatistics({ const metrics = { avg_duration: { avg: { - field: getTransactionDurationFieldForTransactions( - searchAggregatedTransactions - ), + field: getDurationFieldForTransactions(searchAggregatedTransactions), }, }, outcomes, diff --git a/x-pack/plugins/apm/server/routes/transactions/get_latency_charts/index.ts b/x-pack/plugins/apm/server/routes/transactions/get_latency_charts/index.ts index 5375da3606f18b..5c9e4892866cb4 100644 --- a/x-pack/plugins/apm/server/routes/transactions/get_latency_charts/index.ts +++ b/x-pack/plugins/apm/server/routes/transactions/get_latency_charts/index.ts @@ -21,7 +21,7 @@ import { import { environmentQuery } from '../../../../common/utils/environment_query'; import { getDocumentTypeFilterForTransactions, - getTransactionDurationFieldForTransactions, + getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../../lib/helpers/transactions'; import { Setup } from '../../../lib/helpers/setup_request'; @@ -64,7 +64,7 @@ function searchLatency({ searchAggregatedTransactions, }); - const transactionDurationField = getTransactionDurationFieldForTransactions( + const transactionDurationField = getDurationFieldForTransactions( searchAggregatedTransactions ); diff --git a/x-pack/test/apm_api_integration/tests/service_maps/service_maps.spec.ts b/x-pack/test/apm_api_integration/tests/service_maps/service_maps.spec.ts index bf607030c07d3b..d4f0e350071bf7 100644 --- a/x-pack/test/apm_api_integration/tests/service_maps/service_maps.spec.ts +++ b/x-pack/test/apm_api_integration/tests/service_maps/service_maps.spec.ts @@ -5,46 +5,63 @@ * 2.0. */ -import querystring from 'querystring'; -import url from 'url'; import expect from '@kbn/expect'; import { isEmpty, orderBy, uniq } from 'lodash'; +import { ServiceConnectionNode } from '../../../../plugins/apm/common/service_map'; +import { ApmApiError, SupertestReturnType } from '../../common/apm_api_supertest'; import archives_metadata from '../../common/fixtures/es_archiver/archives_metadata'; -import { PromiseReturnType } from '../../../../plugins/observability/typings/common'; import { FtrProviderContext } from '../../common/ftr_provider_context'; +type BackendResponse = SupertestReturnType<'GET /internal/apm/service-map/backend'>; +type ServiceNodeResponse = + SupertestReturnType<'GET /internal/apm/service-map/service/{serviceName}'>; +type ServiceMapResponse = SupertestReturnType<'GET /internal/apm/service-map'>; + export default function serviceMapsApiTests({ getService }: FtrProviderContext) { + const apmApiClient = getService('apmApiClient'); const registry = getService('registry'); - const supertest = getService('legacySupertestAsApmReadUser'); - const supertestAsApmReadUserWithoutMlAccess = getService( - 'legacySupertestAsApmReadUserWithoutMlAccess' - ); const archiveName = 'apm_8.0.0'; const metadata = archives_metadata[archiveName]; - const start = encodeURIComponent(metadata.start); - const end = encodeURIComponent(metadata.end); registry.when('Service map with a basic license', { config: 'basic', archives: [] }, () => { it('is only be available to users with Platinum license (or higher)', async () => { - const response = await supertest.get( - `/internal/apm/service-map?start=${start}&end=${end}&environment=ENVIRONMENT_ALL` - ); - - expect(response.status).to.be(403); + try { + await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map`, + params: { + query: { + start: metadata.start, + end: metadata.end, + environment: 'ENVIRONMENT_ALL', + }, + }, + }); - expectSnapshot(response.body.message).toMatchInline( - `"In order to access Service Maps, you must be subscribed to an Elastic Platinum license. With it, you'll have the ability to visualize your entire application stack along with your APM data."` - ); + expect(true).to.be(false); + } catch (e) { + const err = e as ApmApiError; + expect(err.res.status).to.be(403); + expectSnapshot(err.res.body.message).toMatchInline( + `"In order to access Service Maps, you must be subscribed to an Elastic Platinum license. With it, you'll have the ability to visualize your entire application stack along with your APM data."` + ); + } }); }); registry.when('Service map without data', { config: 'trial', archives: [] }, () => { describe('/internal/apm/service-map', () => { it('returns an empty list', async () => { - const response = await supertest.get( - `/internal/apm/service-map?start=${start}&end=${end}&environment=ENVIRONMENT_ALL` - ); + const response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map`, + params: { + query: { + start: metadata.start, + end: metadata.end, + environment: 'ENVIRONMENT_ALL', + }, + }, + }); expect(response.status).to.be(200); expect(response.body.elements.length).to.be(0); @@ -52,63 +69,78 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) }); describe('/internal/apm/service-map/service/{serviceName}', () => { - it('returns an object with nulls', async () => { - const q = querystring.stringify({ - start: metadata.start, - end: metadata.end, - environment: 'ENVIRONMENT_ALL', + let response: ServiceNodeResponse; + before(async () => { + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map/service/{serviceName}`, + params: { + path: { serviceName: 'opbeans-node' }, + query: { + start: metadata.start, + end: metadata.end, + environment: 'ENVIRONMENT_ALL', + }, + }, }); - const response = await supertest.get(`/internal/apm/service-map/service/opbeans-node?${q}`); + }); + it('retuns status code 200', () => { expect(response.status).to.be(200); + }); - expectSnapshot(response.body).toMatchInline(` - Object { - "avgCpuUsage": null, - "avgErrorRate": null, - "avgMemoryUsage": null, - "transactionStats": Object { - "avgRequestsPerMinute": null, - "avgTransactionDuration": null, - }, - } - `); + it('returns an object with nulls', async () => { + [ + response.body.failedTransactionsRate?.value, + response.body.memoryUsage?.value, + response.body.cpuUsage?.value, + response.body.transactionStats?.latency?.value, + response.body.transactionStats?.throughput?.value, + ].forEach((value) => { + expect(value).to.be.eql(null); + }); }); }); describe('/internal/apm/service-map/backend', () => { - it('returns an object with nulls', async () => { - const q = querystring.stringify({ - backendName: 'postgres', - start: metadata.start, - end: metadata.end, - environment: 'ENVIRONMENT_ALL', + let response: BackendResponse; + before(async () => { + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map/backend`, + params: { + query: { + backendName: 'postgres', + start: metadata.start, + end: metadata.end, + environment: 'ENVIRONMENT_ALL', + }, + }, }); - const response = await supertest.get(`/internal/apm/service-map/backend?${q}`); + }); + it('retuns status code 200', () => { expect(response.status).to.be(200); + }); - expectSnapshot(response.body).toMatchInline(` - Object { - "avgErrorRate": null, - "transactionStats": Object { - "avgRequestsPerMinute": null, - "avgTransactionDuration": null, - }, - } - `); + it('returns undefined values', () => { + expect(response.body).to.eql({ transactionStats: {} }); }); }); }); registry.when('Service Map with data', { config: 'trial', archives: ['apm_8.0.0'] }, () => { describe('/internal/apm/service-map', () => { - let response: PromiseReturnType; - + let response: ServiceMapResponse; before(async () => { - response = await supertest.get( - `/internal/apm/service-map?start=${start}&end=${end}&environment=ENVIRONMENT_ALL` - ); + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map`, + params: { + query: { + environment: 'ENVIRONMENT_ALL', + start: metadata.start, + end: metadata.end, + }, + }, + }); }); it('returns service map elements', () => { @@ -126,17 +158,17 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) ).sort(); expectSnapshot(serviceNames).toMatchInline(` - Array [ - "auditbeat", - "opbeans-dotnet", - "opbeans-go", - "opbeans-java", - "opbeans-node", - "opbeans-python", - "opbeans-ruby", - "opbeans-rum", - ] - `); + Array [ + "auditbeat", + "opbeans-dotnet", + "opbeans-go", + "opbeans-java", + "opbeans-node", + "opbeans-python", + "opbeans-ruby", + "opbeans-rum", + ] + `); const externalDestinations = uniq( elements @@ -145,115 +177,119 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) ).sort(); expectSnapshot(externalDestinations).toMatchInline(` - Array [ - ">elasticsearch", - ">postgresql", - ">redis", - ">sqlite", - ] - `); + Array [ + ">elasticsearch", + ">postgresql", + ">redis", + ">sqlite", + ] + `); }); describe('with ML data', () => { describe('with the default apm user', () => { before(async () => { - response = await supertest.get( - `/internal/apm/service-map?start=${start}&end=${end}&environment=ENVIRONMENT_ALL` - ); + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map`, + params: { + query: { + environment: 'ENVIRONMENT_ALL', + start: metadata.start, + end: metadata.end, + }, + }, + }); }); - it('returns service map elements with anomaly stats', () => { expect(response.status).to.be(200); const dataWithAnomalies = response.body.elements.filter( - (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) + (el) => !isEmpty((el.data as ServiceConnectionNode).serviceAnomalyStats) ); - expect(dataWithAnomalies).not.to.be.empty(); - dataWithAnomalies.forEach(({ data }: any) => { expect( Object.values(data.serviceAnomalyStats).filter((value) => isEmpty(value)) ).to.not.empty(); }); }); - it('returns the correct anomaly stats', () => { const dataWithAnomalies = response.body.elements.filter( - (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) + (el) => !isEmpty((el.data as ServiceConnectionNode).serviceAnomalyStats) ); - expect(dataWithAnomalies).not.to.be.empty(); - expectSnapshot(dataWithAnomalies.length).toMatchInline(`7`); expectSnapshot(orderBy(dataWithAnomalies, 'data.id').slice(0, 3)).toMatchInline(` - Array [ - Object { - "data": Object { - "agent.name": "dotnet", - "id": "opbeans-dotnet", - "service.environment": "production", - "service.name": "opbeans-dotnet", - "serviceAnomalyStats": Object { - "actualValue": 868025.86875, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-dotnet", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "agent.name": "go", - "id": "opbeans-go", - "service.environment": "testing", - "service.name": "opbeans-go", - "serviceAnomalyStats": Object { - "actualValue": 102786.319148936, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-testing-41e5-high_mean_transaction_duration", - "serviceName": "opbeans-go", - "transactionType": "request", - }, - }, - }, - Object { - "data": Object { - "agent.name": "java", - "id": "opbeans-java", - "service.environment": "production", - "service.name": "opbeans-java", - "serviceAnomalyStats": Object { - "actualValue": 175568.855769231, - "anomalyScore": 0, - "healthStatus": "healthy", - "jobId": "apm-production-6117-high_mean_transaction_duration", - "serviceName": "opbeans-java", - "transactionType": "request", - }, - }, - }, - ] - `); + Array [ + Object { + "data": Object { + "agent.name": "dotnet", + "id": "opbeans-dotnet", + "service.environment": "production", + "service.name": "opbeans-dotnet", + "serviceAnomalyStats": Object { + "actualValue": 868025.86875, + "anomalyScore": 0, + "healthStatus": "healthy", + "jobId": "apm-production-6117-high_mean_transaction_duration", + "serviceName": "opbeans-dotnet", + "transactionType": "request", + }, + }, + }, + Object { + "data": Object { + "agent.name": "go", + "id": "opbeans-go", + "service.environment": "testing", + "service.name": "opbeans-go", + "serviceAnomalyStats": Object { + "actualValue": 102786.319148936, + "anomalyScore": 0, + "healthStatus": "healthy", + "jobId": "apm-testing-41e5-high_mean_transaction_duration", + "serviceName": "opbeans-go", + "transactionType": "request", + }, + }, + }, + Object { + "data": Object { + "agent.name": "java", + "id": "opbeans-java", + "service.environment": "production", + "service.name": "opbeans-java", + "serviceAnomalyStats": Object { + "actualValue": 175568.855769231, + "anomalyScore": 0, + "healthStatus": "healthy", + "jobId": "apm-production-6117-high_mean_transaction_duration", + "serviceName": "opbeans-java", + "transactionType": "request", + }, + }, + }, + ] + `); }); }); - describe('with a user that does not have access to ML', () => { before(async () => { - response = await supertestAsApmReadUserWithoutMlAccess.get( - `/internal/apm/service-map?start=${start}&end=${end}&environment=ENVIRONMENT_ALL` - ); + response = await apmApiClient.noMlAccessUser({ + endpoint: `GET /internal/apm/service-map`, + params: { + query: { + environment: 'ENVIRONMENT_ALL', + start: metadata.start, + end: metadata.end, + }, + }, + }); }); - it('returns service map elements without anomaly stats', () => { expect(response.status).to.be(200); - const dataWithAnomalies = response.body.elements.filter( - (el: { data: { serviceAnomalyStats?: {} } }) => !isEmpty(el.data.serviceAnomalyStats) + (el) => !isEmpty((el.data as ServiceConnectionNode).serviceAnomalyStats) ); - expect(dataWithAnomalies).to.be.empty(); }); }); @@ -261,20 +297,25 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) describe('with a single service', () => { describe('when ENVIRONMENT_ALL is selected', () => { - it('returns service map elements', async () => { - response = await supertest.get( - url.format({ - pathname: '/internal/apm/service-map', + before(async () => { + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map`, + params: { query: { environment: 'ENVIRONMENT_ALL', start: metadata.start, end: metadata.end, serviceName: 'opbeans-java', }, - }) - ); + }, + }); + }); + it('retuns status code 200', () => { expect(response.status).to.be(200); + }); + + it('returns some elements', () => { expect(response.body.elements.length).to.be.greaterThan(1); }); }); @@ -282,51 +323,79 @@ export default function serviceMapsApiTests({ getService }: FtrProviderContext) }); describe('/internal/apm/service-map/service/{serviceName}', () => { - it('returns an object with data', async () => { - const q = querystring.stringify({ - start: metadata.start, - end: metadata.end, - environment: 'ENVIRONMENT_ALL', + let response: ServiceNodeResponse; + before(async () => { + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map/service/{serviceName}`, + params: { + path: { serviceName: 'opbeans-node' }, + query: { + start: metadata.start, + end: metadata.end, + environment: 'ENVIRONMENT_ALL', + }, + }, }); - const response = await supertest.get(`/internal/apm/service-map/service/opbeans-node?${q}`); + }); + it('retuns status code 200', () => { expect(response.status).to.be(200); + }); - expectSnapshot(response.body).toMatchInline(` - Object { - "avgCpuUsage": 0.240216666666667, - "avgErrorRate": 0, - "avgMemoryUsage": 0.202572668763642, - "transactionStats": Object { - "avgRequestsPerMinute": 5.2, - "avgTransactionDuration": 53906.6603773585, - }, - } - `); + it('returns some error rate', () => { + expect(response.body.failedTransactionsRate?.value).to.eql(0); + expect(response.body.failedTransactionsRate?.timeseries?.length).to.be.greaterThan(0); + }); + + it('returns some latency', () => { + expect(response.body.transactionStats?.latency?.value).to.be.greaterThan(0); + expect(response.body.transactionStats?.latency?.timeseries?.length).to.be.greaterThan(0); + }); + + it('returns some throughput', () => { + expect(response.body.transactionStats?.throughput?.value).to.be.greaterThan(0); + expect(response.body.transactionStats?.throughput?.timeseries?.length).to.be.greaterThan(0); + }); + + it('returns some cpu usage', () => { + expect(response.body.cpuUsage?.value).to.be.greaterThan(0); + expect(response.body.cpuUsage?.timeseries?.length).to.be.greaterThan(0); }); }); describe('/internal/apm/service-map/backend', () => { - it('returns an object with data', async () => { - const q = querystring.stringify({ - backendName: 'postgresql', - start: metadata.start, - end: metadata.end, - environment: 'ENVIRONMENT_ALL', + let response: BackendResponse; + before(async () => { + response = await apmApiClient.readUser({ + endpoint: `GET /internal/apm/service-map/backend`, + params: { + query: { + backendName: 'postgresql', + start: metadata.start, + end: metadata.end, + environment: 'ENVIRONMENT_ALL', + }, + }, }); - const response = await supertest.get(`/internal/apm/service-map/backend?${q}`); + }); + it('retuns status code 200', () => { expect(response.status).to.be(200); + }); - expectSnapshot(response.body).toMatchInline(` - Object { - "avgErrorRate": 0, - "transactionStats": Object { - "avgRequestsPerMinute": 82.9666666666667, - "avgTransactionDuration": 18307.583366814, - }, - } - `); + it('returns some error rate', () => { + expect(response.body.failedTransactionsRate?.value).to.eql(0); + expect(response.body.failedTransactionsRate?.timeseries?.length).to.be.greaterThan(0); + }); + + it('returns some latency', () => { + expect(response.body.transactionStats?.latency?.value).to.be.greaterThan(0); + expect(response.body.transactionStats?.latency?.timeseries?.length).to.be.greaterThan(0); + }); + + it('returns some throughput', () => { + expect(response.body.transactionStats?.throughput?.value).to.be.greaterThan(0); + expect(response.body.transactionStats?.throughput?.timeseries?.length).to.be.greaterThan(0); }); }); }); From 44f3f92682515b71b65311a8b59d0b585bb14e20 Mon Sep 17 00:00:00 2001 From: Scotty Bollinger Date: Thu, 2 Dec 2021 12:58:02 -0600 Subject: [PATCH 069/126] Replace `EuiThemeProvider` with `KibanaThemeProvider` (#120244) --- .../enterprise_search/public/applications/index.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index f8db22563ec5ae..de112dd60863f5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.tsx @@ -16,8 +16,10 @@ import { Store } from 'redux'; import { I18nProvider } from '@kbn/i18n-react'; import { AppMountParameters, CoreStart } from '../../../../../src/core/public'; -import { EuiThemeProvider } from '../../../../../src/plugins/kibana_react/common'; -import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { + KibanaContextProvider, + KibanaThemeProvider, +} from '../../../../../src/plugins/kibana_react/public'; import { InitialAppData } from '../../common/types'; import { PluginsStart, ClientConfigType, ClientData } from '../plugin'; @@ -70,7 +72,7 @@ export const renderApp = ( ReactDOM.render( - + @@ -79,7 +81,7 @@ export const renderApp = ( - + , params.element ); From 553928c4e18eefdaa2d2d5e94e236a8999093d11 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 2 Dec 2021 12:04:55 -0700 Subject: [PATCH 070/126] [Maps] remove getIndexPatternsService from server.kibana_server_services (#120156) * [Maps] remove getIndexPatternsService from server.kibana_server_services * eslint --- .../maps/server/kibana_server_services.ts | 40 +++++++------------ .../maps_telemetry/maps_telemetry.test.js | 30 +++++++++----- .../server/maps_telemetry/maps_telemetry.ts | 17 +++++++- x-pack/plugins/maps/server/plugin.ts | 11 +---- 4 files changed, 52 insertions(+), 46 deletions(-) diff --git a/x-pack/plugins/maps/server/kibana_server_services.ts b/x-pack/plugins/maps/server/kibana_server_services.ts index f5bd4dad085d8b..28c7caf3c50e34 100644 --- a/x-pack/plugins/maps/server/kibana_server_services.ts +++ b/x-pack/plugins/maps/server/kibana_server_services.ts @@ -5,32 +5,20 @@ * 2.0. */ -import { ElasticsearchClient, ISavedObjectsRepository } from 'kibana/server'; -import { SavedObjectsClient } from '../../../../src/core/server'; -import { - IndexPatternsCommonService, - IndexPatternsServiceStart, -} from '../../../../src/plugins/data/server'; +import { CoreStart } from '../../../../src/core/server'; +import { StartDeps } from './plugin'; -let internalRepository: ISavedObjectsRepository; -export const setInternalRepository = ( - createInternalRepository: (extraTypes?: string[]) => ISavedObjectsRepository -) => { - internalRepository = createInternalRepository(); -}; -export const getInternalRepository = () => internalRepository; +let coreStart: CoreStart; +let pluginsStart: StartDeps; +export function setStartServices(core: CoreStart, plugins: StartDeps) { + coreStart = core; + pluginsStart = plugins; +} -let esClient: ElasticsearchClient; -let indexPatternsService: IndexPatternsCommonService; -export const setIndexPatternsService = async ( - indexPatternsServiceFactory: IndexPatternsServiceStart['indexPatternsServiceFactory'], - elasticsearchClient: ElasticsearchClient -) => { - esClient = elasticsearchClient; - indexPatternsService = await indexPatternsServiceFactory( - new SavedObjectsClient(getInternalRepository()), - elasticsearchClient - ); +export const getSavedObjectClient = (extraTypes?: string[]) => { + return coreStart.savedObjects.createInternalRepository(extraTypes); }; -export const getIndexPatternsService = () => indexPatternsService; -export const getESClient = () => esClient; + +export const getIndexPatternsServiceFactory = () => + pluginsStart.data.indexPatterns.indexPatternsServiceFactory; +export const getElasticsearch = () => coreStart.elasticsearch; diff --git a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js index c9720063290b05..a415d181900d7f 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js +++ b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js @@ -54,19 +54,31 @@ jest.mock('../kibana_server_services', () => { }, }; return { - getIndexPatternsService() { + getSavedObjectClient: () => { + return {}; + }, + getElasticsearch: () => { return { - async get(x) { - return x === testAggIndexPatternId ? testAggIndexPattern : testIndexPatterns[x]; - }, - async getIds() { - return Object.values(testIndexPatterns).map((x) => x.id); - }, - async getFieldsForIndexPattern(x) { - return x.fields; + client: { + asInternalUser: {}, }, }; }, + getIndexPatternsServiceFactory() { + return function () { + return { + async get(x) { + return x === testAggIndexPatternId ? testAggIndexPattern : testIndexPatterns[x]; + }, + async getIds() { + return Object.values(testIndexPatterns).map((x) => x.id); + }, + async getFieldsForIndexPattern(x) { + return x.fields; + }, + }; + }; + }, }; }); diff --git a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts index 5041cb997ff58b..93a9a118d23bcb 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts @@ -22,7 +22,11 @@ import { LayerDescriptor, } from '../../common/descriptor_types'; import { MapSavedObject, MapSavedObjectAttributes } from '../../common/map_saved_object_type'; -import { getIndexPatternsService, getInternalRepository } from '../kibana_server_services'; +import { + getElasticsearch, + getIndexPatternsServiceFactory, + getSavedObjectClient, +} from '../kibana_server_services'; import { injectReferences } from '././../../common/migrations/references'; import { getBaseMapsPerCluster, @@ -36,6 +40,15 @@ import { TELEMETRY_SCALING_OPTION_COUNTS_PER_CLUSTER, TELEMETRY_TERM_JOIN_COUNTS_PER_CLUSTER, } from './util'; +import { SavedObjectsClient } from '../../../../../src/core/server'; + +async function getIndexPatternsService() { + const factory = getIndexPatternsServiceFactory(); + return factory( + new SavedObjectsClient(getSavedObjectClient()), + getElasticsearch().client.asInternalUser + ); +} interface IStats { [key: string]: { @@ -302,7 +315,7 @@ export async function execTransformOverMultipleSavedObjectPages( savedObjectType: string, transform: (savedObjects: Array>) => void ) { - const savedObjectsClient = getInternalRepository(); + const savedObjectsClient = getSavedObjectClient(); let currentPage = 1; // Seed values diff --git a/x-pack/plugins/maps/server/plugin.ts b/x-pack/plugins/maps/server/plugin.ts index b35f680df457c5..ec9b3652fddbd7 100644 --- a/x-pack/plugins/maps/server/plugin.ts +++ b/x-pack/plugins/maps/server/plugin.ts @@ -25,8 +25,7 @@ import { registerMapsUsageCollector } from './maps_telemetry/collectors/register import { APP_ID, APP_ICON, MAP_SAVED_OBJECT_TYPE, getFullPath } from '../common/constants'; import { mapSavedObjects, mapsTelemetrySavedObjects } from './saved_objects'; import { MapsXPackConfig } from '../config'; -// @ts-ignore -import { setIndexPatternsService, setInternalRepository } from './kibana_server_services'; +import { setStartServices } from './kibana_server_services'; import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/server'; import { emsBoundariesSpecProvider } from './tutorials/ems'; // @ts-ignore @@ -160,7 +159,6 @@ export class MapsPlugin implements Plugin { ); } - // @ts-ignore setup(core: CoreSetup, plugins: SetupDeps) { const { usageCollection, home, licensing, features, mapsEms, customIntegrations } = plugins; const mapsEmsConfig = mapsEms.config; @@ -230,12 +228,7 @@ export class MapsPlugin implements Plugin { }; } - // @ts-ignore start(core: CoreStart, plugins: StartDeps) { - setInternalRepository(core.savedObjects.createInternalRepository); - setIndexPatternsService( - plugins.data.indexPatterns.indexPatternsServiceFactory, - core.elasticsearch.client.asInternalUser - ); + setStartServices(core, plugins); } } From 915206531bc35d127fec88e8b2e44811ace47596 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Thu, 2 Dec 2021 12:10:48 -0700 Subject: [PATCH 071/126] [Security Solutions] Removes tech debt of exporting all from linter rule for security_solution plugin (#120188) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary See: https://github.com/elastic/kibana/issues/110903 This removes the top level API `export *` spots from: * `security_solution` plugin by removing _all_ the exports from `security_solution/common/index.ts` since non of those were shared outside this plugin. Look at the metrics from the build below and you will see _huge_ drops off numbers across the board for required API documentation to the page load size. In the file `security_solution/common/index.ts` I now put the advice of: ``` // Careful of exporting anything from this file as any file(s) you export here will cause your page bundle size to increase. // If you're using functions/types/etc... internally it's best to import directly from their paths than expose the functions/types/etc... here. // You should _only_ expose functions/types/etc... that need to be shared with other plugins here. ``` But really I doubt we will have to share anything from `security_solutions` plugin to another plugin or expose it for anyone else. So I think this is 👍 the way forward to not expose anything directly from `security_solution/common/index.ts` anymore. --- x-pack/plugins/lists/common/index.ts | 4 ++++ x-pack/plugins/security_solution/common/index.ts | 9 +++------ .../components/event_details/alert_summary_view.test.tsx | 2 +- .../components/event_details/alert_summary_view.tsx | 3 ++- .../public/common/components/event_details/columns.tsx | 3 ++- .../event_details/cti_details/enrichment_summary.tsx | 6 +++++- .../event_details/cti_details/threat_summary_view.tsx | 6 +++++- .../public/common/components/event_details/helpers.tsx | 2 +- .../event_details/investigation_guide_view.tsx | 2 +- .../public/common/components/event_details/reason.tsx | 2 +- .../common/components/events_viewer/default_headers.tsx | 2 +- .../public/common/containers/sourcerer/index.tsx | 2 +- .../security_solution/public/common/mock/header.ts | 2 +- .../alerts_kpis/alerts_count_panel/alerts_count.tsx | 2 +- .../components/alerts_kpis/alerts_count_panel/types.ts | 2 +- .../timeline_actions/alert_context_menu.test.tsx | 2 +- .../alerts_table/timeline_actions/alert_context_menu.tsx | 2 +- .../timeline_actions/investigate_in_resolver.tsx | 2 +- .../timeline_actions/use_add_to_case_actions.tsx | 3 ++- .../detections/components/host_isolation/helpers.ts | 2 +- .../host_isolation/use_host_isolation_action.tsx | 2 +- .../detections/components/rules/query_preview/index.tsx | 2 +- .../rules/rule_preview/use_preview_histogram.tsx | 2 +- .../components/take_action_dropdown/index.test.tsx | 3 ++- .../detections/components/take_action_dropdown/index.tsx | 2 +- .../examples/observablity_alerts/columns.ts | 2 +- .../observablity_alerts/render_cell_value.test.tsx | 2 +- .../examples/security_solution_rac/columns.ts | 2 +- .../security_solution_rac/render_cell_value.test.tsx | 2 +- .../security_solution_detections/columns.ts | 2 +- .../render_cell_value.test.tsx | 2 +- .../risky_hosts_enabled_module.tsx | 2 +- .../overview_risky_host_links/use_hosts_risk_score.ts | 2 +- .../use_hosts_risk_score_complete.ts | 2 +- .../components/create_field_button/index.test.tsx | 2 +- .../timelines/components/fields_browser/field_items.tsx | 2 +- .../timelines/components/fields_browser/field_name.tsx | 2 +- .../timelines/components/formatted_ip/index.test.tsx | 2 +- .../components/side_panel/event_details/footer.tsx | 3 ++- .../components/side_panel/event_details/index.tsx | 2 +- .../timeline/body/column_headers/actions/index.tsx | 2 +- .../timeline/body/column_headers/default_headers.ts | 2 +- .../timeline/body/column_headers/filter/index.tsx | 2 +- .../timeline/body/column_headers/header/index.tsx | 2 +- .../column_headers/header_tooltip_content/index.test.tsx | 2 +- .../body/column_headers/header_tooltip_content/index.tsx | 2 +- .../components/timeline/body/column_headers/helpers.ts | 2 +- .../timeline/body/events/stateful_row_renderer/index.tsx | 2 +- .../body/renderers/auditd/generic_row_renderer.test.tsx | 2 +- .../timeline/body/renderers/column_renderer.ts | 2 +- .../timeline/body/renderers/cti/threat_match_rows.tsx | 2 +- .../timeline/body/renderers/empty_column_renderer.tsx | 2 +- .../timeline/body/renderers/get_row_renderer.ts | 2 +- .../timeline/body/renderers/host_name.test.tsx | 2 +- .../components/timeline/body/renderers/index.ts | 2 +- .../timeline/body/renderers/plain_column_renderer.tsx | 2 +- .../body/renderers/reason_column_renderer.test.tsx | 9 +++------ .../timeline/body/renderers/reason_column_renderer.tsx | 3 ++- .../body/renderers/system/generic_row_renderer.test.tsx | 2 +- .../public/ueba/components/host_rules_table/columns.tsx | 2 +- .../public/ueba/components/host_rules_table/index.tsx | 7 +++---- .../ueba/components/host_tactics_table/columns.tsx | 2 +- .../public/ueba/components/host_tactics_table/index.tsx | 4 ++-- .../public/ueba/components/risk_score_table/index.tsx | 7 +++---- .../public/ueba/containers/host_rules/index.tsx | 2 +- .../public/ueba/containers/host_tactics/index.tsx | 2 +- .../public/ueba/containers/risk_score/index.tsx | 2 +- .../public/ueba/containers/user_rules/index.tsx | 2 +- .../ueba/pages/navigation/user_rules_query_tab_body.tsx | 2 +- .../plugins/security_solution/public/ueba/pages/ueba.tsx | 2 +- .../source_fields_merging/strategies/get_strategy.ts | 2 +- .../routes/timelines/create_timelines/helpers.test.ts | 2 +- .../security_solution/factory/hosts/risk_score/index.ts | 2 +- .../factory/hosts/risk_score/query.hosts_risk.dsl.ts | 2 +- .../factory/matrix_histogram/alerts/index.ts | 2 +- .../factory/matrix_histogram/anomalies/index.ts | 2 +- .../factory/matrix_histogram/authentications/index.ts | 2 +- .../factory/matrix_histogram/dns/index.ts | 2 +- .../factory/matrix_histogram/events/index.ts | 2 +- .../factory/matrix_histogram/preview/__mocks__/index.ts | 2 +- .../factory/matrix_histogram/preview/index.ts | 2 +- .../security_solution/factory/ueba/host_rules/helpers.ts | 6 +++++- .../security_solution/factory/ueba/host_rules/index.ts | 2 +- .../factory/ueba/host_tactics/helpers.ts | 2 +- .../security_solution/factory/ueba/host_tactics/index.ts | 4 ++-- .../security_solution/factory/ueba/risk_score/helpers.ts | 2 +- .../security_solution/factory/ueba/risk_score/index.ts | 4 ++-- .../security_solution/factory/ueba/user_rules/helpers.ts | 6 +++++- .../security_solution/factory/ueba/user_rules/index.ts | 2 +- .../services/security_solution/roles_users_utils.ts | 2 +- 90 files changed, 126 insertions(+), 108 deletions(-) diff --git a/x-pack/plugins/lists/common/index.ts b/x-pack/plugins/lists/common/index.ts index 1fec1c76430ebd..a9aa96c2d9c605 100644 --- a/x-pack/plugins/lists/common/index.ts +++ b/x-pack/plugins/lists/common/index.ts @@ -4,3 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ + +// Careful of exporting anything from this file as any file(s) you export here will cause your page bundle size to increase. +// If you're using functions/types/etc... internally it's best to import directly from their paths than expose the functions/types/etc... here. +// You should _only_ expose functions/types/etc... that need to be shared with other plugins here. diff --git a/x-pack/plugins/security_solution/common/index.ts b/x-pack/plugins/security_solution/common/index.ts index 19ce0d45e24855..a9aa96c2d9c605 100644 --- a/x-pack/plugins/security_solution/common/index.ts +++ b/x-pack/plugins/security_solution/common/index.ts @@ -5,9 +5,6 @@ * 2.0. */ -// TODO: https://github.com/elastic/kibana/issues/110904 -/* eslint-disable @kbn/eslint/no_export_all */ - -export * from './types'; -export * from './search_strategy'; -export * from './utility_types'; +// Careful of exporting anything from this file as any file(s) you export here will cause your page bundle size to increase. +// If you're using functions/types/etc... internally it's best to import directly from their paths than expose the functions/types/etc... here. +// You should _only_ expose functions/types/etc... that need to be shared with other plugins here. diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx index f7522cb4dd5858..7e1e71a01642f7 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx @@ -14,7 +14,7 @@ import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { useRuleWithFallback } from '../../../detections/containers/detection_engine/rules/use_rule_with_fallback'; import { TestProviders, TestProvidersComponent } from '../../mock'; -import { TimelineId } from '../../../../common'; +import { TimelineId } from '../../../../common/types'; import { mockBrowserFields } from '../../containers/source/mock'; jest.mock('../../lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx index 82259aa2312ae6..b42a0425355cc8 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx @@ -14,7 +14,8 @@ import { AlertSummaryRow, getSummaryColumns, SummaryRow } from './helpers'; import { ActionCell } from './table/action_cell'; import { FieldValueCell } from './table/field_value_cell'; -import { TimelineEventsDetailsItem, TimelineId } from '../../../../common'; +import { TimelineId } from '../../../../common/types'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { getSummaryRows } from './get_alert_summary_rows'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx index dbb52ade2652c5..811c43fdfc5b9c 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx @@ -14,7 +14,8 @@ import { BrowserFields } from '../../containers/source'; import { OnUpdateColumns } from '../../../timelines/components/timeline/events'; import * as i18n from './translations'; import { EventFieldsData } from './types'; -import { BrowserField, ColumnHeaderOptions } from '../../../../common'; +import { ColumnHeaderOptions } from '../../../../common/types'; +import { BrowserField } from '../../../../common/search_strategy'; import { FieldValueCell } from './table/field_value_cell'; import { FieldNameCell } from './table/field_name_cell'; import { ActionCell } from './table/action_cell'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/enrichment_summary.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/enrichment_summary.tsx index 37fbab924afa38..c2254c18f43647 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/enrichment_summary.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/enrichment_summary.tsx @@ -16,7 +16,11 @@ import { getEnrichmentIdentifiers, isInvestigationTimeEnrichment } from './helpe import { FieldsData } from '../types'; import { ActionCell } from '../table/action_cell'; -import { BrowserField, BrowserFields, TimelineEventsDetailsItem } from '../../../../../common'; +import { + BrowserField, + BrowserFields, + TimelineEventsDetailsItem, +} from '../../../../../common/search_strategy'; import { FormattedFieldValue } from '../../../../timelines/components/timeline/body/renderers/formatted_field'; import { EnrichedDataRow, ThreatSummaryPanelHeader } from './threat_summary_view'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx index bdd342934eeb62..c4d7902e151b4f 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_summary_view.tsx @@ -23,7 +23,11 @@ import { CtiEnrichment } from '../../../../../common/search_strategy/security_so import { FieldsData } from '../types'; -import { BrowserField, BrowserFields, TimelineEventsDetailsItem } from '../../../../../common'; +import { + BrowserField, + BrowserFields, + TimelineEventsDetailsItem, +} from '../../../../../common/search_strategy'; import { HostRisk } from '../../../../overview/containers/overview_risky_host_links/use_hosts_risk_score'; import { HostRiskSummary } from './host_risk_summary'; import { EnrichmentSummary } from './enrichment_summary'; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx index 47d0ccf5ba3b26..648bc96b5c9e7b 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/helpers.tsx @@ -25,7 +25,7 @@ import { import { FieldsData } from './types'; import * as i18n from './translations'; -import { ColumnHeaderOptions } from '../../../../common'; +import { ColumnHeaderOptions } from '../../../../common/types'; /** * Defines the behavior of the search input that appears above the table of data diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/investigation_guide_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/investigation_guide_view.tsx index f845e8ecba6b6e..b4abd253b4a96c 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/investigation_guide_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/investigation_guide_view.tsx @@ -15,7 +15,7 @@ import * as i18n from './translations'; import { useRuleWithFallback } from '../../../detections/containers/detection_engine/rules/use_rule_with_fallback'; import { MarkdownRenderer } from '../markdown_editor'; import { LineClamp } from '../line_clamp'; -import { TimelineEventsDetailsItem } from '../../../../common'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; export const Indent = styled.div` padding: 0 8px; diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/reason.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/reason.tsx index cf69e4ba02c3e2..d06f4d3ea105bd 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/reason.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/reason.tsx @@ -13,7 +13,7 @@ import React, { useMemo } from 'react'; import styled from 'styled-components'; import { getRuleDetailsUrl, useFormatUrl } from '../link_to'; import * as i18n from './translations'; -import { TimelineEventsDetailsItem } from '../../../../common'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { LinkAnchor } from '../links'; import { useKibana } from '../../lib/kibana'; import { APP_UI_ID, SecurityPageName } from '../../../../common/constants'; diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/default_headers.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/default_headers.tsx index a511af16bbf715..1578c77f283fb6 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/default_headers.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/default_headers.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { ColumnHeaderOptions } from '../../../../common'; +import { ColumnHeaderOptions } from '../../../../common/types'; import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_DATE_COLUMN_MIN_WIDTH } from '../../../timelines/components/timeline/body/constants'; diff --git a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx index 7aea1e881bb520..3311207eb14202 100644 --- a/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/containers/sourcerer/index.tsx @@ -22,7 +22,7 @@ import { RULES_PATH, UEBA_PATH, } from '../../../../common/constants'; -import { TimelineId } from '../../../../common'; +import { TimelineId } from '../../../../common/types'; import { useDeepEqualSelector } from '../../hooks/use_selector'; import { checkIfIndicesExist, getScopePatternListSelection } from '../../store/sourcerer/helpers'; import { useAppToasts } from '../../hooks/use_app_toasts'; diff --git a/x-pack/plugins/security_solution/public/common/mock/header.ts b/x-pack/plugins/security_solution/public/common/mock/header.ts index 029ddb00d18325..66bfda1a026190 100644 --- a/x-pack/plugins/security_solution/public/common/mock/header.ts +++ b/x-pack/plugins/security_solution/public/common/mock/header.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ColumnHeaderOptions } from '../../../common'; +import { ColumnHeaderOptions } from '../../../common/types'; import { defaultColumnHeaderType } from '../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx index d6b1afea985925..764a13c17ce841 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/alerts_count.tsx @@ -13,7 +13,7 @@ import { useUiSetting$ } from '../../../../common/lib/kibana'; import { DEFAULT_NUMBER_FORMAT } from '../../../../../common/constants'; import * as i18n from './translations'; import { DefaultDraggable } from '../../../../common/components/draggables'; -import type { GenericBuckets } from '../../../../../common'; +import type { GenericBuckets } from '../../../../../common/search_strategy'; import type { AlertSearchResponse } from '../../../containers/detection_engine/alerts/types'; import type { AlertsCountAggregation } from './types'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/types.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/types.ts index 06cdee581d3fd1..b541c7234f08e9 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/types.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_count_panel/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { GenericBuckets } from '../../../../../common'; +import type { GenericBuckets } from '../../../../../common/search_strategy'; export interface AlertsCountAggregation { alertsByGroupingCount: { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx index 9568f9c894e24d..a1684d6564a0a3 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.test.tsx @@ -7,7 +7,7 @@ import { mount } from 'enzyme'; import { AlertContextMenu } from './alert_context_menu'; -import { TimelineId } from '../../../../../common'; +import { TimelineId } from '../../../../../common/types'; import { TestProviders } from '../../../../common/mock'; import React from 'react'; import { Ecs } from '../../../../../common/ecs'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx index 7a6ff229fbcd99..c95006866194bb 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/alert_context_menu.tsx @@ -23,7 +23,7 @@ import { } from '../../../../common/components/exceptions/add_exception_modal'; import * as i18n from '../translations'; import { inputsModel, inputsSelectors, State } from '../../../../common/store'; -import { TimelineId } from '../../../../../common'; +import { TimelineId } from '../../../../../common/types'; import { AlertData, EcsHit } from '../../../../common/components/exceptions/types'; import { useQueryAlerts } from '../../../containers/detection_engine/alerts/use_query'; import { useSignalIndex } from '../../../containers/detection_engine/alerts/use_signal_index'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx index 21d0e132599fbd..db7ba367d0acee 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/investigate_in_resolver.tsx @@ -17,7 +17,7 @@ import { useGlobalFullScreen, useTimelineFullScreen, } from '../../../../common/containers/use_full_screen'; -import { TimelineId, TimelineTabs } from '../../../../../common'; +import { TimelineId, TimelineTabs } from '../../../../../common/types'; import { ACTION_INVESTIGATE_IN_RESOLVER } from '../../../../timelines/components/timeline/body/translations'; import { Ecs } from '../../../../../common/ecs'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx index 708c3c396d0d1f..cc0ef8d4e8b797 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/timeline_actions/use_add_to_case_actions.tsx @@ -7,7 +7,8 @@ import { useMemo } from 'react'; import { useGetUserCasesPermissions, useKibana } from '../../../../common/lib/kibana'; -import { TimelineId, TimelineNonEcsData } from '../../../../../common'; +import type { TimelineNonEcsData } from '../../../../../common/search_strategy'; +import { TimelineId } from '../../../../../common/types'; import { APP_ID, APP_UI_ID } from '../../../../../common/constants'; import { useInsertTimeline } from '../../../../cases/components/use_insert_timeline'; import { Ecs } from '../../../../../common/ecs'; diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/helpers.ts b/x-pack/plugins/security_solution/public/detections/components/host_isolation/helpers.ts index d0951172c21a9f..32fa616831dfb0 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/helpers.ts +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/helpers.ts @@ -6,7 +6,7 @@ */ import { find } from 'lodash/fp'; -import type { TimelineEventsDetailsItem } from '../../../../common'; +import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; export const getFieldValues = ( { diff --git a/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx b/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx index 4282a584ea9f33..a7c3cb900d7c9c 100644 --- a/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/host_isolation/use_host_isolation_action.tsx @@ -6,7 +6,7 @@ */ import React, { useCallback, useMemo } from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; -import type { TimelineEventsDetailsItem } from '../../../../common'; +import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { isIsolationSupported } from '../../../../common/endpoint/service/host_isolation/utils'; import { HostStatus } from '../../../../common/endpoint/types'; import { useIsolationPrivileges } from '../../../common/hooks/endpoint/use_isolate_privileges'; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/query_preview/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/query_preview/index.tsx index ca4fba4a908ff8..e7cc34ef49beff 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/query_preview/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/query_preview/index.tsx @@ -23,7 +23,7 @@ import { debounce } from 'lodash/fp'; import { Type } from '@kbn/securitysolution-io-ts-alerting-types'; import * as i18n from '../rule_preview/translations'; import { useMatrixHistogram } from '../../../../common/containers/matrix_histogram'; -import { MatrixHistogramType } from '../../../../../common'; +import { MatrixHistogramType } from '../../../../../common/search_strategy'; import { FieldValueQueryBar } from '../query_bar'; import { PreviewEqlQueryHistogram } from './eql_histogram'; import { useEqlPreview } from '../../../../common/hooks/eql/'; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_histogram.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_histogram.tsx index b7c415615f97a7..5d8a787929acf1 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_histogram.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview/use_preview_histogram.tsx @@ -6,7 +6,7 @@ */ import { useMemo } from 'react'; import { useMatrixHistogram } from '../../../../common/containers/matrix_histogram'; -import { MatrixHistogramType } from '../../../../../common'; +import { MatrixHistogramType } from '../../../../../common/search_strategy'; import { convertToBuildEsQuery } from '../../../../common/lib/keury'; import { getEsQueryConfig } from '../../../../../../../../src/plugins/data/common'; import { useKibana } from '../../../../common/lib/kibana'; diff --git a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx index a2f2ba331d9595..ab9d4a6344aecd 100644 --- a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.test.tsx @@ -11,7 +11,8 @@ import { waitFor } from '@testing-library/react'; import { TakeActionDropdown, TakeActionDropdownProps } from '.'; import { mockAlertDetailsData } from '../../../common/components/event_details/__mocks__'; import { mockEcsDataWithAlert } from '../../../common/mock/mock_detection_alerts'; -import { TimelineEventsDetailsItem, TimelineId } from '../../../../common'; +import type { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; +import { TimelineId } from '../../../../common/types'; import { TestProviders } from '../../../common/mock'; import { mockTimelines } from '../../../common/mock/mock_timelines_plugin'; import { createStartServicesMock } from '../../../common/lib/kibana/kibana_react.mock'; diff --git a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx index 84cca38014fde3..3a388104d926e2 100644 --- a/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/take_action_dropdown/index.tsx @@ -9,7 +9,7 @@ import React, { useState, useCallback, useMemo } from 'react'; import { EuiContextMenuPanel, EuiButton, EuiPopover } from '@elastic/eui'; import type { ExceptionListType } from '@kbn/securitysolution-io-ts-list-types'; import { isEmpty } from 'lodash/fp'; -import { TimelineEventsDetailsItem } from '../../../../common'; +import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { TAKE_ACTION } from '../alerts_table/alerts_utility_bar/translations'; import { useExceptionActions } from '../alerts_table/timeline_actions/use_add_exception_actions'; import { useAlertsActions } from '../alerts_table/timeline_actions/use_alerts_actions'; diff --git a/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/columns.ts b/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/columns.ts index 37199840ae3fbf..d3ba561bcd6990 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/columns.ts +++ b/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/columns.ts @@ -12,7 +12,7 @@ import { ALERT_STATUS, } from '@kbn/rule-data-utils/technical_field_names'; -import { ColumnHeaderOptions } from '../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../common/types'; import { defaultColumnHeaderType } from '../../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_DATE_COLUMN_MIN_WIDTH } from '../../../../timelines/components/timeline/body/constants'; diff --git a/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/render_cell_value.test.tsx b/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/render_cell_value.test.tsx index 685bc8f42b1d8b..95787629079fab 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/render_cell_value.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/configurations/examples/observablity_alerts/render_cell_value.test.tsx @@ -17,7 +17,7 @@ import { defaultHeaders, mockTimelineData, TestProviders } from '../../../../com import { TimelineNonEcsData } from '../../../../../common/search_strategy/timeline'; import { CellValueElementProps } from '../../../../timelines/components/timeline/cell_rendering'; import { DefaultCellRenderer } from '../../../../timelines/components/timeline/cell_rendering/default_cell_renderer'; -import { ColumnHeaderOptions } from '../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../common/types'; import { RenderCellValue } from '.'; diff --git a/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/columns.ts b/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/columns.ts index 45433a39d8b975..7ae54e60944ccb 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/columns.ts +++ b/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/columns.ts @@ -6,7 +6,7 @@ */ import { EuiDataGridColumn } from '@elastic/eui'; -import { ColumnHeaderOptions } from '../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../common/types'; import { defaultColumnHeaderType } from '../../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_DATE_COLUMN_MIN_WIDTH } from '../../../../timelines/components/timeline/body/constants'; diff --git a/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/render_cell_value.test.tsx b/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/render_cell_value.test.tsx index ccd71404a22161..f9dfc0625ac17d 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/render_cell_value.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/configurations/examples/security_solution_rac/render_cell_value.test.tsx @@ -17,7 +17,7 @@ import { CellValueElementProps } from '../../../../timelines/components/timeline import { DefaultCellRenderer } from '../../../../timelines/components/timeline/cell_rendering/default_cell_renderer'; import { RenderCellValue } from '.'; -import { ColumnHeaderOptions } from '../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../common/types'; jest.mock('../../../../common/lib/kibana/'); diff --git a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts index 72aba6e186fcbd..a9e5679c5b8310 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts +++ b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/columns.ts @@ -6,7 +6,7 @@ */ import { EuiDataGridColumn } from '@elastic/eui'; -import { ColumnHeaderOptions } from '../../../../common'; +import { ColumnHeaderOptions } from '../../../../common/types'; import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { diff --git a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx index a7def2a23ef1d8..6087553522eb88 100644 --- a/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/configurations/security_solution_detections/render_cell_value.test.tsx @@ -9,7 +9,7 @@ import { mount } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { ColumnHeaderOptions } from '../../../../common'; +import { ColumnHeaderOptions } from '../../../../common/types'; import { mockBrowserFields } from '../../../common/containers/source/mock'; import { DragDropContextWrapper } from '../../../common/components/drag_and_drop/drag_drop_context_wrapper'; import { defaultHeaders, mockTimelineData, TestProviders } from '../../../common/mock'; diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_risky_host_links/risky_hosts_enabled_module.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_risky_host_links/risky_hosts_enabled_module.tsx index 4db6f67acb265b..412c4a69ec2f5b 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_risky_host_links/risky_hosts_enabled_module.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_risky_host_links/risky_hosts_enabled_module.tsx @@ -11,7 +11,7 @@ import { LinkPanelListItem } from '../link_panel'; import { useRiskyHostsDashboardButtonHref } from '../../containers/overview_risky_host_links/use_risky_hosts_dashboard_button_href'; import { useRiskyHostsDashboardLinks } from '../../containers/overview_risky_host_links/use_risky_hosts_dashboard_links'; import { HostRisk } from '../../containers/overview_risky_host_links/use_hosts_risk_score'; -import { HostsRiskScore } from '../../../../common'; +import { HostsRiskScore } from '../../../../common/search_strategy'; const getListItemsFromHits = (items: HostsRiskScore[]): LinkPanelListItem[] => { return items.map(({ host, risk_score: count, risk: copy }) => ({ diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score.ts index 15cb7ef7b1c469..eb363f4f770676 100644 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score.ts +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score.ts @@ -13,7 +13,7 @@ import { useAppToasts } from '../../../common/hooks/use_app_toasts'; import { useKibana } from '../../../common/lib/kibana'; import { inputsActions } from '../../../common/store/actions'; import { isIndexNotFoundError } from '../../../common/utils/exceptions'; -import { HostsRiskScore } from '../../../../common'; +import { HostsRiskScore } from '../../../../common/search_strategy'; import { useHostsRiskScoreComplete } from './use_hosts_risk_score_complete'; import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_experimental_features'; import { getHostRiskIndex } from '../../../helpers'; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score_complete.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score_complete.ts index f925339e68490c..959fb94c5bbd79 100644 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score_complete.ts +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_risky_host_links/use_hosts_risk_score_complete.ts @@ -16,7 +16,7 @@ import { HostsQueries, HostsRiskScoreRequestOptions, HostsRiskScoreStrategyResponse, -} from '../../../../common'; +} from '../../../../common/search_strategy'; type GetHostsRiskScoreProps = HostsRiskScoreRequestOptions & { data: DataPublicPluginStart; diff --git a/x-pack/plugins/security_solution/public/timelines/components/create_field_button/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/create_field_button/index.test.tsx index 1708509b318644..59dcf350e9aba5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/create_field_button/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/create_field_button/index.test.tsx @@ -16,7 +16,7 @@ import { import { TestProviders } from '../../../common/mock'; import { useKibana } from '../../../common/lib/kibana'; import type { DataView } from '../../../../../../../src/plugins/data/common'; -import { TimelineId } from '../../../../common'; +import { TimelineId } from '../../../../common/types'; const useKibanaMock = useKibana as jest.Mocked; diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_items.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_items.tsx index 73fb7c19a6f46d..bb95c615d874ee 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_items.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_items.tsx @@ -17,7 +17,7 @@ import type { BrowserFields } from '../../../common/containers/source'; import { getColumnsWithTimestamp } from '../../../common/components/event_details/helpers'; import type { OnUpdateColumns } from '../timeline/events'; import { FieldName } from './field_name'; -import type { ColumnHeaderOptions } from '../../../../common'; +import type { ColumnHeaderOptions } from '../../../../common/types'; import { useKibana } from '../../../common/lib/kibana'; const DraggableFieldsBrowserFieldComponent = ({ diff --git a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx index e833b8411cd9f6..6e9672d08b3666 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/fields_browser/field_name.tsx @@ -11,7 +11,7 @@ import styled from 'styled-components'; import { OnUpdateColumns } from '../timeline/events'; import { WithHoverActions } from '../../../common/components/with_hover_actions'; -import { ColumnHeaderOptions } from '../../../../common'; +import { ColumnHeaderOptions } from '../../../../common/types'; import { HoverActions } from '../../../common/components/hover_actions'; import { TimelineContext } from '../../../../../timelines/public'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx index 7dc0a98461760b..f5086fd1a83da4 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/formatted_ip/index.test.tsx @@ -10,7 +10,7 @@ import { waitFor } from '@testing-library/react'; import { FormattedIp } from './index'; import { TestProviders } from '../../../common/mock'; -import { TimelineId, TimelineTabs } from '../../../../common'; +import { TimelineId, TimelineTabs } from '../../../../common/types'; import { StatefulEventContext } from '../../../../../timelines/public'; import { timelineActions } from '../../store/timeline'; import { activeTimeline } from '../../containers/active_timeline_context'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.tsx index 50fe19f4d804aa..70f3e7004fb8eb 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/footer.tsx @@ -10,7 +10,8 @@ import { EuiFlyoutFooter, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { find, get, isEmpty } from 'lodash/fp'; import { connect, ConnectedProps } from 'react-redux'; import { TakeActionDropdown } from '../../../../detections/components/take_action_dropdown'; -import { TimelineEventsDetailsItem, TimelineId } from '../../../../../common'; +import type { TimelineEventsDetailsItem } from '../../../../../common/search_strategy'; +import { TimelineId } from '../../../../../common/types'; import { useExceptionModal } from '../../../../detections/components/alerts_table/timeline_actions/use_add_exception_modal'; import { AddExceptionModalWrapper } from '../../../../detections/components/alerts_table/timeline_actions/alert_context_menu'; import { EventFiltersFlyout } from '../../../../management/pages/event_filters/view/components/flyout'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx index 947786695ded3a..224662f0fd6ab5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/event_details/index.tsx @@ -31,7 +31,7 @@ import { import { getFieldValue } from '../../../../detections/components/host_isolation/helpers'; import { ALERT_DETAILS } from './translations'; import { useWithCaseDetailsRefresh } from '../../../../common/components/endpoint/host_isolation/endpoint_host_isolation_cases_context'; -import { TimelineNonEcsData } from '../../../../../common'; +import { TimelineNonEcsData } from '../../../../../common/search_strategy'; import { Ecs } from '../../../../../common/ecs'; import { EventDetailsFooter } from './footer'; import { EntityType } from '../../../../../../timelines/common'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/actions/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/actions/index.tsx index 8795255dfcfd4d..1306509a87a54b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/actions/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/actions/index.tsx @@ -8,7 +8,7 @@ import { EuiButtonIcon } from '@elastic/eui'; import React, { useCallback } from 'react'; -import { ColumnHeaderOptions } from '../../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../../common/types'; import { OnColumnRemoved } from '../../../events'; import { EventsHeadingExtra, EventsLoading } from '../../../styles'; import { Sort } from '../../sort'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/default_headers.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/default_headers.ts index 7eb98b74759523..58e8d1869233f5 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/default_headers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/default_headers.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ColumnHeaderOptions } from '../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../common/types'; import { ColumnHeaderType } from '../../../../store/timeline/model'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH } from '../constants'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/filter/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/filter/index.tsx index 828b8d8701188b..b897fef57f0760 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/filter/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/filter/index.tsx @@ -8,7 +8,7 @@ import { noop } from 'lodash/fp'; import React from 'react'; -import { ColumnHeaderOptions } from '../../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../../common/types'; import { DEFAULT_COLUMN_MIN_WIDTH } from '../../constants'; import { OnFilterChange } from '../../../events'; import { TextFilter } from '../text_filter'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.tsx index 18b407a035708d..166a4c2da871c7 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header/index.tsx @@ -10,7 +10,7 @@ import React, { useCallback, useMemo } from 'react'; import { useDispatch } from 'react-redux'; import { isDataViewFieldSubtypeNested } from '@kbn/es-query'; -import { ColumnHeaderOptions } from '../../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../../common/types'; import { useDeepEqualSelector, useShallowEqualSelector, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx index b33e47dd27b965..8f64b4e7e6db3d 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx @@ -9,7 +9,7 @@ import { mount, shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { ColumnHeaderOptions } from '../../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../../common/types'; import { defaultHeaders } from '../../../../../../common/mock'; import { HeaderToolTipContent } from '.'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx index 017ba82e8e33c5..4be37de54b3651 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx @@ -10,7 +10,7 @@ import { isEmpty } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { ColumnHeaderOptions } from '../../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../../common/types'; import { getIconFromType } from '../../../../../../common/components/event_details/helpers'; import * as i18n from '../translations'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.ts index 60118b1e55e589..b1ea4899615a6c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/column_headers/helpers.ts @@ -6,7 +6,7 @@ */ import { get } from 'lodash/fp'; -import { ColumnHeaderOptions } from '../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../common/types'; import { BrowserFields } from '../../../../../common/containers/source'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH } from '../constants'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx index 7124a3de968ba4..d71dfcae1b4e6c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/events/stateful_row_renderer/index.tsx @@ -14,7 +14,7 @@ import { ARIA_ROWINDEX_ATTRIBUTE, getRowRendererClassName, } from '../../../../../../../../timelines/public'; -import { RowRenderer } from '../../../../../../../common'; +import { RowRenderer } from '../../../../../../../common/types'; import { BrowserFields } from '../../../../../../common/containers/source'; import { TimelineItem } from '../../../../../../../common/search_strategy/timeline'; import { getRowRenderer } from '../../renderers/get_row_renderer'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx index 79836b0ac1e4e6..dcfb0efc11455c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx @@ -9,7 +9,7 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { RowRenderer } from '../../../../../../../common'; +import { RowRenderer } from '../../../../../../../common/types'; import { BrowserFields } from '../../../../../../common/containers/source'; import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; import { Ecs } from '../../../../../../../common/ecs'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/column_renderer.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/column_renderer.ts index d05386c2504c5a..9dd17ee9ffed96 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/column_renderer.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/column_renderer.ts @@ -9,7 +9,7 @@ import type React from 'react'; import type { Filter } from '@kbn/es-query'; import { BrowserFields } from '../../../../../../../timelines/common/search_strategy'; -import { ColumnHeaderOptions, RowRenderer } from '../../../../../../common'; +import { ColumnHeaderOptions, RowRenderer } from '../../../../../../common/types'; import { Ecs } from '../../../../../../common/ecs'; import { TimelineNonEcsData } from '../../../../../../common/search_strategy/timeline'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/cti/threat_match_rows.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/cti/threat_match_rows.tsx index 8de9692a116fa3..cc4d3eeee25332 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/cti/threat_match_rows.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/cti/threat_match_rows.tsx @@ -11,7 +11,7 @@ import React, { Fragment } from 'react'; import styled from 'styled-components'; import { ENRICHMENT_DESTINATION_PATH } from '../../../../../../../common/constants'; -import { RowRenderer } from '../../../../../../../common'; +import { RowRenderer } from '../../../../../../../common/types'; import { Fields } from '../../../../../../../common/search_strategy'; import { ID_FIELD_NAME } from '../../../../../../common/components/event_details/event_id'; import { RowRendererContainer } from '../row_renderer'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx index a3a6618e7d07a6..334bfa76b84e13 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { ColumnHeaderOptions } from '../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../common/types'; import { TimelineNonEcsData } from '../../../../../../common/search_strategy/timeline'; import { DraggableWrapper, diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts index 2d1be6ee7914ad..cb6ea7760842ba 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/get_row_renderer.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { RowRenderer } from '../../../../../../common'; +import { RowRenderer } from '../../../../../../common/types'; import { Ecs } from '../../../../../../common/ecs'; export const getRowRenderer = (ecs: Ecs, rowRenderers: RowRenderer[]): RowRenderer | null => diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx index 1bbfc837ebd62c..bf92417c8023a1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/host_name.test.tsx @@ -10,7 +10,7 @@ import { waitFor } from '@testing-library/react'; import { HostName } from './host_name'; import { TestProviders } from '../../../../../common/mock'; -import { TimelineId, TimelineTabs } from '../../../../../../common'; +import { TimelineId, TimelineTabs } from '../../../../../../common/types'; import { StatefulEventContext } from '../../../../../../../timelines/public'; import { timelineActions } from '../../../../store/timeline'; import { activeTimeline } from '../../../../containers/active_timeline_context'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts index 11c501f9426f40..9a68a8b658149c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { RowRenderer } from '../../../../../../common'; +import { RowRenderer } from '../../../../../../common/types'; import { auditdRowRenderers } from './auditd/generic_row_renderer'; import { ColumnRenderer } from './column_renderer'; import { emptyColumnRenderer } from './empty_column_renderer'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx index f00eb332c564bb..35e8647bc413df 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx @@ -9,7 +9,7 @@ import { head } from 'lodash/fp'; import React from 'react'; import type { Filter } from '@kbn/es-query'; -import { ColumnHeaderOptions } from '../../../../../../common'; +import { ColumnHeaderOptions } from '../../../../../../common/types'; import { TimelineNonEcsData } from '../../../../../../common/search_strategy/timeline'; import { getEmptyTagValue } from '../../../../../common/components/empty_value'; import { ColumnRenderer } from './column_renderer'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.test.tsx index 8fdd6483a14f88..f71db57c1b42a2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.test.tsx @@ -13,12 +13,9 @@ import { REASON_FIELD_NAME } from './constants'; import { reasonColumnRenderer } from './reason_column_renderer'; import { plainColumnRenderer } from './plain_column_renderer'; -import { - BrowserFields, - ColumnHeaderOptions, - RowRenderer, - RowRendererId, -} from '../../../../../../common'; +import { RowRendererId, ColumnHeaderOptions, RowRenderer } from '../../../../../../common/types'; +import { BrowserFields } from '../../../../../../common/search_strategy'; + import { render } from '@testing-library/react'; import { TestProviders } from '../../../../../../../timelines/public/mock'; import { useDraggableKeyboardWrapper as mockUseDraggableKeyboardWrapper } from '../../../../../../../timelines/public/components'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.tsx index b3f145beb886b0..a5ba7360c966f9 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/reason_column_renderer.tsx @@ -9,7 +9,8 @@ import { EuiSpacer, EuiPanel } from '@elastic/eui'; import { isEqual } from 'lodash/fp'; import React, { useMemo } from 'react'; -import { BrowserFields, ColumnHeaderOptions, RowRenderer } from '../../../../../../common'; +import { ColumnHeaderOptions, RowRenderer } from '../../../../../../common/types'; +import { BrowserFields } from '../../../../../../common/search_strategy'; import { Ecs } from '../../../../../../common/ecs'; import { eventRendererNames } from '../../../row_renderers_browser/catalog/constants'; import { ColumnRenderer } from './column_renderer'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx index 983ee00ef9b6bb..ae2caa8ce84011 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx @@ -81,7 +81,7 @@ import { EndpointAlertCriteria, } from './generic_row_renderer'; import * as i18n from './translations'; -import { RowRenderer } from '../../../../../../../common'; +import { RowRenderer } from '../../../../../../../common/types'; jest.mock('../../../../../../common/lib/kibana'); diff --git a/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/columns.tsx b/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/columns.tsx index 456a0bbe898ea8..1393f11189ccac 100644 --- a/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/columns.tsx +++ b/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/columns.tsx @@ -17,7 +17,7 @@ import { Provider } from '../../../timelines/components/timeline/data_providers/ import { HostRulesColumns } from './'; import * as i18n from './translations'; -import { HostRulesFields } from '../../../../common'; +import { HostRulesFields } from '../../../../common/search_strategy'; export const getHostRulesColumns = (): HostRulesColumns => [ { diff --git a/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/index.tsx b/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/index.tsx index 3d369a56a7bc0c..540ad05d1da8b0 100644 --- a/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/components/host_rules_table/index.tsx @@ -18,13 +18,12 @@ import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; import { uebaActions, uebaModel, uebaSelectors } from '../../store'; import { getHostRulesColumns } from './columns'; import * as i18n from './translations'; -import { +import type { HostRulesEdges, HostRulesItem, HostRulesSortField, - HostRulesFields, -} from '../../../../common'; -import { Direction } from '../../../../common/search_strategy'; +} from '../../../../common/search_strategy'; +import { Direction, HostRulesFields } from '../../../../common/search_strategy'; import { HOST_RULES } from '../../pages/translations'; import { rowItems } from '../utils'; diff --git a/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/columns.tsx b/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/columns.tsx index 68e1195a9c7ebd..0f635cc8cd198b 100644 --- a/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/columns.tsx +++ b/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/columns.tsx @@ -17,7 +17,7 @@ import { Provider } from '../../../timelines/components/timeline/data_providers/ import { HostTacticsColumns } from './'; import * as i18n from './translations'; -import { HostTacticsFields } from '../../../../common'; +import { HostTacticsFields } from '../../../../common/search_strategy'; export const getHostTacticsColumns = (): HostTacticsColumns => [ { diff --git a/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/index.tsx b/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/index.tsx index 28bd3d6ad43a08..8b5d9bbd656357 100644 --- a/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/components/host_tactics_table/index.tsx @@ -23,8 +23,8 @@ import { HostTacticsItem, HostTacticsSortField, HostTacticsFields, -} from '../../../../common'; -import { Direction } from '../../../../common/search_strategy'; + Direction, +} from '../../../../common/search_strategy'; import { HOST_TACTICS } from '../../pages/translations'; import { rowItems } from '../utils'; diff --git a/x-pack/plugins/security_solution/public/ueba/components/risk_score_table/index.tsx b/x-pack/plugins/security_solution/public/ueba/components/risk_score_table/index.tsx index 9e9c6f81a43bb2..516068d40eb0e3 100644 --- a/x-pack/plugins/security_solution/public/ueba/components/risk_score_table/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/components/risk_score_table/index.tsx @@ -18,13 +18,12 @@ import { useDeepEqualSelector } from '../../../common/hooks/use_selector'; import { uebaActions, uebaModel, uebaSelectors } from '../../store'; import { getRiskScoreColumns } from './columns'; import * as i18n from './translations'; -import { +import type { RiskScoreEdges, RiskScoreItem, RiskScoreSortField, - RiskScoreFields, -} from '../../../../common'; -import { Direction } from '../../../../common/search_strategy'; +} from '../../../../common/search_strategy'; +import { RiskScoreFields, Direction } from '../../../../common/search_strategy'; import { rowItems } from '../utils'; const tableType = uebaModel.UebaTableType.riskScore; diff --git a/x-pack/plugins/security_solution/public/ueba/containers/host_rules/index.tsx b/x-pack/plugins/security_solution/public/ueba/containers/host_rules/index.tsx index 7db1a77244bbeb..7771d470b15567 100644 --- a/x-pack/plugins/security_solution/public/ueba/containers/host_rules/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/containers/host_rules/index.tsx @@ -23,7 +23,7 @@ import { UebaQueries, HostRulesRequestOptions, HostRulesStrategyResponse, -} from '../../../../common'; +} from '../../../../common/search_strategy'; import { ESTermQuery } from '../../../../common/typed_json'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/ueba/containers/host_tactics/index.tsx b/x-pack/plugins/security_solution/public/ueba/containers/host_tactics/index.tsx index 35dd2a0b08d4e8..42f5707bae6e3b 100644 --- a/x-pack/plugins/security_solution/public/ueba/containers/host_tactics/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/containers/host_tactics/index.tsx @@ -23,7 +23,7 @@ import { UebaQueries, HostTacticsRequestOptions, HostTacticsStrategyResponse, -} from '../../../../common'; +} from '../../../../common/search_strategy'; import { ESTermQuery } from '../../../../common/typed_json'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/ueba/containers/risk_score/index.tsx b/x-pack/plugins/security_solution/public/ueba/containers/risk_score/index.tsx index f2f353ffc0cffe..cc27c614f5897e 100644 --- a/x-pack/plugins/security_solution/public/ueba/containers/risk_score/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/containers/risk_score/index.tsx @@ -23,7 +23,7 @@ import { UebaQueries, RiskScoreRequestOptions, RiskScoreStrategyResponse, -} from '../../../../common'; +} from '../../../../common/search_strategy'; import { ESTermQuery } from '../../../../common/typed_json'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/ueba/containers/user_rules/index.tsx b/x-pack/plugins/security_solution/public/ueba/containers/user_rules/index.tsx index 3c4e45bd3a1e54..21376d82eb17af 100644 --- a/x-pack/plugins/security_solution/public/ueba/containers/user_rules/index.tsx +++ b/x-pack/plugins/security_solution/public/ueba/containers/user_rules/index.tsx @@ -22,7 +22,7 @@ import { UserRulesRequestOptions, UserRulesStrategyResponse, UserRulesStrategyUserResponse, -} from '../../../../common'; +} from '../../../../common/search_strategy'; import { ESTermQuery } from '../../../../common/typed_json'; import * as i18n from './translations'; diff --git a/x-pack/plugins/security_solution/public/ueba/pages/navigation/user_rules_query_tab_body.tsx b/x-pack/plugins/security_solution/public/ueba/pages/navigation/user_rules_query_tab_body.tsx index f7542b7b4b8a63..684b5cc12eaf97 100644 --- a/x-pack/plugins/security_solution/public/ueba/pages/navigation/user_rules_query_tab_body.tsx +++ b/x-pack/plugins/security_solution/public/ueba/pages/navigation/user_rules_query_tab_body.tsx @@ -13,7 +13,7 @@ import { HostQueryProps } from './types'; import { manageQuery } from '../../../common/components/page/manage_query'; import { HostRulesTable } from '../../components/host_rules_table'; import { uebaModel } from '../../store'; -import { UserRulesFields } from '../../../../common'; +import { UserRulesFields } from '../../../../common/search_strategy'; const UserRulesTableManage = manageQuery(HostRulesTable); diff --git a/x-pack/plugins/security_solution/public/ueba/pages/ueba.tsx b/x-pack/plugins/security_solution/public/ueba/pages/ueba.tsx index 0c837e60cd2dc2..c553052b353198 100644 --- a/x-pack/plugins/security_solution/public/ueba/pages/ueba.tsx +++ b/x-pack/plugins/security_solution/public/ueba/pages/ueba.tsx @@ -21,7 +21,7 @@ import { SiemSearchBar } from '../../common/components/search_bar'; import { SecuritySolutionPageWrapper } from '../../common/components/page_wrapper'; import { useGlobalFullScreen } from '../../common/containers/use_full_screen'; import { useGlobalTime } from '../../common/containers/use_global_time'; -import { TimelineId } from '../../../common'; +import { TimelineId } from '../../../common/types'; import { LastEventIndexKey } from '../../../common/search_strategy'; import { useKibana } from '../../common/lib/kibana'; import { convertToBuildEsQuery } from '../../common/lib/keury'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/get_strategy.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/get_strategy.ts index 3c4b1cd0ef373e..15164842fe0d69 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/get_strategy.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/source_fields_merging/strategies/get_strategy.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { assertUnreachable } from '../../../../../../common'; +import { assertUnreachable } from '../../../../../../common/utility_types'; import type { ConfigType } from '../../../../../config'; import { MergeStrategyFunction } from '../types'; import { mergeAllFieldsWithSource } from './merge_all_fields_with_source'; diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.test.ts index 1d4d9b1e0f2eaa..18dcdfe103b1ff 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/create_timelines/helpers.test.ts @@ -9,7 +9,7 @@ import * as module from './helpers'; import { savePinnedEvents } from '../../../saved_object/pinned_events'; import { getNote } from '../../../saved_object/notes'; import { FrameworkRequest } from '../../../../framework'; -import { SavedTimeline } from '../../../../../../common'; +import { SavedTimeline } from '../../../../../../common/types'; import { mockTemplate, mockTimeline } from '../../../__mocks__/create_timelines'; import { buildFrameworkRequest } from '../../../utils/common'; import { SecurityPluginSetup } from '../../../../../../../security/server'; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/index.ts index a609a8b356f10c..94504afcc6c026 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/index.ts @@ -10,7 +10,7 @@ import { HostsRiskScoreRequestOptions, HostsQueries, HostsRiskScoreStrategyResponse, -} from '../../../../../../common'; +} from '../../../../../../common/search_strategy'; import type { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; import { inspectStringifyObject } from '../../../../../utils/build_query'; import { buildHostsRiskScoreQuery } from './query.hosts_risk.dsl'; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/query.hosts_risk.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/query.hosts_risk.dsl.ts index 5bbc9b7726002c..05bb496a7444e1 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/query.hosts_risk.dsl.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/hosts/risk_score/query.hosts_risk.dsl.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { HostsRiskScoreRequestOptions } from '../../../../../../common'; +import { HostsRiskScoreRequestOptions } from '../../../../../../common/search_strategy'; export const buildHostsRiskScoreQuery = ({ timerange, diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/alerts/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/alerts/index.ts index b97b8ed4f65498..59985a927aa8f3 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/alerts/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/alerts/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MatrixHistogramTypeToAggName } from '../../../../../../common'; +import { MatrixHistogramTypeToAggName } from '../../../../../../common/search_strategy'; import { buildAlertsHistogramQuery } from './query.alerts_histogram.dsl'; export const alertsMatrixHistogramConfig = { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/anomalies/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/anomalies/index.ts index ec307173ec20c7..c7e67566acfc2a 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/anomalies/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/anomalies/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MatrixHistogramTypeToAggName } from '../../../../../../common'; +import { MatrixHistogramTypeToAggName } from '../../../../../../common/search_strategy'; import { buildAnomaliesHistogramQuery } from './query.anomalies_histogram.dsl'; export const anomaliesMatrixHistogramConfig = { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/authentications/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/authentications/index.ts index 17f7d78167232c..bde058942f2bb2 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/authentications/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/authentications/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MatrixHistogramTypeToAggName } from '../../../../../../common'; +import { MatrixHistogramTypeToAggName } from '../../../../../../common/search_strategy'; import { getEntitiesParser } from '../helpers'; import { buildAuthenticationsHistogramQuery } from './query.authentications_histogram.dsl'; import { buildAuthenticationsHistogramQueryEntities } from './query.authentications_histogram_entities.dsl'; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/dns/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/dns/index.ts index 643b3f657ef0ca..f52a760db842e6 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/dns/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/dns/index.ts @@ -7,7 +7,7 @@ import { buildDnsHistogramQuery } from './query.dns_histogram.dsl'; import { getDnsParsedData } from './helpers'; -import { MatrixHistogramTypeToAggName } from '../../../../../../common'; +import { MatrixHistogramTypeToAggName } from '../../../../../../common/search_strategy'; export const dnsMatrixHistogramConfig = { buildDsl: buildDnsHistogramQuery, diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/events/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/events/index.ts index a280950c37cd62..954cd6509e2b01 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/events/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/events/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MatrixHistogramTypeToAggName } from '../../../../../../common'; +import { MatrixHistogramTypeToAggName } from '../../../../../../common/search_strategy'; import { buildEventsHistogramQuery } from './query.events_histogram.dsl'; export const eventsMatrixHistogramConfig = { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/__mocks__/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/__mocks__/index.ts index 2ff4831616ab91..12d46c4be22823 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/__mocks__/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MatrixHistogramType } from '../../../../../../../common'; +import { MatrixHistogramType } from '../../../../../../../common/search_strategy'; export const mockOptions = { defaultIndex: ['.siem-preview-signals-default'], diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/index.ts index 51e45035f420df..0ca14c5489c563 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/matrix_histogram/preview/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { MatrixHistogramTypeToAggName } from '../../../../../../common'; +import { MatrixHistogramTypeToAggName } from '../../../../../../common/search_strategy'; import { buildPreviewHistogramQuery } from './query.preview_histogram.dsl'; export const previewMatrixHistogramConfig = { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/helpers.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/helpers.ts index f9c94eea3ff298..8b8f6ec204e988 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/helpers.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/helpers.ts @@ -6,7 +6,11 @@ */ import { getOr } from 'lodash/fp'; -import { HostRulesHit, HostRulesEdges, HostRulesFields } from '../../../../../../common'; +import { + HostRulesHit, + HostRulesEdges, + HostRulesFields, +} from '../../../../../../common/search_strategy'; export const formatHostRulesData = (buckets: HostRulesHit[]): HostRulesEdges[] => buckets.map((bucket) => ({ diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/index.ts index 78a1cfe20d2120..fb1416070ddc0f 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_rules/index.ts @@ -12,7 +12,7 @@ import { HostRulesRequestOptions, HostRulesStrategyResponse, UebaQueries, -} from '../../../../../../common'; +} from '../../../../../../common/search_strategy'; import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../../../common/constants'; import { buildHostRulesQuery } from './query.host_rules.dsl'; import type { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/helpers.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/helpers.ts index b20cf4582c8245..6e8a9e0f43b2fa 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/helpers.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/helpers.ts @@ -11,7 +11,7 @@ import { HostTacticsEdges, HostTacticsFields, HostTechniqueHit, -} from '../../../../../../common'; +} from '../../../../../../common/search_strategy'; export const formatHostTacticsData = (buckets: HostTacticsHit[]): HostTacticsEdges[] => buckets.reduce((acc: HostTacticsEdges[], bucket) => { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/index.ts index c90ad5a3117905..86d6bc6f75b6f5 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/host_tactics/index.ts @@ -8,11 +8,11 @@ import { getOr } from 'lodash/fp'; import { SecuritySolutionFactory } from '../../types'; import { + UebaQueries, HostTacticsEdges, HostTacticsRequestOptions, HostTacticsStrategyResponse, - UebaQueries, -} from '../../../../../../common'; +} from '../../../../../../common/search_strategy'; import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../../../common/constants'; import { buildHostTacticsQuery } from './query.host_tactics.dsl'; import type { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/helpers.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/helpers.ts index ace2faf819877c..4ef866f2fd7056 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/helpers.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/helpers.ts @@ -6,7 +6,7 @@ */ import { getOr } from 'lodash/fp'; -import { RiskScoreHit, RiskScoreEdges } from '../../../../../../common'; +import { RiskScoreHit, RiskScoreEdges } from '../../../../../../common/search_strategy'; export const formatRiskScoreData = (buckets: RiskScoreHit[]): RiskScoreEdges[] => buckets.map((bucket) => ({ diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/index.ts index 8e65b53c3e68d9..cc55d838284265 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/risk_score/index.ts @@ -8,11 +8,11 @@ import { getOr } from 'lodash/fp'; import { SecuritySolutionFactory } from '../../types'; import { + UebaQueries, RiskScoreEdges, RiskScoreRequestOptions, RiskScoreStrategyResponse, - UebaQueries, -} from '../../../../../../common'; +} from '../../../../../../common/search_strategy'; import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../../../common/constants'; import { buildRiskScoreQuery } from './query.risk_score.dsl'; import type { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/helpers.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/helpers.ts index c0f38af37c1f54..02b284e6bd2004 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/helpers.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/helpers.ts @@ -6,7 +6,11 @@ */ import { getOr } from 'lodash/fp'; -import { UserRulesHit, UserRulesFields, UserRulesByUser } from '../../../../../../common'; +import { + UserRulesHit, + UserRulesFields, + UserRulesByUser, +} from '../../../../../../common/search_strategy'; import { formatHostRulesData } from '../host_rules/helpers'; export const formatUserRulesData = (buckets: UserRulesHit[]): UserRulesByUser[] => diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/index.ts index 8a5099618d1093..872aa546d6553d 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/ueba/user_rules/index.ts @@ -14,7 +14,7 @@ import { UserRulesRequestOptions, UserRulesStrategyResponse, UsersRulesHit, -} from '../../../../../../common'; +} from '../../../../../../common/search_strategy'; import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../../../common/constants'; import { buildUserRulesQuery } from './query.user_rules.dsl'; import type { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; diff --git a/x-pack/test/common/services/security_solution/roles_users_utils.ts b/x-pack/test/common/services/security_solution/roles_users_utils.ts index dd184c6a94b463..681e710aa896c6 100644 --- a/x-pack/test/common/services/security_solution/roles_users_utils.ts +++ b/x-pack/test/common/services/security_solution/roles_users_utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { assertUnreachable } from '../../../../plugins/security_solution/common'; +import { assertUnreachable } from '../../../../plugins/security_solution/common/utility_types'; import { FtrProviderContext } from '../../ftr_provider_context'; import { t1AnalystUser, From 2ef888f3e3636f06a126804619344b44846ac96e Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Thu, 2 Dec 2021 14:19:09 -0500 Subject: [PATCH 072/126] [Security Solution][Endpoint] Remove (don't register) Endpoint Trusted Apps specific APIs (#120134) * change trusted apps data loader script to use exceptions API * Comment out registration of Trusted Apps API routes --- .../scripts/endpoint/trusted_apps/index.ts | 49 ++++- .../endpoint/routes/trusted_apps/index.ts | 173 +++++++++--------- 2 files changed, 127 insertions(+), 95 deletions(-) diff --git a/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts b/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts index 97695ec60062c2..ad0f9cb5dae494 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts @@ -11,7 +11,14 @@ import { KbnClient } from '@kbn/test'; import pMap from 'p-map'; import { basename } from 'path'; import { AxiosResponse } from 'axios'; -import { TRUSTED_APPS_CREATE_API, TRUSTED_APPS_LIST_API } from '../../../common/endpoint/constants'; +import { + ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION, + ENDPOINT_TRUSTED_APPS_LIST_ID, + ENDPOINT_TRUSTED_APPS_LIST_NAME, + EXCEPTION_LIST_ITEM_URL, + EXCEPTION_LIST_URL, +} from '@kbn/securitysolution-list-constants'; +import { CreateExceptionListSchema } from '@kbn/securitysolution-io-ts-list-types'; import { TrustedApp } from '../../../common/endpoint/types'; import { TrustedAppGenerator } from '../../../common/endpoint/data_generators/trusted_app_generator'; import { indexFleetEndpointPolicy } from '../../../common/endpoint/data_loaders/index_fleet_endpoint_policy'; @@ -21,6 +28,7 @@ import { PACKAGE_POLICY_API_ROUTES, PACKAGE_POLICY_SAVED_OBJECT_TYPE, } from '../../../../fleet/common'; +import { newTrustedAppToCreateExceptionListItem } from '../../../public/management/pages/trusted_apps/service/mappers'; const defaultLogger = new ToolingLog({ level: 'info', writeTo: process.stdout }); const separator = '----------------------------------------'; @@ -76,17 +84,14 @@ export const run: (options?: RunOptions) => Promise = async ({ url: kibana, }); - // touch the Trusted Apps List so it can be created - // and // setup fleet with endpoint integrations + // and + // and ensure the trusted apps list is created logger.info('setting up Fleet with endpoint and creating trusted apps list'); const [installedEndpointPackage] = await Promise.all([ setupFleetForEndpoint(kbnClient).then((response) => response.endpointPackage), - kbnClient.request({ - method: 'GET', - path: TRUSTED_APPS_LIST_API, - }), + ensureCreateEndpointTrustedAppsList(kbnClient), ]); // Setup a list of real endpoint policies and return a method to randomly select one @@ -125,8 +130,8 @@ export const run: (options?: RunOptions) => Promise = async ({ return kbnClient .request({ method: 'POST', - path: TRUSTED_APPS_CREATE_API, - body, + path: EXCEPTION_LIST_ITEM_URL, + body: newTrustedAppToCreateExceptionListItem(body), }) .then(({ data }) => { logger.write(data.id); @@ -176,3 +181,29 @@ const fetchEndpointPolicies = ( }, }); }; + +const ensureCreateEndpointTrustedAppsList = async (kbn: KbnClient) => { + const newListDefinition: CreateExceptionListSchema = { + description: ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION, + list_id: ENDPOINT_TRUSTED_APPS_LIST_ID, + meta: undefined, + name: ENDPOINT_TRUSTED_APPS_LIST_NAME, + os_types: [], + tags: [], + type: 'endpoint', + namespace_type: 'agnostic', + }; + + await kbn + .request({ + method: 'POST', + path: EXCEPTION_LIST_URL, + body: newListDefinition, + }) + .catch((e) => { + // Ignore if list was already created + if (e.response.status !== 409) { + throw e; + } + }); +}; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/trusted_apps/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/trusted_apps/index.ts index 1d5df9c6e88b8b..d00e1fc555b17f 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/trusted_apps/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/trusted_apps/index.ts @@ -5,95 +5,96 @@ * 2.0. */ -import { - DeleteTrustedAppsRequestSchema, - GetOneTrustedAppRequestSchema, - GetTrustedAppsRequestSchema, - PostTrustedAppCreateRequestSchema, - PutTrustedAppUpdateRequestSchema, - GetTrustedAppsSummaryRequestSchema, -} from '../../../../common/endpoint/schema/trusted_apps'; -import { - TRUSTED_APPS_CREATE_API, - TRUSTED_APPS_DELETE_API, - TRUSTED_APPS_GET_API, - TRUSTED_APPS_LIST_API, - TRUSTED_APPS_UPDATE_API, - TRUSTED_APPS_SUMMARY_API, -} from '../../../../common/endpoint/constants'; - -import { - getTrustedAppsCreateRouteHandler, - getTrustedAppsDeleteRouteHandler, - getTrustedAppsGetOneHandler, - getTrustedAppsListRouteHandler, - getTrustedAppsSummaryRouteHandler, - getTrustedAppsUpdateRouteHandler, -} from './handlers'; +// import { +// DeleteTrustedAppsRequestSchema, +// GetOneTrustedAppRequestSchema, +// GetTrustedAppsRequestSchema, +// PostTrustedAppCreateRequestSchema, +// PutTrustedAppUpdateRequestSchema, +// GetTrustedAppsSummaryRequestSchema, +// } from '../../../../common/endpoint/schema/trusted_apps'; +// import { +// TRUSTED_APPS_CREATE_API, +// TRUSTED_APPS_DELETE_API, +// TRUSTED_APPS_GET_API, +// TRUSTED_APPS_LIST_API, +// TRUSTED_APPS_UPDATE_API, +// TRUSTED_APPS_SUMMARY_API, +// } from '../../../../common/endpoint/constants'; +// +// import { +// getTrustedAppsCreateRouteHandler, +// getTrustedAppsDeleteRouteHandler, +// getTrustedAppsGetOneHandler, +// getTrustedAppsListRouteHandler, +// getTrustedAppsSummaryRouteHandler, +// getTrustedAppsUpdateRouteHandler, +// } from './handlers'; import { SecuritySolutionPluginRouter } from '../../../types'; import { EndpointAppContext } from '../../types'; export const registerTrustedAppsRoutes = ( - router: SecuritySolutionPluginRouter, - endpointAppContext: EndpointAppContext + _router: SecuritySolutionPluginRouter, + _endpointAppContext: EndpointAppContext ) => { - // DELETE one - router.delete( - { - path: TRUSTED_APPS_DELETE_API, - validate: DeleteTrustedAppsRequestSchema, - options: { authRequired: true }, - }, - getTrustedAppsDeleteRouteHandler(endpointAppContext) - ); - - // GET one - router.get( - { - path: TRUSTED_APPS_GET_API, - validate: GetOneTrustedAppRequestSchema, - options: { authRequired: true }, - }, - getTrustedAppsGetOneHandler(endpointAppContext) - ); - - // GET list - router.get( - { - path: TRUSTED_APPS_LIST_API, - validate: GetTrustedAppsRequestSchema, - options: { authRequired: true }, - }, - getTrustedAppsListRouteHandler(endpointAppContext) - ); - - // CREATE - router.post( - { - path: TRUSTED_APPS_CREATE_API, - validate: PostTrustedAppCreateRequestSchema, - options: { authRequired: true }, - }, - getTrustedAppsCreateRouteHandler(endpointAppContext) - ); - - // PUT - router.put( - { - path: TRUSTED_APPS_UPDATE_API, - validate: PutTrustedAppUpdateRequestSchema, - options: { authRequired: true }, - }, - getTrustedAppsUpdateRouteHandler(endpointAppContext) - ); - - // SUMMARY - router.get( - { - path: TRUSTED_APPS_SUMMARY_API, - validate: GetTrustedAppsSummaryRequestSchema, - options: { authRequired: true }, - }, - getTrustedAppsSummaryRouteHandler(endpointAppContext) - ); + // FIXME: DELETE all trusted apps api related modules (#2148) + // // DELETE one + // router.delete( + // { + // path: TRUSTED_APPS_DELETE_API, + // validate: DeleteTrustedAppsRequestSchema, + // options: { authRequired: true }, + // }, + // getTrustedAppsDeleteRouteHandler(endpointAppContext) + // ); + // + // // GET one + // router.get( + // { + // path: TRUSTED_APPS_GET_API, + // validate: GetOneTrustedAppRequestSchema, + // options: { authRequired: true }, + // }, + // getTrustedAppsGetOneHandler(endpointAppContext) + // ); + // + // // GET list + // router.get( + // { + // path: TRUSTED_APPS_LIST_API, + // validate: GetTrustedAppsRequestSchema, + // options: { authRequired: true }, + // }, + // getTrustedAppsListRouteHandler(endpointAppContext) + // ); + // + // // CREATE + // router.post( + // { + // path: TRUSTED_APPS_CREATE_API, + // validate: PostTrustedAppCreateRequestSchema, + // options: { authRequired: true }, + // }, + // getTrustedAppsCreateRouteHandler(endpointAppContext) + // ); + // + // // PUT + // router.put( + // { + // path: TRUSTED_APPS_UPDATE_API, + // validate: PutTrustedAppUpdateRequestSchema, + // options: { authRequired: true }, + // }, + // getTrustedAppsUpdateRouteHandler(endpointAppContext) + // ); + // + // // SUMMARY + // router.get( + // { + // path: TRUSTED_APPS_SUMMARY_API, + // validate: GetTrustedAppsSummaryRequestSchema, + // options: { authRequired: true }, + // }, + // getTrustedAppsSummaryRouteHandler(endpointAppContext) + // ); }; From 2d13b7be3c41778ace6083b1bcf3a5df03da4ed6 Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Thu, 2 Dec 2021 20:39:03 +0100 Subject: [PATCH 073/126] [Graph] Add KibanaThemeProvider (#119802) * [Graph] Add ThemeProvider * Wrap top_nav_menu in kibana theme Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../graph/public/{application.ts => application.tsx} | 7 +++++-- .../workspace_layout/workspace_top_nav_menu.tsx | 11 +++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) rename x-pack/plugins/graph/public/{application.ts => application.tsx} (93%) diff --git a/x-pack/plugins/graph/public/application.ts b/x-pack/plugins/graph/public/application.tsx similarity index 93% rename from x-pack/plugins/graph/public/application.ts rename to x-pack/plugins/graph/public/application.tsx index 5a7f931538bf66..235c9aa8437976 100644 --- a/x-pack/plugins/graph/public/application.ts +++ b/x-pack/plugins/graph/public/application.tsx @@ -20,6 +20,7 @@ import { ScopedHistory, } from 'kibana/public'; import ReactDOM from 'react-dom'; +import React from 'react'; import { DataPlugin, IndexPatternsContract } from '../../../../src/plugins/data/public'; import { LicensingPluginStart } from '../../licensing/public'; import { checkLicense } from '../common/check_license'; @@ -32,6 +33,7 @@ import { SavedObjectsStart } from '../../../../src/plugins/saved_objects/public' import { GraphSavePolicy } from './types'; import { graphRouter } from './router'; import { SpacesApi } from '../../spaces/public'; +import { KibanaThemeProvider } from '../../../../src/plugins/kibana_react/public'; /** * These are dependencies of the Graph app besides the base dependencies @@ -69,7 +71,8 @@ export interface GraphDependencies { export type GraphServices = Omit; export const renderApp = ({ history, element, ...deps }: GraphDependencies) => { - const { chrome, capabilities } = deps; + const { chrome, capabilities, core } = deps; + const { theme$ } = core.theme; if (!capabilities.graph.save) { chrome.setBadge({ @@ -107,7 +110,7 @@ export const renderApp = ({ history, element, ...deps }: GraphDependencies) => { window.dispatchEvent(new HashChangeEvent('hashchange')); }); - const app = graphRouter(deps); + const app = {graphRouter(deps)}; ReactDOM.render(app, element); element.setAttribute('class', 'gphAppWrapper'); diff --git a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx index dc7365672ffa23..f3bebfa68ca4a7 100644 --- a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx +++ b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx @@ -11,7 +11,7 @@ import { Provider, useStore } from 'react-redux'; import { AppMountParameters, Capabilities, CoreStart } from 'kibana/public'; import { useHistory, useLocation } from 'react-router-dom'; import { NavigationPublicPluginStart as NavigationStart } from '../../../../../../src/plugins/navigation/public'; -import { toMountPoint } from '../../../../../../src/plugins/kibana_react/public'; +import { toMountPoint, wrapWithTheme } from '../../../../../../src/plugins/kibana_react/public'; import { datasourceSelector, hasFieldsSelector } from '../../state_management'; import { GraphSavePolicy, GraphWorkspaceSavedObject, Workspace } from '../../types'; import { AsObservable, Settings, SettingsWorkspaceProps } from '../settings'; @@ -145,9 +145,12 @@ export const WorkspaceTopNavMenu = (props: WorkspaceTopNavMenuProps) => { props.coreStart.overlays.openFlyout( toMountPoint( - - - + wrapWithTheme( + + + , + props.coreStart.theme.theme$ + ) ), { size: 'm', From a88ac0c2e6be4913a0c39c4fb01a4480f1f8fded Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 2 Dec 2021 19:56:40 +0000 Subject: [PATCH 074/126] chore(NA): splits types from code on @kbn/cli-dev-mode (#120248) --- package.json | 1 + packages/BUILD.bazel | 1 + packages/kbn-cli-dev-mode/BUILD.bazel | 26 ++++++++++++++++++++++---- packages/kbn-cli-dev-mode/package.json | 1 - yarn.lock | 4 ++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index c8da0bf0513900..75da2784a391b5 100644 --- a/package.json +++ b/package.json @@ -560,6 +560,7 @@ "@types/kbn__analytics": "link:bazel-bin/packages/kbn-analytics/npm_module_types", "@types/kbn__apm-config-loader": "link:bazel-bin/packages/kbn-apm-config-loader/npm_module_types", "@types/kbn__apm-utils": "link:bazel-bin/packages/kbn-apm-utils/npm_module_types", + "@types/kbn__cli-dev-mode": "link:bazel-bin/packages/kbn-cli-dev-mode/npm_module_types", "@types/kbn__i18n": "link:bazel-bin/packages/kbn-i18n/npm_module_types", "@types/kbn__i18n-react": "link:bazel-bin/packages/kbn-i18n-react/npm_module_types", "@types/license-checker": "15.0.0", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index f10044a68def9b..9e124cf63a391e 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -82,6 +82,7 @@ filegroup( "//packages/kbn-analytics:build_types", "//packages/kbn-apm-config-loader:build_types", "//packages/kbn-apm-utils:build_types", + "//packages/kbn-cli-dev-mode:build_types", "//packages/kbn-i18n:build_types", "//packages/kbn-i18n-react:build_types", ], diff --git a/packages/kbn-cli-dev-mode/BUILD.bazel b/packages/kbn-cli-dev-mode/BUILD.bazel index e66a621781234b..686866ce7bc883 100644 --- a/packages/kbn-cli-dev-mode/BUILD.bazel +++ b/packages/kbn-cli-dev-mode/BUILD.bazel @@ -1,9 +1,10 @@ -load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project") -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") -load("//src/dev/bazel:index.bzl", "jsts_transpiler") +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") PKG_BASE_NAME = "kbn-cli-dev-mode" PKG_REQUIRE_NAME = "@kbn/cli-dev-mode" +TYPES_PKG_REQUIRE_NAME = "@types/kbn__cli-dev-mode" SOURCE_FILES = glob( [ @@ -103,7 +104,7 @@ ts_project( js_library( name = PKG_BASE_NAME, srcs = NPM_MODULE_EXTRA_FILES, - deps = RUNTIME_DEPS + [":target_node", ":tsc_types"], + deps = RUNTIME_DEPS + [":target_node"], package_name = PKG_REQUIRE_NAME, visibility = ["//visibility:public"], ) @@ -122,3 +123,20 @@ filegroup( ], visibility = ["//visibility:public"], ) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = TYPES_PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [ + ":npm_module_types", + ], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-cli-dev-mode/package.json b/packages/kbn-cli-dev-mode/package.json index ac5ec227e92c54..80076a98510879 100644 --- a/packages/kbn-cli-dev-mode/package.json +++ b/packages/kbn-cli-dev-mode/package.json @@ -1,7 +1,6 @@ { "name": "@kbn/cli-dev-mode", "main": "./target_node/index.js", - "types": "./target_types/index.d.ts", "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", "private": true, diff --git a/yarn.lock b/yarn.lock index 85dba799539397..7a1afe15ddd33d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5825,6 +5825,10 @@ version "0.0.0" uid "" +"@types/kbn__cli-dev-mode@link:bazel-bin/packages/kbn-cli-dev-mode/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__i18n-react@link:bazel-bin/packages/kbn-i18n-react/npm_module_types": version "0.0.0" uid "" From 23652de60551279ea23c5ab41071dea65d893951 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 2 Dec 2021 22:13:53 +0200 Subject: [PATCH 075/126] [Visualize] Fixes wrong display of split warning callout (#120199) --- .../visualize_editor_common.test.tsx | 83 +++++++++++++++++++ .../components/visualize_editor_common.tsx | 4 +- 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/plugins/visualize/public/application/components/visualize_editor_common.test.tsx b/src/plugins/visualize/public/application/components/visualize_editor_common.test.tsx index dbe658b8b2d3ce..d0c7b56638bc29 100644 --- a/src/plugins/visualize/public/application/components/visualize_editor_common.test.tsx +++ b/src/plugins/visualize/public/application/components/visualize_editor_common.test.tsx @@ -10,6 +10,7 @@ import React from 'react'; import { shallowWithIntl, mountWithIntl } from '@kbn/test/jest'; import { VisualizeEditorCommon } from './visualize_editor_common'; import { VisualizeEditorVisInstance } from '../types'; +import { SplitChartWarning } from './split_chart_warning'; const mockGetLegacyUrlConflict = jest.fn(); const mockRedirectLegacyUrl = jest.fn(() => Promise.resolve()); @@ -115,4 +116,86 @@ describe('VisualizeEditorCommon', () => { 'TSVB visualization' ); }); + + it('should display a warning callout for new heatmap implementation with split aggs', async () => { + const wrapper = shallowWithIntl( + {}} + hasUnappliedChanges={false} + isEmbeddableRendered={false} + onAppLeave={() => {}} + visEditorRef={React.createRef()} + visInstance={ + { + savedVis: { + id: 'test', + sharingSavedObjectProps: { + outcome: 'conflict', + aliasTargetId: 'alias_id', + }, + }, + vis: { + type: { + title: 'Heatmap', + name: 'heatmap', + }, + data: { + aggs: { + aggs: [ + { + schema: 'split', + }, + ], + }, + }, + }, + } as unknown as VisualizeEditorVisInstance + } + /> + ); + expect(wrapper.find(SplitChartWarning).length).toBe(1); + }); + + it('should not display a warning callout for XY charts with split aggs', async () => { + const wrapper = shallowWithIntl( + {}} + hasUnappliedChanges={false} + isEmbeddableRendered={false} + onAppLeave={() => {}} + visEditorRef={React.createRef()} + visInstance={ + { + savedVis: { + id: 'test', + sharingSavedObjectProps: { + outcome: 'conflict', + aliasTargetId: 'alias_id', + }, + }, + vis: { + type: { + title: 'XY', + name: 'line', + }, + data: { + aggs: { + aggs: [ + { + schema: 'split', + }, + ], + }, + }, + }, + } as unknown as VisualizeEditorVisInstance + } + /> + ); + expect(wrapper.find(SplitChartWarning).length).toBe(0); + }); }); diff --git a/src/plugins/visualize/public/application/components/visualize_editor_common.tsx b/src/plugins/visualize/public/application/components/visualize_editor_common.tsx index b764c9de483466..706fe55d0754ea 100644 --- a/src/plugins/visualize/public/application/components/visualize_editor_common.tsx +++ b/src/plugins/visualize/public/application/components/visualize_editor_common.tsx @@ -134,7 +134,9 @@ export const VisualizeEditorCommon = ({ /> )} {visInstance?.vis?.type?.stage === 'experimental' && } - {!hasHeatmapLegacyhartsEnabled && isSplitChart && } + {!hasHeatmapLegacyhartsEnabled && + isSplitChart && + visInstance?.vis.type.name === 'heatmap' && } {visInstance?.vis?.type?.getInfoMessage?.(visInstance.vis)} {getLegacyUrlConflictCallout()} {visInstance && ( From f01106c100c3af70fc6fd32938a39e69ed27dd05 Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Thu, 2 Dec 2021 13:17:51 -0800 Subject: [PATCH 076/126] [DOCS] Updates security section of intro doc (#120036) * Updates security section of intro doc * Update docs/user/introduction.asciidoc Co-authored-by: Adam Locke Co-authored-by: Adam Locke --- docs/user/introduction.asciidoc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/user/introduction.asciidoc b/docs/user/introduction.asciidoc index 8972f928317170..89a21b0424ed08 100644 --- a/docs/user/introduction.asciidoc +++ b/docs/user/introduction.asciidoc @@ -169,9 +169,8 @@ them in bulk operations. === Secure {kib} {kib} offers a range of security features for you to control who has access to what. -The security features are automatically turned on when -{ref}/security-minimal-setup.html[security is enabled in -{es}]. For a description of all available configuration options, +{ref}/configuring-stack-security.html[Security is enabled automatically] when you enroll {kib} with a secured {es} cluster. +For a description of all available configuration options, refer to <>. [float] From ea37dbb6c3c8620853267ff09c1716657f2c4eff Mon Sep 17 00:00:00 2001 From: nastasha-solomon <79124755+nastasha-solomon@users.noreply.github.com> Date: Thu, 2 Dec 2021 17:20:05 -0500 Subject: [PATCH 077/126] [Security Solution] Doc pre-reqs for using the SN ITSM, SecOps, and ITOM connectors (#117122) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../action-types/servicenow-itom.asciidoc | 32 ++++--- .../action-types/servicenow-sir.asciidoc | 87 ++++++++++++++--- .../action-types/servicenow.asciidoc | 88 +++++++++++++++--- .../images/servicenow-params-test.png | Bin 184611 -> 233010 bytes .../servicenow-sir-update-connector.png | Bin 0 -> 250246 bytes 5 files changed, 167 insertions(+), 40 deletions(-) create mode 100644 docs/management/connectors/images/servicenow-sir-update-connector.png diff --git a/docs/management/connectors/action-types/servicenow-itom.asciidoc b/docs/management/connectors/action-types/servicenow-itom.asciidoc index 017290dde9b15d..af231c327f955d 100644 --- a/docs/management/connectors/action-types/servicenow-itom.asciidoc +++ b/docs/management/connectors/action-types/servicenow-itom.asciidoc @@ -1,25 +1,31 @@ [role="xpack"] [[servicenow-itom-action-type]] -=== ServiceNow connector and action +=== ServiceNow ITOM connector and action ++++ ServiceNow ITOM ++++ -The ServiceNow ITOM connector uses the https://docs.servicenow.com/bundle/rome-it-operations-management/page/product/event-management/task/send-events-via-web-service.html[Event API] to create ServiceNow events. +The {sn} ITOM connector uses the https://docs.servicenow.com/bundle/rome-it-operations-management/page/product/event-management/task/send-events-via-web-service.html[Event API] to create {sn} events. + +[float] +[[servicenow-itom-connector-prerequisites]] +==== Prerequisites +Create an integration user in {sn} and assign it the following roles. + +* `personalize_choices`: Allows the user to retrieve Choice element options, such as Severity. +* `evt_mgmt_integration`: Enables integration with external event sources by allowing the user to create events. [float] [[servicenow-itom-connector-configuration]] ==== Connector configuration -ServiceNow ITOM connectors have the following configuration properties. +{sn} ITOM connectors have the following configuration properties. -Name:: The name of the connector. The name is used to identify a connector in the **Stack Management** UI connector listing, and in the connector list when configuring an action. -URL:: ServiceNow instance URL. +Name:: The name of the connector. The name is used to identify a connector in the **Stack Management** connector listing, and in the connector list when configuring an action. +URL:: {sn} instance URL. Username:: Username for HTTP Basic authentication. Password:: Password for HTTP Basic authentication. -The ServiceNow user requires at minimum read, create, and update access to the Event table and read access to the https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/localization/reference/r_ChoicesTable.html[sys_choice]. If you don't provide access to sys_choice, then the choices will not render. - [float] [[servicenow-itom-connector-networking-configuration]] ==== Connector networking configuration @@ -55,12 +61,12 @@ Secrets defines sensitive information for the connector type. [[define-servicenow-itom-ui]] ==== Define connector in Stack Management -Define ServiceNow ITOM connector properties. +Define {sn} ITOM connector properties. [role="screenshot"] image::management/connectors/images/servicenow-itom-connector.png[ServiceNow ITOM connector] -Test ServiceNow ITOM action parameters. +Test {sn} ITOM action parameters. [role="screenshot"] image::management/connectors/images/servicenow-itom-params-test.png[ServiceNow ITOM params test] @@ -69,7 +75,7 @@ image::management/connectors/images/servicenow-itom-params-test.png[ServiceNow I [[servicenow-itom-action-configuration]] ==== Action configuration -ServiceNow ITOM actions have the following configuration properties. +{sn} ITOM actions have the following configuration properties. Source:: The name of the event source type. Node:: The Host that the event was triggered for. @@ -77,7 +83,7 @@ Type:: The type of event. Resource:: The name of the resource. Metric name:: Name of the metric. Source instance (event_class):: Specific instance of the source. -Message key:: All actions sharing this key will be associated with the same ServiceNow alert. Default value: `:`. +Message key:: All actions sharing this key will be associated with the same {sn} alert. Default value: `:`. Severity:: The severity of the event. Description:: The details about the event. @@ -85,6 +91,6 @@ Refer to https://docs.servicenow.com/bundle/rome-it-operations-management/page/p [float] [[configuring-servicenow-itom]] -==== Configure ServiceNow ITOM +==== Configure {sn} ITOM -ServiceNow offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. +{sn} offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. diff --git a/docs/management/connectors/action-types/servicenow-sir.asciidoc b/docs/management/connectors/action-types/servicenow-sir.asciidoc index 8847a99fe3af03..70500b26c16e67 100644 --- a/docs/management/connectors/action-types/servicenow-sir.asciidoc +++ b/docs/management/connectors/action-types/servicenow-sir.asciidoc @@ -1,25 +1,83 @@ [role="xpack"] [[servicenow-sir-action-type]] -=== ServiceNow connector and action +=== ServiceNow SecOps connector and action ++++ ServiceNow SecOps ++++ -The ServiceNow SecOps connector uses the https://docs.servicenow.com/bundle/orlando-application-development/page/integrate/inbound-rest/concept/c_TableAPI.html[V2 Table API] to create ServiceNow security incidents. +The {sn} SecOps connector uses the https://docs.servicenow.com/bundle/orlando-application-development/page/integrate/inbound-rest/concept/c_TableAPI.html[V2 Table API] to create {sn} security incidents. + +[float] +[[servicenow-sir-connector-prerequisites]] +==== Prerequisites +After upgrading from {stack} version 7.15.0 or earlier to version 7.16.0 or later, you must complete the following within your {sn} instance before creating a new {sn} SecOps connector or <>: + +* Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/2f0746801baeb01019ae54e4604bcb0f[Elastic for Security Operations (SecOps)] from the {sn} Store. +* Create a {sn} integration user and assign it the appropriate roles. +* Create a Cross-Origin Resource Sharing (CORS) rule. + +*Create a {sn} integration user* + +To ensure authenticated communication between Elastic and {sn}, create a {sn} integration user and assign it the appropriate roles.  + +. In your {sn} instance, go to *System Security -> Users and Groups -> Users*. +. Click *New*. +. Complete the form, then right-click on the menu bar and click *Save*. +. Go to the *Roles* tab and click *Edit*. +. Assign the integration user the following roles:  +* `import_set_loader` +* `import_transformer` +* `personalize_choices` +* `sn_si.basic` +* `x_elas2_sir_int.integration_user` +. Click *Save*. + +*Create a CORS rule* + +A CORS rule is required for communication between Elastic and {sn}. To create a CORS rule: + +. In your {sn} instance, go to *System Web Services -> REST -> CORS Rules*. +. Click *New*. +. Configure the rule as follows: +* *Name*: Name the rule. +* *REST API*: Set the rule to use the Elastic SecOps API by choosing `Elastic SIR API [x_elas2_sir_int/elastic_api]`. +* *Domain*: Enter the Kibana URL. +. Go to the *HTTP methods* tab and select *GET*. +. Click *Submit* to create the rule. + +[float] +[[servicenow-sir-connector-update]] +==== Update a deprecated {sn} SecOps connector + +{sn} SecOps connectors created in {stack} version 7.15.0 or earlier are marked as deprecated after you upgrade to version 7.16.0 or later. Deprecated connectors have a yellow icon after their name and display a warning message when selected. + +[role="screenshot"] +image::management/connectors/images/servicenow-sir-update-connector.png[Shows deprecated ServiceNow connectors] + +IMPORTANT: Deprecated connectors will continue to function with the rules they were added to and can be assigned to new rules. However, it is strongly recommended to update deprecated connectors or <> to ensure you have access to connector enhancements, such as updating incidents. + +To update a deprecated connector: + +. Open the main menu and go to *Stack Management -> Rules and connectors -> Connectors*. +. Select the deprecated connector to open the *Edit connector* flyout. +. In the warning message, click *Update this connector*. +. Complete the guided steps in the *Edit connector* flyout. +.. Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/2f0746801baeb01019ae54e4604bcb0f[Elastic for Security Operations (SecOps)] from the {sn} Store and complete the <>. +.. Enter the URL of your {sn} instance. +.. Enter the username and password of your {sn} instance. +. Click *Update*. [float] [[servicenow-sir-connector-configuration]] ==== Connector configuration -ServiceNow SecOps connectors have the following configuration properties. +{sn} SecOps connectors have the following configuration properties. Name:: The name of the connector. The name is used to identify a connector in the **Stack Management** UI connector listing, and in the connector list when configuring an action. -URL:: ServiceNow instance URL. +URL:: {sn} instance URL. Username:: Username for HTTP Basic authentication. Password:: Password for HTTP Basic authentication. -The ServiceNow user requires at minimum read, create, and update access to the Security Incident table and read access to the https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/localization/reference/r_ChoicesTable.html[sys_choice]. If you don't provide access to sys_choice, then the choices will not render. - [float] [[servicenow-sir-connector-networking-configuration]] ==== Connector networking configuration @@ -48,7 +106,7 @@ Config defines information for the connector type. `apiUrl`:: An address that corresponds to *URL*. `usesTableApi`:: A boolean that indicates if the connector uses the Table API or the Import Set API. -Note: If `usesTableApi` is set to false the Elastic application should be installed in ServiceNow. +NOTE: If `usesTableApi` is set to false, the Elastic application should be installed in {sn}. Secrets defines sensitive information for the connector type. @@ -59,12 +117,12 @@ Secrets defines sensitive information for the connector type. [[define-servicenow-sir-ui]] ==== Define connector in Stack Management -Define ServiceNow SecOps connector properties. +Define {sn} SecOps connector properties. [role="screenshot"] image::management/connectors/images/servicenow-sir-connector.png[ServiceNow SecOps connector] -Test ServiceNow SecOps action parameters. +Test {sn} SecOps action parameters. [role="screenshot"] image::management/connectors/images/servicenow-sir-params-test.png[ServiceNow SecOps params test] @@ -79,13 +137,16 @@ Short description:: A short description for the incident, used for searching Priority:: The priority of the incident. Category:: The category of the incident. Subcategory:: The subcategory of the incident. -Correlation ID:: All actions sharing this ID will be associated with the same ServiceNow security incident. If an incident exists in ServiceNow with the same correlation ID the security incident will be updated. Default value: `:`. -Correlation Display:: A descriptive label of the alert for correlation purposes in ServiceNow. +Correlation ID:: Connectors using the same Correlation ID will be associated with the same {sn} incident. This value determines whether a new {sn} incident will be created or an existing one is updated. Modifying this value is optional; if not modified, the rule ID and alert ID are combined as `{{ruleID}}:{{alert ID}}` to form the Correlation ID value in {sn}. The maximum character length for this value is 100 characters. + +NOTE: Using the default configuration of `{{ruleID}}:{{alert ID}}` ensures that {sn} will create a separate incident record for every generated alert that uses a unique alert ID. If the rule generates multiple alerts that use the same alert IDs, {sn} creates and continually updates a single incident record for the alert. + +Correlation Display:: A descriptive label of the alert for correlation purposes in {sn}. Description:: The details about the incident. Additional comments:: Additional information for the client, such as how to troubleshoot the issue. [float] [[configuring-servicenow-sir]] -==== Configure ServiceNow SecOps +==== Configure {sn} SecOps -ServiceNow offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. +{sn} offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. diff --git a/docs/management/connectors/action-types/servicenow.asciidoc b/docs/management/connectors/action-types/servicenow.asciidoc index bfa8c7db657d03..73e3baaca2ad11 100644 --- a/docs/management/connectors/action-types/servicenow.asciidoc +++ b/docs/management/connectors/action-types/servicenow.asciidoc @@ -1,25 +1,82 @@ [role="xpack"] [[servicenow-action-type]] -=== ServiceNow connector and action +=== ServiceNow ITSM connector and action ++++ ServiceNow ITSM ++++ -The ServiceNow ITSM connector uses the https://docs.servicenow.com/bundle/orlando-application-development/page/integrate/inbound-rest/concept/c_TableAPI.html[V2 Table API] to create ServiceNow incidents. +The {sn} ITSM connector uses the https://docs.servicenow.com/bundle/orlando-application-development/page/integrate/inbound-rest/concept/c_TableAPI.html[V2 Table API] to create {sn} incidents. + +[float] +[[servicenow-itsm-connector-prerequisites]] +==== Prerequisites +After upgrading from {stack} version 7.15.0 or earlier to version 7.16.0 or later, you must complete the following within your {sn} instance before creating a new {sn} ITSM connector or <>: + +* Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/7148dbc91bf1f450ced060a7234bcb88[Elastic for ITSM] from the {sn} Store. +* Create a {sn} integration user and assign it the appropriate roles. +* Create a Cross-Origin Resource Sharing (CORS) rule. + +*Create a {sn} integration user* + +To ensure authenticated communication between Elastic and {sn}, create a {sn} integration user and assign it the appropriate roles. + +. In your {sn} instance, go to *System Security -> Users and Groups -> Users*. +. Click *New*. +. Complete the form, then right-click on the menu bar and click *Save*. +. Go to the *Roles* tab and click *Edit*. +. Assign the integration user the following roles:  +* `import_set_loader` +* `import_transformer` +* `personalize_choices` +* `x_elas2_inc_int.integration_user` +. Click *Save*. + +*Create a CORS rule* + +A CORS rule is required for communication between Elastic and {sn}. To create a CORS rule: + +. In your {sn} instance, go to *System Web Services -> REST -> CORS Rules*. +. Click *New*. +. Configure the rule as follows: +* *Name*: Name the rule. +* *REST API*: Set the rule to use the Elastic ITSM API by choosing `Elastic ITSM API [x_elas2_inc_int/elastic_api]`. +* *Domain*: Enter the Kibana URL. +. Go to the *HTTP methods* tab and select *GET*. +. Click *Submit* to create the rule. + +[float] +[[servicenow-itsm-connector-update]] +==== Update a deprecated {sn} ITSM connector + +{sn} ITSM connectors created in {stack} version 7.15.0 or earlier are marked as deprecated after you upgrade to version 7.16.0 or later. Deprecated connectors have a yellow icon after their name and display a warning message when selected. + +[role="screenshot"] +image::management/connectors/images/servicenow-sir-update-connector.png[Shows deprecated ServiceNow connectors] + +IMPORTANT: Deprecated connectors will continue to function with the rules they were added to and can be assigned to new rules. However, it is strongly recommended to update deprecated connectors or <> to ensure you have access to connector enhancements, such as updating incidents. + +To update a deprecated connector: + +. Open the main menu and go to *Stack Management -> Rules and connectors -> Connectors*. +. Select the deprecated connector to open the *Edit connector* flyout. +. In the warning message, click *Update this connector*. +. Complete the guided steps in the *Edit connector* flyout. +.. Install https://store.servicenow.com/sn_appstore_store.do#!/store/application/7148dbc91bf1f450ced060a7234bcb88[Elastic for ITSM] and complete the <>. +.. Enter the URL of your {sn} instance. +.. Enter the username and password of your {sn} instance. +. Click *Update*. [float] [[servicenow-connector-configuration]] ==== Connector configuration -ServiceNow ITSM connectors have the following configuration properties. +{sn} ITSM connectors have the following configuration properties. Name:: The name of the connector. The name is used to identify a connector in the **Stack Management** UI connector listing, and in the connector list when configuring an action. -URL:: ServiceNow instance URL. +URL:: {sn} instance URL. Username:: Username for HTTP Basic authentication. Password:: Password for HTTP Basic authentication. -The ServiceNow user requires at minimum read, create, and update access to the Incident table and read access to the https://docs.servicenow.com/bundle/paris-platform-administration/page/administer/localization/reference/r_ChoicesTable.html[sys_choice]. If you don't provide access to sys_choice, then the choices will not render. - [float] [[servicenow-connector-networking-configuration]] ==== Connector networking configuration @@ -48,7 +105,7 @@ Config defines information for the connector type. `apiUrl`:: An address that corresponds to *URL*. `usesTableApi`:: A boolean that indicates if the connector uses the Table API or the Import Set API. -Note: If `usesTableApi` is set to false the Elastic application should be installed in ServiceNow. +NOTE: If `usesTableApi` is set to false, the Elastic application should be installed in {sn}. Secrets defines sensitive information for the connector type. @@ -59,12 +116,12 @@ Secrets defines sensitive information for the connector type. [[define-servicenow-ui]] ==== Define connector in Stack Management -Define ServiceNow ITSM connector properties. +Define {sn} ITSM connector properties. [role="screenshot"] image::management/connectors/images/servicenow-connector.png[ServiceNow connector] -Test ServiceNow ITSM action parameters. +Test {sn} ITSM action parameters. [role="screenshot"] image::management/connectors/images/servicenow-params-test.png[ServiceNow params test] @@ -73,21 +130,24 @@ image::management/connectors/images/servicenow-params-test.png[ServiceNow params [[servicenow-action-configuration]] ==== Action configuration -ServiceNow ITSM actions have the following configuration properties. +{sn} ITSM actions have the following configuration properties. Urgency:: The extent to which the incident resolution can delay. Severity:: The severity of the incident. Impact:: The effect an incident has on business. Can be measured by the number of affected users or by how critical it is to the business in question. Category:: The category of the incident. Subcategory:: The category of the incident. -Correlation ID:: All actions sharing this ID will be associated with the same ServiceNow incident. If an incident exists in ServiceNow with the same correlation ID the incident will be updated. Default value: `:`. -Correlation Display:: A descriptive label of the alert for correlation purposes in ServiceNow. +Correlation ID:: Connectors using the same Correlation ID will be associated with the same {sn} incident. This value determines whether a new {sn} incident will be created or an existing one is updated. Modifying this value is optional; if not modified, the rule ID and alert ID are combined as `{{ruleID}}:{{alert ID}}` to form the Correlation ID value in {sn}. The maximum character length for this value is 100 characters. + +NOTE: Using the default configuration of `{{ruleID}}:{{alert ID}}` ensures that {sn} will create a separate incident record for every generated alert that uses a unique alert ID. If the rule generates multiple alerts that use the same alert IDs, {sn} creates and continually updates a single incident record for the alert. + +Correlation Display:: A descriptive label of the alert for correlation purposes in {sn}. Short description:: A short description for the incident, used for searching the contents of the knowledge base. Description:: The details about the incident. Additional comments:: Additional information for the client, such as how to troubleshoot the issue. [float] [[configuring-servicenow]] -==== Configure ServiceNow +==== Configure {sn} -ServiceNow offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. +{sn} offers free https://developer.servicenow.com/dev.do#!/guides/madrid/now-platform/pdi-guide/obtaining-a-pdi[Personal Developer Instances], which you can use to test incidents. diff --git a/docs/management/connectors/images/servicenow-params-test.png b/docs/management/connectors/images/servicenow-params-test.png index 79f1580c873d2647de495089041ac11814011ada..d8a85608bd40e0990da212db3cb54d37e436ff59 100644 GIT binary patch literal 233010 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 cKeZ5nP5D^oUGZ>a2k Date: Thu, 2 Dec 2021 17:37:26 -0500 Subject: [PATCH 078/126] [Alerting][UI] Adding tooltip to Last Run column title (#120159) --- .../components/alerts_list.test.tsx | 36 +++++++++++++++++++ .../alerts_list/components/alerts_list.tsx | 18 +++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx index 5067cbbee9bf44..65f82da69ccc5f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.test.tsx @@ -328,6 +328,8 @@ describe('alerts_list component with items', () => { } it('renders table of alerts', async () => { + // Use fake timers so we don't have to wait for the EuiToolTip timeout + jest.useFakeTimers(); await setup(); expect(wrapper.find('EuiBasicTable')).toHaveLength(1); expect(wrapper.find('EuiTableRow')).toHaveLength(mockedAlertsData.length); @@ -359,6 +361,23 @@ describe('alerts_list component with items', () => { wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-lastExecutionDate"]').length ).toEqual(mockedAlertsData.length); + // Last run tooltip + wrapper + .find('[data-test-subj="alertsTableCell-lastExecutionDateTooltip"]') + .first() + .simulate('mouseOver'); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + wrapper.update(); + expect(wrapper.find('.euiToolTipPopover').text()).toBe('Start time of the last execution.'); + + wrapper + .find('[data-test-subj="alertsTableCell-lastExecutionDateTooltip"]') + .first() + .simulate('mouseOut'); + // Schedule interval column expect( wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-interval"]').length @@ -377,6 +396,20 @@ describe('alerts_list component with items', () => { ).length ); + // Duration tooltip + wrapper + .find('[data-test-subj="alertsTableCell-durationTooltip"]') + .first() + .simulate('mouseOver'); + + // Run the timers so the EuiTooltip will be visible + jest.runAllTimers(); + + wrapper.update(); + expect(wrapper.find('.euiToolTipPopover').text()).toBe( + 'The length of time it took for the rule to run.' + ); + // Status column expect(wrapper.find('EuiTableRowCell[data-test-subj="alertsTableCell-status"]').length).toEqual( mockedAlertsData.length @@ -399,6 +432,9 @@ describe('alerts_list component with items', () => { expect(wrapper.find('EuiHealth[data-test-subj="alertStatus-error"]').last().text()).toEqual( 'License Error' ); + + // Clearing all mocks will also reset fake timers. + jest.clearAllMocks(); }); it('loads alerts when refresh button is clicked', async () => { diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx index 9a9e8f0f56717f..f1e88223e57b6b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_list/components/alerts_list.tsx @@ -483,7 +483,22 @@ export const AlertsList: React.FunctionComponent = () => { }, { field: 'executionStatus.lastExecutionDate', - name: 'Last run', + name: ( + + + Last run{' '} + + + + ), sortable: true, width: '15%', 'data-test-subj': 'alertsTableCell-lastExecutionDate', @@ -523,6 +538,7 @@ export const AlertsList: React.FunctionComponent = () => { width: '12%', name: ( Date: Fri, 3 Dec 2021 00:51:59 +0100 Subject: [PATCH 079/126] [RAC] Adds stats about rules to Alerts page (#119750) * Adds EuiStat to alerts page template * Adds functional tests for stat counters * Whoops - no exclusive tests * Uses triggers_actions_ui API * Toaster on error * Early review feedback * Uses new rule aggregation API * Makes tests pass * Adds logging * Whoops forgot an await * Limits triggers actions UI exports to loadAlertAggregations * Creates rules via API for functional tests * Extracts common methods to create rules via API * Removes unnecessary template strings * Cleanup * Reuses common dummy alert plugin fixture * Removes unnecessary config * Removes unnecessary config --- .../containers/alerts_page/alerts_page.tsx | 114 ++++++++++- .../triggers_actions_ui/public/index.ts | 1 + .../services/observability/alerts/common.ts | 11 + .../apps/triggers_actions_ui/alerts_list.ts | 189 ++++++++++-------- .../lib/alert_api_actions.ts | 87 ++++++++ .../apps/observability/alerts/index.ts | 68 +++++++ .../with_rac_write.config.ts | 50 ++++- 7 files changed, 432 insertions(+), 88 deletions(-) create mode 100644 x-pack/test/functional_with_es_ssl/lib/alert_api_actions.ts diff --git a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx index b19a1dbe86fe11..06040d9a186fff 100644 --- a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx @@ -5,15 +5,17 @@ * 2.0. */ -import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiStat } from '@elastic/eui'; import { IndexPatternBase } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; -import React, { useCallback, useRef, useState, useEffect } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { AlertStatus } from '@kbn/rule-data-utils/alerts_as_data_status'; import { ALERT_STATUS } from '@kbn/rule-data-utils/technical_field_names'; +import { euiStyled } from '../../../../../../../../src/plugins/kibana_react/common'; +import { loadAlertAggregations as loadRuleAggregations } from '../../../../../../../plugins/triggers_actions_ui/public'; import { AlertStatusFilterButton } from '../../../../../common/typings'; import { ParsedTechnicalFields } from '../../../../../../rule_registry/common/parse_technical_fields'; import { ExperimentalBadge } from '../../../../components/shared/experimental_badge'; @@ -34,6 +36,12 @@ import { import './styles.scss'; import { AlertsStatusFilter, AlertsDisclaimer, AlertsSearchBar } from '../../components'; +interface RuleStatsState { + total: number; + disabled: number; + muted: number; + error: number; +} export interface TopAlert { fields: ParsedTechnicalFields; start: number; @@ -41,6 +49,12 @@ export interface TopAlert { link?: string; active: boolean; } + +const Divider = euiStyled.div` + border-right: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; + height: 100%; +`; + const regExpEscape = (str: string) => str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); const NO_INDEX_NAMES: string[] = []; const NO_INDEX_PATTERNS: IndexPatternBase[] = []; @@ -60,6 +74,17 @@ function AlertsPage() { const timefilterService = useTimefilterService(); const { rangeFrom, setRangeFrom, rangeTo, setRangeTo, kuery, setKuery, workflowStatus } = useAlertsPageStateContainer(); + const { + http, + notifications: { toasts }, + } = core; + const [ruleStatsLoading, setRuleStatsLoading] = useState(false); + const [ruleStats, setRuleStats] = useState({ + total: 0, + disabled: 0, + muted: 0, + error: 0, + }); useEffect(() => { syncAlertStatusFilterStatus(kuery as string); @@ -73,6 +98,48 @@ function AlertsPage() { }, ]); + async function loadRuleStats() { + setRuleStatsLoading(true); + try { + const response = await loadRuleAggregations({ + http, + }); + // Note that the API uses the semantics of 'alerts' instead of 'rules' + const { alertExecutionStatus, ruleMutedStatus, ruleEnabledStatus } = response; + if (alertExecutionStatus && ruleMutedStatus && ruleEnabledStatus) { + const total = Object.entries(alertExecutionStatus).reduce((acc, [key, value]) => { + if (key !== 'error') { + acc = acc + value; + } + return acc; + }, 0); + const { error } = alertExecutionStatus; + const { muted } = ruleMutedStatus; + const { disabled } = ruleEnabledStatus; + setRuleStats({ + ...ruleStats, + total, + disabled, + muted, + error, + }); + } + setRuleStatsLoading(false); + } catch (_e) { + toasts.addDanger({ + title: i18n.translate('xpack.observability.alerts.ruleStats.loadError', { + defaultMessage: 'Unable to load rule stats', + }), + }); + setRuleStatsLoading(false); + } + } + + useEffect(() => { + loadRuleStats(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + // In a future milestone we'll have a page dedicated to rule management in // observability. For now link to the settings page. const manageRulesHref = prepend('/app/management/insightsAndAlerting/triggersActions/alerts'); @@ -198,12 +265,53 @@ function AlertsPage() { ), rightSideItems: [ + , + , + , + , + , {i18n.translate('xpack.observability.alerts.manageRulesButtonLabel', { defaultMessage: 'Manage Rules', })} , - ], + ].reverse(), }} > diff --git a/x-pack/plugins/triggers_actions_ui/public/index.ts b/x-pack/plugins/triggers_actions_ui/public/index.ts index 4c4a424b51eeaa..97f4d847361f20 100644 --- a/x-pack/plugins/triggers_actions_ui/public/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/index.ts @@ -45,6 +45,7 @@ export function plugin() { export { Plugin }; export * from './plugin'; +export { loadAlertAggregations } from './application/lib/alert_api/aggregate'; export { loadActionTypes } from './application/lib/action_connector_api/connector_types'; diff --git a/x-pack/test/functional/services/observability/alerts/common.ts b/x-pack/test/functional/services/observability/alerts/common.ts index 8c6352fff98640..2f888d3d733c09 100644 --- a/x-pack/test/functional/services/observability/alerts/common.ts +++ b/x-pack/test/functional/services/observability/alerts/common.ts @@ -5,6 +5,7 @@ * 2.0. */ +import expect from '@kbn/expect'; import { chunk } from 'lodash'; import { ALERT_STATUS_ACTIVE, @@ -270,6 +271,15 @@ export function ObservabilityAlertsCommonProvider({ return actionsOverflowButtons[index] || null; }; + const getAlertStatValue = async (testSubj: string) => { + const stat = await testSubjects.find(testSubj); + const title = await stat.findByCssSelector('.euiStat__title'); + const count = await title.getVisibleText(); + const value = Number.parseInt(count, 10); + expect(Number.isNaN(value)).to.be(false); + return value; + }; + return { getQueryBar, clearQueryBar, @@ -307,5 +317,6 @@ export function ObservabilityAlertsCommonProvider({ viewRuleDetailsButtonClick, viewRuleDetailsLinkClick, getAlertsFlyoutViewRuleDetailsLinkOrFail, + getAlertStatValue, }; } diff --git a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts index 04b9b1b45b6335..0a0e409ef53a98 100644 --- a/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts +++ b/x-pack/test/functional_with_es_ssl/apps/triggers_actions_ui/alerts_list.ts @@ -7,8 +7,16 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; +import { + createAction, + createAlert, + createAlertManualCleanup, + createFailingAlert, + disableAlert, + muteAlert, +} from '../../lib/alert_api_actions'; import { ObjectRemover } from '../../lib/object_remover'; -import { generateUniqueKey, getTestAlertData, getTestActionData } from '../../lib/get_test_data'; +import { generateUniqueKey } from '../../lib/get_test_data'; export default ({ getPageObjects, getService }: FtrProviderContext) => { const testSubjects = getService('testSubjects'); @@ -18,52 +26,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const retry = getService('retry'); const objectRemover = new ObjectRemover(supertest); - async function createAlertManualCleanup(overwrites: Record = {}) { - const { body: createdAlert } = await supertest - .post(`/api/alerting/rule`) - .set('kbn-xsrf', 'foo') - .send(getTestAlertData(overwrites)) - .expect(200); - return createdAlert; - } - - async function createFailingAlert() { - return await createAlert({ - rule_type_id: 'test.failing', - schedule: { interval: '30s' }, - }); - } - - async function createAlert(overwrites: Record = {}) { - const createdAlert = await createAlertManualCleanup(overwrites); - objectRemover.add(createdAlert.id, 'alert', 'alerts'); - return createdAlert; - } - - async function createAction(overwrites: Record = {}) { - const { body: createdAction } = await supertest - .post(`/api/actions/connector`) - .set('kbn-xsrf', 'foo') - .send(getTestActionData(overwrites)) - .expect(200); - objectRemover.add(createdAction.id, 'action', 'actions'); - return createdAction; - } - - async function muteAlert(alertId: string) { - const { body: alert } = await supertest - .post(`/api/alerting/rule/${alertId}/_mute_all`) - .set('kbn-xsrf', 'foo'); - return alert; - } - - async function disableAlert(alertId: string) { - const { body: alert } = await supertest - .post(`/api/alerting/rule/${alertId}/_disable`) - .set('kbn-xsrf', 'foo'); - return alert; - } - async function refreshAlertsList() { await testSubjects.click('rulesTab'); } @@ -80,9 +42,21 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should display alerts in alphabetical order', async () => { const uniqueKey = generateUniqueKey(); - await createAlert({ name: 'b', tags: [uniqueKey] }); - await createAlert({ name: 'c', tags: [uniqueKey] }); - await createAlert({ name: 'a', tags: [uniqueKey] }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'b', tags: [uniqueKey] }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'c', tags: [uniqueKey] }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'a', tags: [uniqueKey] }, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(uniqueKey); @@ -95,7 +69,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should search for alert', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ + supertest, + objectRemover, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -108,8 +85,16 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should update alert list on the search clear button click', async () => { - await createAlert({ name: 'b' }); - await createAlert({ name: 'c', tags: [] }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'b' }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'c', tags: [] }, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts('b'); @@ -138,7 +123,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should search for tags', async () => { - const createdAlert = await createAlert({ tags: ['tag', 'tagtag', 'taggity tag'] }); + const createdAlert = await createAlert({ + supertest, + objectRemover, + overwrites: { tags: ['tag', 'tagtag', 'taggity tag'] }, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(`${createdAlert.name} tag`); @@ -151,7 +140,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should display an empty list when search did not return any alerts', async () => { - await createAlert(); + await createAlert({ + supertest, + objectRemover, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(`An Alert That For Sure Doesn't Exist!`); @@ -159,7 +151,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should disable single alert', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ + supertest, + objectRemover, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -175,8 +170,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should re-enable single alert', async () => { - const createdAlert = await createAlert(); - await disableAlert(createdAlert.id); + const createdAlert = await createAlert({ + supertest, + objectRemover, + }); + await disableAlert({ supertest, alertId: createdAlert.id }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -191,7 +189,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should mute single alert', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ + supertest, + objectRemover, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -207,7 +208,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should be able to mute the rule with non "alerts" consumer from a non editable context', async () => { - const createdAlert = await createAlert({ consumer: 'siem' }); + const createdAlert = await createAlert({ + supertest, + objectRemover, + overwrites: { consumer: 'siem' }, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -223,8 +228,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should unmute single alert', async () => { - const createdAlert = await createAlert(); - await muteAlert(createdAlert.id); + const createdAlert = await createAlert({ + supertest, + objectRemover, + }); + await muteAlert({ supertest, alertId: createdAlert.id }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -239,8 +247,11 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should delete single alert', async () => { - await createAlert(); - const secondAlert = await createAlertManualCleanup(); + await createAlert({ + supertest, + objectRemover, + }); + const secondAlert = await createAlertManualCleanup({ supertest }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(secondAlert.name); @@ -262,7 +273,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should mute all selection', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ supertest, objectRemover }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -285,7 +296,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should unmute all selection', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ supertest, objectRemover }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -307,7 +318,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should disable all selection', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ supertest, objectRemover }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -328,7 +339,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should enable all selection', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ supertest, objectRemover }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(createdAlert.name); @@ -352,7 +363,10 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { it('should delete all selection', async () => { const namePrefix = generateUniqueKey(); - const createdAlert = await createAlertManualCleanup({ name: `${namePrefix}-1` }); + const createdAlert = await createAlertManualCleanup({ + supertest, + overwrites: { name: `${namePrefix}-1` }, + }); await refreshAlertsList(); await pageObjects.triggersActionsUI.searchAlerts(namePrefix); @@ -376,8 +390,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should filter alerts by the status', async () => { - await createAlert(); - const failingAlert = await createFailingAlert(); + await createAlert({ supertest, objectRemover }); + const failingAlert = await createFailingAlert({ supertest, objectRemover }); // initialy alert get Pending status, so we need to retry refresh list logic to get the post execution statuses await retry.try(async () => { await refreshAlertsList(); @@ -398,7 +412,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should display total alerts by status and error banner only when exists alerts with status error', async () => { - const createdAlert = await createAlert(); + const createdAlert = await createAlert({ supertest, objectRemover }); await retry.try(async () => { await refreshAlertsList(); const refreshResults = await pageObjects.triggersActionsUI.getAlertsListWithStatus(); @@ -414,7 +428,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); expect(alertsErrorBannerWhenNoErrors).to.have.length(0); - await createFailingAlert(); + await createFailingAlert({ supertest, objectRemover }); await retry.try(async () => { await refreshAlertsList(); const alertsErrorBannerExistErrors = await find.allByCssSelector( @@ -438,8 +452,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should filter alerts by the alert type', async () => { - await createAlert(); - const failingAlert = await createFailingAlert(); + await createAlert({ supertest, objectRemover }); + const failingAlert = await createFailingAlert({ supertest, objectRemover }); await refreshAlertsList(); await testSubjects.click('alertTypeFilterButton'); expect(await (await testSubjects.find('alertType0Group')).getVisibleText()).to.eql('Alerts'); @@ -455,16 +469,23 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should filter alerts by the action type', async () => { - await createAlert(); - const action = await createAction(); + await createAlert({ + supertest, + objectRemover, + }); + const action = await createAction({ supertest, objectRemover }); const noopAlertWithAction = await createAlert({ - actions: [ - { - id: action.id, - group: 'default', - params: { level: 'info', message: 'gfghfhg' }, - }, - ], + supertest, + objectRemover, + overwrites: { + actions: [ + { + id: action.id, + group: 'default', + params: { level: 'info', message: 'gfghfhg' }, + }, + ], + }, }); await refreshAlertsList(); await testSubjects.click('actionTypeFilterButton'); diff --git a/x-pack/test/functional_with_es_ssl/lib/alert_api_actions.ts b/x-pack/test/functional_with_es_ssl/lib/alert_api_actions.ts new file mode 100644 index 00000000000000..40e567c2998268 --- /dev/null +++ b/x-pack/test/functional_with_es_ssl/lib/alert_api_actions.ts @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ObjectRemover } from './object_remover'; +import { getTestAlertData, getTestActionData } from './get_test_data'; + +export async function createAlertManualCleanup({ + supertest, + overwrites = {}, +}: { + supertest: any; + overwrites?: Record; +}) { + const { body: createdAlert } = await supertest + .post('/api/alerting/rule') + .set('kbn-xsrf', 'foo') + .send(getTestAlertData(overwrites)) + .expect(200); + return createdAlert; +} + +export async function createFailingAlert({ + supertest, + objectRemover, +}: { + supertest: any; + objectRemover: ObjectRemover; +}) { + return await createAlert({ + supertest, + overwrites: { + rule_type_id: 'test.failing', + schedule: { interval: '30s' }, + }, + objectRemover, + }); +} + +export async function createAlert({ + supertest, + objectRemover, + overwrites = {}, +}: { + supertest: any; + objectRemover: ObjectRemover; + overwrites?: Record; +}) { + const createdAlert = await createAlertManualCleanup({ supertest, overwrites }); + objectRemover.add(createdAlert.id, 'alert', 'alerts'); + return createdAlert; +} + +export async function createAction({ + supertest, + objectRemover, + overwrites = {}, +}: { + supertest: any; + objectRemover: ObjectRemover; + overwrites?: Record; +}) { + const { body: createdAction } = await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send(getTestActionData(overwrites)) + .expect(200); + objectRemover.add(createdAction.id, 'action', 'actions'); + return createdAction; +} + +export async function muteAlert({ supertest, alertId }: { supertest: any; alertId: string }) { + const { body: alert } = await supertest + .post(`/api/alerting/rule/${alertId}/_mute_all`) + .set('kbn-xsrf', 'foo'); + return alert; +} + +export async function disableAlert({ supertest, alertId }: { supertest: any; alertId: string }) { + const { body: alert } = await supertest + .post(`/api/alerting/rule/${alertId}/_disable`) + .set('kbn-xsrf', 'foo'); + return alert; +} diff --git a/x-pack/test/observability_functional/apps/observability/alerts/index.ts b/x-pack/test/observability_functional/apps/observability/alerts/index.ts index 3abf04ed29e670..12a83f19ca2580 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/index.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/index.ts @@ -7,6 +7,13 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; +import { ObjectRemover } from '../../../../functional_with_es_ssl/lib/object_remover'; +import { + createAlert, + disableAlert, + muteAlert, +} from '../../../../functional_with_es_ssl/lib/alert_api_actions'; +import { generateUniqueKey } from '../../../../functional_with_es_ssl/lib/get_test_data'; async function asyncForEach(array: T[], callback: (item: T, index: number) => void) { for (let index = 0; index < array.length; index++) { @@ -21,6 +28,8 @@ const TOTAL_ALERTS_CELL_COUNT = 165; export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const find = getService('find'); + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); describe('Observability alerts', function () { this.tags('includeFirefox'); @@ -236,6 +245,65 @@ export default ({ getService }: FtrProviderContext) => { expect(await find.existsByCssSelector('[title="Rules and Connectors"]')).to.eql(true); }); }); + + describe('Stat counters', () => { + beforeEach(async () => { + const uniqueKey = generateUniqueKey(); + + const alertToDisable = await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'b', tags: [uniqueKey] }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'c', tags: [uniqueKey] }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'a', tags: [uniqueKey] }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'd', tags: [uniqueKey] }, + }); + await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'e', tags: [uniqueKey] }, + }); + const alertToMute = await createAlert({ + supertest, + objectRemover, + overwrites: { name: 'f', tags: [uniqueKey] }, + }); + + await disableAlert({ supertest, alertId: alertToDisable.id }); + await muteAlert({ supertest, alertId: alertToMute.id }); + + await observability.alerts.common.navigateToTimeWithData(); + }); + + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('Exist and display expected values', async () => { + const subjToValueMap: { [key: string]: number } = { + statRuleCount: 6, + statDisabled: 1, + statMuted: 1, + statErrors: 0, + }; + await asyncForEach(Object.keys(subjToValueMap), async (subject: string) => { + const value = await observability.alerts.common.getAlertStatValue(subject); + expect(value).to.be(subjToValueMap[subject]); + }); + }); + }); }); }); }; diff --git a/x-pack/test/observability_functional/with_rac_write.config.ts b/x-pack/test/observability_functional/with_rac_write.config.ts index dcf6b121d62584..71a1de1df6a77e 100644 --- a/x-pack/test/observability_functional/with_rac_write.config.ts +++ b/x-pack/test/observability_functional/with_rac_write.config.ts @@ -6,10 +6,26 @@ */ import { readFileSync } from 'fs'; -import { resolve } from 'path'; +import { resolve, join } from 'path'; import { CA_CERT_PATH } from '@kbn/dev-utils'; import { FtrConfigProviderContext } from '@kbn/test'; +// .server-log is specifically not enabled +const enabledActionTypes = [ + '.email', + '.index', + '.pagerduty', + '.swimlane', + '.servicenow', + '.slack', + '.webhook', + 'test.authorization', + 'test.failing', + 'test.index-record', + 'test.noop', + 'test.rate-limit', +]; + export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xpackFunctionalConfig = await readConfigFile(require.resolve('../functional/config.js')); @@ -36,6 +52,38 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...xpackFunctionalConfig.get('kbnTestServer.serverArgs'), `--elasticsearch.hosts=https://${servers.elasticsearch.hostname}:${servers.elasticsearch.port}`, `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, + `--plugin-path=${join( + __dirname, + '..', + 'functional_with_es_ssl', + 'fixtures', + 'plugins', + 'alerts' + )}`, + `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, + `--xpack.actions.preconfiguredAlertHistoryEsIndex=false`, + `--xpack.actions.preconfigured=${JSON.stringify({ + 'my-slack1': { + actionTypeId: '.slack', + name: 'Slack#xyztest', + secrets: { + webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz', + }, + }, + 'my-server-log': { + actionTypeId: '.server-log', + name: 'Serverlog#xyz', + }, + 'my-email-connector': { + actionTypeId: '.email', + name: 'Email#test-preconfigured-email', + config: { + from: 'me@example.com', + host: 'localhost', + port: '1025', + }, + }, + })}`, ], }, uiSettings: { From 92a8636f0ff63ab072527574e96e6616327b2ea4 Mon Sep 17 00:00:00 2001 From: Tyler Smalley Date: Thu, 2 Dec 2021 16:27:41 -0800 Subject: [PATCH 080/126] Upgrade Typescript to 4.3.5 (#104470) Co-authored-by: Mikhail Shustov Co-authored-by: Dario Gieselaar Co-authored-by: CJ Cenizal Co-authored-by: Justin Kambic Co-authored-by: Stratoula Kalafateli Co-authored-by: Jean-Louis Leysens Co-authored-by: Kyle Pollich Co-authored-by: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Co-authored-by: Kevin Qualters Co-authored-by: Candace Park Co-authored-by: Brian Seeders Co-authored-by: spalger --- ...core-public.scopedhistory._constructor_.md | 4 +- ...-plugin-core-public.scopedhistory.block.md | 2 +- ...e-public.scopedhistory.createsubhistory.md | 2 +- ...kibana-plugin-core-public.scopedhistory.md | 4 +- ...lugin-core-server.kibanaresponsefactory.md | 32 +- package.json | 10 +- packages/kbn-alerts/BUILD.bazel | 2 - packages/kbn-alerts/tsconfig.json | 2 +- .../buid_api_declaration.test.ts | 3 +- .../build_basic_api_declaration.ts | 2 +- .../build_api_declarations/js_doc_utils.ts | 4 +- .../src/api_docs/mdx/write_plugin_mdx_docs.ts | 2 +- .../src/api_docs/tests/api_doc_suite.test.ts | 2 +- .../api_docs/tests/snapshots/plugin_a.json | 6 +- .../src/api_docs/tests/snapshots/plugin_a.mdx | 2 +- .../api_docs/tests/snapshots/plugin_a_foo.mdx | 2 +- .../src/api_docs/tests/snapshots/plugin_b.mdx | 2 +- packages/kbn-field-types/BUILD.bazel | 1 - packages/kbn-optimizer/BUILD.bazel | 2 - packages/kbn-pm/dist/index.js | 8490 +++++++---------- packages/kbn-react-field/BUILD.bazel | 1 - packages/kbn-react-field/tsconfig.json | 1 - .../BUILD.bazel | 2 - .../tsconfig.json | 2 +- packages/kbn-storybook/src/webpack.config.ts | 6 +- packages/kbn-test/src/jest/run.ts | 5 +- .../kbn-typed-react-router-config/BUILD.bazel | 1 + .../src/create_router.test.tsx | 2 + .../src/create_router.ts | 14 +- .../src/types/index.ts | 20 +- packages/kbn-ui-shared-deps-npm/BUILD.bazel | 2 - packages/kbn-ui-shared-deps-npm/tsconfig.json | 1 - packages/kbn-ui-shared-deps-src/tsconfig.json | 1 - src/core/public/application/scoped_history.ts | 11 +- src/core/public/chrome/chrome_service.tsx | 2 +- src/core/public/core_app/core_app.ts | 4 +- .../public/doc_links/doc_links_service.ts | 2 +- .../fatal_errors/fatal_errors_service.tsx | 2 +- .../integrations/integrations_service.ts | 2 +- .../notifications/notifications_service.ts | 4 +- src/core/public/public.api.md | 7 +- .../public/rendering/rendering_service.tsx | 2 +- src/core/public/theme/theme_service.ts | 2 +- .../public/ui_settings/ui_settings_service.ts | 2 +- .../server/context/container/context.mock.ts | 1 - src/core/server/context/context_service.ts | 2 +- src/core/server/http/http_service.mock.ts | 13 +- src/core/server/http/http_service.ts | 4 +- src/core/server/http/router/headers.ts | 16 +- src/core/server/i18n/i18n_service.ts | 4 +- src/core/server/logging/logging_service.ts | 2 +- src/core/server/metrics/metrics_service.ts | 2 +- src/core/server/server.api.md | 33 +- src/core/server/status/status_service.ts | 2 +- src/core/types/elasticsearch/search.ts | 36 +- src/dev/build/build_distributables.ts | 8 +- src/dev/precommit_hook/casing_check_config.js | 1 + src/dev/typescript/run_type_check_cli.ts | 2 +- .../models/sense_editor/sense_editor.ts | 4 +- .../embeddable/grid/dashboard_grid.tsx | 6 +- .../search_interceptor/search_interceptor.ts | 9 +- .../data/public/ui/search_bar/search_bar.tsx | 2 +- .../data/server/search/collectors/usage.ts | 8 +- .../editors/number/number.tsx | 2 +- .../components/scripting_help/test_script.tsx | 2 +- .../components/field_editor/field_editor.tsx | 2 +- .../main/services/discover_search_session.ts | 4 +- src/plugins/discover/public/build_services.ts | 6 +- .../discover/public/kibana_services.ts | 4 +- .../attribute_service/attribute_service.tsx | 12 +- .../embeddable_state_transfer.ts | 4 +- .../common/execution/execution_contract.ts | 6 +- .../expression_types/expression_type.ts | 4 +- .../common/field_formats_registry.ts | 6 +- .../components/vis/input_control_vis.tsx | 6 +- .../public/components/add_data/add_data.tsx | 13 +- .../components/manage_data/manage_data.tsx | 13 +- .../control_group_container_factory.ts | 1 - .../utils/use/use_editor_updates.test.ts | 5 +- test/tsconfig.json | 2 +- tsconfig.base.json | 4 +- typings/resize-observer-polyfill/index.d.ts | 10 + .../drilldown.tsx | 8 +- x-pack/plugins/apm/kibana.json | 4 +- .../plugins/apm/public/application/uxApp.tsx | 1 + .../app/service_inventory/index.tsx | 4 +- .../service_map/Popover/backend_contents.tsx | 1 + .../components/shared/managed_table/index.tsx | 1 + .../shared/time_comparison/index.tsx | 1 + .../apm/public/hooks/use_apm_router.ts | 4 +- .../create_apm_event_client/index.test.ts | 6 +- .../create_apm_event_client/index.ts | 226 +- .../apm/server/lib/helpers/setup_request.ts | 7 +- .../get_transaction_group_stats.ts | 6 +- x-pack/plugins/apm/server/plugin.ts | 6 +- ...ister_transaction_error_rate_alert_type.ts | 38 +- .../apm/server/routes/data_view/route.ts | 13 +- .../get_error_group_main_statistics.ts | 1 + .../service_map/get_service_anomalies.ts | 1 + ...ervice_instances_transaction_statistics.ts | 1 + .../settings/apm_indices/get_apm_indices.ts | 2 +- .../server/routes/traces/get_trace_items.ts | 6 +- x-pack/plugins/apm/server/routes/typings.ts | 11 +- x-pack/plugins/apm/server/types.ts | 160 +- .../abstract_dashboard_drilldown.tsx | 13 +- .../utils/saved_search_utils.test.ts | 2 +- .../accordion_list.test.tsx | 4 +- .../components/crawl_requests_table.test.tsx | 2 + .../components/crawl_requests_table.tsx | 7 +- .../credentials_list.test.tsx | 4 +- .../ignored_queries_panel.test.tsx | 1 + .../error_pages/components/no_data_layout.tsx | 2 +- .../field_manager/field_manager.test.tsx | 2 +- .../graph/public/state_management/fields.ts | 4 +- .../public/state_management/persistence.ts | 16 +- .../graph/public/state_management/store.ts | 2 +- .../public/state_management/workspace.ts | 12 +- .../plugins/graph/public/types/app_state.ts | 2 +- .../components/mappings_editor/reducer.ts | 2 - .../expression_editor/criterion.tsx | 6 +- .../log_text_stream/loading_item_view.tsx | 2 +- .../pipelines_create/pipelines_create.tsx | 10 +- .../maps/public/actions/layer_actions.ts | 8 +- .../tooltip_selector/tooltip_selector.tsx | 2 + .../feature_geometry_filter_form.tsx | 4 +- .../ml/server/lib/alerts/alerting_service.ts | 3 +- .../data_recognizer/data_recognizer.test.ts | 2 +- .../public/routes/live_queries/new/index.tsx | 6 +- .../reporting_api_client.ts | 8 +- .../rule_data_client/rule_data_client.mock.ts | 1 + .../utils/create_lifecycle_executor.test.ts | 1 + .../utils/create_lifecycle_rule_type.test.ts | 1 + .../management/users/edit_user/user_form.tsx | 2 +- .../common/endpoint/schema/trusted_apps.ts | 6 +- .../security_solution/cypress/tsconfig.json | 1 - .../public/common/mock/utils.ts | 2 +- .../detection_engine/rules/helpers.test.tsx | 3 +- .../public/management/index.ts | 2 +- .../view/side_effect_simulator_factory.ts | 9 +- .../timelines/components/timeline/styles.tsx | 4 +- .../signals/query_signals_route.test.ts | 1 + .../detection_engine/signals/utils.test.ts | 2 +- .../security_solution/index.ts | 16 +- .../public/components/t_grid/styles.tsx | 4 +- .../lib/reindexing/credential_store.test.ts | 18 +- .../monitor_list/use_monitor_histogram.ts | 1 + .../uptime/public/state/alerts/alerts.ts | 8 +- .../uptime/public/state/effects/alerts.ts | 32 +- .../public/state/effects/fetch_effect.ts | 4 +- .../uptime/public/state/effects/journey.ts | 8 +- .../uptime/public/state/effects/ml_anomaly.ts | 30 +- .../public/state/effects/network_events.ts | 47 +- x-pack/plugins/uptime/public/state/index.ts | 3 +- .../uptime/public/state/selectors/index.ts | 2 +- .../server/lib/requests/get_monitor_status.ts | 1 + .../lib/requests/get_ping_histogram.test.ts | 38 + .../server/lib/requests/get_ping_histogram.ts | 2 +- .../services/observability/users.ts | 1 - yarn.lock | 81 +- 159 files changed, 4022 insertions(+), 5878 deletions(-) create mode 100644 typings/resize-observer-polyfill/index.d.ts diff --git a/docs/development/core/public/kibana-plugin-core-public.scopedhistory._constructor_.md b/docs/development/core/public/kibana-plugin-core-public.scopedhistory._constructor_.md index 32b0950aa1065d..67264a26ac5dbf 100644 --- a/docs/development/core/public/kibana-plugin-core-public.scopedhistory._constructor_.md +++ b/docs/development/core/public/kibana-plugin-core-public.scopedhistory._constructor_.md @@ -9,13 +9,13 @@ Constructs a new instance of the `ScopedHistory` class Signature: ```typescript -constructor(parentHistory: History, basePath: string); +constructor(parentHistory: History, basePath: string); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| parentHistory | History | | +| parentHistory | History<HistoryLocationState> | | | basePath | string | | diff --git a/docs/development/core/public/kibana-plugin-core-public.scopedhistory.block.md b/docs/development/core/public/kibana-plugin-core-public.scopedhistory.block.md index eb632465e46990..acbb06c6aa6ece 100644 --- a/docs/development/core/public/kibana-plugin-core-public.scopedhistory.block.md +++ b/docs/development/core/public/kibana-plugin-core-public.scopedhistory.block.md @@ -9,5 +9,5 @@ Add a block prompt requesting user confirmation when navigating away from the cu Signature: ```typescript -block: (prompt?: string | boolean | History.TransitionPromptHook | undefined) => UnregisterCallback; +block: (prompt?: string | boolean | TransitionPromptHook | undefined) => UnregisterCallback; ``` diff --git a/docs/development/core/public/kibana-plugin-core-public.scopedhistory.createsubhistory.md b/docs/development/core/public/kibana-plugin-core-public.scopedhistory.createsubhistory.md index a976eeed912b2a..7c5dfccb5b008c 100644 --- a/docs/development/core/public/kibana-plugin-core-public.scopedhistory.createsubhistory.md +++ b/docs/development/core/public/kibana-plugin-core-public.scopedhistory.createsubhistory.md @@ -9,5 +9,5 @@ Creates a `ScopedHistory` for a subpath of this `ScopedHistory`. Useful Signature: ```typescript -createSubHistory: (basePath: string) => ScopedHistory; +createSubHistory: (basePath: string) => ScopedHistory; ``` diff --git a/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md b/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md index 0d04fc3d6a8603..a3c369b143b4a7 100644 --- a/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md +++ b/docs/development/core/public/kibana-plugin-core-public.scopedhistory.md @@ -28,9 +28,9 @@ export declare class ScopedHistory implements Hi | Property | Modifiers | Type | Description | | --- | --- | --- | --- | | [action](./kibana-plugin-core-public.scopedhistory.action.md) | | Action | The last action dispatched on the history stack. | -| [block](./kibana-plugin-core-public.scopedhistory.block.md) | | (prompt?: string \| boolean \| History.TransitionPromptHook<HistoryLocationState> \| undefined) => UnregisterCallback | Add a block prompt requesting user confirmation when navigating away from the current page. | +| [block](./kibana-plugin-core-public.scopedhistory.block.md) | | (prompt?: string \| boolean \| TransitionPromptHook<HistoryLocationState> \| undefined) => UnregisterCallback | Add a block prompt requesting user confirmation when navigating away from the current page. | | [createHref](./kibana-plugin-core-public.scopedhistory.createhref.md) | | (location: LocationDescriptorObject<HistoryLocationState>, { prependBasePath }?: { prependBasePath?: boolean \| undefined; }) => Href | Creates an href (string) to the location. If prependBasePath is true (default), it will prepend the location's path with the scoped history basePath. | -| [createSubHistory](./kibana-plugin-core-public.scopedhistory.createsubhistory.md) | | <SubHistoryLocationState = unknown>(basePath: string) => ScopedHistory<SubHistoryLocationState> | Creates a ScopedHistory for a subpath of this ScopedHistory. Useful for applications that may have sub-apps that do not need access to the containing application's history. | +| [createSubHistory](./kibana-plugin-core-public.scopedhistory.createsubhistory.md) | | (basePath: string) => ScopedHistory<HistoryLocationState> | Creates a ScopedHistory for a subpath of this ScopedHistory. Useful for applications that may have sub-apps that do not need access to the containing application's history. | | [go](./kibana-plugin-core-public.scopedhistory.go.md) | | (n: number) => void | Send the user forward or backwards in the history stack. | | [goBack](./kibana-plugin-core-public.scopedhistory.goback.md) | | () => void | Send the user one location back in the history stack. Equivalent to calling [ScopedHistory.go(-1)](./kibana-plugin-core-public.scopedhistory.go.md). If no more entries are available backwards, this is a no-op. | | [goForward](./kibana-plugin-core-public.scopedhistory.goforward.md) | | () => void | Send the user one location forward in the history stack. Equivalent to calling [ScopedHistory.go(1)](./kibana-plugin-core-public.scopedhistory.go.md). If no more entries are available forwards, this is a no-op. | diff --git a/docs/development/core/server/kibana-plugin-core-server.kibanaresponsefactory.md b/docs/development/core/server/kibana-plugin-core-server.kibanaresponsefactory.md index b2e2b4bc6003f0..91cb6c370d759e 100644 --- a/docs/development/core/server/kibana-plugin-core-server.kibanaresponsefactory.md +++ b/docs/development/core/server/kibana-plugin-core-server.kibanaresponsefactory.md @@ -12,14 +12,32 @@ Set of helpers used to create `KibanaResponse` to form HTTP response on an incom kibanaResponseFactory: { custom: | Error | Buffer | Stream | { message: string | Error; - attributes?: Record | undefined; + attributes?: ResponseErrorAttributes | undefined; } | undefined>(options: CustomHttpResponseOptions) => KibanaResponse; - badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse; - unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse; - forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse; - notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse; - conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse; - customError: (options: CustomHttpResponseOptions) => KibanaResponse; + badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse; + unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse; + forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse; + notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse; + conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse; + customError: (options: CustomHttpResponseOptions) => KibanaResponse; redirected: (options: RedirectResponseOptions) => KibanaResponse | Buffer | Stream>; ok: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; accepted: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; diff --git a/package.json b/package.json index 75da2784a391b5..06e338ab87ca76 100644 --- a/package.json +++ b/package.json @@ -88,9 +88,9 @@ "**/react-syntax-highlighter": "^15.3.1", "**/react-syntax-highlighter/**/highlight.js": "^10.4.1", "**/trim": "1.0.1", - "**/typescript": "4.1.3", + "**/typescript": "4.3.5", "**/underscore": "^1.13.1", - "globby/fast-glob": "3.2.5" + "globby/fast-glob": "3.2.7" }, "dependencies": { "@babel/runtime": "^7.16.3", @@ -538,7 +538,7 @@ "@types/hapi__inert": "^5.2.3", "@types/has-ansi": "^3.0.0", "@types/he": "^1.1.1", - "@types/history": "^4.7.3", + "@types/history": "^4.7.9", "@types/hjson": "^2.4.2", "@types/http-proxy": "^1.17.4", "@types/http-proxy-agent": "^2.0.2", @@ -823,9 +823,9 @@ "terser-webpack-plugin": "^4.2.3", "tough-cookie": "^4.0.0", "ts-loader": "^7.0.5", - "ts-morph": "^9.1.0", + "ts-morph": "^11.0.0", "tsd": "^0.13.1", - "typescript": "4.1.3", + "typescript": "4.3.5", "unlazy-loader": "^0.1.3", "url-loader": "^2.2.0", "val-loader": "^1.1.1", diff --git a/packages/kbn-alerts/BUILD.bazel b/packages/kbn-alerts/BUILD.bazel index 15dbc163cd2888..a6e5f167735c01 100644 --- a/packages/kbn-alerts/BUILD.bazel +++ b/packages/kbn-alerts/BUILD.bazel @@ -34,13 +34,11 @@ RUNTIME_DEPS = [ "@npm//@elastic/eui", "@npm//enzyme", "@npm//react", - "@npm//resize-observer-polyfill", ] TYPES_DEPS = [ "//packages/kbn-i18n:npm_module_types", "@npm//@elastic/eui", - "@npm//resize-observer-polyfill", "@npm//tslib", "@npm//@types/enzyme", "@npm//@types/jest", diff --git a/packages/kbn-alerts/tsconfig.json b/packages/kbn-alerts/tsconfig.json index fa18a407443548..ac523fb77a9e1a 100644 --- a/packages/kbn-alerts/tsconfig.json +++ b/packages/kbn-alerts/tsconfig.json @@ -8,7 +8,7 @@ "rootDir": "src", "sourceMap": true, "sourceRoot": "../../../../packages/kbn-alerts/src", - "types": ["jest", "node", "resize-observer-polyfill"] + "types": ["jest", "node"] }, "include": ["src/**/*"], } diff --git a/packages/kbn-docs-utils/src/api_docs/build_api_declarations/buid_api_declaration.test.ts b/packages/kbn-docs-utils/src/api_docs/build_api_declarations/buid_api_declaration.test.ts index 6697dfe53ee36e..75c0bf4985b84b 100644 --- a/packages/kbn-docs-utils/src/api_docs/build_api_declarations/buid_api_declaration.test.ts +++ b/packages/kbn-docs-utils/src/api_docs/build_api_declarations/buid_api_declaration.test.ts @@ -114,7 +114,8 @@ it('Function inside interface has a label', () => { expect(fn?.type).toBe(TypeKind.FunctionKind); }); -it('Test ReactElement signature', () => { +// FAILING: https://github.com/elastic/kibana/issues/120125 +it.skip('Test ReactElement signature', () => { const node = nodes.find((n) => getNodeName(n) === 'AReactElementFn'); expect(node).toBeDefined(); const def = buildApiDeclarationTopNode(node!, { diff --git a/packages/kbn-docs-utils/src/api_docs/build_api_declarations/build_basic_api_declaration.ts b/packages/kbn-docs-utils/src/api_docs/build_api_declarations/build_basic_api_declaration.ts index d9538467a09847..cb0928fa3763d7 100644 --- a/packages/kbn-docs-utils/src/api_docs/build_api_declarations/build_basic_api_declaration.ts +++ b/packages/kbn-docs-utils/src/api_docs/build_api_declarations/build_basic_api_declaration.ts @@ -48,7 +48,7 @@ export function buildBasicApiDeclaration(node: Node, opts: BuildApiDecOpts): Api signature: getSignature(node, opts.plugins, opts.log), path: getSourceForNode(node), deprecated, - removeBy: removeByTag ? removeByTag.getComment() : undefined, + removeBy: removeByTag ? removeByTag.getCommentText() : undefined, }; return { ...apiDec, diff --git a/packages/kbn-docs-utils/src/api_docs/build_api_declarations/js_doc_utils.ts b/packages/kbn-docs-utils/src/api_docs/build_api_declarations/js_doc_utils.ts index 55639f16d7a97b..7b6ac5a6ec5f67 100644 --- a/packages/kbn-docs-utils/src/api_docs/build_api_declarations/js_doc_utils.ts +++ b/packages/kbn-docs-utils/src/api_docs/build_api_declarations/js_doc_utils.ts @@ -43,14 +43,14 @@ export function getJSDocs(node: Node): JSDoc[] | undefined { export function getJSDocReturnTagComment(node: Node | JSDoc[]): TextWithLinks { const tags = getJSDocTags(node); const returnTag = tags.find((tag) => Node.isJSDocReturnTag(tag)); - if (returnTag) return getTextWithLinks(returnTag.getComment()); + if (returnTag) return getTextWithLinks(returnTag.getCommentText()); return []; } export function getJSDocParamComment(node: Node | JSDoc[], name: string): TextWithLinks { const tags = getJSDocTags(node); const paramTag = tags.find((tag) => Node.isJSDocParameterTag(tag) && tag.getName() === name); - if (paramTag) return getTextWithLinks(paramTag.getComment()); + if (paramTag) return getTextWithLinks(paramTag.getCommentText()); return []; } diff --git a/packages/kbn-docs-utils/src/api_docs/mdx/write_plugin_mdx_docs.ts b/packages/kbn-docs-utils/src/api_docs/mdx/write_plugin_mdx_docs.ts index aae77a75089541..fabe55d93c8ef2 100644 --- a/packages/kbn-docs-utils/src/api_docs/mdx/write_plugin_mdx_docs.ts +++ b/packages/kbn-docs-utils/src/api_docs/mdx/write_plugin_mdx_docs.ts @@ -98,7 +98,7 @@ ${ **Code health stats** -| Public API count | Any count | Items lacking comments | Missing exports | +| Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| | ${pluginStats.apiCount} | ${pluginStats.isAnyType.length} | ${ pluginStats.missingComments.length diff --git a/packages/kbn-docs-utils/src/api_docs/tests/api_doc_suite.test.ts b/packages/kbn-docs-utils/src/api_docs/tests/api_doc_suite.test.ts index 7708eca0ec67a5..cf536ce5158c11 100644 --- a/packages/kbn-docs-utils/src/api_docs/tests/api_doc_suite.test.ts +++ b/packages/kbn-docs-utils/src/api_docs/tests/api_doc_suite.test.ts @@ -330,7 +330,7 @@ describe('Types', () => { "section": "def-public.MyProps", "text": "MyProps", }, - ">", + ", string | React.JSXElementConstructor>", ] `); }); diff --git a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.json b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.json index 0eb9438ce594f2..a3b3cdcbe28d00 100644 --- a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.json +++ b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.json @@ -76,7 +76,7 @@ "label": "component", "description": [], "signature": [ - "React.ComponentClass<{}, any> | React.FunctionComponent<{}> | undefined" + "React.ComponentType<{}> | undefined" ], "path": "packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/classes.ts", "deprecated": false @@ -1241,7 +1241,7 @@ "section": "def-public.MyProps", "text": "MyProps" }, - ">" + ", string | React.JSXElementConstructor>" ], "path": "packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/types.ts", "deprecated": false, @@ -2356,7 +2356,7 @@ "deprecated": false, "children": [], "returnComment": [ - "The currently selected {@link SearchLanguage}" + "The currently selected {@link SearchLanguage }" ] } ], diff --git a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.mdx b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.mdx index 44223783ada577..f6a7893fe5998b 100644 --- a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.mdx +++ b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a.mdx @@ -16,7 +16,7 @@ Contact Kibana Core for questions regarding this plugin. **Code health stats** -| Public API count | Any count | Items lacking comments | Missing exports | +| Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| | 131 | 1 | 71 | 2 | diff --git a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a_foo.mdx b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a_foo.mdx index b27d6d2de2f8f5..13754ad452b014 100644 --- a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a_foo.mdx +++ b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_a_foo.mdx @@ -16,7 +16,7 @@ Contact Kibana Core for questions regarding this plugin. **Code health stats** -| Public API count | Any count | Items lacking comments | Missing exports | +| Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| | 131 | 1 | 71 | 2 | diff --git a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_b.mdx b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_b.mdx index df0dec00544973..afc42a59ee96da 100644 --- a/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_b.mdx +++ b/packages/kbn-docs-utils/src/api_docs/tests/snapshots/plugin_b.mdx @@ -16,7 +16,7 @@ Contact Kibana Core for questions regarding this plugin. **Code health stats** -| Public API count | Any count | Items lacking comments | Missing exports | +| Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| | 2 | 0 | 2 | 0 | diff --git a/packages/kbn-field-types/BUILD.bazel b/packages/kbn-field-types/BUILD.bazel index 1fb97a5914ee45..0492829dd53207 100644 --- a/packages/kbn-field-types/BUILD.bazel +++ b/packages/kbn-field-types/BUILD.bazel @@ -38,7 +38,6 @@ TYPES_DEPS = [ "@npm//@types/node", "@npm//@types/node-forge", "@npm//@types/testing-library__jest-dom", - "@npm//resize-observer-polyfill", "@npm//@emotion/react", "@npm//jest-styled-components", ] diff --git a/packages/kbn-optimizer/BUILD.bazel b/packages/kbn-optimizer/BUILD.bazel index 485e5f1044aa32..647fcdfcbaad32 100644 --- a/packages/kbn-optimizer/BUILD.bazel +++ b/packages/kbn-optimizer/BUILD.bazel @@ -51,7 +51,6 @@ RUNTIME_DEPS = [ "@npm//node-sass", "@npm//normalize-path", "@npm//pirates", - "@npm//resize-observer-polyfill", "@npm//rxjs", "@npm//source-map-support", "@npm//watchpack", @@ -77,7 +76,6 @@ TYPES_DEPS = [ "@npm//jest-diff", "@npm//lmdb-store", "@npm//pirates", - "@npm//resize-observer-polyfill", "@npm//rxjs", "@npm//zlib", "@npm//@types/compression-webpack-plugin", diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index ab8b9766f28d0c..c1d0f69e4ea073 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -94,21 +94,21 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _cli__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "run", function() { return _cli__WEBPACK_IMPORTED_MODULE_0__["run"]; }); -/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(569); +/* harmony import */ var _production__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(563); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildBazelProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildBazelProductionProjects"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildNonBazelProductionProjects", function() { return _production__WEBPACK_IMPORTED_MODULE_1__["buildNonBazelProductionProjects"]; }); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(346); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(340); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjects", function() { return _utils_projects__WEBPACK_IMPORTED_MODULE_2__["getProjects"]; }); -/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(348); +/* harmony import */ var _utils_project__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(342); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Project", function() { return _utils_project__WEBPACK_IMPORTED_MODULE_3__["Project"]; }); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(349); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(343); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transformDependencies", function() { return _utils_package_json__WEBPACK_IMPORTED_MODULE_4__["transformDependencies"]; }); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(568); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(562); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getProjectPaths", function() { return _config__WEBPACK_IMPORTED_MODULE_5__["getProjectPaths"]; }); /* @@ -141,7 +141,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(5); /* harmony import */ var _kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils_tooling_log__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _commands__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(129); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(563); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(557); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(220); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one @@ -8811,12 +8811,12 @@ exports.ToolingLogCollectingWriter = ToolingLogCollectingWriter; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "commands", function() { return commands; }); /* harmony import */ var _bootstrap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(130); -/* harmony import */ var _build__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(533); -/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(534); -/* harmony import */ var _reset__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(558); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(559); -/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(561); -/* harmony import */ var _patch_native_modules__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(562); +/* harmony import */ var _build__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(527); +/* harmony import */ var _clean__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(528); +/* harmony import */ var _reset__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(552); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(553); +/* harmony import */ var _watch__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(555); +/* harmony import */ var _patch_native_modules__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(556); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -8855,11 +8855,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(220); /* harmony import */ var _utils_child_process__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(221); /* harmony import */ var _utils_link_project_executables__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(346); -/* harmony import */ var _utils_yarn_lock__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(414); -/* harmony import */ var _utils_sort_package_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(417); -/* harmony import */ var _utils_validate_dependencies__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(425); -/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(427); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(340); +/* harmony import */ var _utils_yarn_lock__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(408); +/* harmony import */ var _utils_sort_package_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(411); +/* harmony import */ var _utils_validate_dependencies__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(419); +/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(421); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -16552,7 +16552,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(132); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(345); +/* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(339); /* harmony import */ var ncp__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(ncp__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_4__); @@ -17966,12 +17966,12 @@ const {promisify} = __webpack_require__(113); const path = __webpack_require__(4); const globby = __webpack_require__(241); const isGlob = __webpack_require__(266); -const slash = __webpack_require__(336); +const slash = __webpack_require__(330); const gracefulFs = __webpack_require__(233); -const isPathCwd = __webpack_require__(338); -const isPathInside = __webpack_require__(339); -const rimraf = __webpack_require__(340); -const pMap = __webpack_require__(341); +const isPathCwd = __webpack_require__(332); +const isPathInside = __webpack_require__(333); +const rimraf = __webpack_require__(334); +const pMap = __webpack_require__(335); const rimrafP = promisify(rimraf); @@ -18095,9 +18095,9 @@ const arrayUnion = __webpack_require__(242); const merge2 = __webpack_require__(243); const glob = __webpack_require__(244); const fastGlob = __webpack_require__(257); -const dirGlob = __webpack_require__(332); -const gitignore = __webpack_require__(334); -const {FilterStream, UniqueStream} = __webpack_require__(337); +const dirGlob = __webpack_require__(326); +const gitignore = __webpack_require__(328); +const {FilterStream, UniqueStream} = __webpack_require__(331); const DEFAULT_FILTER = () => false; @@ -21708,73 +21708,73 @@ function slice (args) { /***/ (function(module, exports, __webpack_require__) { "use strict"; - -const taskManager = __webpack_require__(258); -const async_1 = __webpack_require__(293); -const stream_1 = __webpack_require__(328); -const sync_1 = __webpack_require__(329); -const settings_1 = __webpack_require__(331); -const utils = __webpack_require__(259); -async function FastGlob(source, options) { - assertPatternsInput(source); - const works = getWorks(source, async_1.default, options); - const result = await Promise.all(works); - return utils.array.flatten(result); -} -// https://github.com/typescript-eslint/typescript-eslint/issues/60 -// eslint-disable-next-line no-redeclare -(function (FastGlob) { - function sync(source, options) { - assertPatternsInput(source); - const works = getWorks(source, sync_1.default, options); - return utils.array.flatten(works); - } - FastGlob.sync = sync; - function stream(source, options) { - assertPatternsInput(source); - const works = getWorks(source, stream_1.default, options); - /** - * The stream returned by the provider cannot work with an asynchronous iterator. - * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. - * This affects performance (+25%). I don't see best solution right now. - */ - return utils.stream.merge(works); - } - FastGlob.stream = stream; - function generateTasks(source, options) { - assertPatternsInput(source); - const patterns = [].concat(source); - const settings = new settings_1.default(options); - return taskManager.generate(patterns, settings); - } - FastGlob.generateTasks = generateTasks; - function isDynamicPattern(source, options) { - assertPatternsInput(source); - const settings = new settings_1.default(options); - return utils.pattern.isDynamicPattern(source, settings); - } - FastGlob.isDynamicPattern = isDynamicPattern; - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escape(source); - } - FastGlob.escapePath = escapePath; -})(FastGlob || (FastGlob = {})); -function getWorks(source, _Provider, options) { - const patterns = [].concat(source); - const settings = new settings_1.default(options); - const tasks = taskManager.generate(patterns, settings); - const provider = new _Provider(settings); - return tasks.map(provider.read, provider); -} -function assertPatternsInput(input) { - const source = [].concat(input); - const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); - if (!isValidSource) { - throw new TypeError('Patterns must be a string (non empty) or an array of strings'); - } -} -module.exports = FastGlob; + +const taskManager = __webpack_require__(258); +const async_1 = __webpack_require__(287); +const stream_1 = __webpack_require__(322); +const sync_1 = __webpack_require__(323); +const settings_1 = __webpack_require__(325); +const utils = __webpack_require__(259); +async function FastGlob(source, options) { + assertPatternsInput(source); + const works = getWorks(source, async_1.default, options); + const result = await Promise.all(works); + return utils.array.flatten(result); +} +// https://github.com/typescript-eslint/typescript-eslint/issues/60 +// eslint-disable-next-line no-redeclare +(function (FastGlob) { + function sync(source, options) { + assertPatternsInput(source); + const works = getWorks(source, sync_1.default, options); + return utils.array.flatten(works); + } + FastGlob.sync = sync; + function stream(source, options) { + assertPatternsInput(source); + const works = getWorks(source, stream_1.default, options); + /** + * The stream returned by the provider cannot work with an asynchronous iterator. + * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. + * This affects performance (+25%). I don't see best solution right now. + */ + return utils.stream.merge(works); + } + FastGlob.stream = stream; + function generateTasks(source, options) { + assertPatternsInput(source); + const patterns = [].concat(source); + const settings = new settings_1.default(options); + return taskManager.generate(patterns, settings); + } + FastGlob.generateTasks = generateTasks; + function isDynamicPattern(source, options) { + assertPatternsInput(source); + const settings = new settings_1.default(options); + return utils.pattern.isDynamicPattern(source, settings); + } + FastGlob.isDynamicPattern = isDynamicPattern; + function escapePath(source) { + assertPatternsInput(source); + return utils.path.escape(source); + } + FastGlob.escapePath = escapePath; +})(FastGlob || (FastGlob = {})); +function getWorks(source, _Provider, options) { + const patterns = [].concat(source); + const settings = new settings_1.default(options); + const tasks = taskManager.generate(patterns, settings); + const provider = new _Provider(settings); + return tasks.map(provider.read, provider); +} +function assertPatternsInput(input) { + const source = [].concat(input); + const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); + if (!isValidSource) { + throw new TypeError('Patterns must be a string (non empty) or an array of strings'); + } +} +module.exports = FastGlob; /***/ }), @@ -21782,71 +21782,86 @@ module.exports = FastGlob; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0; -const utils = __webpack_require__(259); -function generate(patterns, settings) { - const positivePatterns = getPositivePatterns(patterns); - const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); - const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); - const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); - const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); - const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); - return staticTasks.concat(dynamicTasks); -} -exports.generate = generate; -function convertPatternsToTasks(positive, negative, dynamic) { - const positivePatternsGroup = groupPatternsByBaseDirectory(positive); - // When we have a global group – there is no reason to divide the patterns into independent tasks. - // In this case, the global task covers the rest. - if ('.' in positivePatternsGroup) { - const task = convertPatternGroupToTask('.', positive, negative, dynamic); - return [task]; - } - return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic); -} -exports.convertPatternsToTasks = convertPatternsToTasks; -function getPositivePatterns(patterns) { - return utils.pattern.getPositivePatterns(patterns); -} -exports.getPositivePatterns = getPositivePatterns; -function getNegativePatternsAsPositive(patterns, ignore) { - const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); - const positive = negative.map(utils.pattern.convertToPositivePattern); - return positive; -} -exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; -function groupPatternsByBaseDirectory(patterns) { - const group = {}; - return patterns.reduce((collection, pattern) => { - const base = utils.pattern.getBaseDirectory(pattern); - if (base in collection) { - collection[base].push(pattern); - } - else { - collection[base] = [pattern]; - } - return collection; - }, group); -} -exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; -function convertPatternGroupsToTasks(positive, negative, dynamic) { - return Object.keys(positive).map((base) => { - return convertPatternGroupToTask(base, positive[base], negative, dynamic); - }); -} -exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; -function convertPatternGroupToTask(base, positive, negative, dynamic) { - return { - dynamic, - positive, - negative, - base, - patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) - }; -} -exports.convertPatternGroupToTask = convertPatternGroupToTask; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0; +const utils = __webpack_require__(259); +function generate(patterns, settings) { + const positivePatterns = getPositivePatterns(patterns); + const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); + const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); + const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); + const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); + const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); + return staticTasks.concat(dynamicTasks); +} +exports.generate = generate; +/** + * Returns tasks grouped by basic pattern directories. + * + * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately. + * This is necessary because directory traversal starts at the base directory and goes deeper. + */ +function convertPatternsToTasks(positive, negative, dynamic) { + const tasks = []; + const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive); + const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive); + const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory); + const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory); + tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic)); + /* + * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory + * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest. + */ + if ('.' in insideCurrentDirectoryGroup) { + tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic)); + } + else { + tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic)); + } + return tasks; +} +exports.convertPatternsToTasks = convertPatternsToTasks; +function getPositivePatterns(patterns) { + return utils.pattern.getPositivePatterns(patterns); +} +exports.getPositivePatterns = getPositivePatterns; +function getNegativePatternsAsPositive(patterns, ignore) { + const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); + const positive = negative.map(utils.pattern.convertToPositivePattern); + return positive; +} +exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; +function groupPatternsByBaseDirectory(patterns) { + const group = {}; + return patterns.reduce((collection, pattern) => { + const base = utils.pattern.getBaseDirectory(pattern); + if (base in collection) { + collection[base].push(pattern); + } + else { + collection[base] = [pattern]; + } + return collection; + }, group); +} +exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; +function convertPatternGroupsToTasks(positive, negative, dynamic) { + return Object.keys(positive).map((base) => { + return convertPatternGroupToTask(base, positive[base], negative, dynamic); + }); +} +exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; +function convertPatternGroupToTask(base, positive, negative, dynamic) { + return { + dynamic, + positive, + negative, + base, + patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) + }; +} +exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), @@ -21854,23 +21869,23 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0; -const array = __webpack_require__(260); -exports.array = array; -const errno = __webpack_require__(261); -exports.errno = errno; -const fs = __webpack_require__(262); -exports.fs = fs; -const path = __webpack_require__(263); -exports.path = path; -const pattern = __webpack_require__(264); -exports.pattern = pattern; -const stream = __webpack_require__(291); -exports.stream = stream; -const string = __webpack_require__(292); -exports.string = string; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0; +const array = __webpack_require__(260); +exports.array = array; +const errno = __webpack_require__(261); +exports.errno = errno; +const fs = __webpack_require__(262); +exports.fs = fs; +const path = __webpack_require__(263); +exports.path = path; +const pattern = __webpack_require__(264); +exports.pattern = pattern; +const stream = __webpack_require__(285); +exports.stream = stream; +const string = __webpack_require__(286); +exports.string = string; /***/ }), @@ -21878,28 +21893,28 @@ exports.string = string; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.splitWhen = exports.flatten = void 0; -function flatten(items) { - return items.reduce((collection, item) => [].concat(collection, item), []); -} -exports.flatten = flatten; -function splitWhen(items, predicate) { - const result = [[]]; - let groupIndex = 0; - for (const item of items) { - if (predicate(item)) { - groupIndex++; - result[groupIndex] = []; - } - else { - result[groupIndex].push(item); - } - } - return result; -} -exports.splitWhen = splitWhen; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.splitWhen = exports.flatten = void 0; +function flatten(items) { + return items.reduce((collection, item) => [].concat(collection, item), []); +} +exports.flatten = flatten; +function splitWhen(items, predicate) { + const result = [[]]; + let groupIndex = 0; + for (const item of items) { + if (predicate(item)) { + groupIndex++; + result[groupIndex] = []; + } + else { + result[groupIndex].push(item); + } + } + return result; +} +exports.splitWhen = splitWhen; /***/ }), @@ -21907,13 +21922,13 @@ exports.splitWhen = splitWhen; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEnoentCodeError = void 0; -function isEnoentCodeError(error) { - return error.code === 'ENOENT'; -} -exports.isEnoentCodeError = isEnoentCodeError; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isEnoentCodeError = void 0; +function isEnoentCodeError(error) { + return error.code === 'ENOENT'; +} +exports.isEnoentCodeError = isEnoentCodeError; /***/ }), @@ -21921,25 +21936,25 @@ exports.isEnoentCodeError = isEnoentCodeError; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createDirentFromStats = void 0; -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createDirentFromStats = void 0; +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; /***/ }), @@ -21947,39 +21962,39 @@ exports.createDirentFromStats = createDirentFromStats; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.removeLeadingDotSegment = exports.escape = exports.makeAbsolute = exports.unixify = void 0; -const path = __webpack_require__(4); -const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ -const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; -/** - * Designed to work only with simple paths: `dir\\file`. - */ -function unixify(filepath) { - return filepath.replace(/\\/g, '/'); -} -exports.unixify = unixify; -function makeAbsolute(cwd, filepath) { - return path.resolve(cwd, filepath); -} -exports.makeAbsolute = makeAbsolute; -function escape(pattern) { - return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); -} -exports.escape = escape; -function removeLeadingDotSegment(entry) { - // We do not use `startsWith` because this is 10x slower than current implementation for some cases. - // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with - if (entry.charAt(0) === '.') { - const secondCharactery = entry.charAt(1); - if (secondCharactery === '/' || secondCharactery === '\\') { - return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); - } - } - return entry; -} -exports.removeLeadingDotSegment = removeLeadingDotSegment; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.removeLeadingDotSegment = exports.escape = exports.makeAbsolute = exports.unixify = void 0; +const path = __webpack_require__(4); +const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ +const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; +/** + * Designed to work only with simple paths: `dir\\file`. + */ +function unixify(filepath) { + return filepath.replace(/\\/g, '/'); +} +exports.unixify = unixify; +function makeAbsolute(cwd, filepath) { + return path.resolve(cwd, filepath); +} +exports.makeAbsolute = makeAbsolute; +function escape(pattern) { + return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); +} +exports.escape = escape; +function removeLeadingDotSegment(entry) { + // We do not use `startsWith` because this is 10x slower than current implementation for some cases. + // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with + if (entry.charAt(0) === '.') { + const secondCharactery = entry.charAt(1); + if (secondCharactery === '/' || secondCharactery === '\\') { + return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); + } + } + return entry; +} +exports.removeLeadingDotSegment = removeLeadingDotSegment; /***/ }), @@ -21987,138 +22002,163 @@ exports.removeLeadingDotSegment = removeLeadingDotSegment; /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0; -const path = __webpack_require__(4); -const globParent = __webpack_require__(265); -const micromatch = __webpack_require__(268); -const picomatch = __webpack_require__(285); -const GLOBSTAR = '**'; -const ESCAPE_SYMBOL = '\\'; -const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; -const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[.*]/; -const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\(.*\|.*\)/; -const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; -const BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\.\.).*}/; -function isStaticPattern(pattern, options = {}) { - return !isDynamicPattern(pattern, options); -} -exports.isStaticPattern = isStaticPattern; -function isDynamicPattern(pattern, options = {}) { - /** - * A special case with an empty string is necessary for matching patterns that start with a forward slash. - * An empty string cannot be a dynamic pattern. - * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'. - */ - if (pattern === '') { - return false; - } - /** - * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check - * filepath directly (without read directory). - */ - if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { - return true; - } - if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) { - return true; - } - return false; -} -exports.isDynamicPattern = isDynamicPattern; -function convertToPositivePattern(pattern) { - return isNegativePattern(pattern) ? pattern.slice(1) : pattern; -} -exports.convertToPositivePattern = convertToPositivePattern; -function convertToNegativePattern(pattern) { - return '!' + pattern; -} -exports.convertToNegativePattern = convertToNegativePattern; -function isNegativePattern(pattern) { - return pattern.startsWith('!') && pattern[1] !== '('; -} -exports.isNegativePattern = isNegativePattern; -function isPositivePattern(pattern) { - return !isNegativePattern(pattern); -} -exports.isPositivePattern = isPositivePattern; -function getNegativePatterns(patterns) { - return patterns.filter(isNegativePattern); -} -exports.getNegativePatterns = getNegativePatterns; -function getPositivePatterns(patterns) { - return patterns.filter(isPositivePattern); -} -exports.getPositivePatterns = getPositivePatterns; -function getBaseDirectory(pattern) { - return globParent(pattern, { flipBackslashes: false }); -} -exports.getBaseDirectory = getBaseDirectory; -function hasGlobStar(pattern) { - return pattern.includes(GLOBSTAR); -} -exports.hasGlobStar = hasGlobStar; -function endsWithSlashGlobStar(pattern) { - return pattern.endsWith('/' + GLOBSTAR); -} -exports.endsWithSlashGlobStar = endsWithSlashGlobStar; -function isAffectDepthOfReadingPattern(pattern) { - const basename = path.basename(pattern); - return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); -} -exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; -function expandPatternsWithBraceExpansion(patterns) { - return patterns.reduce((collection, pattern) => { - return collection.concat(expandBraceExpansion(pattern)); - }, []); -} -exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; -function expandBraceExpansion(pattern) { - return micromatch.braces(pattern, { - expand: true, - nodupes: true - }); -} -exports.expandBraceExpansion = expandBraceExpansion; -function getPatternParts(pattern, options) { - let { parts } = picomatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); - /** - * The scan method returns an empty array in some cases. - * See micromatch/picomatch#58 for more details. - */ - if (parts.length === 0) { - parts = [pattern]; - } - /** - * The scan method does not return an empty part for the pattern with a forward slash. - * This is another part of micromatch/picomatch#58. - */ - if (parts[0].startsWith('/')) { - parts[0] = parts[0].slice(1); - parts.unshift(''); - } - return parts; -} -exports.getPatternParts = getPatternParts; -function makeRe(pattern, options) { - return micromatch.makeRe(pattern, options); -} -exports.makeRe = makeRe; -function convertPatternsToRe(patterns, options) { - return patterns.map((pattern) => makeRe(pattern, options)); -} -exports.convertPatternsToRe = convertPatternsToRe; -function matchAny(entry, patternsRe) { - return patternsRe.some((patternRe) => patternRe.test(entry)); -} -exports.matchAny = matchAny; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0; +const path = __webpack_require__(4); +const globParent = __webpack_require__(265); +const micromatch = __webpack_require__(268); +const GLOBSTAR = '**'; +const ESCAPE_SYMBOL = '\\'; +const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; +const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[.*]/; +const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\(.*\|.*\)/; +const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; +const BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\.\.).*}/; +function isStaticPattern(pattern, options = {}) { + return !isDynamicPattern(pattern, options); +} +exports.isStaticPattern = isStaticPattern; +function isDynamicPattern(pattern, options = {}) { + /** + * A special case with an empty string is necessary for matching patterns that start with a forward slash. + * An empty string cannot be a dynamic pattern. + * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'. + */ + if (pattern === '') { + return false; + } + /** + * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check + * filepath directly (without read directory). + */ + if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { + return true; + } + if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { + return true; + } + if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { + return true; + } + if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) { + return true; + } + return false; +} +exports.isDynamicPattern = isDynamicPattern; +function convertToPositivePattern(pattern) { + return isNegativePattern(pattern) ? pattern.slice(1) : pattern; +} +exports.convertToPositivePattern = convertToPositivePattern; +function convertToNegativePattern(pattern) { + return '!' + pattern; +} +exports.convertToNegativePattern = convertToNegativePattern; +function isNegativePattern(pattern) { + return pattern.startsWith('!') && pattern[1] !== '('; +} +exports.isNegativePattern = isNegativePattern; +function isPositivePattern(pattern) { + return !isNegativePattern(pattern); +} +exports.isPositivePattern = isPositivePattern; +function getNegativePatterns(patterns) { + return patterns.filter(isNegativePattern); +} +exports.getNegativePatterns = getNegativePatterns; +function getPositivePatterns(patterns) { + return patterns.filter(isPositivePattern); +} +exports.getPositivePatterns = getPositivePatterns; +/** + * Returns patterns that can be applied inside the current directory. + * + * @example + * // ['./*', '*', 'a/*'] + * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) + */ +function getPatternsInsideCurrentDirectory(patterns) { + return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern)); +} +exports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory; +/** + * Returns patterns to be expanded relative to (outside) the current directory. + * + * @example + * // ['../*', './../*'] + * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) + */ +function getPatternsOutsideCurrentDirectory(patterns) { + return patterns.filter(isPatternRelatedToParentDirectory); +} +exports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory; +function isPatternRelatedToParentDirectory(pattern) { + return pattern.startsWith('..') || pattern.startsWith('./..'); +} +exports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory; +function getBaseDirectory(pattern) { + return globParent(pattern, { flipBackslashes: false }); +} +exports.getBaseDirectory = getBaseDirectory; +function hasGlobStar(pattern) { + return pattern.includes(GLOBSTAR); +} +exports.hasGlobStar = hasGlobStar; +function endsWithSlashGlobStar(pattern) { + return pattern.endsWith('/' + GLOBSTAR); +} +exports.endsWithSlashGlobStar = endsWithSlashGlobStar; +function isAffectDepthOfReadingPattern(pattern) { + const basename = path.basename(pattern); + return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); +} +exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; +function expandPatternsWithBraceExpansion(patterns) { + return patterns.reduce((collection, pattern) => { + return collection.concat(expandBraceExpansion(pattern)); + }, []); +} +exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; +function expandBraceExpansion(pattern) { + return micromatch.braces(pattern, { + expand: true, + nodupes: true + }); +} +exports.expandBraceExpansion = expandBraceExpansion; +function getPatternParts(pattern, options) { + let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); + /** + * The scan method returns an empty array in some cases. + * See micromatch/picomatch#58 for more details. + */ + if (parts.length === 0) { + parts = [pattern]; + } + /** + * The scan method does not return an empty part for the pattern with a forward slash. + * This is another part of micromatch/picomatch#58. + */ + if (parts[0].startsWith('/')) { + parts[0] = parts[0].slice(1); + parts.unshift(''); + } + return parts; +} +exports.getPatternParts = getPatternParts; +function makeRe(pattern, options) { + return micromatch.makeRe(pattern, options); +} +exports.makeRe = makeRe; +function convertPatternsToRe(patterns, options) { + return patterns.map((pattern) => makeRe(pattern, options)); +} +exports.convertPatternsToRe = convertPatternsToRe; +function matchAny(entry, patternsRe) { + return patternsRe.some((patternRe) => patternRe.test(entry)); +} +exports.matchAny = matchAny; /***/ }), @@ -26436,2237 +26476,149 @@ module.exports = parse; "use strict"; - -module.exports = __webpack_require__(286); - - -/***/ }), -/* 286 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(4); -const scan = __webpack_require__(287); -const parse = __webpack_require__(290); -const utils = __webpack_require__(288); -const constants = __webpack_require__(289); -const isObject = val => val && typeof val === 'object' && !Array.isArray(val); - -/** - * Creates a matcher function from one or more glob patterns. The - * returned function takes a string to match as its first argument, - * and returns true if the string is a match. The returned matcher - * function also takes a boolean as the second argument that, when true, - * returns an object with additional information. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch(glob[, options]); - * - * const isMatch = picomatch('*.!(*a)'); - * console.log(isMatch('a.a')); //=> false - * console.log(isMatch('a.b')); //=> true - * ``` - * @name picomatch - * @param {String|Array} `globs` One or more glob patterns. - * @param {Object=} `options` - * @return {Function=} Returns a matcher function. - * @api public - */ - -const picomatch = (glob, options, returnState = false) => { - if (Array.isArray(glob)) { - const fns = glob.map(input => picomatch(input, options, returnState)); - const arrayMatcher = str => { - for (const isMatch of fns) { - const state = isMatch(str); - if (state) return state; - } - return false; - }; - return arrayMatcher; - } - - const isState = isObject(glob) && glob.tokens && glob.input; - - if (glob === '' || (typeof glob !== 'string' && !isState)) { - throw new TypeError('Expected pattern to be a non-empty string'); - } - - const opts = options || {}; - const posix = utils.isWindows(options); - const regex = isState - ? picomatch.compileRe(glob, options) - : picomatch.makeRe(glob, options, false, true); - - const state = regex.state; - delete regex.state; - - let isIgnored = () => false; - if (opts.ignore) { - const ignoreOpts = { ...options, ignore: null, onMatch: null, onResult: null }; - isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); - } - - const matcher = (input, returnObject = false) => { - const { isMatch, match, output } = picomatch.test(input, regex, options, { glob, posix }); - const result = { glob, state, regex, posix, input, output, match, isMatch }; - - if (typeof opts.onResult === 'function') { - opts.onResult(result); - } - - if (isMatch === false) { - result.isMatch = false; - return returnObject ? result : false; - } - - if (isIgnored(input)) { - if (typeof opts.onIgnore === 'function') { - opts.onIgnore(result); - } - result.isMatch = false; - return returnObject ? result : false; - } - - if (typeof opts.onMatch === 'function') { - opts.onMatch(result); - } - return returnObject ? result : true; - }; - - if (returnState) { - matcher.state = state; - } - - return matcher; -}; - -/** - * Test `input` with the given `regex`. This is used by the main - * `picomatch()` function to test the input string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.test(input, regex[, options]); - * - * console.log(picomatch.test('foo/bar', /^(?:([^/]*?)\/([^/]*?))$/)); - * // { isMatch: true, match: [ 'foo/', 'foo', 'bar' ], output: 'foo/bar' } - * ``` - * @param {String} `input` String to test. - * @param {RegExp} `regex` - * @return {Object} Returns an object with matching info. - * @api public - */ - -picomatch.test = (input, regex, options, { glob, posix } = {}) => { - if (typeof input !== 'string') { - throw new TypeError('Expected input to be a string'); - } - - if (input === '') { - return { isMatch: false, output: '' }; - } - - const opts = options || {}; - const format = opts.format || (posix ? utils.toPosixSlashes : null); - let match = input === glob; - let output = (match && format) ? format(input) : input; - - if (match === false) { - output = format ? format(input) : input; - match = output === glob; - } - - if (match === false || opts.capture === true) { - if (opts.matchBase === true || opts.basename === true) { - match = picomatch.matchBase(input, regex, options, posix); - } else { - match = regex.exec(output); - } - } - - return { isMatch: Boolean(match), match, output }; -}; - -/** - * Match the basename of a filepath. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.matchBase(input, glob[, options]); - * console.log(picomatch.matchBase('foo/bar.js', '*.js'); // true - * ``` - * @param {String} `input` String to test. - * @param {RegExp|String} `glob` Glob pattern or regex created by [.makeRe](#makeRe). - * @return {Boolean} - * @api public - */ - -picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { - const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); - return regex.test(path.basename(input)); -}; - -/** - * Returns true if **any** of the given glob `patterns` match the specified `string`. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.isMatch(string, patterns[, options]); - * - * console.log(picomatch.isMatch('a.a', ['b.*', '*.a'])); //=> true - * console.log(picomatch.isMatch('a.a', 'b.*')); //=> false - * ``` - * @param {String|Array} str The string to test. - * @param {String|Array} patterns One or more glob patterns to use for matching. - * @param {Object} [options] See available [options](#options). - * @return {Boolean} Returns true if any patterns match `str` - * @api public - */ - -picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); - -/** - * Parse a glob pattern to create the source string for a regular - * expression. - * - * ```js - * const picomatch = require('picomatch'); - * const result = picomatch.parse(pattern[, options]); - * ``` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Object} Returns an object with useful properties and output to be used as a regex source string. - * @api public - */ - -picomatch.parse = (pattern, options) => { - if (Array.isArray(pattern)) return pattern.map(p => picomatch.parse(p, options)); - return parse(pattern, { ...options, fastpaths: false }); -}; - -/** - * Scan a glob pattern to separate the pattern into segments. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.scan(input[, options]); - * - * const result = picomatch.scan('!./foo/*.js'); - * console.log(result); - * { prefix: '!./', - * input: '!./foo/*.js', - * start: 3, - * base: 'foo', - * glob: '*.js', - * isBrace: false, - * isBracket: false, - * isGlob: true, - * isExtglob: false, - * isGlobstar: false, - * negated: true } - * ``` - * @param {String} `input` Glob pattern to scan. - * @param {Object} `options` - * @return {Object} Returns an object with - * @api public - */ - -picomatch.scan = (input, options) => scan(input, options); - -/** - * Create a regular expression from a parsed glob pattern. - * - * ```js - * const picomatch = require('picomatch'); - * const state = picomatch.parse('*.js'); - * // picomatch.compileRe(state[, options]); - * - * console.log(picomatch.compileRe(state)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `state` The object returned from the `.parse` method. - * @param {Object} `options` - * @return {RegExp} Returns a regex created from the given pattern. - * @api public - */ - -picomatch.compileRe = (parsed, options, returnOutput = false, returnState = false) => { - if (returnOutput === true) { - return parsed.output; - } - - const opts = options || {}; - const prepend = opts.contains ? '' : '^'; - const append = opts.contains ? '' : '$'; - - let source = `${prepend}(?:${parsed.output})${append}`; - if (parsed && parsed.negated === true) { - source = `^(?!${source}).*$`; - } - - const regex = picomatch.toRegex(source, options); - if (returnState === true) { - regex.state = parsed; - } - - return regex; -}; - -picomatch.makeRe = (input, options, returnOutput = false, returnState = false) => { - if (!input || typeof input !== 'string') { - throw new TypeError('Expected a non-empty string'); - } - - const opts = options || {}; - let parsed = { negated: false, fastpaths: true }; - let prefix = ''; - let output; - - if (input.startsWith('./')) { - input = input.slice(2); - prefix = parsed.prefix = './'; - } - - if (opts.fastpaths !== false && (input[0] === '.' || input[0] === '*')) { - output = parse.fastpaths(input, options); - } - - if (output === undefined) { - parsed = parse(input, options); - parsed.prefix = prefix + (parsed.prefix || ''); - } else { - parsed.output = output; - } - - return picomatch.compileRe(parsed, options, returnOutput, returnState); -}; - -/** - * Create a regular expression from the given regex source string. - * - * ```js - * const picomatch = require('picomatch'); - * // picomatch.toRegex(source[, options]); - * - * const { output } = picomatch.parse('*.js'); - * console.log(picomatch.toRegex(output)); - * //=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ - * ``` - * @param {String} `source` Regular expression source string. - * @param {Object} `options` - * @return {RegExp} - * @api public - */ - -picomatch.toRegex = (source, options) => { - try { - const opts = options || {}; - return new RegExp(source, opts.flags || (opts.nocase ? 'i' : '')); - } catch (err) { - if (options && options.debug === true) throw err; - return /$^/; - } -}; - -/** - * Picomatch constants. - * @return {Object} - */ - -picomatch.constants = constants; - -/** - * Expose "picomatch" - */ - -module.exports = picomatch; - - -/***/ }), -/* 287 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const utils = __webpack_require__(288); -const { - CHAR_ASTERISK, /* * */ - CHAR_AT, /* @ */ - CHAR_BACKWARD_SLASH, /* \ */ - CHAR_COMMA, /* , */ - CHAR_DOT, /* . */ - CHAR_EXCLAMATION_MARK, /* ! */ - CHAR_FORWARD_SLASH, /* / */ - CHAR_LEFT_CURLY_BRACE, /* { */ - CHAR_LEFT_PARENTHESES, /* ( */ - CHAR_LEFT_SQUARE_BRACKET, /* [ */ - CHAR_PLUS, /* + */ - CHAR_QUESTION_MARK, /* ? */ - CHAR_RIGHT_CURLY_BRACE, /* } */ - CHAR_RIGHT_PARENTHESES, /* ) */ - CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(289); - -const isPathSeparator = code => { - return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; -}; - -const depth = token => { - if (token.isPrefix !== true) { - token.depth = token.isGlobstar ? Infinity : 1; - } -}; - -/** - * Quickly scans a glob pattern and returns an object with a handful of - * useful properties, like `isGlob`, `path` (the leading non-glob, if it exists), - * `glob` (the actual pattern), and `negated` (true if the path starts with `!`). - * - * ```js - * const pm = require('picomatch'); - * console.log(pm.scan('foo/bar/*.js')); - * { isGlob: true, input: 'foo/bar/*.js', base: 'foo/bar', glob: '*.js' } - * ``` - * @param {String} `str` - * @param {Object} `options` - * @return {Object} Returns an object with tokens and regex source string. - * @api public - */ - -const scan = (input, options) => { - const opts = options || {}; - - const length = input.length - 1; - const scanToEnd = opts.parts === true || opts.scanToEnd === true; - const slashes = []; - const tokens = []; - const parts = []; - - let str = input; - let index = -1; - let start = 0; - let lastIndex = 0; - let isBrace = false; - let isBracket = false; - let isGlob = false; - let isExtglob = false; - let isGlobstar = false; - let braceEscaped = false; - let backslashes = false; - let negated = false; - let finished = false; - let braces = 0; - let prev; - let code; - let token = { value: '', depth: 0, isGlob: false }; - - const eos = () => index >= length; - const peek = () => str.charCodeAt(index + 1); - const advance = () => { - prev = code; - return str.charCodeAt(++index); - }; - - while (index < length) { - code = advance(); - let next; - - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - - if (code === CHAR_LEFT_CURLY_BRACE) { - braceEscaped = true; - } - continue; - } - - if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { - braces++; - - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - - if (code === CHAR_LEFT_CURLY_BRACE) { - braces++; - continue; - } - - if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (braceEscaped !== true && code === CHAR_COMMA) { - isBrace = token.isBrace = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_RIGHT_CURLY_BRACE) { - braces--; - - if (braces === 0) { - braceEscaped = false; - isBrace = token.isBrace = true; - finished = true; - break; - } - } - } - - if (scanToEnd === true) { - continue; - } - - break; - } - - if (code === CHAR_FORWARD_SLASH) { - slashes.push(index); - tokens.push(token); - token = { value: '', depth: 0, isGlob: false }; - - if (finished === true) continue; - if (prev === CHAR_DOT && index === (start + 1)) { - start += 2; - continue; - } - - lastIndex = index + 1; - continue; - } - - if (opts.noext !== true) { - const isExtglobChar = code === CHAR_PLUS - || code === CHAR_AT - || code === CHAR_ASTERISK - || code === CHAR_QUESTION_MARK - || code === CHAR_EXCLAMATION_MARK; - - if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - isExtglob = token.isExtglob = true; - finished = true; - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - isGlob = token.isGlob = true; - finished = true; - break; - } - } - continue; - } - break; - } - } - - if (code === CHAR_ASTERISK) { - if (prev === CHAR_ASTERISK) isGlobstar = token.isGlobstar = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_QUESTION_MARK) { - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - - if (code === CHAR_LEFT_SQUARE_BRACKET) { - while (eos() !== true && (next = advance())) { - if (next === CHAR_BACKWARD_SLASH) { - backslashes = token.backslashes = true; - advance(); - continue; - } - - if (next === CHAR_RIGHT_SQUARE_BRACKET) { - isBracket = token.isBracket = true; - isGlob = token.isGlob = true; - finished = true; - - if (scanToEnd === true) { - continue; - } - break; - } - } - } - - if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { - negated = token.negated = true; - start++; - continue; - } - - if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { - isGlob = token.isGlob = true; - - if (scanToEnd === true) { - while (eos() !== true && (code = advance())) { - if (code === CHAR_LEFT_PARENTHESES) { - backslashes = token.backslashes = true; - code = advance(); - continue; - } - - if (code === CHAR_RIGHT_PARENTHESES) { - finished = true; - break; - } - } - continue; - } - break; - } - - if (isGlob === true) { - finished = true; - - if (scanToEnd === true) { - continue; - } - - break; - } - } - - if (opts.noext === true) { - isExtglob = false; - isGlob = false; - } - - let base = str; - let prefix = ''; - let glob = ''; - - if (start > 0) { - prefix = str.slice(0, start); - str = str.slice(start); - lastIndex -= start; - } - - if (base && isGlob === true && lastIndex > 0) { - base = str.slice(0, lastIndex); - glob = str.slice(lastIndex); - } else if (isGlob === true) { - base = ''; - glob = str; - } else { - base = str; - } - - if (base && base !== '' && base !== '/' && base !== str) { - if (isPathSeparator(base.charCodeAt(base.length - 1))) { - base = base.slice(0, -1); - } - } - - if (opts.unescape === true) { - if (glob) glob = utils.removeBackslashes(glob); - - if (base && backslashes === true) { - base = utils.removeBackslashes(base); - } - } - - const state = { - prefix, - input, - start, - base, - glob, - isBrace, - isBracket, - isGlob, - isExtglob, - isGlobstar, - negated - }; - - if (opts.tokens === true) { - state.maxDepth = 0; - if (!isPathSeparator(code)) { - tokens.push(token); - } - state.tokens = tokens; - } - - if (opts.parts === true || opts.tokens === true) { - let prevIndex; - - for (let idx = 0; idx < slashes.length; idx++) { - const n = prevIndex ? prevIndex + 1 : start; - const i = slashes[idx]; - const value = input.slice(n, i); - if (opts.tokens) { - if (idx === 0 && start !== 0) { - tokens[idx].isPrefix = true; - tokens[idx].value = prefix; - } else { - tokens[idx].value = value; - } - depth(tokens[idx]); - state.maxDepth += tokens[idx].depth; - } - if (idx !== 0 || value !== '') { - parts.push(value); - } - prevIndex = i; - } - - if (prevIndex && prevIndex + 1 < input.length) { - const value = input.slice(prevIndex + 1); - parts.push(value); - - if (opts.tokens) { - tokens[tokens.length - 1].value = value; - depth(tokens[tokens.length - 1]); - state.maxDepth += tokens[tokens.length - 1].depth; - } - } - - state.slashes = slashes; - state.parts = parts; - } - - return state; -}; - -module.exports = scan; - - -/***/ }), -/* 288 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(4); -const win32 = process.platform === 'win32'; -const { - REGEX_BACKSLASH, - REGEX_REMOVE_BACKSLASH, - REGEX_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_GLOBAL -} = __webpack_require__(289); - -exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); -exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); -exports.isRegexChar = str => str.length === 1 && exports.hasRegexChars(str); -exports.escapeRegex = str => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, '\\$1'); -exports.toPosixSlashes = str => str.replace(REGEX_BACKSLASH, '/'); - -exports.removeBackslashes = str => { - return str.replace(REGEX_REMOVE_BACKSLASH, match => { - return match === '\\' ? '' : match; - }); -}; - -exports.supportsLookbehinds = () => { - const segs = process.version.slice(1).split('.').map(Number); - if (segs.length === 3 && segs[0] >= 9 || (segs[0] === 8 && segs[1] >= 10)) { - return true; - } - return false; -}; - -exports.isWindows = options => { - if (options && typeof options.windows === 'boolean') { - return options.windows; - } - return win32 === true || path.sep === '\\'; -}; - -exports.escapeLast = (input, char, lastIdx) => { - const idx = input.lastIndexOf(char, lastIdx); - if (idx === -1) return input; - if (input[idx - 1] === '\\') return exports.escapeLast(input, char, idx - 1); - return `${input.slice(0, idx)}\\${input.slice(idx)}`; -}; - -exports.removePrefix = (input, state = {}) => { - let output = input; - if (output.startsWith('./')) { - output = output.slice(2); - state.prefix = './'; - } - return output; -}; - -exports.wrapOutput = (input, state = {}, options = {}) => { - const prepend = options.contains ? '' : '^'; - const append = options.contains ? '' : '$'; - - let output = `${prepend}(?:${input})${append}`; - if (state.negated === true) { - output = `(?:^(?!${output}).*$)`; - } - return output; -}; - - -/***/ }), -/* 289 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(4); -const WIN_SLASH = '\\\\/'; -const WIN_NO_SLASH = `[^${WIN_SLASH}]`; - -/** - * Posix glob regex - */ - -const DOT_LITERAL = '\\.'; -const PLUS_LITERAL = '\\+'; -const QMARK_LITERAL = '\\?'; -const SLASH_LITERAL = '\\/'; -const ONE_CHAR = '(?=.)'; -const QMARK = '[^/]'; -const END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; -const START_ANCHOR = `(?:^|${SLASH_LITERAL})`; -const DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; -const NO_DOT = `(?!${DOT_LITERAL})`; -const NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; -const NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; -const NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; -const QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; -const STAR = `${QMARK}*?`; - -const POSIX_CHARS = { - DOT_LITERAL, - PLUS_LITERAL, - QMARK_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - QMARK, - END_ANCHOR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK_NO_DOT, - STAR, - START_ANCHOR -}; - -/** - * Windows glob regex - */ - -const WINDOWS_CHARS = { - ...POSIX_CHARS, - - SLASH_LITERAL: `[${WIN_SLASH}]`, - QMARK: WIN_NO_SLASH, - STAR: `${WIN_NO_SLASH}*?`, - DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, - NO_DOT: `(?!${DOT_LITERAL})`, - NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, - NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, - QMARK_NO_DOT: `[^.${WIN_SLASH}]`, - START_ANCHOR: `(?:^|[${WIN_SLASH}])`, - END_ANCHOR: `(?:[${WIN_SLASH}]|$)` -}; - -/** - * POSIX Bracket Regex - */ - -const POSIX_REGEX_SOURCE = { - alnum: 'a-zA-Z0-9', - alpha: 'a-zA-Z', - ascii: '\\x00-\\x7F', - blank: ' \\t', - cntrl: '\\x00-\\x1F\\x7F', - digit: '0-9', - graph: '\\x21-\\x7E', - lower: 'a-z', - print: '\\x20-\\x7E ', - punct: '\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~', - space: ' \\t\\r\\n\\v\\f', - upper: 'A-Z', - word: 'A-Za-z0-9_', - xdigit: 'A-Fa-f0-9' -}; - -module.exports = { - MAX_LENGTH: 1024 * 64, - POSIX_REGEX_SOURCE, - - // regular expressions - REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, - REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, - REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, - REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, - REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, - REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, - - // Replace globs with equivalent patterns to reduce parsing time. - REPLACEMENTS: { - '***': '*', - '**/**': '**', - '**/**/**': '**' - }, - - // Digits - CHAR_0: 48, /* 0 */ - CHAR_9: 57, /* 9 */ - - // Alphabet chars. - CHAR_UPPERCASE_A: 65, /* A */ - CHAR_LOWERCASE_A: 97, /* a */ - CHAR_UPPERCASE_Z: 90, /* Z */ - CHAR_LOWERCASE_Z: 122, /* z */ - - CHAR_LEFT_PARENTHESES: 40, /* ( */ - CHAR_RIGHT_PARENTHESES: 41, /* ) */ - - CHAR_ASTERISK: 42, /* * */ - - // Non-alphabetic chars. - CHAR_AMPERSAND: 38, /* & */ - CHAR_AT: 64, /* @ */ - CHAR_BACKWARD_SLASH: 92, /* \ */ - CHAR_CARRIAGE_RETURN: 13, /* \r */ - CHAR_CIRCUMFLEX_ACCENT: 94, /* ^ */ - CHAR_COLON: 58, /* : */ - CHAR_COMMA: 44, /* , */ - CHAR_DOT: 46, /* . */ - CHAR_DOUBLE_QUOTE: 34, /* " */ - CHAR_EQUAL: 61, /* = */ - CHAR_EXCLAMATION_MARK: 33, /* ! */ - CHAR_FORM_FEED: 12, /* \f */ - CHAR_FORWARD_SLASH: 47, /* / */ - CHAR_GRAVE_ACCENT: 96, /* ` */ - CHAR_HASH: 35, /* # */ - CHAR_HYPHEN_MINUS: 45, /* - */ - CHAR_LEFT_ANGLE_BRACKET: 60, /* < */ - CHAR_LEFT_CURLY_BRACE: 123, /* { */ - CHAR_LEFT_SQUARE_BRACKET: 91, /* [ */ - CHAR_LINE_FEED: 10, /* \n */ - CHAR_NO_BREAK_SPACE: 160, /* \u00A0 */ - CHAR_PERCENT: 37, /* % */ - CHAR_PLUS: 43, /* + */ - CHAR_QUESTION_MARK: 63, /* ? */ - CHAR_RIGHT_ANGLE_BRACKET: 62, /* > */ - CHAR_RIGHT_CURLY_BRACE: 125, /* } */ - CHAR_RIGHT_SQUARE_BRACKET: 93, /* ] */ - CHAR_SEMICOLON: 59, /* ; */ - CHAR_SINGLE_QUOTE: 39, /* ' */ - CHAR_SPACE: 32, /* */ - CHAR_TAB: 9, /* \t */ - CHAR_UNDERSCORE: 95, /* _ */ - CHAR_VERTICAL_LINE: 124, /* | */ - CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, /* \uFEFF */ - - SEP: path.sep, - - /** - * Create EXTGLOB_CHARS - */ - - extglobChars(chars) { - return { - '!': { type: 'negate', open: '(?:(?!(?:', close: `))${chars.STAR})` }, - '?': { type: 'qmark', open: '(?:', close: ')?' }, - '+': { type: 'plus', open: '(?:', close: ')+' }, - '*': { type: 'star', open: '(?:', close: ')*' }, - '@': { type: 'at', open: '(?:', close: ')' } - }; - }, - - /** - * Create GLOB_CHARS - */ - - globChars(win32) { - return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; - } -}; - - -/***/ }), -/* 290 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -const constants = __webpack_require__(289); -const utils = __webpack_require__(288); - -/** - * Constants - */ - -const { - MAX_LENGTH, - POSIX_REGEX_SOURCE, - REGEX_NON_SPECIAL_CHARS, - REGEX_SPECIAL_CHARS_BACKREF, - REPLACEMENTS -} = constants; - -/** - * Helpers - */ - -const expandRange = (args, options) => { - if (typeof options.expandRange === 'function') { - return options.expandRange(...args, options); - } - - args.sort(); - const value = `[${args.join('-')}]`; - - try { - /* eslint-disable-next-line no-new */ - new RegExp(value); - } catch (ex) { - return args.map(v => utils.escapeRegex(v)).join('..'); - } - - return value; -}; - -/** - * Create the message for a syntax error - */ - -const syntaxError = (type, char) => { - return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; -}; - -/** - * Parse the given input string. - * @param {String} input - * @param {Object} options - * @return {Object} - */ - -const parse = (input, options) => { - if (typeof input !== 'string') { - throw new TypeError('Expected a string'); - } - - input = REPLACEMENTS[input] || input; - - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - - let len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - const bos = { type: 'bos', value: '', output: opts.prepend || '' }; - const tokens = [bos]; - - const capture = opts.capture ? '' : '?:'; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const PLATFORM_CHARS = constants.globChars(win32); - const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); - - const { - DOT_LITERAL, - PLUS_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOT_SLASH, - NO_DOTS_SLASH, - QMARK, - QMARK_NO_DOT, - STAR, - START_ANCHOR - } = PLATFORM_CHARS; - - const globstar = (opts) => { - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const nodot = opts.dot ? '' : NO_DOT; - const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; - let star = opts.bash === true ? globstar(opts) : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - // minimatch options support - if (typeof opts.noext === 'boolean') { - opts.noextglob = opts.noext; - } - - const state = { - input, - index: -1, - start: 0, - dot: opts.dot === true, - consumed: '', - output: '', - prefix: '', - backtrack: false, - negated: false, - brackets: 0, - braces: 0, - parens: 0, - quotes: 0, - globstar: false, - tokens - }; - - input = utils.removePrefix(input, state); - len = input.length; - - const extglobs = []; - const braces = []; - const stack = []; - let prev = bos; - let value; - - /** - * Tokenizing helpers - */ - - const eos = () => state.index === len - 1; - const peek = state.peek = (n = 1) => input[state.index + n]; - const advance = state.advance = () => input[++state.index]; - const remaining = () => input.slice(state.index + 1); - const consume = (value = '', num = 0) => { - state.consumed += value; - state.index += num; - }; - const append = token => { - state.output += token.output != null ? token.output : token.value; - consume(token.value); - }; - - const negate = () => { - let count = 1; - - while (peek() === '!' && (peek(2) !== '(' || peek(3) === '?')) { - advance(); - state.start++; - count++; - } - - if (count % 2 === 0) { - return false; - } - - state.negated = true; - state.start++; - return true; - }; - - const increment = type => { - state[type]++; - stack.push(type); - }; - - const decrement = type => { - state[type]--; - stack.pop(); - }; - - /** - * Push tokens onto the tokens array. This helper speeds up - * tokenizing by 1) helping us avoid backtracking as much as possible, - * and 2) helping us avoid creating extra tokens when consecutive - * characters are plain text. This improves performance and simplifies - * lookbehinds. - */ - - const push = tok => { - if (prev.type === 'globstar') { - const isBrace = state.braces > 0 && (tok.type === 'comma' || tok.type === 'brace'); - const isExtglob = tok.extglob === true || (extglobs.length && (tok.type === 'pipe' || tok.type === 'paren')); - - if (tok.type !== 'slash' && tok.type !== 'paren' && !isBrace && !isExtglob) { - state.output = state.output.slice(0, -prev.output.length); - prev.type = 'star'; - prev.value = '*'; - prev.output = star; - state.output += prev.output; - } - } - - if (extglobs.length && tok.type !== 'paren' && !EXTGLOB_CHARS[tok.value]) { - extglobs[extglobs.length - 1].inner += tok.value; - } - - if (tok.value || tok.output) append(tok); - if (prev && prev.type === 'text' && tok.type === 'text') { - prev.value += tok.value; - prev.output = (prev.output || '') + tok.value; - return; - } - - tok.prev = prev; - tokens.push(tok); - prev = tok; - }; - - const extglobOpen = (type, value) => { - const token = { ...EXTGLOB_CHARS[value], conditions: 1, inner: '' }; - - token.prev = prev; - token.parens = state.parens; - token.output = state.output; - const output = (opts.capture ? '(' : '') + token.open; - - increment('parens'); - push({ type, value, output: state.output ? '' : ONE_CHAR }); - push({ type: 'paren', extglob: true, value: advance(), output }); - extglobs.push(token); - }; - - const extglobClose = token => { - let output = token.close + (opts.capture ? ')' : ''); - - if (token.type === 'negate') { - let extglobStar = star; - - if (token.inner && token.inner.length > 1 && token.inner.includes('/')) { - extglobStar = globstar(opts); - } - - if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { - output = token.close = `)$))${extglobStar}`; - } - - if (token.prev.type === 'bos' && eos()) { - state.negatedExtglob = true; - } - } - - push({ type: 'paren', extglob: true, value, output }); - decrement('parens'); - }; - - /** - * Fast paths - */ - - if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { - let backslashes = false; - - let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { - if (first === '\\') { - backslashes = true; - return m; - } - - if (first === '?') { - if (esc) { - return esc + first + (rest ? QMARK.repeat(rest.length) : ''); - } - if (index === 0) { - return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ''); - } - return QMARK.repeat(chars.length); - } - - if (first === '.') { - return DOT_LITERAL.repeat(chars.length); - } - - if (first === '*') { - if (esc) { - return esc + first + (rest ? star : ''); - } - return star; - } - return esc ? m : `\\${m}`; - }); - - if (backslashes === true) { - if (opts.unescape === true) { - output = output.replace(/\\/g, ''); - } else { - output = output.replace(/\\+/g, m => { - return m.length % 2 === 0 ? '\\\\' : (m ? '\\' : ''); - }); - } - } - - if (output === input && opts.contains === true) { - state.output = input; - return state; - } - - state.output = utils.wrapOutput(output, state, options); - return state; - } - - /** - * Tokenize input until we reach end-of-string - */ - - while (!eos()) { - value = advance(); - - if (value === '\u0000') { - continue; - } - - /** - * Escaped characters - */ - - if (value === '\\') { - const next = peek(); - - if (next === '/' && opts.bash !== true) { - continue; - } - - if (next === '.' || next === ';') { - continue; - } - - if (!next) { - value += '\\'; - push({ type: 'text', value }); - continue; - } - - // collapse slashes to reduce potential for exploits - const match = /^\\+/.exec(remaining()); - let slashes = 0; - - if (match && match[0].length > 2) { - slashes = match[0].length; - state.index += slashes; - if (slashes % 2 !== 0) { - value += '\\'; - } - } - - if (opts.unescape === true) { - value = advance() || ''; - } else { - value += advance() || ''; - } - - if (state.brackets === 0) { - push({ type: 'text', value }); - continue; - } - } - - /** - * If we're inside a regex character class, continue - * until we reach the closing bracket. - */ - - if (state.brackets > 0 && (value !== ']' || prev.value === '[' || prev.value === '[^')) { - if (opts.posix !== false && value === ':') { - const inner = prev.value.slice(1); - if (inner.includes('[')) { - prev.posix = true; - - if (inner.includes(':')) { - const idx = prev.value.lastIndexOf('['); - const pre = prev.value.slice(0, idx); - const rest = prev.value.slice(idx + 2); - const posix = POSIX_REGEX_SOURCE[rest]; - if (posix) { - prev.value = pre + posix; - state.backtrack = true; - advance(); - - if (!bos.output && tokens.indexOf(prev) === 1) { - bos.output = ONE_CHAR; - } - continue; - } - } - } - } - - if ((value === '[' && peek() !== ':') || (value === '-' && peek() === ']')) { - value = `\\${value}`; - } - - if (value === ']' && (prev.value === '[' || prev.value === '[^')) { - value = `\\${value}`; - } - - if (opts.posix === true && value === '!' && prev.value === '[') { - value = '^'; - } - - prev.value += value; - append({ value }); - continue; - } - - /** - * If we're inside a quoted string, continue - * until we reach the closing double quote. - */ - - if (state.quotes === 1 && value !== '"') { - value = utils.escapeRegex(value); - prev.value += value; - append({ value }); - continue; - } - - /** - * Double quotes - */ - - if (value === '"') { - state.quotes = state.quotes === 1 ? 0 : 1; - if (opts.keepQuotes === true) { - push({ type: 'text', value }); - } - continue; - } - - /** - * Parentheses - */ - - if (value === '(') { - increment('parens'); - push({ type: 'paren', value }); - continue; - } - - if (value === ')') { - if (state.parens === 0 && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '(')); - } - - const extglob = extglobs[extglobs.length - 1]; - if (extglob && state.parens === extglob.parens + 1) { - extglobClose(extglobs.pop()); - continue; - } - - push({ type: 'paren', value, output: state.parens ? ')' : '\\)' }); - decrement('parens'); - continue; - } - - /** - * Square brackets - */ - - if (value === '[') { - if (opts.nobracket === true || !remaining().includes(']')) { - if (opts.nobracket !== true && opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('closing', ']')); - } - - value = `\\${value}`; - } else { - increment('brackets'); - } - - push({ type: 'bracket', value }); - continue; - } - - if (value === ']') { - if (opts.nobracket === true || (prev && prev.type === 'bracket' && prev.value.length === 1)) { - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - if (state.brackets === 0) { - if (opts.strictBrackets === true) { - throw new SyntaxError(syntaxError('opening', '[')); - } - - push({ type: 'text', value, output: `\\${value}` }); - continue; - } - - decrement('brackets'); - - const prevValue = prev.value.slice(1); - if (prev.posix !== true && prevValue[0] === '^' && !prevValue.includes('/')) { - value = `/${value}`; - } - - prev.value += value; - append({ value }); - - // when literal brackets are explicitly disabled - // assume we should match with a regex character class - if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { - continue; - } - - const escaped = utils.escapeRegex(prev.value); - state.output = state.output.slice(0, -prev.value.length); - - // when literal brackets are explicitly enabled - // assume we should escape the brackets to match literal characters - if (opts.literalBrackets === true) { - state.output += escaped; - prev.value = escaped; - continue; - } - - // when the user specifies nothing, try to match both - prev.value = `(${capture}${escaped}|${prev.value})`; - state.output += prev.value; - continue; - } - - /** - * Braces - */ - - if (value === '{' && opts.nobrace !== true) { - increment('braces'); - - const open = { - type: 'brace', - value, - output: '(', - outputIndex: state.output.length, - tokensIndex: state.tokens.length - }; - - braces.push(open); - push(open); - continue; - } - - if (value === '}') { - const brace = braces[braces.length - 1]; - - if (opts.nobrace === true || !brace) { - push({ type: 'text', value, output: value }); - continue; - } - - let output = ')'; - - if (brace.dots === true) { - const arr = tokens.slice(); - const range = []; - - for (let i = arr.length - 1; i >= 0; i--) { - tokens.pop(); - if (arr[i].type === 'brace') { - break; - } - if (arr[i].type !== 'dots') { - range.unshift(arr[i].value); - } - } - - output = expandRange(range, opts); - state.backtrack = true; - } - - if (brace.comma !== true && brace.dots !== true) { - const out = state.output.slice(0, brace.outputIndex); - const toks = state.tokens.slice(brace.tokensIndex); - brace.value = brace.output = '\\{'; - value = output = '\\}'; - state.output = out; - for (const t of toks) { - state.output += (t.output || t.value); - } - } - - push({ type: 'brace', value, output }); - decrement('braces'); - braces.pop(); - continue; - } - - /** - * Pipes - */ - - if (value === '|') { - if (extglobs.length > 0) { - extglobs[extglobs.length - 1].conditions++; - } - push({ type: 'text', value }); - continue; - } - - /** - * Commas - */ - - if (value === ',') { - let output = value; - - const brace = braces[braces.length - 1]; - if (brace && stack[stack.length - 1] === 'braces') { - brace.comma = true; - output = '|'; - } - - push({ type: 'comma', value, output }); - continue; - } - - /** - * Slashes - */ - - if (value === '/') { - // if the beginning of the glob is "./", advance the start - // to the current index, and don't add the "./" characters - // to the state. This greatly simplifies lookbehinds when - // checking for BOS characters like "!" and "." (not "./") - if (prev.type === 'dot' && state.index === state.start + 1) { - state.start = state.index + 1; - state.consumed = ''; - state.output = ''; - tokens.pop(); - prev = bos; // reset "prev" to the first token - continue; - } - - push({ type: 'slash', value, output: SLASH_LITERAL }); - continue; - } - - /** - * Dots - */ - - if (value === '.') { - if (state.braces > 0 && prev.type === 'dot') { - if (prev.value === '.') prev.output = DOT_LITERAL; - const brace = braces[braces.length - 1]; - prev.type = 'dots'; - prev.output += value; - prev.value += value; - brace.dots = true; - continue; - } - - if ((state.braces + state.parens) === 0 && prev.type !== 'bos' && prev.type !== 'slash') { - push({ type: 'text', value, output: DOT_LITERAL }); - continue; - } - - push({ type: 'dot', value, output: DOT_LITERAL }); - continue; - } - - /** - * Question marks - */ - - if (value === '?') { - const isGroup = prev && prev.value === '('; - if (!isGroup && opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('qmark', value); - continue; - } - - if (prev && prev.type === 'paren') { - const next = peek(); - let output = value; - - if (next === '<' && !utils.supportsLookbehinds()) { - throw new Error('Node.js v10 or higher is required for regex lookbehinds'); - } - - if ((prev.value === '(' && !/[!=<:]/.test(next)) || (next === '<' && !/<([!=]|\w+>)/.test(remaining()))) { - output = `\\${value}`; - } - - push({ type: 'text', value, output }); - continue; - } - - if (opts.dot !== true && (prev.type === 'slash' || prev.type === 'bos')) { - push({ type: 'qmark', value, output: QMARK_NO_DOT }); - continue; - } - - push({ type: 'qmark', value, output: QMARK }); - continue; - } - - /** - * Exclamation - */ - - if (value === '!') { - if (opts.noextglob !== true && peek() === '(') { - if (peek(2) !== '?' || !/[!=<:]/.test(peek(3))) { - extglobOpen('negate', value); - continue; - } - } - - if (opts.nonegate !== true && state.index === 0) { - negate(); - continue; - } - } - - /** - * Plus - */ - - if (value === '+') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - extglobOpen('plus', value); - continue; - } - - if ((prev && prev.value === '(') || opts.regex === false) { - push({ type: 'plus', value, output: PLUS_LITERAL }); - continue; - } - - if ((prev && (prev.type === 'bracket' || prev.type === 'paren' || prev.type === 'brace')) || state.parens > 0) { - push({ type: 'plus', value }); - continue; - } - - push({ type: 'plus', value: PLUS_LITERAL }); - continue; - } - - /** - * Plain text - */ - - if (value === '@') { - if (opts.noextglob !== true && peek() === '(' && peek(2) !== '?') { - push({ type: 'at', extglob: true, value, output: '' }); - continue; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Plain text - */ - - if (value !== '*') { - if (value === '$' || value === '^') { - value = `\\${value}`; - } - - const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); - if (match) { - value += match[0]; - state.index += match[0].length; - } - - push({ type: 'text', value }); - continue; - } - - /** - * Stars - */ - - if (prev && (prev.type === 'globstar' || prev.star === true)) { - prev.type = 'star'; - prev.star = true; - prev.value += value; - prev.output = star; - state.backtrack = true; - state.globstar = true; - consume(value); - continue; - } - - let rest = remaining(); - if (opts.noextglob !== true && /^\([^?]/.test(rest)) { - extglobOpen('star', value); - continue; - } - - if (prev.type === 'star') { - if (opts.noglobstar === true) { - consume(value); - continue; - } - - const prior = prev.prev; - const before = prior.prev; - const isStart = prior.type === 'slash' || prior.type === 'bos'; - const afterStar = before && (before.type === 'star' || before.type === 'globstar'); - - if (opts.bash === true && (!isStart || (rest[0] && rest[0] !== '/'))) { - push({ type: 'star', value, output: '' }); - continue; - } - - const isBrace = state.braces > 0 && (prior.type === 'comma' || prior.type === 'brace'); - const isExtglob = extglobs.length && (prior.type === 'pipe' || prior.type === 'paren'); - if (!isStart && prior.type !== 'paren' && !isBrace && !isExtglob) { - push({ type: 'star', value, output: '' }); - continue; - } - - // strip consecutive `/**/` - while (rest.slice(0, 3) === '/**') { - const after = input[state.index + 4]; - if (after && after !== '/') { - break; - } - rest = rest.slice(3); - consume('/**', 3); - } - - if (prior.type === 'bos' && eos()) { - prev.type = 'globstar'; - prev.value += value; - prev.output = globstar(opts); - state.output = prev.output; - state.globstar = true; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && !afterStar && eos()) { - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = globstar(opts) + (opts.strictSlashes ? ')' : '|$)'); - prev.value += value; - state.globstar = true; - state.output += prior.output + prev.output; - consume(value); - continue; - } - - if (prior.type === 'slash' && prior.prev.type !== 'bos' && rest[0] === '/') { - const end = rest[1] !== void 0 ? '|$' : ''; - - state.output = state.output.slice(0, -(prior.output + prev.output).length); - prior.output = `(?:${prior.output}`; - - prev.type = 'globstar'; - prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; - prev.value += value; - - state.output += prior.output + prev.output; - state.globstar = true; - - consume(value + advance()); - - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - if (prior.type === 'bos' && rest[0] === '/') { - prev.type = 'globstar'; - prev.value += value; - prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; - state.output = prev.output; - state.globstar = true; - consume(value + advance()); - push({ type: 'slash', value: '/', output: '' }); - continue; - } - - // remove single star from output - state.output = state.output.slice(0, -prev.output.length); - - // reset previous token to globstar - prev.type = 'globstar'; - prev.output = globstar(opts); - prev.value += value; - - // reset output with globstar - state.output += prev.output; - state.globstar = true; - consume(value); - continue; - } - - const token = { type: 'star', value, output: star }; - - if (opts.bash === true) { - token.output = '.*?'; - if (prev.type === 'bos' || prev.type === 'slash') { - token.output = nodot + token.output; - } - push(token); - continue; - } - - if (prev && (prev.type === 'bracket' || prev.type === 'paren') && opts.regex === true) { - token.output = value; - push(token); - continue; - } - - if (state.index === state.start || prev.type === 'slash' || prev.type === 'dot') { - if (prev.type === 'dot') { - state.output += NO_DOT_SLASH; - prev.output += NO_DOT_SLASH; - - } else if (opts.dot === true) { - state.output += NO_DOTS_SLASH; - prev.output += NO_DOTS_SLASH; - - } else { - state.output += nodot; - prev.output += nodot; - } - - if (peek() !== '*') { - state.output += ONE_CHAR; - prev.output += ONE_CHAR; - } - } - - push(token); - } - - while (state.brackets > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ']')); - state.output = utils.escapeLast(state.output, '['); - decrement('brackets'); - } - - while (state.parens > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', ')')); - state.output = utils.escapeLast(state.output, '('); - decrement('parens'); - } - - while (state.braces > 0) { - if (opts.strictBrackets === true) throw new SyntaxError(syntaxError('closing', '}')); - state.output = utils.escapeLast(state.output, '{'); - decrement('braces'); - } - - if (opts.strictSlashes !== true && (prev.type === 'star' || prev.type === 'bracket')) { - push({ type: 'maybe_slash', value: '', output: `${SLASH_LITERAL}?` }); - } - - // rebuild the output if we had to backtrack at any point - if (state.backtrack === true) { - state.output = ''; - - for (const token of state.tokens) { - state.output += token.output != null ? token.output : token.value; - - if (token.suffix) { - state.output += token.suffix; - } - } - } - - return state; -}; - -/** - * Fast paths for creating regular expressions for common glob patterns. - * This can significantly speed up processing and has very little downside - * impact when none of the fast paths match. - */ - -parse.fastpaths = (input, options) => { - const opts = { ...options }; - const max = typeof opts.maxLength === 'number' ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; - const len = input.length; - if (len > max) { - throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); - } - - input = REPLACEMENTS[input] || input; - const win32 = utils.isWindows(options); - - // create constants based on platform, for windows or posix - const { - DOT_LITERAL, - SLASH_LITERAL, - ONE_CHAR, - DOTS_SLASH, - NO_DOT, - NO_DOTS, - NO_DOTS_SLASH, - STAR, - START_ANCHOR - } = constants.globChars(win32); - - const nodot = opts.dot ? NO_DOTS : NO_DOT; - const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; - const capture = opts.capture ? '' : '?:'; - const state = { negated: false, prefix: '' }; - let star = opts.bash === true ? '.*?' : STAR; - - if (opts.capture) { - star = `(${star})`; - } - - const globstar = (opts) => { - if (opts.noglobstar === true) return star; - return `(${capture}(?:(?!${START_ANCHOR}${opts.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; - }; - - const create = str => { - switch (str) { - case '*': - return `${nodot}${ONE_CHAR}${star}`; - - case '.*': - return `${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*.*': - return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '*/*': - return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; - - case '**': - return nodot + globstar(opts); - - case '**/*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; - - case '**/*.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; - - case '**/.*': - return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; - - default: { - const match = /^(.*?)\.(\w+)$/.exec(str); - if (!match) return; - - const source = create(match[1]); - if (!source) return; - - return source + DOT_LITERAL + match[2]; - } - } - }; - - const output = utils.removePrefix(input, state); - let source = create(output); - - if (source && opts.strictSlashes !== true) { - source += `${SLASH_LITERAL}?`; - } - - return source; -}; - -module.exports = parse; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.merge = void 0; +const merge2 = __webpack_require__(243); +function merge(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream) => { + stream.once('error', (error) => mergedStream.emit('error', error)); + }); + mergedStream.once('close', () => propagateCloseEventToSources(streams)); + mergedStream.once('end', () => propagateCloseEventToSources(streams)); + return mergedStream; +} +exports.merge = merge; +function propagateCloseEventToSources(streams) { + streams.forEach((stream) => stream.emit('close')); +} /***/ }), -/* 291 */ +/* 286 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.merge = void 0; -const merge2 = __webpack_require__(243); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (error) => mergedStream.emit('error', error)); - }); - mergedStream.once('close', () => propagateCloseEventToSources(streams)); - mergedStream.once('end', () => propagateCloseEventToSources(streams)); - return mergedStream; -} -exports.merge = merge; -function propagateCloseEventToSources(streams) { - streams.forEach((stream) => stream.emit('close')); -} - - -/***/ }), -/* 292 */ -/***/ (function(module, exports, __webpack_require__) { -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEmpty = exports.isString = void 0; -function isString(input) { - return typeof input === 'string'; -} -exports.isString = isString; -function isEmpty(input) { - return input === ''; -} -exports.isEmpty = isEmpty; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isEmpty = exports.isString = void 0; +function isString(input) { + return typeof input === 'string'; +} +exports.isString = isString; +function isEmpty(input) { + return input === ''; +} +exports.isEmpty = isEmpty; /***/ }), -/* 293 */ +/* 287 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(294); -const provider_1 = __webpack_require__(321); -class ProviderAsync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = []; - return new Promise((resolve, reject) => { - const stream = this.api(root, task, options); - stream.once('error', reject); - stream.on('data', (entry) => entries.push(options.transform(entry))); - stream.once('end', () => resolve(entries)); - }); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderAsync; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(288); +const provider_1 = __webpack_require__(315); +class ProviderAsync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = []; + return new Promise((resolve, reject) => { + const stream = this.api(root, task, options); + stream.once('error', reject); + stream.on('data', (entry) => entries.push(options.transform(entry))); + stream.once('end', () => resolve(entries)); + }); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderAsync; /***/ }), -/* 294 */ +/* 288 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(173); -const fsStat = __webpack_require__(295); -const fsWalk = __webpack_require__(300); -const reader_1 = __webpack_require__(320); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; - } - dynamic(root, options) { - return this._walkStream(root, options); - } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); - }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); - } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); - } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - return error === null ? resolve(stats) : reject(error); - }); - }); - } -} -exports.default = ReaderStream; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(173); +const fsStat = __webpack_require__(289); +const fsWalk = __webpack_require__(294); +const reader_1 = __webpack_require__(314); +class ReaderStream extends reader_1.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk.walkStream; + this._stat = fsStat.stat; + } + dynamic(root, options) { + return this._walkStream(root, options); + } + static(patterns, options) { + const filepaths = patterns.map(this._getFullEntryPath, this); + const stream = new stream_1.PassThrough({ objectMode: true }); + stream._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns[index], options) + .then((entry) => { + if (entry !== null && options.entryFilter(entry)) { + stream.push(entry); + } + if (index === filepaths.length - 1) { + stream.end(); + } + done(); + }) + .catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream.write(i); + } + return stream; + } + _getEntry(filepath, pattern, options) { + return this._getStat(filepath) + .then((stats) => this._makeEntry(stats, pattern)) + .catch((error) => { + if (options.errorFilter(error)) { + return null; + } + throw error; + }); + } + _getStat(filepath) { + return new Promise((resolve, reject) => { + this._stat(filepath, this._fsStatSettings, (error, stats) => { + return error === null ? resolve(stats) : reject(error); + }); + }); + } +} +exports.default = ReaderStream; /***/ }), -/* 295 */ +/* 289 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(296); -const sync = __webpack_require__(297); -const settings_1 = __webpack_require__(298); +const async = __webpack_require__(290); +const sync = __webpack_require__(291); +const settings_1 = __webpack_require__(292); exports.Settings = settings_1.default; function stat(path, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -28689,7 +26641,7 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 296 */ +/* 290 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -28727,7 +26679,7 @@ function callSuccessCallback(callback, result) { /***/ }), -/* 297 */ +/* 291 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -28756,13 +26708,13 @@ exports.read = read; /***/ }), -/* 298 */ +/* 292 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(299); +const fs = __webpack_require__(293); class Settings { constructor(_options = {}) { this._options = _options; @@ -28779,7 +26731,7 @@ exports.default = Settings; /***/ }), -/* 299 */ +/* 293 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -28802,16 +26754,16 @@ exports.createFileSystemAdapter = createFileSystemAdapter; /***/ }), -/* 300 */ +/* 294 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(301); -const stream_1 = __webpack_require__(316); -const sync_1 = __webpack_require__(317); -const settings_1 = __webpack_require__(319); +const async_1 = __webpack_require__(295); +const stream_1 = __webpack_require__(310); +const sync_1 = __webpack_require__(311); +const settings_1 = __webpack_require__(313); exports.Settings = settings_1.default; function walk(directory, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -28841,13 +26793,13 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 301 */ +/* 295 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async_1 = __webpack_require__(302); +const async_1 = __webpack_require__(296); class AsyncProvider { constructor(_root, _settings) { this._root = _root; @@ -28878,17 +26830,17 @@ function callSuccessCallback(callback, entries) { /***/ }), -/* 302 */ +/* 296 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const events_1 = __webpack_require__(164); -const fsScandir = __webpack_require__(303); -const fastq = __webpack_require__(312); -const common = __webpack_require__(314); -const reader_1 = __webpack_require__(315); +const fsScandir = __webpack_require__(297); +const fastq = __webpack_require__(306); +const common = __webpack_require__(308); +const reader_1 = __webpack_require__(309); class AsyncReader extends reader_1.default { constructor(_root, _settings) { super(_root, _settings); @@ -28978,15 +26930,15 @@ exports.default = AsyncReader; /***/ }), -/* 303 */ +/* 297 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const async = __webpack_require__(304); -const sync = __webpack_require__(309); -const settings_1 = __webpack_require__(310); +const async = __webpack_require__(298); +const sync = __webpack_require__(303); +const settings_1 = __webpack_require__(304); exports.Settings = settings_1.default; function scandir(path, optionsOrSettingsOrCallback, callback) { if (typeof optionsOrSettingsOrCallback === 'function') { @@ -29009,16 +26961,16 @@ function getSettings(settingsOrOptions = {}) { /***/ }), -/* 304 */ +/* 298 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(295); -const rpl = __webpack_require__(305); -const constants_1 = __webpack_require__(306); -const utils = __webpack_require__(307); +const fsStat = __webpack_require__(289); +const rpl = __webpack_require__(299); +const constants_1 = __webpack_require__(300); +const utils = __webpack_require__(301); function read(directory, settings, callback) { if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { return readdirWithFileTypes(directory, settings, callback); @@ -29106,7 +27058,7 @@ function callSuccessCallback(callback, result) { /***/ }), -/* 305 */ +/* 299 */ /***/ (function(module, exports) { module.exports = runParallel @@ -29160,7 +27112,7 @@ function runParallel (tasks, cb) { /***/ }), -/* 306 */ +/* 300 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -29180,18 +27132,18 @@ exports.IS_SUPPORT_READDIR_WITH_FILE_TYPES = IS_MATCHED_BY_MAJOR || IS_MATCHED_B /***/ }), -/* 307 */ +/* 301 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fs = __webpack_require__(308); +const fs = __webpack_require__(302); exports.fs = fs; /***/ }), -/* 308 */ +/* 302 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -29216,15 +27168,15 @@ exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 309 */ +/* 303 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(295); -const constants_1 = __webpack_require__(306); -const utils = __webpack_require__(307); +const fsStat = __webpack_require__(289); +const constants_1 = __webpack_require__(300); +const utils = __webpack_require__(301); function read(directory, settings) { if (!settings.stats && constants_1.IS_SUPPORT_READDIR_WITH_FILE_TYPES) { return readdirWithFileTypes(directory, settings); @@ -29275,15 +27227,15 @@ exports.readdir = readdir; /***/ }), -/* 310 */ +/* 304 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsStat = __webpack_require__(295); -const fs = __webpack_require__(311); +const fsStat = __webpack_require__(289); +const fs = __webpack_require__(305); class Settings { constructor(_options = {}) { this._options = _options; @@ -29306,7 +27258,7 @@ exports.default = Settings; /***/ }), -/* 311 */ +/* 305 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -29331,13 +27283,13 @@ exports.createFileSystemAdapter = createFileSystemAdapter; /***/ }), -/* 312 */ +/* 306 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var reusify = __webpack_require__(313) +var reusify = __webpack_require__(307) function fastqueue (context, worker, concurrency) { if (typeof context === 'function') { @@ -29511,7 +27463,7 @@ module.exports = fastqueue /***/ }), -/* 313 */ +/* 307 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -29551,7 +27503,7 @@ module.exports = reusify /***/ }), -/* 314 */ +/* 308 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -29582,13 +27534,13 @@ exports.joinPathSegments = joinPathSegments; /***/ }), -/* 315 */ +/* 309 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const common = __webpack_require__(314); +const common = __webpack_require__(308); class Reader { constructor(_root, _settings) { this._root = _root; @@ -29600,14 +27552,14 @@ exports.default = Reader; /***/ }), -/* 316 */ +/* 310 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const stream_1 = __webpack_require__(173); -const async_1 = __webpack_require__(302); +const async_1 = __webpack_require__(296); class StreamProvider { constructor(_root, _settings) { this._root = _root; @@ -29637,13 +27589,13 @@ exports.default = StreamProvider; /***/ }), -/* 317 */ +/* 311 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(318); +const sync_1 = __webpack_require__(312); class SyncProvider { constructor(_root, _settings) { this._root = _root; @@ -29658,15 +27610,15 @@ exports.default = SyncProvider; /***/ }), -/* 318 */ +/* 312 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsScandir = __webpack_require__(303); -const common = __webpack_require__(314); -const reader_1 = __webpack_require__(315); +const fsScandir = __webpack_require__(297); +const common = __webpack_require__(308); +const reader_1 = __webpack_require__(309); class SyncReader extends reader_1.default { constructor() { super(...arguments); @@ -29724,14 +27676,14 @@ exports.default = SyncReader; /***/ }), -/* 319 */ +/* 313 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const path = __webpack_require__(4); -const fsScandir = __webpack_require__(303); +const fsScandir = __webpack_require__(297); class Settings { constructor(_options = {}) { this._options = _options; @@ -29757,579 +27709,579 @@ exports.default = Settings; /***/ }), -/* 320 */ +/* 314 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const fsStat = __webpack_require__(295); -const utils = __webpack_require__(259); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsStat = __webpack_require__(289); +const utils = __webpack_require__(259); +class Reader { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); + } + _getFullEntryPath(filepath) { + return path.resolve(this._settings.cwd, filepath); + } + _makeEntry(stats, pattern) { + const entry = { + name: pattern, + path: pattern, + dirent: utils.fs.createDirentFromStats(pattern, stats) + }; + if (this._settings.stats) { + entry.stats = stats; + } + return entry; + } + _isFatalError(error) { + return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; + } +} +exports.default = Reader; /***/ }), -/* 321 */ +/* 315 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const deep_1 = __webpack_require__(322); -const entry_1 = __webpack_require__(325); -const error_1 = __webpack_require__(326); -const entry_2 = __webpack_require__(327); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const deep_1 = __webpack_require__(316); +const entry_1 = __webpack_require__(319); +const error_1 = __webpack_require__(320); +const entry_2 = __webpack_require__(321); +class Provider { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); + } + _getRootDirectory(task) { + return path.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === '.' ? '' : task.base; + return { + basePath, + pathSegmentSeparator: '/', + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; + } +} +exports.default = Provider; /***/ }), -/* 322 */ +/* 316 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(259); -const partial_1 = __webpack_require__(323); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const matcher = this._getMatcher(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, matcher, negativeRe); - } - _getMatcher(patterns) { - return new partial_1.default(patterns, this._settings, this._micromatchOptions); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, matcher, negativeRe) { - if (this._isSkippedByDeep(basePath, entry.path)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._isSkippedByPositivePatterns(filepath, matcher)) { - return false; - } - return this._isSkippedByNegativePatterns(filepath, negativeRe); - } - _isSkippedByDeep(basePath, entryPath) { - /** - * Avoid unnecessary depth calculations when it doesn't matter. - */ - if (this._settings.deep === Infinity) { - return false; - } - return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; - } - _getEntryLevel(basePath, entryPath) { - const entryPathDepth = entryPath.split('/').length; - if (basePath === '') { - return entryPathDepth; - } - const basePathDepth = basePath.split('/').length; - return entryPathDepth - basePathDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedByPositivePatterns(entryPath, matcher) { - return !this._settings.baseNameMatch && !matcher.match(entryPath); - } - _isSkippedByNegativePatterns(entryPath, patternsRe) { - return !utils.pattern.matchAny(entryPath, patternsRe); - } -} -exports.default = DeepFilter; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(259); +const partial_1 = __webpack_require__(317); +class DeepFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const matcher = this._getMatcher(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry) => this._filter(basePath, entry, matcher, negativeRe); + } + _getMatcher(patterns) { + return new partial_1.default(patterns, this._settings, this._micromatchOptions); + } + _getNegativePatternsRe(patterns) { + const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); + return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry, matcher, negativeRe) { + if (this._isSkippedByDeep(basePath, entry.path)) { + return false; + } + if (this._isSkippedSymbolicLink(entry)) { + return false; + } + const filepath = utils.path.removeLeadingDotSegment(entry.path); + if (this._isSkippedByPositivePatterns(filepath, matcher)) { + return false; + } + return this._isSkippedByNegativePatterns(filepath, negativeRe); + } + _isSkippedByDeep(basePath, entryPath) { + /** + * Avoid unnecessary depth calculations when it doesn't matter. + */ + if (this._settings.deep === Infinity) { + return false; + } + return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; + } + _getEntryLevel(basePath, entryPath) { + const entryPathDepth = entryPath.split('/').length; + if (basePath === '') { + return entryPathDepth; + } + const basePathDepth = basePath.split('/').length; + return entryPathDepth - basePathDepth; + } + _isSkippedSymbolicLink(entry) { + return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); + } + _isSkippedByPositivePatterns(entryPath, matcher) { + return !this._settings.baseNameMatch && !matcher.match(entryPath); + } + _isSkippedByNegativePatterns(entryPath, patternsRe) { + return !utils.pattern.matchAny(entryPath, patternsRe); + } +} +exports.default = DeepFilter; /***/ }), -/* 323 */ +/* 317 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const matcher_1 = __webpack_require__(324); -class PartialMatcher extends matcher_1.default { - match(filepath) { - const parts = filepath.split('/'); - const levels = parts.length; - const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); - for (const pattern of patterns) { - const section = pattern.sections[0]; - /** - * In this case, the pattern has a globstar and we must read all directories unconditionally, - * but only if the level has reached the end of the first group. - * - * fixtures/{a,b}/** - * ^ true/false ^ always true - */ - if (!pattern.complete && levels > section.length) { - return true; - } - const match = parts.every((part, index) => { - const segment = pattern.segments[index]; - if (segment.dynamic && segment.patternRe.test(part)) { - return true; - } - if (!segment.dynamic && segment.pattern === part) { - return true; - } - return false; - }); - if (match) { - return true; - } - } - return false; - } -} -exports.default = PartialMatcher; + +Object.defineProperty(exports, "__esModule", { value: true }); +const matcher_1 = __webpack_require__(318); +class PartialMatcher extends matcher_1.default { + match(filepath) { + const parts = filepath.split('/'); + const levels = parts.length; + const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); + for (const pattern of patterns) { + const section = pattern.sections[0]; + /** + * In this case, the pattern has a globstar and we must read all directories unconditionally, + * but only if the level has reached the end of the first group. + * + * fixtures/{a,b}/** + * ^ true/false ^ always true + */ + if (!pattern.complete && levels > section.length) { + return true; + } + const match = parts.every((part, index) => { + const segment = pattern.segments[index]; + if (segment.dynamic && segment.patternRe.test(part)) { + return true; + } + if (!segment.dynamic && segment.pattern === part) { + return true; + } + return false; + }); + if (match) { + return true; + } + } + return false; + } +} +exports.default = PartialMatcher; /***/ }), -/* 324 */ +/* 318 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(259); -class Matcher { - constructor(_patterns, _settings, _micromatchOptions) { - this._patterns = _patterns; - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this._storage = []; - this._fillStorage(); - } - _fillStorage() { - /** - * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level). - * So, before expand patterns with brace expansion into separated patterns. - */ - const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns); - for (const pattern of patterns) { - const segments = this._getPatternSegments(pattern); - const sections = this._splitSegmentsIntoSections(segments); - this._storage.push({ - complete: sections.length <= 1, - pattern, - segments, - sections - }); - } - } - _getPatternSegments(pattern) { - const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); - return parts.map((part) => { - const dynamic = utils.pattern.isDynamicPattern(part, this._settings); - if (!dynamic) { - return { - dynamic: false, - pattern: part - }; - } - return { - dynamic: true, - pattern: part, - patternRe: utils.pattern.makeRe(part, this._micromatchOptions) - }; - }); - } - _splitSegmentsIntoSections(segments) { - return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); - } -} -exports.default = Matcher; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(259); +class Matcher { + constructor(_patterns, _settings, _micromatchOptions) { + this._patterns = _patterns; + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this._storage = []; + this._fillStorage(); + } + _fillStorage() { + /** + * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level). + * So, before expand patterns with brace expansion into separated patterns. + */ + const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns); + for (const pattern of patterns) { + const segments = this._getPatternSegments(pattern); + const sections = this._splitSegmentsIntoSections(segments); + this._storage.push({ + complete: sections.length <= 1, + pattern, + segments, + sections + }); + } + } + _getPatternSegments(pattern) { + const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); + return parts.map((part) => { + const dynamic = utils.pattern.isDynamicPattern(part, this._settings); + if (!dynamic) { + return { + dynamic: false, + pattern: part + }; + } + return { + dynamic: true, + pattern: part, + patternRe: utils.pattern.makeRe(part, this._micromatchOptions) + }; + }); + } + _splitSegmentsIntoSections(segments) { + return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); + } +} +exports.default = Matcher; /***/ }), -/* 325 */ +/* 319 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(259); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); - const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); - return (entry) => this._filter(entry, positiveRe, negativeRe); - } - _filter(entry, positiveRe, negativeRe) { - if (this._settings.unique && this._isDuplicateEntry(entry)) { - return false; - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) { - return false; - } - const filepath = this._settings.baseNameMatch ? entry.name : entry.path; - const isMatched = this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); - if (this._settings.unique && isMatched) { - this._createIndexRecord(entry); - } - return isMatched; - } - _isDuplicateEntry(entry) { - return this.index.has(entry.path); - } - _createIndexRecord(entry) { - this.index.set(entry.path, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) { - if (!this._settings.absolute) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath); - return utils.pattern.matchAny(fullpath, patternsRe); - } - _isMatchToPatterns(entryPath, patternsRe) { - const filepath = utils.path.removeLeadingDotSegment(entryPath); - return utils.pattern.matchAny(filepath, patternsRe); - } -} -exports.default = EntryFilter; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(259); +class EntryFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = new Map(); + } + getFilter(positive, negative) { + const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry) => this._filter(entry, positiveRe, negativeRe); + } + _filter(entry, positiveRe, negativeRe) { + if (this._settings.unique && this._isDuplicateEntry(entry)) { + return false; + } + if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry.name : entry.path; + const isMatched = this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); + if (this._settings.unique && isMatched) { + this._createIndexRecord(entry); + } + return isMatched; + } + _isDuplicateEntry(entry) { + return this.index.has(entry.path); + } + _createIndexRecord(entry) { + this.index.set(entry.path, undefined); + } + _onlyFileFilter(entry) { + return this._settings.onlyFiles && !entry.dirent.isFile(); + } + _onlyDirectoryFilter(entry) { + return this._settings.onlyDirectories && !entry.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) { + if (!this._settings.absolute) { + return false; + } + const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath); + return utils.pattern.matchAny(fullpath, patternsRe); + } + _isMatchToPatterns(entryPath, patternsRe) { + const filepath = utils.path.removeLeadingDotSegment(entryPath); + return utils.pattern.matchAny(filepath, patternsRe); + } +} +exports.default = EntryFilter; /***/ }), -/* 326 */ +/* 320 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(259); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(259); +class ErrorFilter { + constructor(_settings) { + this._settings = _settings; + } + getFilter() { + return (error) => this._isNonFatalError(error); + } + _isNonFatalError(error) { + return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; + } +} +exports.default = ErrorFilter; /***/ }), -/* 327 */ +/* 321 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(259); -class EntryTransformer { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += '/'; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign(Object.assign({}, entry), { path: filepath }); - } -} -exports.default = EntryTransformer; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(259); +class EntryTransformer { + constructor(_settings) { + this._settings = _settings; + } + getTransformer() { + return (entry) => this._transform(entry); + } + _transform(entry) { + let filepath = entry.path; + if (this._settings.absolute) { + filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); + filepath = utils.path.unixify(filepath); + } + if (this._settings.markDirectories && entry.dirent.isDirectory()) { + filepath += '/'; + } + if (!this._settings.objectMode) { + return filepath; + } + return Object.assign(Object.assign({}, entry), { path: filepath }); + } +} +exports.default = EntryTransformer; /***/ }), -/* 328 */ +/* 322 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(173); -const stream_2 = __webpack_require__(294); -const provider_1 = __webpack_require__(321); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => destination.emit('error', error)) - .on('data', (entry) => destination.emit('data', options.transform(entry))) - .once('end', () => destination.emit('end')); - destination - .once('close', () => source.destroy()); - return destination; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(173); +const stream_2 = __webpack_require__(288); +const provider_1 = __webpack_require__(315); +class ProviderStream extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const source = this.api(root, task, options); + const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); + source + .once('error', (error) => destination.emit('error', error)) + .on('data', (entry) => destination.emit('data', options.transform(entry))) + .once('end', () => destination.emit('end')); + destination + .once('close', () => source.destroy()); + return destination; + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderStream; /***/ }), -/* 329 */ +/* 323 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(330); -const provider_1 = __webpack_require__(321); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; + +Object.defineProperty(exports, "__esModule", { value: true }); +const sync_1 = __webpack_require__(324); +const provider_1 = __webpack_require__(315); +class ProviderSync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = this.api(root, task, options); + return entries.map(options.transform); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderSync; /***/ }), -/* 330 */ +/* 324 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(295); -const fsWalk = __webpack_require__(300); -const reader_1 = __webpack_require__(320); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(289); +const fsWalk = __webpack_require__(294); +const reader_1 = __webpack_require__(314); +class ReaderSync extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; + } + dynamic(root, options) { + return this._walkSync(root, options); + } + static(patterns, options) { + const entries = []; + for (const pattern of patterns) { + const filepath = this._getFullEntryPath(pattern); + const entry = this._getEntry(filepath, pattern, options); + if (entry === null || !options.entryFilter(entry)) { + continue; + } + entries.push(entry); + } + return entries; + } + _getEntry(filepath, pattern, options) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern); + } + catch (error) { + if (options.errorFilter(error)) { + return null; + } + throw error; + } + } + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); + } +} +exports.default = ReaderSync; /***/ }), -/* 331 */ +/* 325 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; -const fs = __webpack_require__(132); -const os = __webpack_require__(122); -/** - * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero. - * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107 - */ -const CPU_COUNT = Math.max(os.cpus().length, 1); -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); - } -} -exports.default = Settings; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; +const fs = __webpack_require__(132); +const os = __webpack_require__(122); +/** + * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero. + * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107 + */ +const CPU_COUNT = Math.max(os.cpus().length, 1); +exports.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + lstatSync: fs.lstatSync, + stat: fs.stat, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +class Settings { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } + } + _getValue(option, value) { + return option === undefined ? value : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); + } +} +exports.default = Settings; /***/ }), -/* 332 */ +/* 326 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(333); +const pathType = __webpack_require__(327); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -30405,7 +28357,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 333 */ +/* 327 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -30455,7 +28407,7 @@ exports.isSymlinkSync = isTypeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 334 */ +/* 328 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -30464,8 +28416,8 @@ const {promisify} = __webpack_require__(113); const fs = __webpack_require__(132); const path = __webpack_require__(4); const fastGlob = __webpack_require__(257); -const gitIgnore = __webpack_require__(335); -const slash = __webpack_require__(336); +const gitIgnore = __webpack_require__(329); +const slash = __webpack_require__(330); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -30579,7 +28531,7 @@ module.exports.sync = options => { /***/ }), -/* 335 */ +/* 329 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -31182,7 +29134,7 @@ if ( /***/ }), -/* 336 */ +/* 330 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -31200,7 +29152,7 @@ module.exports = path => { /***/ }), -/* 337 */ +/* 331 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -31253,7 +29205,7 @@ module.exports = { /***/ }), -/* 338 */ +/* 332 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -31275,7 +29227,7 @@ module.exports = path_ => { /***/ }), -/* 339 */ +/* 333 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -31303,7 +29255,7 @@ module.exports = (childPath, parentPath) => { /***/ }), -/* 340 */ +/* 334 */ /***/ (function(module, exports, __webpack_require__) { const assert = __webpack_require__(162) @@ -31669,12 +29621,12 @@ rimraf.sync = rimrafSync /***/ }), -/* 341 */ +/* 335 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const AggregateError = __webpack_require__(342); +const AggregateError = __webpack_require__(336); module.exports = async ( iterable, @@ -31757,13 +29709,13 @@ module.exports = async ( /***/ }), -/* 342 */ +/* 336 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const indentString = __webpack_require__(343); -const cleanStack = __webpack_require__(344); +const indentString = __webpack_require__(337); +const cleanStack = __webpack_require__(338); const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); @@ -31811,7 +29763,7 @@ module.exports = AggregateError; /***/ }), -/* 343 */ +/* 337 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -31853,7 +29805,7 @@ module.exports = (string, count = 1, options) => { /***/ }), -/* 344 */ +/* 338 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -31900,7 +29852,7 @@ module.exports = (stack, options) => { /***/ }), -/* 345 */ +/* 339 */ /***/ (function(module, exports, __webpack_require__) { var fs = __webpack_require__(132), @@ -32167,7 +30119,7 @@ function ncp (source, dest, options, callback) { /***/ }), -/* 346 */ +/* 340 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -32184,8 +30136,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(113); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(347); -/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(348); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(341); +/* harmony import */ var _project__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(342); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -32360,7 +30312,7 @@ function includeTransitiveProjects(subsetOfProjects, allProjects, { } /***/ }), -/* 347 */ +/* 341 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -32382,7 +30334,7 @@ class CliError extends Error { } /***/ }), -/* 348 */ +/* 342 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -32394,10 +30346,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(113); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(347); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(341); /* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(220); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(349); -/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(413); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(343); +/* harmony import */ var _scripts__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(407); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -32590,7 +30542,7 @@ function normalizePath(path) { } /***/ }), -/* 349 */ +/* 343 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -32601,9 +30553,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isLinkDependency", function() { return isLinkDependency; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isBazelPackageDependency", function() { return isBazelPackageDependency; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "transformDependencies", function() { return transformDependencies; }); -/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(350); +/* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(344); /* harmony import */ var read_pkg__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(read_pkg__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(402); +/* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(396); /* harmony import */ var write_pkg__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(write_pkg__WEBPACK_IMPORTED_MODULE_1__); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } @@ -32671,7 +30623,7 @@ function transformDependencies(dependencies = {}) { } /***/ }), -/* 350 */ +/* 344 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -32679,7 +30631,7 @@ function transformDependencies(dependencies = {}) { const {promisify} = __webpack_require__(113); const fs = __webpack_require__(132); const path = __webpack_require__(4); -const parseJson = __webpack_require__(351); +const parseJson = __webpack_require__(345); const readFileAsync = promisify(fs.readFile); @@ -32694,7 +30646,7 @@ module.exports = async options => { const json = parseJson(await readFileAsync(filePath, 'utf8')); if (options.normalize) { - __webpack_require__(372)(json); + __webpack_require__(366)(json); } return json; @@ -32711,7 +30663,7 @@ module.exports.sync = options => { const json = parseJson(fs.readFileSync(filePath, 'utf8')); if (options.normalize) { - __webpack_require__(372)(json); + __webpack_require__(366)(json); } return json; @@ -32719,15 +30671,15 @@ module.exports.sync = options => { /***/ }), -/* 351 */ +/* 345 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const errorEx = __webpack_require__(352); -const fallback = __webpack_require__(354); -const {default: LinesAndColumns} = __webpack_require__(355); -const {codeFrameColumns} = __webpack_require__(356); +const errorEx = __webpack_require__(346); +const fallback = __webpack_require__(348); +const {default: LinesAndColumns} = __webpack_require__(349); +const {codeFrameColumns} = __webpack_require__(350); const JSONError = errorEx('JSONError', { fileName: errorEx.append('in %s'), @@ -32776,14 +30728,14 @@ module.exports = (string, reviver, filename) => { /***/ }), -/* 352 */ +/* 346 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(113); -var isArrayish = __webpack_require__(353); +var isArrayish = __webpack_require__(347); var errorEx = function errorEx(name, properties) { if (!name || name.constructor !== String) { @@ -32916,7 +30868,7 @@ module.exports = errorEx; /***/ }), -/* 353 */ +/* 347 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -32933,7 +30885,7 @@ module.exports = function isArrayish(obj) { /***/ }), -/* 354 */ +/* 348 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -32978,7 +30930,7 @@ function parseJson (txt, reviver, context) { /***/ }), -/* 355 */ +/* 349 */ /***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; @@ -33042,7 +30994,7 @@ var LinesAndColumns = (function () { /***/ }), -/* 356 */ +/* 350 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -33054,7 +31006,7 @@ Object.defineProperty(exports, "__esModule", { exports.codeFrameColumns = codeFrameColumns; exports.default = _default; -var _highlight = __webpack_require__(357); +var _highlight = __webpack_require__(351); let deprecationWarningShown = false; @@ -33211,7 +31163,7 @@ function _default(rawLines, lineNumber, colNumber, opts = {}) { } /***/ }), -/* 357 */ +/* 351 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -33224,11 +31176,11 @@ exports.default = highlight; exports.getChalk = getChalk; exports.shouldHighlight = shouldHighlight; -var _jsTokens = __webpack_require__(358); +var _jsTokens = __webpack_require__(352); -var _helperValidatorIdentifier = __webpack_require__(359); +var _helperValidatorIdentifier = __webpack_require__(353); -var _chalk = __webpack_require__(362); +var _chalk = __webpack_require__(356); const sometimesKeywords = new Set(["as", "async", "from", "get", "of", "set"]); @@ -33333,7 +31285,7 @@ function highlight(code, options = {}) { } /***/ }), -/* 358 */ +/* 352 */ /***/ (function(module, exports) { // Copyright 2014, 2015, 2016, 2017, 2018 Simon Lydell @@ -33362,7 +31314,7 @@ exports.matchToToken = function(match) { /***/ }), -/* 359 */ +/* 353 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -33420,12 +31372,12 @@ Object.defineProperty(exports, "isKeyword", { } }); -var _identifier = __webpack_require__(360); +var _identifier = __webpack_require__(354); -var _keyword = __webpack_require__(361); +var _keyword = __webpack_require__(355); /***/ }), -/* 360 */ +/* 354 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -33515,7 +31467,7 @@ function isIdentifierName(name) { } /***/ }), -/* 361 */ +/* 355 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -33559,16 +31511,16 @@ function isKeyword(word) { } /***/ }), -/* 362 */ +/* 356 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(363); -const ansiStyles = __webpack_require__(364); -const stdoutColor = __webpack_require__(369).stdout; +const escapeStringRegexp = __webpack_require__(357); +const ansiStyles = __webpack_require__(358); +const stdoutColor = __webpack_require__(363).stdout; -const template = __webpack_require__(371); +const template = __webpack_require__(365); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -33794,7 +31746,7 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 363 */ +/* 357 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -33812,12 +31764,12 @@ module.exports = function (str) { /***/ }), -/* 364 */ +/* 358 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(365); +const colorConvert = __webpack_require__(359); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -33985,11 +31937,11 @@ Object.defineProperty(module, 'exports', { /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(116)(module))) /***/ }), -/* 365 */ +/* 359 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(366); -var route = __webpack_require__(368); +var conversions = __webpack_require__(360); +var route = __webpack_require__(362); var convert = {}; @@ -34069,11 +32021,11 @@ module.exports = convert; /***/ }), -/* 366 */ +/* 360 */ /***/ (function(module, exports, __webpack_require__) { /* MIT license */ -var cssKeywords = __webpack_require__(367); +var cssKeywords = __webpack_require__(361); // NOTE: conversions should only return primitive values (i.e. arrays, or // values that give correct `typeof` results). @@ -34943,7 +32895,7 @@ convert.rgb.gray = function (rgb) { /***/ }), -/* 367 */ +/* 361 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -35102,10 +33054,10 @@ module.exports = { /***/ }), -/* 368 */ +/* 362 */ /***/ (function(module, exports, __webpack_require__) { -var conversions = __webpack_require__(366); +var conversions = __webpack_require__(360); /* this function routes a model to all other models. @@ -35205,13 +33157,13 @@ module.exports = function (fromModel) { /***/ }), -/* 369 */ +/* 363 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const os = __webpack_require__(122); -const hasFlag = __webpack_require__(370); +const hasFlag = __webpack_require__(364); const env = process.env; @@ -35343,7 +33295,7 @@ module.exports = { /***/ }), -/* 370 */ +/* 364 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -35358,7 +33310,7 @@ module.exports = (flag, argv) => { /***/ }), -/* 371 */ +/* 365 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -35493,15 +33445,15 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 372 */ +/* 366 */ /***/ (function(module, exports, __webpack_require__) { module.exports = normalize -var fixer = __webpack_require__(373) +var fixer = __webpack_require__(367) normalize.fixer = fixer -var makeWarning = __webpack_require__(400) +var makeWarning = __webpack_require__(394) var fieldsToFix = ['name','version','description','repository','modules','scripts' ,'files','bin','man','bugs','keywords','readme','homepage','license'] @@ -35538,17 +33490,17 @@ function ucFirst (string) { /***/ }), -/* 373 */ +/* 367 */ /***/ (function(module, exports, __webpack_require__) { -var semver = __webpack_require__(374) -var validateLicense = __webpack_require__(375); -var hostedGitInfo = __webpack_require__(380) -var isBuiltinModule = __webpack_require__(383).isCore +var semver = __webpack_require__(368) +var validateLicense = __webpack_require__(369); +var hostedGitInfo = __webpack_require__(374) +var isBuiltinModule = __webpack_require__(377).isCore var depTypes = ["dependencies","devDependencies","optionalDependencies"] -var extractDescription = __webpack_require__(398) +var extractDescription = __webpack_require__(392) var url = __webpack_require__(203) -var typos = __webpack_require__(399) +var typos = __webpack_require__(393) var fixer = module.exports = { // default warning function @@ -35962,7 +33914,7 @@ function bugsTypos(bugs, warn) { /***/ }), -/* 374 */ +/* 368 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -37451,11 +35403,11 @@ function coerce (version) { /***/ }), -/* 375 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(376); -var correct = __webpack_require__(378); +var parse = __webpack_require__(370); +var correct = __webpack_require__(372); var genericWarning = ( 'license should be ' + @@ -37541,10 +35493,10 @@ module.exports = function(argument) { /***/ }), -/* 376 */ +/* 370 */ /***/ (function(module, exports, __webpack_require__) { -var parser = __webpack_require__(377).parser +var parser = __webpack_require__(371).parser module.exports = function (argument) { return parser.parse(argument) @@ -37552,7 +35504,7 @@ module.exports = function (argument) { /***/ }), -/* 377 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { /* WEBPACK VAR INJECTION */(function(module) {/* parser generated by jison 0.4.17 */ @@ -38916,10 +36868,10 @@ if ( true && __webpack_require__.c[__webpack_require__.s] === module) { /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(116)(module))) /***/ }), -/* 378 */ +/* 372 */ /***/ (function(module, exports, __webpack_require__) { -var licenseIDs = __webpack_require__(379); +var licenseIDs = __webpack_require__(373); function valid(string) { return licenseIDs.indexOf(string) > -1; @@ -39159,20 +37111,20 @@ module.exports = function(identifier) { /***/ }), -/* 379 */ +/* 373 */ /***/ (function(module) { module.exports = JSON.parse("[\"Glide\",\"Abstyles\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"AMPAS\",\"APL-1.0\",\"Adobe-Glyph\",\"APAFML\",\"Adobe-2006\",\"AGPL-1.0\",\"Afmparse\",\"Aladdin\",\"ADSL\",\"AMDPLPA\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"AML\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0\",\"Artistic-1.0-Perl\",\"Artistic-1.0-cl8\",\"Artistic-2.0\",\"AAL\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"BSL-1.0\",\"Borceux\",\"BSD-2-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-3-Clause\",\"BSD-3-Clause-Clear\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSD-3-Clause-Attribution\",\"0BSD\",\"BSD-4-Clause-UC\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"MIT-CMU\",\"CNRI-Jython\",\"CNRI-Python\",\"CNRI-Python-GPL-Compatible\",\"CPOL-1.02\",\"CDDL-1.0\",\"CDDL-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CATOSL-1.1\",\"Condor-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"WTFPL\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"EPL-1.0\",\"ECL-1.0\",\"ECL-2.0\",\"eGenix\",\"EFL-1.0\",\"EFL-2.0\",\"MIT-advertising\",\"MIT-enna\",\"Entessa\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"Eurosym\",\"Fair\",\"MIT-feh\",\"Frameworx-1.0\",\"FreeImage\",\"FTL\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"Giftware\",\"GL2PS\",\"Glulxe\",\"AGPL-3.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0\",\"GPL-3.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"LGPL-2.0\",\"gnuplot\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"IPL-1.0\",\"ICU\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"IJG\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"Latex2e\",\"BSD-3-Clause-LBNL\",\"Leptonica\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LAL-1.2\",\"LAL-1.3\",\"LiLiQ-P-1.1\",\"LiLiQ-Rplus-1.1\",\"LiLiQ-R-1.1\",\"LPL-1.02\",\"LPL-1.0\",\"MakeIndex\",\"MTLL\",\"MS-PL\",\"MS-RL\",\"MirOS\",\"MITNFA\",\"MIT\",\"Motosoto\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0\",\"MPL-2.0-no-copyleft-exception\",\"mpich2\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NetCDF\",\"NGPL\",\"NOSL\",\"NPL-1.0\",\"NPL-1.1\",\"Newsletr\",\"NLPL\",\"Nokia\",\"NPOSL-3.0\",\"NLOD-1.0\",\"Noweb\",\"NRL\",\"NTP\",\"Nunit\",\"OCLC-2.0\",\"ODbL-1.0\",\"PDDL-1.0\",\"OCCT-PL\",\"OGTSL\",\"OLDAP-2.2.2\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0\",\"OLDAP-2.0.1\",\"OLDAP-2.1\",\"OLDAP-2.2\",\"OLDAP-2.2.1\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OPL-1.0\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"OpenSSL\",\"OSET-PL-2.1\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"QPL-1.0\",\"Qhull\",\"Rdisc\",\"RPSL-1.0\",\"RPL-1.1\",\"RPL-1.5\",\"RHeCos-1.1\",\"RSCPL\",\"RSA-MD\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"SWL\",\"SMPPL\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"OFL-1.0\",\"OFL-1.1\",\"SimPL-2.0\",\"Sleepycat\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SMLNJ\",\"SugarCRM-1.1.3\",\"SISSL\",\"SISSL-1.2\",\"SPL-1.0\",\"Watcom-1.0\",\"TCL\",\"Unlicense\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-TOU\",\"UPL-1.0\",\"NCSA\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C\",\"Wsuipa\",\"Xnet\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"Zlib\",\"zlib-acknowledgement\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"eCos-2.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"StandardML-NJ\",\"WXwindows\"]"); /***/ }), -/* 380 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var url = __webpack_require__(203) -var gitHosts = __webpack_require__(381) -var GitHost = module.exports = __webpack_require__(382) +var gitHosts = __webpack_require__(375) +var GitHost = module.exports = __webpack_require__(376) var protocolToRepresentationMap = { 'git+ssh:': 'sshurl', @@ -39320,7 +37272,7 @@ function parseGitUrl (giturl) { /***/ }), -/* 381 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -39406,12 +37358,12 @@ function formatHashFragment (fragment) { /***/ }), -/* 382 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var gitHosts = __webpack_require__(381) +var gitHosts = __webpack_require__(375) /* eslint-disable node/no-deprecated-api */ // copy-pasta util._extend from node's source, to avoid pulling @@ -39569,27 +37521,27 @@ GitHost.prototype.toString = function (opts) { /***/ }), -/* 383 */ +/* 377 */ /***/ (function(module, exports, __webpack_require__) { -var async = __webpack_require__(384); -async.core = __webpack_require__(394); -async.isCore = __webpack_require__(396); -async.sync = __webpack_require__(397); +var async = __webpack_require__(378); +async.core = __webpack_require__(388); +async.isCore = __webpack_require__(390); +async.sync = __webpack_require__(391); module.exports = async; /***/ }), -/* 384 */ +/* 378 */ /***/ (function(module, exports, __webpack_require__) { var fs = __webpack_require__(132); var path = __webpack_require__(4); -var caller = __webpack_require__(385); -var nodeModulesPaths = __webpack_require__(386); -var normalizeOptions = __webpack_require__(388); -var isCore = __webpack_require__(389); +var caller = __webpack_require__(379); +var nodeModulesPaths = __webpack_require__(380); +var normalizeOptions = __webpack_require__(382); +var isCore = __webpack_require__(383); var realpathFS = fs.realpath && typeof fs.realpath.native === 'function' ? fs.realpath.native : fs.realpath; @@ -39907,7 +37859,7 @@ module.exports = function resolve(x, options, callback) { /***/ }), -/* 385 */ +/* 379 */ /***/ (function(module, exports) { module.exports = function () { @@ -39921,11 +37873,11 @@ module.exports = function () { /***/ }), -/* 386 */ +/* 380 */ /***/ (function(module, exports, __webpack_require__) { var path = __webpack_require__(4); -var parse = path.parse || __webpack_require__(387); +var parse = path.parse || __webpack_require__(381); var getNodeModulesDirs = function getNodeModulesDirs(absoluteStart, modules) { var prefix = '/'; @@ -39969,7 +37921,7 @@ module.exports = function nodeModulesPaths(start, opts, request) { /***/ }), -/* 387 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40051,7 +38003,7 @@ module.exports.win32 = win32.parse; /***/ }), -/* 388 */ +/* 382 */ /***/ (function(module, exports) { module.exports = function (x, opts) { @@ -40067,13 +38019,13 @@ module.exports = function (x, opts) { /***/ }), -/* 389 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var has = __webpack_require__(390); +var has = __webpack_require__(384); function specifierIncluded(current, specifier) { var nodeParts = current.split('.'); @@ -40135,7 +38087,7 @@ function versionIncluded(nodeVersion, specifierValue) { return matchesRange(current, specifierValue); } -var data = __webpack_require__(393); +var data = __webpack_require__(387); module.exports = function isCore(x, nodeVersion) { return has(data, x) && versionIncluded(nodeVersion, data[x]); @@ -40143,31 +38095,31 @@ module.exports = function isCore(x, nodeVersion) { /***/ }), -/* 390 */ +/* 384 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var bind = __webpack_require__(391); +var bind = __webpack_require__(385); module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty); /***/ }), -/* 391 */ +/* 385 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var implementation = __webpack_require__(392); +var implementation = __webpack_require__(386); module.exports = Function.prototype.bind || implementation; /***/ }), -/* 392 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40226,13 +38178,13 @@ module.exports = function bind(that) { /***/ }), -/* 393 */ +/* 387 */ /***/ (function(module) { module.exports = JSON.parse("{\"assert\":true,\"node:assert\":[\">= 14.18 && < 15\",\">= 16\"],\"assert/strict\":\">= 15\",\"node:assert/strict\":\">= 16\",\"async_hooks\":\">= 8\",\"node:async_hooks\":[\">= 14.18 && < 15\",\">= 16\"],\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"node:buffer\":[\">= 14.18 && < 15\",\">= 16\"],\"child_process\":true,\"node:child_process\":[\">= 14.18 && < 15\",\">= 16\"],\"cluster\":true,\"node:cluster\":[\">= 14.18 && < 15\",\">= 16\"],\"console\":true,\"node:console\":[\">= 14.18 && < 15\",\">= 16\"],\"constants\":true,\"node:constants\":[\">= 14.18 && < 15\",\">= 16\"],\"crypto\":true,\"node:crypto\":[\">= 14.18 && < 15\",\">= 16\"],\"_debug_agent\":\">= 1 && < 8\",\"_debugger\":\"< 8\",\"dgram\":true,\"node:dgram\":[\">= 14.18 && < 15\",\">= 16\"],\"diagnostics_channel\":[\">= 14.17 && < 15\",\">= 15.1\"],\"node:diagnostics_channel\":[\">= 14.18 && < 15\",\">= 16\"],\"dns\":true,\"node:dns\":[\">= 14.18 && < 15\",\">= 16\"],\"dns/promises\":\">= 15\",\"node:dns/promises\":\">= 16\",\"domain\":\">= 0.7.12\",\"node:domain\":[\">= 14.18 && < 15\",\">= 16\"],\"events\":true,\"node:events\":[\">= 14.18 && < 15\",\">= 16\"],\"freelist\":\"< 6\",\"fs\":true,\"node:fs\":[\">= 14.18 && < 15\",\">= 16\"],\"fs/promises\":[\">= 10 && < 10.1\",\">= 14\"],\"node:fs/promises\":[\">= 14.18 && < 15\",\">= 16\"],\"_http_agent\":\">= 0.11.1\",\"node:_http_agent\":[\">= 14.18 && < 15\",\">= 16\"],\"_http_client\":\">= 0.11.1\",\"node:_http_client\":[\">= 14.18 && < 15\",\">= 16\"],\"_http_common\":\">= 0.11.1\",\"node:_http_common\":[\">= 14.18 && < 15\",\">= 16\"],\"_http_incoming\":\">= 0.11.1\",\"node:_http_incoming\":[\">= 14.18 && < 15\",\">= 16\"],\"_http_outgoing\":\">= 0.11.1\",\"node:_http_outgoing\":[\">= 14.18 && < 15\",\">= 16\"],\"_http_server\":\">= 0.11.1\",\"node:_http_server\":[\">= 14.18 && < 15\",\">= 16\"],\"http\":true,\"node:http\":[\">= 14.18 && < 15\",\">= 16\"],\"http2\":\">= 8.8\",\"node:http2\":[\">= 14.18 && < 15\",\">= 16\"],\"https\":true,\"node:https\":[\">= 14.18 && < 15\",\">= 16\"],\"inspector\":\">= 8\",\"node:inspector\":[\">= 14.18 && < 15\",\">= 16\"],\"_linklist\":\"< 8\",\"module\":true,\"node:module\":[\">= 14.18 && < 15\",\">= 16\"],\"net\":true,\"node:net\":[\">= 14.18 && < 15\",\">= 16\"],\"node-inspect/lib/_inspect\":\">= 7.6 && < 12\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6 && < 12\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6 && < 12\",\"os\":true,\"node:os\":[\">= 14.18 && < 15\",\">= 16\"],\"path\":true,\"node:path\":[\">= 14.18 && < 15\",\">= 16\"],\"path/posix\":\">= 15.3\",\"node:path/posix\":\">= 16\",\"path/win32\":\">= 15.3\",\"node:path/win32\":\">= 16\",\"perf_hooks\":\">= 8.5\",\"node:perf_hooks\":[\">= 14.18 && < 15\",\">= 16\"],\"process\":\">= 1\",\"node:process\":[\">= 14.18 && < 15\",\">= 16\"],\"punycode\":true,\"node:punycode\":[\">= 14.18 && < 15\",\">= 16\"],\"querystring\":true,\"node:querystring\":[\">= 14.18 && < 15\",\">= 16\"],\"readline\":true,\"node:readline\":[\">= 14.18 && < 15\",\">= 16\"],\"repl\":true,\"node:repl\":[\">= 14.18 && < 15\",\">= 16\"],\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"node:_stream_duplex\":[\">= 14.18 && < 15\",\">= 16\"],\"_stream_transform\":\">= 0.9.4\",\"node:_stream_transform\":[\">= 14.18 && < 15\",\">= 16\"],\"_stream_wrap\":\">= 1.4.1\",\"node:_stream_wrap\":[\">= 14.18 && < 15\",\">= 16\"],\"_stream_passthrough\":\">= 0.9.4\",\"node:_stream_passthrough\":[\">= 14.18 && < 15\",\">= 16\"],\"_stream_readable\":\">= 0.9.4\",\"node:_stream_readable\":[\">= 14.18 && < 15\",\">= 16\"],\"_stream_writable\":\">= 0.9.4\",\"node:_stream_writable\":[\">= 14.18 && < 15\",\">= 16\"],\"stream\":true,\"node:stream\":[\">= 14.18 && < 15\",\">= 16\"],\"stream/consumers\":\">= 16.7\",\"node:stream/consumers\":\">= 16.7\",\"stream/promises\":\">= 15\",\"node:stream/promises\":\">= 16\",\"stream/web\":\">= 16.5\",\"node:stream/web\":\">= 16.5\",\"string_decoder\":true,\"node:string_decoder\":[\">= 14.18 && < 15\",\">= 16\"],\"sys\":[\">= 0.6 && < 0.7\",\">= 0.8\"],\"node:sys\":[\">= 14.18 && < 15\",\">= 16\"],\"timers\":true,\"node:timers\":[\">= 14.18 && < 15\",\">= 16\"],\"timers/promises\":\">= 15\",\"node:timers/promises\":\">= 16\",\"_tls_common\":\">= 0.11.13\",\"node:_tls_common\":[\">= 14.18 && < 15\",\">= 16\"],\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"node:_tls_wrap\":[\">= 14.18 && < 15\",\">= 16\"],\"tls\":true,\"node:tls\":[\">= 14.18 && < 15\",\">= 16\"],\"trace_events\":\">= 10\",\"node:trace_events\":[\">= 14.18 && < 15\",\">= 16\"],\"tty\":true,\"node:tty\":[\">= 14.18 && < 15\",\">= 16\"],\"url\":true,\"node:url\":[\">= 14.18 && < 15\",\">= 16\"],\"util\":true,\"node:util\":[\">= 14.18 && < 15\",\">= 16\"],\"util/types\":\">= 15.3\",\"node:util/types\":\">= 16\",\"v8/tools/arguments\":\">= 10 && < 12\",\"v8/tools/codemap\":[\">= 4.4 && < 5\",\">= 5.2 && < 12\"],\"v8/tools/consarray\":[\">= 4.4 && < 5\",\">= 5.2 && < 12\"],\"v8/tools/csvparser\":[\">= 4.4 && < 5\",\">= 5.2 && < 12\"],\"v8/tools/logreader\":[\">= 4.4 && < 5\",\">= 5.2 && < 12\"],\"v8/tools/profile_view\":[\">= 4.4 && < 5\",\">= 5.2 && < 12\"],\"v8/tools/splaytree\":[\">= 4.4 && < 5\",\">= 5.2 && < 12\"],\"v8\":\">= 1\",\"node:v8\":[\">= 14.18 && < 15\",\">= 16\"],\"vm\":true,\"node:vm\":[\">= 14.18 && < 15\",\">= 16\"],\"wasi\":\">= 13.4 && < 13.5\",\"worker_threads\":\">= 11.7\",\"node:worker_threads\":[\">= 14.18 && < 15\",\">= 16\"],\"zlib\":true,\"node:zlib\":[\">= 14.18 && < 15\",\">= 16\"]}"); /***/ }), -/* 394 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { var current = (process.versions && process.versions.node && process.versions.node.split('.')) || []; @@ -40279,7 +38231,7 @@ function versionIncluded(specifierValue) { return matchesRange(specifierValue); } -var data = __webpack_require__(395); +var data = __webpack_require__(389); var core = {}; for (var mod in data) { // eslint-disable-line no-restricted-syntax @@ -40291,16 +38243,16 @@ module.exports = core; /***/ }), -/* 395 */ +/* 389 */ /***/ (function(module) { module.exports = JSON.parse("{\"assert\":true,\"assert/strict\":\">= 15\",\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debug_agent\":\">= 1 && < 8\",\"_debugger\":\"< 8\",\"dgram\":true,\"diagnostics_channel\":\">= 15.1\",\"dns\":true,\"dns/promises\":\">= 15\",\"domain\":\">= 0.7.12\",\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":[\">= 10 && < 10.1\",\">= 14\"],\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0 && < 12\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0 && < 12\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0 && < 12\",\"os\":true,\"path\":true,\"path/posix\":\">= 15.3\",\"path/win32\":\">= 15.3\",\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"stream/promises\":\">= 15\",\"string_decoder\":true,\"sys\":[\">= 0.6 && < 0.7\",\">= 0.8\"],\"timers\":true,\"timers/promises\":\">= 15\",\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"util/types\":\">= 15.3\",\"v8/tools/arguments\":\">= 10 && < 12\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0 && < 12\"],\"v8\":\">= 1\",\"vm\":true,\"wasi\":\">= 13.4 && < 13.5\",\"worker_threads\":\">= 11.7\",\"zlib\":true}"); /***/ }), -/* 396 */ +/* 390 */ /***/ (function(module, exports, __webpack_require__) { -var isCoreModule = __webpack_require__(389); +var isCoreModule = __webpack_require__(383); module.exports = function isCore(x) { return isCoreModule(x); @@ -40308,15 +38260,15 @@ module.exports = function isCore(x) { /***/ }), -/* 397 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { -var isCore = __webpack_require__(389); +var isCore = __webpack_require__(383); var fs = __webpack_require__(132); var path = __webpack_require__(4); -var caller = __webpack_require__(385); -var nodeModulesPaths = __webpack_require__(386); -var normalizeOptions = __webpack_require__(388); +var caller = __webpack_require__(379); +var nodeModulesPaths = __webpack_require__(380); +var normalizeOptions = __webpack_require__(382); var realpathFS = fs.realpathSync && typeof fs.realpathSync.native === 'function' ? fs.realpathSync.native : fs.realpathSync; @@ -40513,7 +38465,7 @@ module.exports = function resolveSync(x, options) { /***/ }), -/* 398 */ +/* 392 */ /***/ (function(module, exports) { module.exports = extractDescription @@ -40533,17 +38485,17 @@ function extractDescription (d) { /***/ }), -/* 399 */ +/* 393 */ /***/ (function(module) { module.exports = JSON.parse("{\"topLevel\":{\"dependancies\":\"dependencies\",\"dependecies\":\"dependencies\",\"depdenencies\":\"dependencies\",\"devEependencies\":\"devDependencies\",\"depends\":\"dependencies\",\"dev-dependencies\":\"devDependencies\",\"devDependences\":\"devDependencies\",\"devDepenencies\":\"devDependencies\",\"devdependencies\":\"devDependencies\",\"repostitory\":\"repository\",\"repo\":\"repository\",\"prefereGlobal\":\"preferGlobal\",\"hompage\":\"homepage\",\"hampage\":\"homepage\",\"autohr\":\"author\",\"autor\":\"author\",\"contributers\":\"contributors\",\"publicationConfig\":\"publishConfig\",\"script\":\"scripts\"},\"bugs\":{\"web\":\"url\",\"name\":\"url\"},\"script\":{\"server\":\"start\",\"tests\":\"test\"}}"); /***/ }), -/* 400 */ +/* 394 */ /***/ (function(module, exports, __webpack_require__) { var util = __webpack_require__(113) -var messages = __webpack_require__(401) +var messages = __webpack_require__(395) module.exports = function() { var args = Array.prototype.slice.call(arguments, 0) @@ -40568,20 +38520,20 @@ function makeTypoWarning (providedName, probableName, field) { /***/ }), -/* 401 */ +/* 395 */ /***/ (function(module) { module.exports = JSON.parse("{\"repositories\":\"'repositories' (plural) Not supported. Please pick one as the 'repository' field\",\"missingRepository\":\"No repository field.\",\"brokenGitUrl\":\"Probably broken git url: %s\",\"nonObjectScripts\":\"scripts must be an object\",\"nonStringScript\":\"script values must be string commands\",\"nonArrayFiles\":\"Invalid 'files' member\",\"invalidFilename\":\"Invalid filename in 'files' list: %s\",\"nonArrayBundleDependencies\":\"Invalid 'bundleDependencies' list. Must be array of package names\",\"nonStringBundleDependency\":\"Invalid bundleDependencies member: %s\",\"nonDependencyBundleDependency\":\"Non-dependency in bundleDependencies: %s\",\"nonObjectDependencies\":\"%s field must be an object\",\"nonStringDependency\":\"Invalid dependency: %s %s\",\"deprecatedArrayDependencies\":\"specifying %s as array is deprecated\",\"deprecatedModules\":\"modules field is deprecated\",\"nonArrayKeywords\":\"keywords should be an array of strings\",\"nonStringKeyword\":\"keywords should be an array of strings\",\"conflictingName\":\"%s is also the name of a node core module.\",\"nonStringDescription\":\"'description' field should be a string\",\"missingDescription\":\"No description\",\"missingReadme\":\"No README data\",\"missingLicense\":\"No license field.\",\"nonEmailUrlBugsString\":\"Bug string field must be url, email, or {email,url}\",\"nonUrlBugsUrlField\":\"bugs.url field must be a string url. Deleted.\",\"nonEmailBugsEmailField\":\"bugs.email field must be a string email. Deleted.\",\"emptyNormalizedBugs\":\"Normalized value of bugs field is an empty object. Deleted.\",\"nonUrlHomepage\":\"homepage field must be a string url. Deleted.\",\"invalidLicense\":\"license should be a valid SPDX license expression\",\"typo\":\"%s should probably be %s.\"}"); /***/ }), -/* 402 */ +/* 396 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const writeJsonFile = __webpack_require__(403); -const sortKeys = __webpack_require__(407); +const writeJsonFile = __webpack_require__(397); +const sortKeys = __webpack_require__(401); const dependencyKeys = new Set([ 'dependencies', @@ -40646,18 +38598,18 @@ module.exports.sync = (filePath, data, options) => { /***/ }), -/* 403 */ +/* 397 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); const fs = __webpack_require__(233); -const writeFileAtomic = __webpack_require__(404); -const sortKeys = __webpack_require__(407); -const makeDir = __webpack_require__(409); -const pify = __webpack_require__(410); -const detectIndent = __webpack_require__(412); +const writeFileAtomic = __webpack_require__(398); +const sortKeys = __webpack_require__(401); +const makeDir = __webpack_require__(403); +const pify = __webpack_require__(404); +const detectIndent = __webpack_require__(406); const init = (fn, filePath, data, options) => { if (!filePath) { @@ -40729,7 +38681,7 @@ module.exports.sync = (filePath, data, options) => { /***/ }), -/* 404 */ +/* 398 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -40740,7 +38692,7 @@ module.exports._getTmpname = getTmpname // for testing module.exports._cleanupOnExit = cleanupOnExit var fs = __webpack_require__(233) -var MurmurHash3 = __webpack_require__(405) +var MurmurHash3 = __webpack_require__(399) var onExit = __webpack_require__(161) var path = __webpack_require__(4) var activeFiles = {} @@ -40749,7 +38701,7 @@ var activeFiles = {} /* istanbul ignore next */ var threadId = (function getId () { try { - var workerThreads = __webpack_require__(406) + var workerThreads = __webpack_require__(400) /// if we are in main thread, this is set to `0` return workerThreads.threadId @@ -40974,7 +38926,7 @@ function writeFileSync (filename, data, options) { /***/ }), -/* 405 */ +/* 399 */ /***/ (function(module, exports, __webpack_require__) { /** @@ -41116,18 +39068,18 @@ function writeFileSync (filename, data, options) { /***/ }), -/* 406 */ +/* 400 */ /***/ (function(module, exports) { module.exports = require(undefined); /***/ }), -/* 407 */ +/* 401 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isPlainObj = __webpack_require__(408); +const isPlainObj = __webpack_require__(402); module.exports = (obj, opts) => { if (!isPlainObj(obj)) { @@ -41184,7 +39136,7 @@ module.exports = (obj, opts) => { /***/ }), -/* 408 */ +/* 402 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41198,15 +39150,15 @@ module.exports = function (x) { /***/ }), -/* 409 */ +/* 403 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(132); const path = __webpack_require__(4); -const pify = __webpack_require__(410); -const semver = __webpack_require__(411); +const pify = __webpack_require__(404); +const semver = __webpack_require__(405); const defaults = { mode: 0o777 & (~process.umask()), @@ -41344,7 +39296,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 410 */ +/* 404 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -41419,7 +39371,7 @@ module.exports = (input, options) => { /***/ }), -/* 411 */ +/* 405 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -42908,7 +40860,7 @@ function coerce (version) { /***/ }), -/* 412 */ +/* 406 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -43037,7 +40989,7 @@ module.exports = str => { /***/ }), -/* 413 */ +/* 407 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -43097,14 +41049,14 @@ function runScriptInPackageStreaming({ } /***/ }), -/* 414 */ +/* 408 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "readYarnLock", function() { return readYarnLock; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resolveDepsForProject", function() { return resolveDepsForProject; }); -/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(415); +/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(409); /* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(231); /* @@ -43206,7 +41158,7 @@ function resolveDepsForProject({ } /***/ }), -/* 415 */ +/* 409 */ /***/ (function(module, exports, __webpack_require__) { module.exports = @@ -47089,7 +45041,7 @@ function onceStrict (fn) { /* 63 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(416); +module.exports = __webpack_require__(410); /***/ }), /* 64 */, @@ -53484,21 +51436,21 @@ module.exports = process && support(supportLevel); /******/ ]); /***/ }), -/* 416 */ +/* 410 */ /***/ (function(module, exports) { module.exports = require("buffer"); /***/ }), -/* 417 */ +/* 411 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sortPackageJson", function() { return sortPackageJson; }); -/* harmony import */ var fs_promises__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(418); +/* harmony import */ var fs_promises__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(412); /* harmony import */ var fs_promises__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs_promises__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var sort_package_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(419); +/* harmony import */ var sort_package_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(413); /* harmony import */ var sort_package_json__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(sort_package_json__WEBPACK_IMPORTED_MODULE_1__); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one @@ -53519,20 +51471,20 @@ async function sortPackageJson(kbn) { } /***/ }), -/* 418 */ +/* 412 */ /***/ (function(module, exports) { module.exports = require("fs/promises"); /***/ }), -/* 419 */ +/* 413 */ /***/ (function(module, exports, __webpack_require__) { -const sortObjectKeys = __webpack_require__(420) -const detectIndent = __webpack_require__(421) -const detectNewline = __webpack_require__(422).graceful -const gitHooks = __webpack_require__(423) -const isPlainObject = __webpack_require__(424) +const sortObjectKeys = __webpack_require__(414) +const detectIndent = __webpack_require__(415) +const detectNewline = __webpack_require__(416).graceful +const gitHooks = __webpack_require__(417) +const isPlainObject = __webpack_require__(418) const hasOwnProperty = (object, property) => Object.prototype.hasOwnProperty.call(object, property) @@ -53891,7 +51843,7 @@ module.exports.default = sortPackageJson /***/ }), -/* 420 */ +/* 414 */ /***/ (function(module, exports) { module.exports = function sortObjectByKeyNameList(object, sortWith) { @@ -53915,7 +51867,7 @@ module.exports = function sortObjectByKeyNameList(object, sortWith) { /***/ }), -/* 421 */ +/* 415 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -54082,7 +52034,7 @@ module.exports = string => { /***/ }), -/* 422 */ +/* 416 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -54110,13 +52062,13 @@ module.exports.graceful = string => (typeof string === 'string' && detectNewline /***/ }), -/* 423 */ +/* 417 */ /***/ (function(module) { module.exports = JSON.parse("[\"applypatch-msg\",\"pre-applypatch\",\"post-applypatch\",\"pre-commit\",\"pre-merge-commit\",\"prepare-commit-msg\",\"commit-msg\",\"post-commit\",\"pre-rebase\",\"post-checkout\",\"post-merge\",\"pre-push\",\"pre-receive\",\"update\",\"post-receive\",\"post-update\",\"push-to-checkout\",\"pre-auto-gc\",\"post-rewrite\",\"sendemail-validate\",\"fsmonitor-watchman\",\"p4-pre-submit\",\"post-index-change\"]"); /***/ }), -/* 424 */ +/* 418 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -54133,13 +52085,13 @@ module.exports = value => { /***/ }), -/* 425 */ +/* 419 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "validateDependencies", function() { return validateDependencies; }); -/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(415); +/* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(409); /* harmony import */ var _yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_yarnpkg_lockfile__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2); /* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_1__); @@ -54149,8 +52101,8 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); /* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(349); -/* harmony import */ var _projects_tree__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(426); +/* harmony import */ var _package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(343); +/* harmony import */ var _projects_tree__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(420); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -54331,7 +52283,7 @@ function getDevOnlyProductionDepsTree(kbn, projectName) { } /***/ }), -/* 426 */ +/* 420 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54473,27 +52425,27 @@ function addProjectToTree(tree, pathParts, project) { } /***/ }), -/* 427 */ +/* 421 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _yarn_integrity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(428); +/* harmony import */ var _yarn_integrity__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(422); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "yarnIntegrityFileExists", function() { return _yarn_integrity__WEBPACK_IMPORTED_MODULE_0__["yarnIntegrityFileExists"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ensureYarnIntegrityFileExists", function() { return _yarn_integrity__WEBPACK_IMPORTED_MODULE_0__["ensureYarnIntegrityFileExists"]; }); -/* harmony import */ var _get_cache_folders__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(429); +/* harmony import */ var _get_cache_folders__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(423); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBazelDiskCacheFolder", function() { return _get_cache_folders__WEBPACK_IMPORTED_MODULE_1__["getBazelDiskCacheFolder"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getBazelRepositoryCacheFolder", function() { return _get_cache_folders__WEBPACK_IMPORTED_MODULE_1__["getBazelRepositoryCacheFolder"]; }); -/* harmony import */ var _install_tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(430); +/* harmony import */ var _install_tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(424); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isBazelBinAvailable", function() { return _install_tools__WEBPACK_IMPORTED_MODULE_2__["isBazelBinAvailable"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "installBazelTools", function() { return _install_tools__WEBPACK_IMPORTED_MODULE_2__["installBazelTools"]; }); -/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(431); +/* harmony import */ var _run__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(425); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "runBazel", function() { return _run__WEBPACK_IMPORTED_MODULE_3__["runBazel"]; }); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "runIBazel", function() { return _run__WEBPACK_IMPORTED_MODULE_3__["runIBazel"]; }); @@ -54511,7 +52463,7 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 428 */ +/* 422 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54558,7 +52510,7 @@ async function ensureYarnIntegrityFileExists(nodeModulesPath) { } /***/ }), -/* 429 */ +/* 423 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54595,7 +52547,7 @@ async function getBazelRepositoryCacheFolder() { } /***/ }), -/* 430 */ +/* 424 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54714,7 +52666,7 @@ async function installBazelTools(repoRootPath) { } /***/ }), -/* 431 */ +/* 425 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -54724,12 +52676,12 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(114); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(9); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(432); -/* harmony import */ var _kbn_dev_utils_stdio__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(530); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(426); +/* harmony import */ var _kbn_dev_utils_stdio__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(524); /* harmony import */ var _kbn_dev_utils_stdio__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils_stdio__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _child_process__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(221); /* harmony import */ var _log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(347); +/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(341); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -54791,141 +52743,141 @@ async function runIBazel(bazelArgs, offline = false, runOpts = {}) { } /***/ }), -/* 432 */ +/* 426 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(433); +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(427); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__["audit"]; }); -/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(434); +/* harmony import */ var _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(428); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return _internal_operators_auditTime__WEBPACK_IMPORTED_MODULE_1__["auditTime"]; }); -/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(435); +/* harmony import */ var _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(429); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return _internal_operators_buffer__WEBPACK_IMPORTED_MODULE_2__["buffer"]; }); -/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(436); +/* harmony import */ var _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(430); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return _internal_operators_bufferCount__WEBPACK_IMPORTED_MODULE_3__["bufferCount"]; }); -/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(437); +/* harmony import */ var _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(431); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return _internal_operators_bufferTime__WEBPACK_IMPORTED_MODULE_4__["bufferTime"]; }); -/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(438); +/* harmony import */ var _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(432); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return _internal_operators_bufferToggle__WEBPACK_IMPORTED_MODULE_5__["bufferToggle"]; }); -/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(439); +/* harmony import */ var _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(433); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return _internal_operators_bufferWhen__WEBPACK_IMPORTED_MODULE_6__["bufferWhen"]; }); -/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(440); +/* harmony import */ var _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(434); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return _internal_operators_catchError__WEBPACK_IMPORTED_MODULE_7__["catchError"]; }); -/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(441); +/* harmony import */ var _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(435); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return _internal_operators_combineAll__WEBPACK_IMPORTED_MODULE_8__["combineAll"]; }); -/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(442); +/* harmony import */ var _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(436); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_operators_combineLatest__WEBPACK_IMPORTED_MODULE_9__["combineLatest"]; }); -/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(443); +/* harmony import */ var _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(437); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_operators_concat__WEBPACK_IMPORTED_MODULE_10__["concat"]; }); /* harmony import */ var _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(81); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return _internal_operators_concatAll__WEBPACK_IMPORTED_MODULE_11__["concatAll"]; }); -/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(444); +/* harmony import */ var _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(438); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return _internal_operators_concatMap__WEBPACK_IMPORTED_MODULE_12__["concatMap"]; }); -/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(445); +/* harmony import */ var _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(439); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return _internal_operators_concatMapTo__WEBPACK_IMPORTED_MODULE_13__["concatMapTo"]; }); -/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(446); +/* harmony import */ var _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(440); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "count", function() { return _internal_operators_count__WEBPACK_IMPORTED_MODULE_14__["count"]; }); -/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(447); +/* harmony import */ var _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(441); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return _internal_operators_debounce__WEBPACK_IMPORTED_MODULE_15__["debounce"]; }); -/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(448); +/* harmony import */ var _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(442); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return _internal_operators_debounceTime__WEBPACK_IMPORTED_MODULE_16__["debounceTime"]; }); -/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(449); +/* harmony import */ var _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(443); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return _internal_operators_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_17__["defaultIfEmpty"]; }); -/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(450); +/* harmony import */ var _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(444); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return _internal_operators_delay__WEBPACK_IMPORTED_MODULE_18__["delay"]; }); -/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(452); +/* harmony import */ var _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(446); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return _internal_operators_delayWhen__WEBPACK_IMPORTED_MODULE_19__["delayWhen"]; }); -/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(453); +/* harmony import */ var _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(447); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return _internal_operators_dematerialize__WEBPACK_IMPORTED_MODULE_20__["dematerialize"]; }); -/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(454); +/* harmony import */ var _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(448); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return _internal_operators_distinct__WEBPACK_IMPORTED_MODULE_21__["distinct"]; }); -/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(455); +/* harmony import */ var _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(449); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return _internal_operators_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_22__["distinctUntilChanged"]; }); -/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(456); +/* harmony import */ var _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(450); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return _internal_operators_distinctUntilKeyChanged__WEBPACK_IMPORTED_MODULE_23__["distinctUntilKeyChanged"]; }); -/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(457); +/* harmony import */ var _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(451); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return _internal_operators_elementAt__WEBPACK_IMPORTED_MODULE_24__["elementAt"]; }); -/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(460); +/* harmony import */ var _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(454); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return _internal_operators_endWith__WEBPACK_IMPORTED_MODULE_25__["endWith"]; }); -/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(461); +/* harmony import */ var _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(455); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "every", function() { return _internal_operators_every__WEBPACK_IMPORTED_MODULE_26__["every"]; }); -/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(462); +/* harmony import */ var _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(456); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return _internal_operators_exhaust__WEBPACK_IMPORTED_MODULE_27__["exhaust"]; }); -/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(463); +/* harmony import */ var _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(457); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return _internal_operators_exhaustMap__WEBPACK_IMPORTED_MODULE_28__["exhaustMap"]; }); -/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(464); +/* harmony import */ var _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(458); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return _internal_operators_expand__WEBPACK_IMPORTED_MODULE_29__["expand"]; }); /* harmony import */ var _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(106); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return _internal_operators_filter__WEBPACK_IMPORTED_MODULE_30__["filter"]; }); -/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(465); +/* harmony import */ var _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(459); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return _internal_operators_finalize__WEBPACK_IMPORTED_MODULE_31__["finalize"]; }); -/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(466); +/* harmony import */ var _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(460); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "find", function() { return _internal_operators_find__WEBPACK_IMPORTED_MODULE_32__["find"]; }); -/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(467); +/* harmony import */ var _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(461); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return _internal_operators_findIndex__WEBPACK_IMPORTED_MODULE_33__["findIndex"]; }); -/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(468); +/* harmony import */ var _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(462); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "first", function() { return _internal_operators_first__WEBPACK_IMPORTED_MODULE_34__["first"]; }); /* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(32); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_35__["groupBy"]; }); -/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(469); +/* harmony import */ var _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(463); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return _internal_operators_ignoreElements__WEBPACK_IMPORTED_MODULE_36__["ignoreElements"]; }); -/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(470); +/* harmony import */ var _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(464); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return _internal_operators_isEmpty__WEBPACK_IMPORTED_MODULE_37__["isEmpty"]; }); -/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(471); +/* harmony import */ var _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(465); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "last", function() { return _internal_operators_last__WEBPACK_IMPORTED_MODULE_38__["last"]; }); /* harmony import */ var _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(67); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "map", function() { return _internal_operators_map__WEBPACK_IMPORTED_MODULE_39__["map"]; }); -/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(473); +/* harmony import */ var _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(467); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return _internal_operators_mapTo__WEBPACK_IMPORTED_MODULE_40__["mapTo"]; }); -/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(474); +/* harmony import */ var _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(468); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return _internal_operators_materialize__WEBPACK_IMPORTED_MODULE_41__["materialize"]; }); -/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(475); +/* harmony import */ var _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(469); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "max", function() { return _internal_operators_max__WEBPACK_IMPORTED_MODULE_42__["max"]; }); -/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(478); +/* harmony import */ var _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(472); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_operators_merge__WEBPACK_IMPORTED_MODULE_43__["merge"]; }); /* harmony import */ var _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(82); @@ -54936,175 +52888,175 @@ __webpack_require__.r(__webpack_exports__); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["flatMap"]; }); -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(479); +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(473); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(480); +/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(474); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(481); +/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(475); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(482); +/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(476); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); /* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(42); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(483); +/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(477); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(484); +/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(478); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(485); +/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(479); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(486); +/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(480); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(487); +/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(481); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(488); +/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(482); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(489); +/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(483); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(490); +/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(484); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(491); +/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(485); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(476); +/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(470); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(492); +/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(486); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(493); +/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(487); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(494); +/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(488); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(495); +/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(489); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); /* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(31); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(496); +/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(490); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(497); +/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(491); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(477); +/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(471); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(498); +/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(492); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(499); +/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(493); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(500); +/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(494); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(501); +/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(495); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(502); +/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(496); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(503); +/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(497); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(504); +/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(498); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(505); +/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(499); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(506); +/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(500); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(507); +/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(501); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(509); +/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(503); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(510); +/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(504); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(511); +/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(505); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(459); +/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(453); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(472); +/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(466); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(512); +/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(506); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(513); +/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(507); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(514); +/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(508); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(515); +/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(509); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(516); +/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(510); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(458); +/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(452); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(517); +/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(511); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(518); +/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(512); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(519); +/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(513); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(520); +/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(514); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(521); +/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(515); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(522); +/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(516); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(523); +/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(517); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(524); +/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(518); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(525); +/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(519); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(526); +/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(520); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(527); +/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(521); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(528); +/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(522); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(529); +/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(523); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ @@ -55215,7 +53167,7 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 433 */ +/* 427 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55294,14 +53246,14 @@ var AuditSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 434 */ +/* 428 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(433); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(427); /* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(109); /** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ @@ -55317,7 +53269,7 @@ function auditTime(duration, scheduler) { /***/ }), -/* 435 */ +/* 429 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55364,7 +53316,7 @@ var BufferSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 436 */ +/* 430 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55465,7 +53417,7 @@ var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 437 */ +/* 431 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55626,7 +53578,7 @@ function dispatchBufferClose(arg) { /***/ }), -/* 438 */ +/* 432 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55745,7 +53697,7 @@ var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 439 */ +/* 433 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55838,7 +53790,7 @@ var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 440 */ +/* 434 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55898,7 +53850,7 @@ var CatchSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 441 */ +/* 435 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55914,7 +53866,7 @@ function combineAll(project) { /***/ }), -/* 442 */ +/* 436 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55946,7 +53898,7 @@ function combineLatest() { /***/ }), -/* 443 */ +/* 437 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55966,7 +53918,7 @@ function concat() { /***/ }), -/* 444 */ +/* 438 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -55982,13 +53934,13 @@ function concatMap(project, resultSelector) { /***/ }), -/* 445 */ +/* 439 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); -/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(444); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(438); /** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ function concatMapTo(innerObservable, resultSelector) { @@ -55998,7 +53950,7 @@ function concatMapTo(innerObservable, resultSelector) { /***/ }), -/* 446 */ +/* 440 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56063,7 +54015,7 @@ var CountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 447 */ +/* 441 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56148,7 +54100,7 @@ var DebounceSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 448 */ +/* 442 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56224,7 +54176,7 @@ function dispatchNext(subscriber) { /***/ }), -/* 449 */ +/* 443 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56274,7 +54226,7 @@ var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 450 */ +/* 444 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56282,7 +54234,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(13); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(451); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(445); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(12); /* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(43); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ @@ -56381,7 +54333,7 @@ var DelayMessage = /*@__PURE__*/ (function () { /***/ }), -/* 451 */ +/* 445 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56395,7 +54347,7 @@ function isDate(value) { /***/ }), -/* 452 */ +/* 446 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56541,7 +54493,7 @@ var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 453 */ +/* 447 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56579,7 +54531,7 @@ var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 454 */ +/* 448 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56655,7 +54607,7 @@ var DistinctSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 455 */ +/* 449 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56726,13 +54678,13 @@ var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 456 */ +/* 450 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); -/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(455); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(449); /** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ function distinctUntilKeyChanged(key, compare) { @@ -56742,7 +54694,7 @@ function distinctUntilKeyChanged(key, compare) { /***/ }), -/* 457 */ +/* 451 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56750,9 +54702,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "elementAt", function() { return elementAt; }); /* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(63); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(106); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(458); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(449); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(459); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(452); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(443); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(453); /** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ @@ -56774,7 +54726,7 @@ function elementAt(index, defaultValue) { /***/ }), -/* 458 */ +/* 452 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56840,7 +54792,7 @@ function defaultErrorFactory() { /***/ }), -/* 459 */ +/* 453 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56902,7 +54854,7 @@ var TakeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 460 */ +/* 454 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56924,7 +54876,7 @@ function endWith() { /***/ }), -/* 461 */ +/* 455 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -56986,7 +54938,7 @@ var EverySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 462 */ +/* 456 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57040,7 +54992,7 @@ var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 463 */ +/* 457 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57134,7 +55086,7 @@ var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 464 */ +/* 458 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57246,7 +55198,7 @@ var ExpandSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 465 */ +/* 459 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57284,7 +55236,7 @@ var FinallySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 466 */ +/* 460 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57356,13 +55308,13 @@ var FindValueSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 467 */ +/* 461 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); -/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(466); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(460); /** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ function findIndex(predicate, thisArg) { @@ -57372,7 +55324,7 @@ function findIndex(predicate, thisArg) { /***/ }), -/* 468 */ +/* 462 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57380,9 +55332,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "first", function() { return first; }); /* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(106); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(459); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(449); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(458); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(453); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(443); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(452); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26); /** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -57399,7 +55351,7 @@ function first(predicate, defaultValue) { /***/ }), -/* 469 */ +/* 463 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57436,7 +55388,7 @@ var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 470 */ +/* 464 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57480,7 +55432,7 @@ var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 471 */ +/* 465 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57488,9 +55440,9 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); /* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(64); /* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(106); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(472); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(458); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(449); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(466); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(452); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(443); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(26); /** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ @@ -57507,7 +55459,7 @@ function last(predicate, defaultValue) { /***/ }), -/* 472 */ +/* 466 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57584,7 +55536,7 @@ var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 473 */ +/* 467 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57623,7 +55575,7 @@ var MapToSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 474 */ +/* 468 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57673,13 +55625,13 @@ var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 475 */ +/* 469 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(476); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function max(comparer) { @@ -57692,15 +55644,15 @@ function max(comparer) { /***/ }), -/* 476 */ +/* 470 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(477); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(472); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(449); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(471); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(466); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(443); /* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25); /** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ @@ -57721,7 +55673,7 @@ function reduce(accumulator, seed) { /***/ }), -/* 477 */ +/* 471 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57803,7 +55755,7 @@ var ScanSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 478 */ +/* 472 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57823,7 +55775,7 @@ function merge() { /***/ }), -/* 479 */ +/* 473 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57848,7 +55800,7 @@ function mergeMapTo(innerObservable, resultSelector, concurrent) { /***/ }), -/* 480 */ +/* 474 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -57957,13 +55909,13 @@ var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 481 */ +/* 475 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "min", function() { return min; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(476); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function min(comparer) { @@ -57976,7 +55928,7 @@ function min(comparer) { /***/ }), -/* 482 */ +/* 476 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58025,7 +55977,7 @@ var MulticastOperator = /*@__PURE__*/ (function () { /***/ }), -/* 483 */ +/* 477 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58115,7 +56067,7 @@ var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 484 */ +/* 478 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58163,7 +56115,7 @@ var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 485 */ +/* 479 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58186,7 +56138,7 @@ function partition(predicate, thisArg) { /***/ }), -/* 486 */ +/* 480 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58226,14 +56178,14 @@ function plucker(props, length) { /***/ }), -/* 487 */ +/* 481 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); /* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(28); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(482); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(476); /** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ @@ -58246,14 +56198,14 @@ function publish(selector) { /***/ }), -/* 488 */ +/* 482 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); /* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(33); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(482); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(476); /** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ @@ -58264,14 +56216,14 @@ function publishBehavior(value) { /***/ }), -/* 489 */ +/* 483 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); /* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(51); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(482); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(476); /** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ @@ -58282,14 +56234,14 @@ function publishLast() { /***/ }), -/* 490 */ +/* 484 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return publishReplay; }); /* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(34); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(482); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(476); /** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ @@ -58305,7 +56257,7 @@ function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { /***/ }), -/* 491 */ +/* 485 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58332,7 +56284,7 @@ function race() { /***/ }), -/* 492 */ +/* 486 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58397,7 +56349,7 @@ var RepeatSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 493 */ +/* 487 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58491,7 +56443,7 @@ var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 494 */ +/* 488 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58544,7 +56496,7 @@ var RetrySubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 495 */ +/* 489 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58630,7 +56582,7 @@ var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 496 */ +/* 490 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58685,7 +56637,7 @@ var SampleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 497 */ +/* 491 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58745,7 +56697,7 @@ function dispatchNotification(state) { /***/ }), -/* 498 */ +/* 492 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58868,13 +56820,13 @@ var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 499 */ +/* 493 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(482); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(476); /* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(31); /* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(28); /** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ @@ -58891,7 +56843,7 @@ function share() { /***/ }), -/* 500 */ +/* 494 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -58960,7 +56912,7 @@ function shareReplayOperator(_a) { /***/ }), -/* 501 */ +/* 495 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59040,7 +56992,7 @@ var SingleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 502 */ +/* 496 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59082,7 +57034,7 @@ var SkipSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 503 */ +/* 497 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59144,7 +57096,7 @@ var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 504 */ +/* 498 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59201,7 +57153,7 @@ var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 505 */ +/* 499 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59257,7 +57209,7 @@ var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 506 */ +/* 500 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59286,13 +57238,13 @@ function startWith() { /***/ }), -/* 507 */ +/* 501 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return subscribeOn; }); -/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(508); +/* harmony import */ var _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(502); /** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ function subscribeOn(scheduler, delay) { @@ -59317,7 +57269,7 @@ var SubscribeOnOperator = /*@__PURE__*/ (function () { /***/ }), -/* 508 */ +/* 502 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59381,13 +57333,13 @@ var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { /***/ }), -/* 509 */ +/* 503 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return switchAll; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(510); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(504); /* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(26); /** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ @@ -59399,7 +57351,7 @@ function switchAll() { /***/ }), -/* 510 */ +/* 504 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59487,13 +57439,13 @@ var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 511 */ +/* 505 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return switchMapTo; }); -/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(510); +/* harmony import */ var _switchMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(504); /** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ function switchMapTo(innerObservable, resultSelector) { @@ -59503,7 +57455,7 @@ function switchMapTo(innerObservable, resultSelector) { /***/ }), -/* 512 */ +/* 506 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59551,7 +57503,7 @@ var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 513 */ +/* 507 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59619,7 +57571,7 @@ var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 514 */ +/* 508 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59707,7 +57659,7 @@ var TapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 515 */ +/* 509 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59809,7 +57761,7 @@ var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 516 */ +/* 510 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59818,7 +57770,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(13); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(12); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(515); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(509); /** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ @@ -59907,7 +57859,7 @@ function dispatchNext(arg) { /***/ }), -/* 517 */ +/* 511 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59915,7 +57867,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return timeInterval; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeInterval", function() { return TimeInterval; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(477); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(471); /* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(92); /* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(67); /** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ @@ -59951,7 +57903,7 @@ var TimeInterval = /*@__PURE__*/ (function () { /***/ }), -/* 518 */ +/* 512 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59959,7 +57911,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return timeout; }); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56); /* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(65); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(519); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(513); /* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(50); /** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ @@ -59976,7 +57928,7 @@ function timeout(due, scheduler) { /***/ }), -/* 519 */ +/* 513 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -59984,7 +57936,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return timeoutWith; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(13); /* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(451); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(445); /* harmony import */ var _innerSubscribe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(91); /** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_innerSubscribe PURE_IMPORTS_END */ @@ -60055,7 +58007,7 @@ var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 520 */ +/* 514 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60085,13 +58037,13 @@ var Timestamp = /*@__PURE__*/ (function () { /***/ }), -/* 521 */ +/* 515 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return toArray; }); -/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(476); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(470); /** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ function toArrayReducer(arr, item, index) { @@ -60108,7 +58060,7 @@ function toArray() { /***/ }), -/* 522 */ +/* 516 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60186,7 +58138,7 @@ var WindowSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 523 */ +/* 517 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60276,7 +58228,7 @@ var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 524 */ +/* 518 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60446,7 +58398,7 @@ function dispatchWindowClose(state) { /***/ }), -/* 525 */ +/* 519 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60589,7 +58541,7 @@ var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 526 */ +/* 520 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60686,7 +58638,7 @@ var WindowSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 527 */ +/* 521 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60781,7 +58733,7 @@ var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 528 */ +/* 522 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60803,7 +58755,7 @@ function zip() { /***/ }), -/* 529 */ +/* 523 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -60819,7 +58771,7 @@ function zipAll(project) { /***/ }), -/* 530 */ +/* 524 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60829,7 +58781,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); -var _observe_lines = __webpack_require__(531); +var _observe_lines = __webpack_require__(525); Object.keys(_observe_lines).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -60842,7 +58794,7 @@ Object.keys(_observe_lines).forEach(function (key) { }); }); -var _observe_readable = __webpack_require__(532); +var _observe_readable = __webpack_require__(526); Object.keys(_observe_readable).forEach(function (key) { if (key === "default" || key === "__esModule") return; @@ -60856,7 +58808,7 @@ Object.keys(_observe_readable).forEach(function (key) { }); /***/ }), -/* 531 */ +/* 525 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60869,9 +58821,9 @@ exports.observeLines = observeLines; var Rx = _interopRequireWildcard(__webpack_require__(9)); -var _operators = __webpack_require__(432); +var _operators = __webpack_require__(426); -var _observe_readable = __webpack_require__(532); +var _observe_readable = __webpack_require__(526); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -60934,7 +58886,7 @@ function observeLines(readable) { } /***/ }), -/* 532 */ +/* 526 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -60947,7 +58899,7 @@ exports.observeReadable = observeReadable; var Rx = _interopRequireWildcard(__webpack_require__(9)); -var _operators = __webpack_require__(432); +var _operators = __webpack_require__(426); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } @@ -60971,13 +58923,13 @@ function observeReadable(readable) { } /***/ }), -/* 533 */ +/* 527 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BuildCommand", function() { return BuildCommand; }); -/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(427); +/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(421); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -61005,7 +58957,7 @@ const BuildCommand = { }; /***/ }), -/* 534 */ +/* 528 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -61015,11 +58967,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(240); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(535); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(529); /* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(427); +/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(421); /* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(231); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(220); /* @@ -61122,20 +59074,20 @@ const CleanCommand = { }; /***/ }), -/* 535 */ +/* 529 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readline = __webpack_require__(536); -const chalk = __webpack_require__(537); -const cliCursor = __webpack_require__(540); -const cliSpinners = __webpack_require__(542); -const logSymbols = __webpack_require__(544); -const stripAnsi = __webpack_require__(550); -const wcwidth = __webpack_require__(552); -const isInteractive = __webpack_require__(556); -const MuteStream = __webpack_require__(557); +const readline = __webpack_require__(530); +const chalk = __webpack_require__(531); +const cliCursor = __webpack_require__(534); +const cliSpinners = __webpack_require__(536); +const logSymbols = __webpack_require__(538); +const stripAnsi = __webpack_require__(544); +const wcwidth = __webpack_require__(546); +const isInteractive = __webpack_require__(550); +const MuteStream = __webpack_require__(551); const TEXT = Symbol('text'); const PREFIX_TEXT = Symbol('prefixText'); @@ -61488,13 +59440,13 @@ module.exports.promise = (action, options) => { /***/ }), -/* 536 */ +/* 530 */ /***/ (function(module, exports) { module.exports = require("readline"); /***/ }), -/* 537 */ +/* 531 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61504,7 +59456,7 @@ const {stdout: stdoutColor, stderr: stderrColor} = __webpack_require__(121); const { stringReplaceAll, stringEncaseCRLFWithFirstIndex -} = __webpack_require__(538); +} = __webpack_require__(532); // `supportsColor.level` → `ansiStyles.color[name]` mapping const levelMapping = [ @@ -61705,7 +59657,7 @@ const chalkTag = (chalk, ...strings) => { } if (template === undefined) { - template = __webpack_require__(539); + template = __webpack_require__(533); } return template(chalk, parts.join('')); @@ -61734,7 +59686,7 @@ module.exports = chalk; /***/ }), -/* 538 */ +/* 532 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61780,7 +59732,7 @@ module.exports = { /***/ }), -/* 539 */ +/* 533 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61921,12 +59873,12 @@ module.exports = (chalk, temporary) => { /***/ }), -/* 540 */ +/* 534 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const restoreCursor = __webpack_require__(541); +const restoreCursor = __webpack_require__(535); let isHidden = false; @@ -61963,7 +59915,7 @@ exports.toggle = (force, writableStream) => { /***/ }), -/* 541 */ +/* 535 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -61979,13 +59931,13 @@ module.exports = onetime(() => { /***/ }), -/* 542 */ +/* 536 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const spinners = Object.assign({}, __webpack_require__(543)); +const spinners = Object.assign({}, __webpack_require__(537)); const spinnersList = Object.keys(spinners); @@ -62003,18 +59955,18 @@ module.exports.default = spinners; /***/ }), -/* 543 */ +/* 537 */ /***/ (function(module) { module.exports = JSON.parse("{\"dots\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠹\",\"⠸\",\"⠼\",\"⠴\",\"⠦\",\"⠧\",\"⠇\",\"⠏\"]},\"dots2\":{\"interval\":80,\"frames\":[\"⣾\",\"⣽\",\"⣻\",\"⢿\",\"⡿\",\"⣟\",\"⣯\",\"⣷\"]},\"dots3\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠞\",\"⠖\",\"⠦\",\"⠴\",\"⠲\",\"⠳\",\"⠓\"]},\"dots4\":{\"interval\":80,\"frames\":[\"⠄\",\"⠆\",\"⠇\",\"⠋\",\"⠙\",\"⠸\",\"⠰\",\"⠠\",\"⠰\",\"⠸\",\"⠙\",\"⠋\",\"⠇\",\"⠆\"]},\"dots5\":{\"interval\":80,\"frames\":[\"⠋\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\"]},\"dots6\":{\"interval\":80,\"frames\":[\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠴\",\"⠲\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠚\",\"⠙\",\"⠉\",\"⠁\"]},\"dots7\":{\"interval\":80,\"frames\":[\"⠈\",\"⠉\",\"⠋\",\"⠓\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠖\",\"⠦\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\"]},\"dots8\":{\"interval\":80,\"frames\":[\"⠁\",\"⠁\",\"⠉\",\"⠙\",\"⠚\",\"⠒\",\"⠂\",\"⠂\",\"⠒\",\"⠲\",\"⠴\",\"⠤\",\"⠄\",\"⠄\",\"⠤\",\"⠠\",\"⠠\",\"⠤\",\"⠦\",\"⠖\",\"⠒\",\"⠐\",\"⠐\",\"⠒\",\"⠓\",\"⠋\",\"⠉\",\"⠈\",\"⠈\"]},\"dots9\":{\"interval\":80,\"frames\":[\"⢹\",\"⢺\",\"⢼\",\"⣸\",\"⣇\",\"⡧\",\"⡗\",\"⡏\"]},\"dots10\":{\"interval\":80,\"frames\":[\"⢄\",\"⢂\",\"⢁\",\"⡁\",\"⡈\",\"⡐\",\"⡠\"]},\"dots11\":{\"interval\":100,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⡀\",\"⢀\",\"⠠\",\"⠐\",\"⠈\"]},\"dots12\":{\"interval\":80,\"frames\":[\"⢀⠀\",\"⡀⠀\",\"⠄⠀\",\"⢂⠀\",\"⡂⠀\",\"⠅⠀\",\"⢃⠀\",\"⡃⠀\",\"⠍⠀\",\"⢋⠀\",\"⡋⠀\",\"⠍⠁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⢈⠩\",\"⡀⢙\",\"⠄⡙\",\"⢂⠩\",\"⡂⢘\",\"⠅⡘\",\"⢃⠨\",\"⡃⢐\",\"⠍⡐\",\"⢋⠠\",\"⡋⢀\",\"⠍⡁\",\"⢋⠁\",\"⡋⠁\",\"⠍⠉\",\"⠋⠉\",\"⠋⠉\",\"⠉⠙\",\"⠉⠙\",\"⠉⠩\",\"⠈⢙\",\"⠈⡙\",\"⠈⠩\",\"⠀⢙\",\"⠀⡙\",\"⠀⠩\",\"⠀⢘\",\"⠀⡘\",\"⠀⠨\",\"⠀⢐\",\"⠀⡐\",\"⠀⠠\",\"⠀⢀\",\"⠀⡀\"]},\"dots8Bit\":{\"interval\":80,\"frames\":[\"⠀\",\"⠁\",\"⠂\",\"⠃\",\"⠄\",\"⠅\",\"⠆\",\"⠇\",\"⡀\",\"⡁\",\"⡂\",\"⡃\",\"⡄\",\"⡅\",\"⡆\",\"⡇\",\"⠈\",\"⠉\",\"⠊\",\"⠋\",\"⠌\",\"⠍\",\"⠎\",\"⠏\",\"⡈\",\"⡉\",\"⡊\",\"⡋\",\"⡌\",\"⡍\",\"⡎\",\"⡏\",\"⠐\",\"⠑\",\"⠒\",\"⠓\",\"⠔\",\"⠕\",\"⠖\",\"⠗\",\"⡐\",\"⡑\",\"⡒\",\"⡓\",\"⡔\",\"⡕\",\"⡖\",\"⡗\",\"⠘\",\"⠙\",\"⠚\",\"⠛\",\"⠜\",\"⠝\",\"⠞\",\"⠟\",\"⡘\",\"⡙\",\"⡚\",\"⡛\",\"⡜\",\"⡝\",\"⡞\",\"⡟\",\"⠠\",\"⠡\",\"⠢\",\"⠣\",\"⠤\",\"⠥\",\"⠦\",\"⠧\",\"⡠\",\"⡡\",\"⡢\",\"⡣\",\"⡤\",\"⡥\",\"⡦\",\"⡧\",\"⠨\",\"⠩\",\"⠪\",\"⠫\",\"⠬\",\"⠭\",\"⠮\",\"⠯\",\"⡨\",\"⡩\",\"⡪\",\"⡫\",\"⡬\",\"⡭\",\"⡮\",\"⡯\",\"⠰\",\"⠱\",\"⠲\",\"⠳\",\"⠴\",\"⠵\",\"⠶\",\"⠷\",\"⡰\",\"⡱\",\"⡲\",\"⡳\",\"⡴\",\"⡵\",\"⡶\",\"⡷\",\"⠸\",\"⠹\",\"⠺\",\"⠻\",\"⠼\",\"⠽\",\"⠾\",\"⠿\",\"⡸\",\"⡹\",\"⡺\",\"⡻\",\"⡼\",\"⡽\",\"⡾\",\"⡿\",\"⢀\",\"⢁\",\"⢂\",\"⢃\",\"⢄\",\"⢅\",\"⢆\",\"⢇\",\"⣀\",\"⣁\",\"⣂\",\"⣃\",\"⣄\",\"⣅\",\"⣆\",\"⣇\",\"⢈\",\"⢉\",\"⢊\",\"⢋\",\"⢌\",\"⢍\",\"⢎\",\"⢏\",\"⣈\",\"⣉\",\"⣊\",\"⣋\",\"⣌\",\"⣍\",\"⣎\",\"⣏\",\"⢐\",\"⢑\",\"⢒\",\"⢓\",\"⢔\",\"⢕\",\"⢖\",\"⢗\",\"⣐\",\"⣑\",\"⣒\",\"⣓\",\"⣔\",\"⣕\",\"⣖\",\"⣗\",\"⢘\",\"⢙\",\"⢚\",\"⢛\",\"⢜\",\"⢝\",\"⢞\",\"⢟\",\"⣘\",\"⣙\",\"⣚\",\"⣛\",\"⣜\",\"⣝\",\"⣞\",\"⣟\",\"⢠\",\"⢡\",\"⢢\",\"⢣\",\"⢤\",\"⢥\",\"⢦\",\"⢧\",\"⣠\",\"⣡\",\"⣢\",\"⣣\",\"⣤\",\"⣥\",\"⣦\",\"⣧\",\"⢨\",\"⢩\",\"⢪\",\"⢫\",\"⢬\",\"⢭\",\"⢮\",\"⢯\",\"⣨\",\"⣩\",\"⣪\",\"⣫\",\"⣬\",\"⣭\",\"⣮\",\"⣯\",\"⢰\",\"⢱\",\"⢲\",\"⢳\",\"⢴\",\"⢵\",\"⢶\",\"⢷\",\"⣰\",\"⣱\",\"⣲\",\"⣳\",\"⣴\",\"⣵\",\"⣶\",\"⣷\",\"⢸\",\"⢹\",\"⢺\",\"⢻\",\"⢼\",\"⢽\",\"⢾\",\"⢿\",\"⣸\",\"⣹\",\"⣺\",\"⣻\",\"⣼\",\"⣽\",\"⣾\",\"⣿\"]},\"line\":{\"interval\":130,\"frames\":[\"-\",\"\\\\\",\"|\",\"/\"]},\"line2\":{\"interval\":100,\"frames\":[\"⠂\",\"-\",\"–\",\"—\",\"–\",\"-\"]},\"pipe\":{\"interval\":100,\"frames\":[\"┤\",\"┘\",\"┴\",\"└\",\"├\",\"┌\",\"┬\",\"┐\"]},\"simpleDots\":{\"interval\":400,\"frames\":[\". \",\".. \",\"...\",\" \"]},\"simpleDotsScrolling\":{\"interval\":200,\"frames\":[\". \",\".. \",\"...\",\" ..\",\" .\",\" \"]},\"star\":{\"interval\":70,\"frames\":[\"✶\",\"✸\",\"✹\",\"✺\",\"✹\",\"✷\"]},\"star2\":{\"interval\":80,\"frames\":[\"+\",\"x\",\"*\"]},\"flip\":{\"interval\":70,\"frames\":[\"_\",\"_\",\"_\",\"-\",\"`\",\"`\",\"'\",\"´\",\"-\",\"_\",\"_\",\"_\"]},\"hamburger\":{\"interval\":100,\"frames\":[\"☱\",\"☲\",\"☴\"]},\"growVertical\":{\"interval\":120,\"frames\":[\"▁\",\"▃\",\"▄\",\"▅\",\"▆\",\"▇\",\"▆\",\"▅\",\"▄\",\"▃\"]},\"growHorizontal\":{\"interval\":120,\"frames\":[\"▏\",\"▎\",\"▍\",\"▌\",\"▋\",\"▊\",\"▉\",\"▊\",\"▋\",\"▌\",\"▍\",\"▎\"]},\"balloon\":{\"interval\":140,\"frames\":[\" \",\".\",\"o\",\"O\",\"@\",\"*\",\" \"]},\"balloon2\":{\"interval\":120,\"frames\":[\".\",\"o\",\"O\",\"°\",\"O\",\"o\",\".\"]},\"noise\":{\"interval\":100,\"frames\":[\"▓\",\"▒\",\"░\"]},\"bounce\":{\"interval\":120,\"frames\":[\"⠁\",\"⠂\",\"⠄\",\"⠂\"]},\"boxBounce\":{\"interval\":120,\"frames\":[\"▖\",\"▘\",\"▝\",\"▗\"]},\"boxBounce2\":{\"interval\":100,\"frames\":[\"▌\",\"▀\",\"▐\",\"▄\"]},\"triangle\":{\"interval\":50,\"frames\":[\"◢\",\"◣\",\"◤\",\"◥\"]},\"arc\":{\"interval\":100,\"frames\":[\"◜\",\"◠\",\"◝\",\"◞\",\"◡\",\"◟\"]},\"circle\":{\"interval\":120,\"frames\":[\"◡\",\"⊙\",\"◠\"]},\"squareCorners\":{\"interval\":180,\"frames\":[\"◰\",\"◳\",\"◲\",\"◱\"]},\"circleQuarters\":{\"interval\":120,\"frames\":[\"◴\",\"◷\",\"◶\",\"◵\"]},\"circleHalves\":{\"interval\":50,\"frames\":[\"◐\",\"◓\",\"◑\",\"◒\"]},\"squish\":{\"interval\":100,\"frames\":[\"╫\",\"╪\"]},\"toggle\":{\"interval\":250,\"frames\":[\"⊶\",\"⊷\"]},\"toggle2\":{\"interval\":80,\"frames\":[\"▫\",\"▪\"]},\"toggle3\":{\"interval\":120,\"frames\":[\"□\",\"■\"]},\"toggle4\":{\"interval\":100,\"frames\":[\"■\",\"□\",\"▪\",\"▫\"]},\"toggle5\":{\"interval\":100,\"frames\":[\"▮\",\"▯\"]},\"toggle6\":{\"interval\":300,\"frames\":[\"ဝ\",\"၀\"]},\"toggle7\":{\"interval\":80,\"frames\":[\"⦾\",\"⦿\"]},\"toggle8\":{\"interval\":100,\"frames\":[\"◍\",\"◌\"]},\"toggle9\":{\"interval\":100,\"frames\":[\"◉\",\"◎\"]},\"toggle10\":{\"interval\":100,\"frames\":[\"㊂\",\"㊀\",\"㊁\"]},\"toggle11\":{\"interval\":50,\"frames\":[\"⧇\",\"⧆\"]},\"toggle12\":{\"interval\":120,\"frames\":[\"☗\",\"☖\"]},\"toggle13\":{\"interval\":80,\"frames\":[\"=\",\"*\",\"-\"]},\"arrow\":{\"interval\":100,\"frames\":[\"←\",\"↖\",\"↑\",\"↗\",\"→\",\"↘\",\"↓\",\"↙\"]},\"arrow2\":{\"interval\":80,\"frames\":[\"⬆️ \",\"↗️ \",\"➡️ \",\"↘️ \",\"⬇️ \",\"↙️ \",\"⬅️ \",\"↖️ \"]},\"arrow3\":{\"interval\":120,\"frames\":[\"▹▹▹▹▹\",\"▸▹▹▹▹\",\"▹▸▹▹▹\",\"▹▹▸▹▹\",\"▹▹▹▸▹\",\"▹▹▹▹▸\"]},\"bouncingBar\":{\"interval\":80,\"frames\":[\"[ ]\",\"[= ]\",\"[== ]\",\"[=== ]\",\"[ ===]\",\"[ ==]\",\"[ =]\",\"[ ]\",\"[ =]\",\"[ ==]\",\"[ ===]\",\"[====]\",\"[=== ]\",\"[== ]\",\"[= ]\"]},\"bouncingBall\":{\"interval\":80,\"frames\":[\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ●)\",\"( ● )\",\"( ● )\",\"( ● )\",\"( ● )\",\"(● )\"]},\"smiley\":{\"interval\":200,\"frames\":[\"😄 \",\"😝 \"]},\"monkey\":{\"interval\":300,\"frames\":[\"🙈 \",\"🙈 \",\"🙉 \",\"🙊 \"]},\"hearts\":{\"interval\":100,\"frames\":[\"💛 \",\"💙 \",\"💜 \",\"💚 \",\"❤️ \"]},\"clock\":{\"interval\":100,\"frames\":[\"🕛 \",\"🕐 \",\"🕑 \",\"🕒 \",\"🕓 \",\"🕔 \",\"🕕 \",\"🕖 \",\"🕗 \",\"🕘 \",\"🕙 \",\"🕚 \"]},\"earth\":{\"interval\":180,\"frames\":[\"🌍 \",\"🌎 \",\"🌏 \"]},\"material\":{\"interval\":17,\"frames\":[\"█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"███████▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"████████▁▁▁▁▁▁▁▁▁▁▁▁\",\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\"██████████▁▁▁▁▁▁▁▁▁▁\",\"███████████▁▁▁▁▁▁▁▁▁\",\"█████████████▁▁▁▁▁▁▁\",\"██████████████▁▁▁▁▁▁\",\"██████████████▁▁▁▁▁▁\",\"▁██████████████▁▁▁▁▁\",\"▁██████████████▁▁▁▁▁\",\"▁██████████████▁▁▁▁▁\",\"▁▁██████████████▁▁▁▁\",\"▁▁▁██████████████▁▁▁\",\"▁▁▁▁█████████████▁▁▁\",\"▁▁▁▁██████████████▁▁\",\"▁▁▁▁██████████████▁▁\",\"▁▁▁▁▁██████████████▁\",\"▁▁▁▁▁██████████████▁\",\"▁▁▁▁▁██████████████▁\",\"▁▁▁▁▁▁██████████████\",\"▁▁▁▁▁▁██████████████\",\"▁▁▁▁▁▁▁█████████████\",\"▁▁▁▁▁▁▁█████████████\",\"▁▁▁▁▁▁▁▁████████████\",\"▁▁▁▁▁▁▁▁████████████\",\"▁▁▁▁▁▁▁▁▁███████████\",\"▁▁▁▁▁▁▁▁▁███████████\",\"▁▁▁▁▁▁▁▁▁▁██████████\",\"▁▁▁▁▁▁▁▁▁▁██████████\",\"▁▁▁▁▁▁▁▁▁▁▁▁████████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁███████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████\",\"█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\"██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\"██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\"███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\"████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\"█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\"█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\"██████▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\"████████▁▁▁▁▁▁▁▁▁▁▁▁\",\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\"█████████▁▁▁▁▁▁▁▁▁▁▁\",\"███████████▁▁▁▁▁▁▁▁▁\",\"████████████▁▁▁▁▁▁▁▁\",\"████████████▁▁▁▁▁▁▁▁\",\"██████████████▁▁▁▁▁▁\",\"██████████████▁▁▁▁▁▁\",\"▁██████████████▁▁▁▁▁\",\"▁██████████████▁▁▁▁▁\",\"▁▁▁█████████████▁▁▁▁\",\"▁▁▁▁▁████████████▁▁▁\",\"▁▁▁▁▁████████████▁▁▁\",\"▁▁▁▁▁▁███████████▁▁▁\",\"▁▁▁▁▁▁▁▁█████████▁▁▁\",\"▁▁▁▁▁▁▁▁█████████▁▁▁\",\"▁▁▁▁▁▁▁▁▁█████████▁▁\",\"▁▁▁▁▁▁▁▁▁█████████▁▁\",\"▁▁▁▁▁▁▁▁▁▁█████████▁\",\"▁▁▁▁▁▁▁▁▁▁▁████████▁\",\"▁▁▁▁▁▁▁▁▁▁▁████████▁\",\"▁▁▁▁▁▁▁▁▁▁▁▁███████▁\",\"▁▁▁▁▁▁▁▁▁▁▁▁███████▁\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁███████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁███████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\",\"▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁\"]},\"moon\":{\"interval\":80,\"frames\":[\"🌑 \",\"🌒 \",\"🌓 \",\"🌔 \",\"🌕 \",\"🌖 \",\"🌗 \",\"🌘 \"]},\"runner\":{\"interval\":140,\"frames\":[\"🚶 \",\"🏃 \"]},\"pong\":{\"interval\":80,\"frames\":[\"▐⠂ ▌\",\"▐⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂▌\",\"▐ ⠠▌\",\"▐ ⡀▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐ ⠠ ▌\",\"▐ ⠂ ▌\",\"▐ ⠈ ▌\",\"▐ ⠂ ▌\",\"▐ ⠠ ▌\",\"▐ ⡀ ▌\",\"▐⠠ ▌\"]},\"shark\":{\"interval\":120,\"frames\":[\"▐|\\\\____________▌\",\"▐_|\\\\___________▌\",\"▐__|\\\\__________▌\",\"▐___|\\\\_________▌\",\"▐____|\\\\________▌\",\"▐_____|\\\\_______▌\",\"▐______|\\\\______▌\",\"▐_______|\\\\_____▌\",\"▐________|\\\\____▌\",\"▐_________|\\\\___▌\",\"▐__________|\\\\__▌\",\"▐___________|\\\\_▌\",\"▐____________|\\\\▌\",\"▐____________/|▌\",\"▐___________/|_▌\",\"▐__________/|__▌\",\"▐_________/|___▌\",\"▐________/|____▌\",\"▐_______/|_____▌\",\"▐______/|______▌\",\"▐_____/|_______▌\",\"▐____/|________▌\",\"▐___/|_________▌\",\"▐__/|__________▌\",\"▐_/|___________▌\",\"▐/|____________▌\"]},\"dqpb\":{\"interval\":100,\"frames\":[\"d\",\"q\",\"p\",\"b\"]},\"weather\":{\"interval\":100,\"frames\":[\"☀️ \",\"☀️ \",\"☀️ \",\"🌤 \",\"⛅️ \",\"🌥 \",\"☁️ \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"🌧 \",\"🌨 \",\"⛈ \",\"🌨 \",\"🌧 \",\"🌨 \",\"☁️ \",\"🌥 \",\"⛅️ \",\"🌤 \",\"☀️ \",\"☀️ \"]},\"christmas\":{\"interval\":400,\"frames\":[\"🌲\",\"🎄\"]},\"grenade\":{\"interval\":80,\"frames\":[\"، \",\"′ \",\" ´ \",\" ‾ \",\" ⸌\",\" ⸊\",\" |\",\" ⁎\",\" ⁕\",\" ෴ \",\" ⁓\",\" \",\" \",\" \"]},\"point\":{\"interval\":125,\"frames\":[\"∙∙∙\",\"●∙∙\",\"∙●∙\",\"∙∙●\",\"∙∙∙\"]},\"layer\":{\"interval\":150,\"frames\":[\"-\",\"=\",\"≡\"]},\"betaWave\":{\"interval\":80,\"frames\":[\"ρββββββ\",\"βρβββββ\",\"ββρββββ\",\"βββρβββ\",\"ββββρββ\",\"βββββρβ\",\"ββββββρ\"]},\"aesthetic\":{\"interval\":80,\"frames\":[\"▰▱▱▱▱▱▱\",\"▰▰▱▱▱▱▱\",\"▰▰▰▱▱▱▱\",\"▰▰▰▰▱▱▱\",\"▰▰▰▰▰▱▱\",\"▰▰▰▰▰▰▱\",\"▰▰▰▰▰▰▰\",\"▰▱▱▱▱▱▱\"]}}"); /***/ }), -/* 544 */ +/* 538 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const chalk = __webpack_require__(545); +const chalk = __webpack_require__(539); const isSupported = process.platform !== 'win32' || process.env.CI || process.env.TERM === 'xterm-256color'; @@ -62036,16 +59988,16 @@ module.exports = isSupported ? main : fallbacks; /***/ }), -/* 545 */ +/* 539 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const escapeStringRegexp = __webpack_require__(363); -const ansiStyles = __webpack_require__(546); -const stdoutColor = __webpack_require__(547).stdout; +const escapeStringRegexp = __webpack_require__(357); +const ansiStyles = __webpack_require__(540); +const stdoutColor = __webpack_require__(541).stdout; -const template = __webpack_require__(549); +const template = __webpack_require__(543); const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); @@ -62271,12 +60223,12 @@ module.exports.default = module.exports; // For TypeScript /***/ }), -/* 546 */ +/* 540 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(module) { -const colorConvert = __webpack_require__(365); +const colorConvert = __webpack_require__(359); const wrapAnsi16 = (fn, offset) => function () { const code = fn.apply(colorConvert, arguments); @@ -62444,13 +60396,13 @@ Object.defineProperty(module, 'exports', { /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(116)(module))) /***/ }), -/* 547 */ +/* 541 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const os = __webpack_require__(122); -const hasFlag = __webpack_require__(548); +const hasFlag = __webpack_require__(542); const env = process.env; @@ -62582,7 +60534,7 @@ module.exports = { /***/ }), -/* 548 */ +/* 542 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62597,7 +60549,7 @@ module.exports = (flag, argv) => { /***/ }), -/* 549 */ +/* 543 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62732,18 +60684,18 @@ module.exports = (chalk, tmp) => { /***/ }), -/* 550 */ +/* 544 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const ansiRegex = __webpack_require__(551); +const ansiRegex = __webpack_require__(545); module.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string; /***/ }), -/* 551 */ +/* 545 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -62760,14 +60712,14 @@ module.exports = ({onlyFirst = false} = {}) => { /***/ }), -/* 552 */ +/* 546 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var defaults = __webpack_require__(553) -var combining = __webpack_require__(555) +var defaults = __webpack_require__(547) +var combining = __webpack_require__(549) var DEFAULTS = { nul: 0, @@ -62866,10 +60818,10 @@ function bisearch(ucs) { /***/ }), -/* 553 */ +/* 547 */ /***/ (function(module, exports, __webpack_require__) { -var clone = __webpack_require__(554); +var clone = __webpack_require__(548); module.exports = function(options, defaults) { options = options || {}; @@ -62884,7 +60836,7 @@ module.exports = function(options, defaults) { }; /***/ }), -/* 554 */ +/* 548 */ /***/ (function(module, exports, __webpack_require__) { var clone = (function() { @@ -63056,7 +61008,7 @@ if ( true && module.exports) { /***/ }), -/* 555 */ +/* 549 */ /***/ (function(module, exports) { module.exports = [ @@ -63112,7 +61064,7 @@ module.exports = [ /***/ }), -/* 556 */ +/* 550 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -63128,7 +61080,7 @@ module.exports = ({stream = process.stdout} = {}) => { /***/ }), -/* 557 */ +/* 551 */ /***/ (function(module, exports, __webpack_require__) { var Stream = __webpack_require__(173) @@ -63279,7 +61231,7 @@ MuteStream.prototype.close = proxy('close') /***/ }), -/* 558 */ +/* 552 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -63289,11 +61241,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(240); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(535); +/* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(529); /* harmony import */ var ora__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(ora__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(427); +/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(421); /* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(231); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(220); /* @@ -63402,7 +61354,7 @@ const ResetCommand = { }; /***/ }), -/* 559 */ +/* 553 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -63410,10 +61362,10 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RunCommand", function() { return RunCommand; }); /* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); /* harmony import */ var dedent__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(dedent__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(347); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(341); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(220); -/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(560); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(346); +/* harmony import */ var _utils_parallelize__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(554); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(340); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -63471,7 +61423,7 @@ const RunCommand = { }; /***/ }), -/* 560 */ +/* 554 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -63526,13 +61478,13 @@ async function parallelize(items, fn, concurrency = 4) { } /***/ }), -/* 561 */ +/* 555 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "WatchCommand", function() { return WatchCommand; }); -/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(427); +/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(421); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -63563,7 +61515,7 @@ const WatchCommand = { }; /***/ }), -/* 562 */ +/* 556 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -63643,7 +61595,7 @@ const PatchNativeModulesCommand = { }; /***/ }), -/* 563 */ +/* 557 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -63651,11 +61603,11 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "runCommand", function() { return runCommand; }); /* harmony import */ var _kbn_dev_utils_ci_stats_reporter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(131); /* harmony import */ var _kbn_dev_utils_ci_stats_reporter__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_kbn_dev_utils_ci_stats_reporter__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(347); +/* harmony import */ var _utils_errors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(341); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(220); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(346); -/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(426); -/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(564); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(340); +/* harmony import */ var _utils_projects_tree__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(420); +/* harmony import */ var _utils_kibana__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(558); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -63774,7 +61726,7 @@ function toArray(value) { } /***/ }), -/* 564 */ +/* 558 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -63784,13 +61736,13 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(132); /* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(565); +/* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(559); /* harmony import */ var multimatch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(multimatch__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(339); +/* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(333); /* harmony import */ var is_path_inside__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(is_path_inside__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(414); -/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(346); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(568); +/* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(408); +/* harmony import */ var _projects__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(340); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(562); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } @@ -63954,15 +61906,15 @@ class Kibana { } /***/ }), -/* 565 */ +/* 559 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const minimatch = __webpack_require__(247); const arrayUnion = __webpack_require__(242); -const arrayDiffer = __webpack_require__(566); -const arrify = __webpack_require__(567); +const arrayDiffer = __webpack_require__(560); +const arrify = __webpack_require__(561); module.exports = (list, patterns, options = {}) => { list = arrify(list); @@ -63986,7 +61938,7 @@ module.exports = (list, patterns, options = {}) => { /***/ }), -/* 566 */ +/* 560 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64001,7 +61953,7 @@ module.exports = arrayDiffer; /***/ }), -/* 567 */ +/* 561 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64031,7 +61983,7 @@ module.exports = arrify; /***/ }), -/* 568 */ +/* 562 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -64091,15 +62043,15 @@ function getProjectPaths({ } /***/ }), -/* 569 */ +/* 563 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _build_bazel_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(570); +/* harmony import */ var _build_bazel_production_projects__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(564); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildBazelProductionProjects", function() { return _build_bazel_production_projects__WEBPACK_IMPORTED_MODULE_0__["buildBazelProductionProjects"]; }); -/* harmony import */ var _build_non_bazel_production_projects__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(817); +/* harmony import */ var _build_non_bazel_production_projects__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(811); /* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "buildNonBazelProductionProjects", function() { return _build_non_bazel_production_projects__WEBPACK_IMPORTED_MODULE_1__["buildNonBazelProductionProjects"]; }); /* @@ -64113,24 +62065,24 @@ __webpack_require__.r(__webpack_exports__); /***/ }), -/* 570 */ +/* 564 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildBazelProductionProjects", function() { return buildBazelProductionProjects; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(571); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(565); /* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var globby__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(783); +/* harmony import */ var globby__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(777); /* harmony import */ var globby__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(globby__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _build_non_bazel_production_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(817); -/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(427); +/* harmony import */ var _build_non_bazel_production_projects__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(811); +/* harmony import */ var _utils_bazel__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(421); /* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(231); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(220); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(349); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(346); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(343); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(340); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License @@ -64220,7 +62172,7 @@ async function applyCorrectPermissions(project, kibanaRoot, buildRoot) { } /***/ }), -/* 571 */ +/* 565 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64228,14 +62180,14 @@ async function applyCorrectPermissions(project, kibanaRoot, buildRoot) { const EventEmitter = __webpack_require__(164); const path = __webpack_require__(4); const os = __webpack_require__(122); -const pMap = __webpack_require__(572); -const arrify = __webpack_require__(567); -const globby = __webpack_require__(575); -const hasGlob = __webpack_require__(767); -const cpFile = __webpack_require__(769); -const junk = __webpack_require__(779); -const pFilter = __webpack_require__(780); -const CpyError = __webpack_require__(782); +const pMap = __webpack_require__(566); +const arrify = __webpack_require__(561); +const globby = __webpack_require__(569); +const hasGlob = __webpack_require__(761); +const cpFile = __webpack_require__(763); +const junk = __webpack_require__(773); +const pFilter = __webpack_require__(774); +const CpyError = __webpack_require__(776); const defaultOptions = { ignoreJunk: true @@ -64386,12 +62338,12 @@ module.exports = (source, destination, { /***/ }), -/* 572 */ +/* 566 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const AggregateError = __webpack_require__(573); +const AggregateError = __webpack_require__(567); module.exports = async ( iterable, @@ -64474,13 +62426,13 @@ module.exports = async ( /***/ }), -/* 573 */ +/* 567 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const indentString = __webpack_require__(574); -const cleanStack = __webpack_require__(344); +const indentString = __webpack_require__(568); +const cleanStack = __webpack_require__(338); const cleanInternalStack = stack => stack.replace(/\s+at .*aggregate-error\/index.js:\d+:\d+\)?/g, ''); @@ -64528,7 +62480,7 @@ module.exports = AggregateError; /***/ }), -/* 574 */ +/* 568 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64570,17 +62522,17 @@ module.exports = (string, count = 1, options) => { /***/ }), -/* 575 */ +/* 569 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(132); -const arrayUnion = __webpack_require__(576); +const arrayUnion = __webpack_require__(570); const glob = __webpack_require__(244); -const fastGlob = __webpack_require__(578); -const dirGlob = __webpack_require__(761); -const gitignore = __webpack_require__(764); +const fastGlob = __webpack_require__(572); +const dirGlob = __webpack_require__(755); +const gitignore = __webpack_require__(758); const DEFAULT_FILTER = () => false; @@ -64725,12 +62677,12 @@ module.exports.gitignore = gitignore; /***/ }), -/* 576 */ +/* 570 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var arrayUniq = __webpack_require__(577); +var arrayUniq = __webpack_require__(571); module.exports = function () { return arrayUniq([].concat.apply([], arguments)); @@ -64738,7 +62690,7 @@ module.exports = function () { /***/ }), -/* 577 */ +/* 571 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64807,10 +62759,10 @@ if ('Set' in global) { /***/ }), -/* 578 */ +/* 572 */ /***/ (function(module, exports, __webpack_require__) { -const pkg = __webpack_require__(579); +const pkg = __webpack_require__(573); module.exports = pkg.async; module.exports.default = pkg.async; @@ -64823,19 +62775,19 @@ module.exports.generateTasks = pkg.generateTasks; /***/ }), -/* 579 */ +/* 573 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var optionsManager = __webpack_require__(580); -var taskManager = __webpack_require__(581); -var reader_async_1 = __webpack_require__(732); -var reader_stream_1 = __webpack_require__(756); -var reader_sync_1 = __webpack_require__(757); -var arrayUtils = __webpack_require__(759); -var streamUtils = __webpack_require__(760); +var optionsManager = __webpack_require__(574); +var taskManager = __webpack_require__(575); +var reader_async_1 = __webpack_require__(726); +var reader_stream_1 = __webpack_require__(750); +var reader_sync_1 = __webpack_require__(751); +var arrayUtils = __webpack_require__(753); +var streamUtils = __webpack_require__(754); /** * Synchronous API. */ @@ -64901,7 +62853,7 @@ function isString(source) { /***/ }), -/* 580 */ +/* 574 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -64939,13 +62891,13 @@ exports.prepare = prepare; /***/ }), -/* 581 */ +/* 575 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var patternUtils = __webpack_require__(582); +var patternUtils = __webpack_require__(576); /** * Generate tasks based on parent directory of each pattern. */ @@ -65036,16 +62988,16 @@ exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 582 */ +/* 576 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var globParent = __webpack_require__(583); +var globParent = __webpack_require__(577); var isGlob = __webpack_require__(266); -var micromatch = __webpack_require__(586); +var micromatch = __webpack_require__(580); var GLOBSTAR = '**'; /** * Return true for static pattern. @@ -65191,15 +63143,15 @@ exports.matchAny = matchAny; /***/ }), -/* 583 */ +/* 577 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var path = __webpack_require__(4); -var isglob = __webpack_require__(584); -var pathDirname = __webpack_require__(585); +var isglob = __webpack_require__(578); +var pathDirname = __webpack_require__(579); var isWin32 = __webpack_require__(122).platform() === 'win32'; module.exports = function globParent(str) { @@ -65222,7 +63174,7 @@ module.exports = function globParent(str) { /***/ }), -/* 584 */ +/* 578 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -65253,7 +63205,7 @@ module.exports = function isGlob(str) { /***/ }), -/* 585 */ +/* 579 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65403,7 +63355,7 @@ module.exports.win32 = win32; /***/ }), -/* 586 */ +/* 580 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -65414,18 +63366,18 @@ module.exports.win32 = win32; */ var util = __webpack_require__(113); -var braces = __webpack_require__(587); -var toRegex = __webpack_require__(588); -var extend = __webpack_require__(700); +var braces = __webpack_require__(581); +var toRegex = __webpack_require__(582); +var extend = __webpack_require__(694); /** * Local dependencies */ -var compilers = __webpack_require__(702); -var parsers = __webpack_require__(728); -var cache = __webpack_require__(729); -var utils = __webpack_require__(730); +var compilers = __webpack_require__(696); +var parsers = __webpack_require__(722); +var cache = __webpack_require__(723); +var utils = __webpack_require__(724); var MAX_LENGTH = 1024 * 64; /** @@ -66287,7 +64239,7 @@ module.exports = micromatch; /***/ }), -/* 587 */ +/* 581 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -66297,18 +64249,18 @@ module.exports = micromatch; * Module dependencies */ -var toRegex = __webpack_require__(588); -var unique = __webpack_require__(608); -var extend = __webpack_require__(609); +var toRegex = __webpack_require__(582); +var unique = __webpack_require__(602); +var extend = __webpack_require__(603); /** * Local dependencies */ -var compilers = __webpack_require__(611); -var parsers = __webpack_require__(626); -var Braces = __webpack_require__(631); -var utils = __webpack_require__(612); +var compilers = __webpack_require__(605); +var parsers = __webpack_require__(620); +var Braces = __webpack_require__(625); +var utils = __webpack_require__(606); var MAX_LENGTH = 1024 * 64; var cache = {}; @@ -66612,16 +64564,16 @@ module.exports = braces; /***/ }), -/* 588 */ +/* 582 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var safe = __webpack_require__(589); -var define = __webpack_require__(595); -var extend = __webpack_require__(601); -var not = __webpack_require__(605); +var safe = __webpack_require__(583); +var define = __webpack_require__(589); +var extend = __webpack_require__(595); +var not = __webpack_require__(599); var MAX_LENGTH = 1024 * 64; /** @@ -66774,10 +64726,10 @@ module.exports.makeRe = makeRe; /***/ }), -/* 589 */ +/* 583 */ /***/ (function(module, exports, __webpack_require__) { -var parse = __webpack_require__(590); +var parse = __webpack_require__(584); var types = parse.types; module.exports = function (re, opts) { @@ -66823,13 +64775,13 @@ function isRegExp (x) { /***/ }), -/* 590 */ +/* 584 */ /***/ (function(module, exports, __webpack_require__) { -var util = __webpack_require__(591); -var types = __webpack_require__(592); -var sets = __webpack_require__(593); -var positions = __webpack_require__(594); +var util = __webpack_require__(585); +var types = __webpack_require__(586); +var sets = __webpack_require__(587); +var positions = __webpack_require__(588); module.exports = function(regexpStr) { @@ -67111,11 +65063,11 @@ module.exports.types = types; /***/ }), -/* 591 */ +/* 585 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(592); -var sets = __webpack_require__(593); +var types = __webpack_require__(586); +var sets = __webpack_require__(587); // All of these are private and only used by randexp. @@ -67228,7 +65180,7 @@ exports.error = function(regexp, msg) { /***/ }), -/* 592 */ +/* 586 */ /***/ (function(module, exports) { module.exports = { @@ -67244,10 +65196,10 @@ module.exports = { /***/ }), -/* 593 */ +/* 587 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(592); +var types = __webpack_require__(586); var INTS = function() { return [{ type: types.RANGE , from: 48, to: 57 }]; @@ -67332,10 +65284,10 @@ exports.anyChar = function() { /***/ }), -/* 594 */ +/* 588 */ /***/ (function(module, exports, __webpack_require__) { -var types = __webpack_require__(592); +var types = __webpack_require__(586); exports.wordBoundary = function() { return { type: types.POSITION, value: 'b' }; @@ -67355,7 +65307,7 @@ exports.end = function() { /***/ }), -/* 595 */ +/* 589 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67368,8 +65320,8 @@ exports.end = function() { -var isobject = __webpack_require__(596); -var isDescriptor = __webpack_require__(597); +var isobject = __webpack_require__(590); +var isDescriptor = __webpack_require__(591); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -67400,7 +65352,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 596 */ +/* 590 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67419,7 +65371,7 @@ module.exports = function isObject(val) { /***/ }), -/* 597 */ +/* 591 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67432,9 +65384,9 @@ module.exports = function isObject(val) { -var typeOf = __webpack_require__(598); -var isAccessor = __webpack_require__(599); -var isData = __webpack_require__(600); +var typeOf = __webpack_require__(592); +var isAccessor = __webpack_require__(593); +var isData = __webpack_require__(594); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -67448,7 +65400,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 598 */ +/* 592 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -67583,7 +65535,7 @@ function isBuffer(val) { /***/ }), -/* 599 */ +/* 593 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67596,7 +65548,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(598); +var typeOf = __webpack_require__(592); // accessor descriptor properties var accessor = { @@ -67659,7 +65611,7 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 600 */ +/* 594 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67672,7 +65624,7 @@ module.exports = isAccessorDescriptor; -var typeOf = __webpack_require__(598); +var typeOf = __webpack_require__(592); module.exports = function isDataDescriptor(obj, prop) { // data descriptor properties @@ -67715,14 +65667,14 @@ module.exports = function isDataDescriptor(obj, prop) { /***/ }), -/* 601 */ +/* 595 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(602); -var assignSymbols = __webpack_require__(604); +var isExtendable = __webpack_require__(596); +var assignSymbols = __webpack_require__(598); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -67782,7 +65734,7 @@ function isEnum(obj, key) { /***/ }), -/* 602 */ +/* 596 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67795,7 +65747,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(603); +var isPlainObject = __webpack_require__(597); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -67803,7 +65755,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 603 */ +/* 597 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67816,7 +65768,7 @@ module.exports = function isExtendable(val) { -var isObject = __webpack_require__(596); +var isObject = __webpack_require__(590); function isObjectObject(o) { return isObject(o) === true @@ -67847,7 +65799,7 @@ module.exports = function isPlainObject(o) { /***/ }), -/* 604 */ +/* 598 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -67894,14 +65846,14 @@ module.exports = function(receiver, objects) { /***/ }), -/* 605 */ +/* 599 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(606); -var safe = __webpack_require__(589); +var extend = __webpack_require__(600); +var safe = __webpack_require__(583); /** * The main export is a function that takes a `pattern` string and an `options` object. @@ -67973,14 +65925,14 @@ module.exports = toRegex; /***/ }), -/* 606 */ +/* 600 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(607); -var assignSymbols = __webpack_require__(604); +var isExtendable = __webpack_require__(601); +var assignSymbols = __webpack_require__(598); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -68040,7 +65992,7 @@ function isEnum(obj, key) { /***/ }), -/* 607 */ +/* 601 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68053,7 +66005,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(603); +var isPlainObject = __webpack_require__(597); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -68061,7 +66013,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 608 */ +/* 602 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68111,13 +66063,13 @@ module.exports.immutable = function uniqueImmutable(arr) { /***/ }), -/* 609 */ +/* 603 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(610); +var isObject = __webpack_require__(604); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -68151,7 +66103,7 @@ function hasOwn(obj, key) { /***/ }), -/* 610 */ +/* 604 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68171,13 +66123,13 @@ module.exports = function isExtendable(val) { /***/ }), -/* 611 */ +/* 605 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(612); +var utils = __webpack_require__(606); module.exports = function(braces, options) { braces.compiler @@ -68460,25 +66412,25 @@ function hasQueue(node) { /***/ }), -/* 612 */ +/* 606 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var splitString = __webpack_require__(613); +var splitString = __webpack_require__(607); var utils = module.exports; /** * Module dependencies */ -utils.extend = __webpack_require__(609); -utils.flatten = __webpack_require__(616); -utils.isObject = __webpack_require__(596); -utils.fillRange = __webpack_require__(617); -utils.repeat = __webpack_require__(625); -utils.unique = __webpack_require__(608); +utils.extend = __webpack_require__(603); +utils.flatten = __webpack_require__(610); +utils.isObject = __webpack_require__(590); +utils.fillRange = __webpack_require__(611); +utils.repeat = __webpack_require__(619); +utils.unique = __webpack_require__(602); utils.define = function(obj, key, val) { Object.defineProperty(obj, key, { @@ -68810,7 +66762,7 @@ utils.escapeRegex = function(str) { /***/ }), -/* 613 */ +/* 607 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -68823,7 +66775,7 @@ utils.escapeRegex = function(str) { -var extend = __webpack_require__(614); +var extend = __webpack_require__(608); module.exports = function(str, options, fn) { if (typeof str !== 'string') { @@ -68988,14 +66940,14 @@ function keepEscaping(opts, str, idx) { /***/ }), -/* 614 */ +/* 608 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(615); -var assignSymbols = __webpack_require__(604); +var isExtendable = __webpack_require__(609); +var assignSymbols = __webpack_require__(598); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -69055,7 +67007,7 @@ function isEnum(obj, key) { /***/ }), -/* 615 */ +/* 609 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69068,7 +67020,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(603); +var isPlainObject = __webpack_require__(597); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -69076,7 +67028,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 616 */ +/* 610 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69105,7 +67057,7 @@ function flat(arr, res) { /***/ }), -/* 617 */ +/* 611 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69119,10 +67071,10 @@ function flat(arr, res) { var util = __webpack_require__(113); -var isNumber = __webpack_require__(618); -var extend = __webpack_require__(621); -var repeat = __webpack_require__(623); -var toRegex = __webpack_require__(624); +var isNumber = __webpack_require__(612); +var extend = __webpack_require__(615); +var repeat = __webpack_require__(617); +var toRegex = __webpack_require__(618); /** * Return a range of numbers or letters. @@ -69320,7 +67272,7 @@ module.exports = fillRange; /***/ }), -/* 618 */ +/* 612 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69333,7 +67285,7 @@ module.exports = fillRange; -var typeOf = __webpack_require__(619); +var typeOf = __webpack_require__(613); module.exports = function isNumber(num) { var type = typeOf(num); @@ -69349,10 +67301,10 @@ module.exports = function isNumber(num) { /***/ }), -/* 619 */ +/* 613 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -69471,7 +67423,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 620 */ +/* 614 */ /***/ (function(module, exports) { /*! @@ -69498,13 +67450,13 @@ function isSlowBuffer (obj) { /***/ }), -/* 621 */ +/* 615 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(622); +var isObject = __webpack_require__(616); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -69538,7 +67490,7 @@ function hasOwn(obj, key) { /***/ }), -/* 622 */ +/* 616 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69558,7 +67510,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 623 */ +/* 617 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69635,7 +67587,7 @@ function repeat(str, num) { /***/ }), -/* 624 */ +/* 618 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69648,8 +67600,8 @@ function repeat(str, num) { -var repeat = __webpack_require__(623); -var isNumber = __webpack_require__(618); +var repeat = __webpack_require__(617); +var isNumber = __webpack_require__(612); var cache = {}; function toRegexRange(min, max, options) { @@ -69936,7 +67888,7 @@ module.exports = toRegexRange; /***/ }), -/* 625 */ +/* 619 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -69961,14 +67913,14 @@ module.exports = function repeat(ele, num) { /***/ }), -/* 626 */ +/* 620 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Node = __webpack_require__(627); -var utils = __webpack_require__(612); +var Node = __webpack_require__(621); +var utils = __webpack_require__(606); /** * Braces parsers @@ -70328,15 +68280,15 @@ function concatNodes(pos, node, parent, options) { /***/ }), -/* 627 */ +/* 621 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(596); -var define = __webpack_require__(628); -var utils = __webpack_require__(629); +var isObject = __webpack_require__(590); +var define = __webpack_require__(622); +var utils = __webpack_require__(623); var ownNames; /** @@ -70827,7 +68779,7 @@ exports = module.exports = Node; /***/ }), -/* 628 */ +/* 622 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -70840,7 +68792,7 @@ exports = module.exports = Node; -var isDescriptor = __webpack_require__(597); +var isDescriptor = __webpack_require__(591); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -70865,13 +68817,13 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 629 */ +/* 623 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(630); +var typeOf = __webpack_require__(624); var utils = module.exports; /** @@ -71891,10 +69843,10 @@ function assert(val, message) { /***/ }), -/* 630 */ +/* 624 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -72013,17 +69965,17 @@ module.exports = function kindOf(val) { /***/ }), -/* 631 */ +/* 625 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extend = __webpack_require__(609); -var Snapdragon = __webpack_require__(632); -var compilers = __webpack_require__(611); -var parsers = __webpack_require__(626); -var utils = __webpack_require__(612); +var extend = __webpack_require__(603); +var Snapdragon = __webpack_require__(626); +var compilers = __webpack_require__(605); +var parsers = __webpack_require__(620); +var utils = __webpack_require__(606); /** * Customize Snapdragon parser and renderer @@ -72124,17 +70076,17 @@ module.exports = Braces; /***/ }), -/* 632 */ +/* 626 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var Base = __webpack_require__(633); -var define = __webpack_require__(663); -var Compiler = __webpack_require__(674); -var Parser = __webpack_require__(697); -var utils = __webpack_require__(677); +var Base = __webpack_require__(627); +var define = __webpack_require__(657); +var Compiler = __webpack_require__(668); +var Parser = __webpack_require__(691); +var utils = __webpack_require__(671); var regexCache = {}; var cache = {}; @@ -72305,20 +70257,20 @@ module.exports.Parser = Parser; /***/ }), -/* 633 */ +/* 627 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(113); -var define = __webpack_require__(634); -var CacheBase = __webpack_require__(635); -var Emitter = __webpack_require__(636); -var isObject = __webpack_require__(596); -var merge = __webpack_require__(657); -var pascal = __webpack_require__(660); -var cu = __webpack_require__(661); +var define = __webpack_require__(628); +var CacheBase = __webpack_require__(629); +var Emitter = __webpack_require__(630); +var isObject = __webpack_require__(590); +var merge = __webpack_require__(651); +var pascal = __webpack_require__(654); +var cu = __webpack_require__(655); /** * Optionally define a custom `cache` namespace to use. @@ -72747,7 +70699,7 @@ module.exports.namespace = namespace; /***/ }), -/* 634 */ +/* 628 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -72760,7 +70712,7 @@ module.exports.namespace = namespace; -var isDescriptor = __webpack_require__(597); +var isDescriptor = __webpack_require__(591); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -72785,21 +70737,21 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 635 */ +/* 629 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(596); -var Emitter = __webpack_require__(636); -var visit = __webpack_require__(637); -var toPath = __webpack_require__(640); -var union = __webpack_require__(642); -var del = __webpack_require__(648); -var get = __webpack_require__(645); -var has = __webpack_require__(653); -var set = __webpack_require__(656); +var isObject = __webpack_require__(590); +var Emitter = __webpack_require__(630); +var visit = __webpack_require__(631); +var toPath = __webpack_require__(634); +var union = __webpack_require__(636); +var del = __webpack_require__(642); +var get = __webpack_require__(639); +var has = __webpack_require__(647); +var set = __webpack_require__(650); /** * Create a `Cache` constructor that when instantiated will @@ -73053,7 +71005,7 @@ module.exports.namespace = namespace; /***/ }), -/* 636 */ +/* 630 */ /***/ (function(module, exports, __webpack_require__) { @@ -73222,7 +71174,7 @@ Emitter.prototype.hasListeners = function(event){ /***/ }), -/* 637 */ +/* 631 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73235,8 +71187,8 @@ Emitter.prototype.hasListeners = function(event){ -var visit = __webpack_require__(638); -var mapVisit = __webpack_require__(639); +var visit = __webpack_require__(632); +var mapVisit = __webpack_require__(633); module.exports = function(collection, method, val) { var result; @@ -73259,7 +71211,7 @@ module.exports = function(collection, method, val) { /***/ }), -/* 638 */ +/* 632 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73272,7 +71224,7 @@ module.exports = function(collection, method, val) { -var isObject = __webpack_require__(596); +var isObject = __webpack_require__(590); module.exports = function visit(thisArg, method, target, val) { if (!isObject(thisArg) && typeof thisArg !== 'function') { @@ -73299,14 +71251,14 @@ module.exports = function visit(thisArg, method, target, val) { /***/ }), -/* 639 */ +/* 633 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(113); -var visit = __webpack_require__(638); +var visit = __webpack_require__(632); /** * Map `visit` over an array of objects. @@ -73343,7 +71295,7 @@ function isObject(val) { /***/ }), -/* 640 */ +/* 634 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73356,7 +71308,7 @@ function isObject(val) { -var typeOf = __webpack_require__(641); +var typeOf = __webpack_require__(635); module.exports = function toPath(args) { if (typeOf(args) !== 'arguments') { @@ -73383,10 +71335,10 @@ function filter(arr) { /***/ }), -/* 641 */ +/* 635 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -73505,16 +71457,16 @@ module.exports = function kindOf(val) { /***/ }), -/* 642 */ +/* 636 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(643); -var union = __webpack_require__(644); -var get = __webpack_require__(645); -var set = __webpack_require__(646); +var isObject = __webpack_require__(637); +var union = __webpack_require__(638); +var get = __webpack_require__(639); +var set = __webpack_require__(640); module.exports = function unionValue(obj, prop, value) { if (!isObject(obj)) { @@ -73542,7 +71494,7 @@ function arrayify(val) { /***/ }), -/* 643 */ +/* 637 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73562,7 +71514,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 644 */ +/* 638 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73598,7 +71550,7 @@ module.exports = function union(init) { /***/ }), -/* 645 */ +/* 639 */ /***/ (function(module, exports) { /*! @@ -73654,7 +71606,7 @@ function toString(val) { /***/ }), -/* 646 */ +/* 640 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73667,10 +71619,10 @@ function toString(val) { -var split = __webpack_require__(613); -var extend = __webpack_require__(647); -var isPlainObject = __webpack_require__(603); -var isObject = __webpack_require__(643); +var split = __webpack_require__(607); +var extend = __webpack_require__(641); +var isPlainObject = __webpack_require__(597); +var isObject = __webpack_require__(637); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -73716,13 +71668,13 @@ function isValidKey(key) { /***/ }), -/* 647 */ +/* 641 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isObject = __webpack_require__(643); +var isObject = __webpack_require__(637); module.exports = function extend(o/*, objects*/) { if (!isObject(o)) { o = {}; } @@ -73756,7 +71708,7 @@ function hasOwn(obj, key) { /***/ }), -/* 648 */ +/* 642 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73769,8 +71721,8 @@ function hasOwn(obj, key) { -var isObject = __webpack_require__(596); -var has = __webpack_require__(649); +var isObject = __webpack_require__(590); +var has = __webpack_require__(643); module.exports = function unset(obj, prop) { if (!isObject(obj)) { @@ -73795,7 +71747,7 @@ module.exports = function unset(obj, prop) { /***/ }), -/* 649 */ +/* 643 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73808,9 +71760,9 @@ module.exports = function unset(obj, prop) { -var isObject = __webpack_require__(650); -var hasValues = __webpack_require__(652); -var get = __webpack_require__(645); +var isObject = __webpack_require__(644); +var hasValues = __webpack_require__(646); +var get = __webpack_require__(639); module.exports = function(obj, prop, noZero) { if (isObject(obj)) { @@ -73821,7 +71773,7 @@ module.exports = function(obj, prop, noZero) { /***/ }), -/* 650 */ +/* 644 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73834,7 +71786,7 @@ module.exports = function(obj, prop, noZero) { -var isArray = __webpack_require__(651); +var isArray = __webpack_require__(645); module.exports = function isObject(val) { return val != null && typeof val === 'object' && isArray(val) === false; @@ -73842,7 +71794,7 @@ module.exports = function isObject(val) { /***/ }), -/* 651 */ +/* 645 */ /***/ (function(module, exports) { var toString = {}.toString; @@ -73853,7 +71805,7 @@ module.exports = Array.isArray || function (arr) { /***/ }), -/* 652 */ +/* 646 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73896,7 +71848,7 @@ module.exports = function hasValue(o, noZero) { /***/ }), -/* 653 */ +/* 647 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73909,9 +71861,9 @@ module.exports = function hasValue(o, noZero) { -var isObject = __webpack_require__(596); -var hasValues = __webpack_require__(654); -var get = __webpack_require__(645); +var isObject = __webpack_require__(590); +var hasValues = __webpack_require__(648); +var get = __webpack_require__(639); module.exports = function(val, prop) { return hasValues(isObject(val) && prop ? get(val, prop) : val); @@ -73919,7 +71871,7 @@ module.exports = function(val, prop) { /***/ }), -/* 654 */ +/* 648 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -73932,8 +71884,8 @@ module.exports = function(val, prop) { -var typeOf = __webpack_require__(655); -var isNumber = __webpack_require__(618); +var typeOf = __webpack_require__(649); +var isNumber = __webpack_require__(612); module.exports = function hasValue(val) { // is-number checks for NaN and other edge cases @@ -73986,10 +71938,10 @@ module.exports = function hasValue(val) { /***/ }), -/* 655 */ +/* 649 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -74111,7 +72063,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 656 */ +/* 650 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74124,10 +72076,10 @@ module.exports = function kindOf(val) { -var split = __webpack_require__(613); -var extend = __webpack_require__(647); -var isPlainObject = __webpack_require__(603); -var isObject = __webpack_require__(643); +var split = __webpack_require__(607); +var extend = __webpack_require__(641); +var isPlainObject = __webpack_require__(597); +var isObject = __webpack_require__(637); module.exports = function(obj, prop, val) { if (!isObject(obj)) { @@ -74173,14 +72125,14 @@ function isValidKey(key) { /***/ }), -/* 657 */ +/* 651 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(658); -var forIn = __webpack_require__(659); +var isExtendable = __webpack_require__(652); +var forIn = __webpack_require__(653); function mixinDeep(target, objects) { var len = arguments.length, i = 0; @@ -74244,7 +72196,7 @@ module.exports = mixinDeep; /***/ }), -/* 658 */ +/* 652 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74257,7 +72209,7 @@ module.exports = mixinDeep; -var isPlainObject = __webpack_require__(603); +var isPlainObject = __webpack_require__(597); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -74265,7 +72217,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 659 */ +/* 653 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74288,7 +72240,7 @@ module.exports = function forIn(obj, fn, thisArg) { /***/ }), -/* 660 */ +/* 654 */ /***/ (function(module, exports) { /*! @@ -74315,14 +72267,14 @@ module.exports = pascalcase; /***/ }), -/* 661 */ +/* 655 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; var util = __webpack_require__(113); -var utils = __webpack_require__(662); +var utils = __webpack_require__(656); /** * Expose class utils @@ -74687,7 +72639,7 @@ cu.bubble = function(Parent, events) { /***/ }), -/* 662 */ +/* 656 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74701,10 +72653,10 @@ var utils = {}; * Lazily required module dependencies */ -utils.union = __webpack_require__(644); -utils.define = __webpack_require__(663); -utils.isObj = __webpack_require__(596); -utils.staticExtend = __webpack_require__(670); +utils.union = __webpack_require__(638); +utils.define = __webpack_require__(657); +utils.isObj = __webpack_require__(590); +utils.staticExtend = __webpack_require__(664); /** @@ -74715,7 +72667,7 @@ module.exports = utils; /***/ }), -/* 663 */ +/* 657 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74728,7 +72680,7 @@ module.exports = utils; -var isDescriptor = __webpack_require__(664); +var isDescriptor = __webpack_require__(658); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -74753,7 +72705,7 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 664 */ +/* 658 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74766,9 +72718,9 @@ module.exports = function defineProperty(obj, prop, val) { -var typeOf = __webpack_require__(665); -var isAccessor = __webpack_require__(666); -var isData = __webpack_require__(668); +var typeOf = __webpack_require__(659); +var isAccessor = __webpack_require__(660); +var isData = __webpack_require__(662); module.exports = function isDescriptor(obj, key) { if (typeOf(obj) !== 'object') { @@ -74782,7 +72734,7 @@ module.exports = function isDescriptor(obj, key) { /***/ }), -/* 665 */ +/* 659 */ /***/ (function(module, exports) { var toString = Object.prototype.toString; @@ -74935,7 +72887,7 @@ function isBuffer(val) { /***/ }), -/* 666 */ +/* 660 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -74948,7 +72900,7 @@ function isBuffer(val) { -var typeOf = __webpack_require__(667); +var typeOf = __webpack_require__(661); // accessor descriptor properties var accessor = { @@ -75011,10 +72963,10 @@ module.exports = isAccessorDescriptor; /***/ }), -/* 667 */ +/* 661 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -75133,7 +73085,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 668 */ +/* 662 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75146,7 +73098,7 @@ module.exports = function kindOf(val) { -var typeOf = __webpack_require__(669); +var typeOf = __webpack_require__(663); // data descriptor properties var data = { @@ -75195,10 +73147,10 @@ module.exports = isDataDescriptor; /***/ }), -/* 669 */ +/* 663 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -75317,7 +73269,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 670 */ +/* 664 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75330,8 +73282,8 @@ module.exports = function kindOf(val) { -var copy = __webpack_require__(671); -var define = __webpack_require__(663); +var copy = __webpack_require__(665); +var define = __webpack_require__(657); var util = __webpack_require__(113); /** @@ -75414,15 +73366,15 @@ module.exports = extend; /***/ }), -/* 671 */ +/* 665 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var typeOf = __webpack_require__(672); -var copyDescriptor = __webpack_require__(673); -var define = __webpack_require__(663); +var typeOf = __webpack_require__(666); +var copyDescriptor = __webpack_require__(667); +var define = __webpack_require__(657); /** * Copy static properties, prototype properties, and descriptors from one object to another. @@ -75595,10 +73547,10 @@ module.exports.has = has; /***/ }), -/* 672 */ +/* 666 */ /***/ (function(module, exports, __webpack_require__) { -var isBuffer = __webpack_require__(620); +var isBuffer = __webpack_require__(614); var toString = Object.prototype.toString; /** @@ -75717,7 +73669,7 @@ module.exports = function kindOf(val) { /***/ }), -/* 673 */ +/* 667 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -75805,16 +73757,16 @@ function isObject(val) { /***/ }), -/* 674 */ +/* 668 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(675); -var define = __webpack_require__(663); +var use = __webpack_require__(669); +var define = __webpack_require__(657); var debug = __webpack_require__(205)('snapdragon:compiler'); -var utils = __webpack_require__(677); +var utils = __webpack_require__(671); /** * Create a new `Compiler` with the given `options`. @@ -75968,7 +73920,7 @@ Compiler.prototype = { // source map support if (opts.sourcemap) { - var sourcemaps = __webpack_require__(696); + var sourcemaps = __webpack_require__(690); sourcemaps(this); this.mapVisit(this.ast.nodes); this.applySourceMaps(); @@ -75989,7 +73941,7 @@ module.exports = Compiler; /***/ }), -/* 675 */ +/* 669 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76002,7 +73954,7 @@ module.exports = Compiler; -var utils = __webpack_require__(676); +var utils = __webpack_require__(670); module.exports = function base(app, opts) { if (!utils.isObject(app) && typeof app !== 'function') { @@ -76117,7 +74069,7 @@ module.exports = function base(app, opts) { /***/ }), -/* 676 */ +/* 670 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76131,8 +74083,8 @@ var utils = {}; * Lazily required module dependencies */ -utils.define = __webpack_require__(663); -utils.isObject = __webpack_require__(596); +utils.define = __webpack_require__(657); +utils.isObject = __webpack_require__(590); utils.isString = function(val) { @@ -76147,7 +74099,7 @@ module.exports = utils; /***/ }), -/* 677 */ +/* 671 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -76157,9 +74109,9 @@ module.exports = utils; * Module dependencies */ -exports.extend = __webpack_require__(647); -exports.SourceMap = __webpack_require__(678); -exports.sourceMapResolve = __webpack_require__(689); +exports.extend = __webpack_require__(641); +exports.SourceMap = __webpack_require__(672); +exports.sourceMapResolve = __webpack_require__(683); /** * Convert backslash in the given string to forward slashes @@ -76202,7 +74154,7 @@ exports.last = function(arr, n) { /***/ }), -/* 678 */ +/* 672 */ /***/ (function(module, exports, __webpack_require__) { /* @@ -76210,13 +74162,13 @@ exports.last = function(arr, n) { * Licensed under the New BSD license. See LICENSE.txt or: * http://opensource.org/licenses/BSD-3-Clause */ -exports.SourceMapGenerator = __webpack_require__(679).SourceMapGenerator; -exports.SourceMapConsumer = __webpack_require__(685).SourceMapConsumer; -exports.SourceNode = __webpack_require__(688).SourceNode; +exports.SourceMapGenerator = __webpack_require__(673).SourceMapGenerator; +exports.SourceMapConsumer = __webpack_require__(679).SourceMapConsumer; +exports.SourceNode = __webpack_require__(682).SourceNode; /***/ }), -/* 679 */ +/* 673 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -76226,10 +74178,10 @@ exports.SourceNode = __webpack_require__(688).SourceNode; * http://opensource.org/licenses/BSD-3-Clause */ -var base64VLQ = __webpack_require__(680); -var util = __webpack_require__(682); -var ArraySet = __webpack_require__(683).ArraySet; -var MappingList = __webpack_require__(684).MappingList; +var base64VLQ = __webpack_require__(674); +var util = __webpack_require__(676); +var ArraySet = __webpack_require__(677).ArraySet; +var MappingList = __webpack_require__(678).MappingList; /** * An instance of the SourceMapGenerator represents a source map which is @@ -76638,7 +74590,7 @@ exports.SourceMapGenerator = SourceMapGenerator; /***/ }), -/* 680 */ +/* 674 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -76678,7 +74630,7 @@ exports.SourceMapGenerator = SourceMapGenerator; * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -var base64 = __webpack_require__(681); +var base64 = __webpack_require__(675); // A single base 64 digit can contain 6 bits of data. For the base 64 variable // length quantities we use in the source map spec, the first bit is the sign, @@ -76784,7 +74736,7 @@ exports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) { /***/ }), -/* 681 */ +/* 675 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -76857,7 +74809,7 @@ exports.decode = function (charCode) { /***/ }), -/* 682 */ +/* 676 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -77280,7 +75232,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate /***/ }), -/* 683 */ +/* 677 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -77290,7 +75242,7 @@ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflate * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(682); +var util = __webpack_require__(676); var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; @@ -77407,7 +75359,7 @@ exports.ArraySet = ArraySet; /***/ }), -/* 684 */ +/* 678 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -77417,7 +75369,7 @@ exports.ArraySet = ArraySet; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(682); +var util = __webpack_require__(676); /** * Determine whether mappingB is after mappingA with respect to generated @@ -77492,7 +75444,7 @@ exports.MappingList = MappingList; /***/ }), -/* 685 */ +/* 679 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -77502,11 +75454,11 @@ exports.MappingList = MappingList; * http://opensource.org/licenses/BSD-3-Clause */ -var util = __webpack_require__(682); -var binarySearch = __webpack_require__(686); -var ArraySet = __webpack_require__(683).ArraySet; -var base64VLQ = __webpack_require__(680); -var quickSort = __webpack_require__(687).quickSort; +var util = __webpack_require__(676); +var binarySearch = __webpack_require__(680); +var ArraySet = __webpack_require__(677).ArraySet; +var base64VLQ = __webpack_require__(674); +var quickSort = __webpack_require__(681).quickSort; function SourceMapConsumer(aSourceMap) { var sourceMap = aSourceMap; @@ -78580,7 +76532,7 @@ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer; /***/ }), -/* 686 */ +/* 680 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -78697,7 +76649,7 @@ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) { /***/ }), -/* 687 */ +/* 681 */ /***/ (function(module, exports) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -78817,7 +76769,7 @@ exports.quickSort = function (ary, comparator) { /***/ }), -/* 688 */ +/* 682 */ /***/ (function(module, exports, __webpack_require__) { /* -*- Mode: js; js-indent-level: 2; -*- */ @@ -78827,8 +76779,8 @@ exports.quickSort = function (ary, comparator) { * http://opensource.org/licenses/BSD-3-Clause */ -var SourceMapGenerator = __webpack_require__(679).SourceMapGenerator; -var util = __webpack_require__(682); +var SourceMapGenerator = __webpack_require__(673).SourceMapGenerator; +var util = __webpack_require__(676); // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other // operating systems these days (capturing the result). @@ -79236,17 +77188,17 @@ exports.SourceNode = SourceNode; /***/ }), -/* 689 */ +/* 683 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014, 2015, 2016, 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var sourceMappingURL = __webpack_require__(690) -var resolveUrl = __webpack_require__(691) -var decodeUriComponent = __webpack_require__(692) -var urix = __webpack_require__(694) -var atob = __webpack_require__(695) +var sourceMappingURL = __webpack_require__(684) +var resolveUrl = __webpack_require__(685) +var decodeUriComponent = __webpack_require__(686) +var urix = __webpack_require__(688) +var atob = __webpack_require__(689) @@ -79544,7 +77496,7 @@ module.exports = { /***/ }), -/* 690 */ +/* 684 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;// Copyright 2014 Simon Lydell @@ -79607,7 +77559,7 @@ void (function(root, factory) { /***/ }), -/* 691 */ +/* 685 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -79625,13 +77577,13 @@ module.exports = resolveUrl /***/ }), -/* 692 */ +/* 686 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2017 Simon Lydell // X11 (“MIT”) Licensed. (See LICENSE.) -var decodeUriComponent = __webpack_require__(693) +var decodeUriComponent = __webpack_require__(687) function customDecodeUriComponent(string) { // `decodeUriComponent` turns `+` into ` `, but that's not wanted. @@ -79642,7 +77594,7 @@ module.exports = customDecodeUriComponent /***/ }), -/* 693 */ +/* 687 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79743,7 +77695,7 @@ module.exports = function (encodedURI) { /***/ }), -/* 694 */ +/* 688 */ /***/ (function(module, exports, __webpack_require__) { // Copyright 2014 Simon Lydell @@ -79766,7 +77718,7 @@ module.exports = urix /***/ }), -/* 695 */ +/* 689 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79780,7 +77732,7 @@ module.exports = atob.atob = atob; /***/ }), -/* 696 */ +/* 690 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -79788,8 +77740,8 @@ module.exports = atob.atob = atob; var fs = __webpack_require__(132); var path = __webpack_require__(4); -var define = __webpack_require__(663); -var utils = __webpack_require__(677); +var define = __webpack_require__(657); +var utils = __webpack_require__(671); /** * Expose `mixin()`. @@ -79932,19 +77884,19 @@ exports.comment = function(node) { /***/ }), -/* 697 */ +/* 691 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var use = __webpack_require__(675); +var use = __webpack_require__(669); var util = __webpack_require__(113); -var Cache = __webpack_require__(698); -var define = __webpack_require__(663); +var Cache = __webpack_require__(692); +var define = __webpack_require__(657); var debug = __webpack_require__(205)('snapdragon:parser'); -var Position = __webpack_require__(699); -var utils = __webpack_require__(677); +var Position = __webpack_require__(693); +var utils = __webpack_require__(671); /** * Create a new `Parser` with the given `input` and `options`. @@ -80472,7 +78424,7 @@ module.exports = Parser; /***/ }), -/* 698 */ +/* 692 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80579,13 +78531,13 @@ MapCache.prototype.del = function mapDelete(key) { /***/ }), -/* 699 */ +/* 693 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var define = __webpack_require__(663); +var define = __webpack_require__(657); /** * Store position for a node @@ -80600,14 +78552,14 @@ module.exports = function Position(start, parser) { /***/ }), -/* 700 */ +/* 694 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(701); -var assignSymbols = __webpack_require__(604); +var isExtendable = __webpack_require__(695); +var assignSymbols = __webpack_require__(598); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -80667,7 +78619,7 @@ function isEnum(obj, key) { /***/ }), -/* 701 */ +/* 695 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80680,7 +78632,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(603); +var isPlainObject = __webpack_require__(597); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -80688,14 +78640,14 @@ module.exports = function isExtendable(val) { /***/ }), -/* 702 */ +/* 696 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var nanomatch = __webpack_require__(703); -var extglob = __webpack_require__(717); +var nanomatch = __webpack_require__(697); +var extglob = __webpack_require__(711); module.exports = function(snapdragon) { var compilers = snapdragon.compiler.compilers; @@ -80772,7 +78724,7 @@ function escapeExtglobs(compiler) { /***/ }), -/* 703 */ +/* 697 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -80783,17 +78735,17 @@ function escapeExtglobs(compiler) { */ var util = __webpack_require__(113); -var toRegex = __webpack_require__(588); -var extend = __webpack_require__(704); +var toRegex = __webpack_require__(582); +var extend = __webpack_require__(698); /** * Local dependencies */ -var compilers = __webpack_require__(706); -var parsers = __webpack_require__(707); -var cache = __webpack_require__(710); -var utils = __webpack_require__(712); +var compilers = __webpack_require__(700); +var parsers = __webpack_require__(701); +var cache = __webpack_require__(704); +var utils = __webpack_require__(706); var MAX_LENGTH = 1024 * 64; /** @@ -81617,14 +79569,14 @@ module.exports = nanomatch; /***/ }), -/* 704 */ +/* 698 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var isExtendable = __webpack_require__(705); -var assignSymbols = __webpack_require__(604); +var isExtendable = __webpack_require__(699); +var assignSymbols = __webpack_require__(598); module.exports = Object.assign || function(obj/*, objects*/) { if (obj === null || typeof obj === 'undefined') { @@ -81684,7 +79636,7 @@ function isEnum(obj, key) { /***/ }), -/* 705 */ +/* 699 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -81697,7 +79649,7 @@ function isEnum(obj, key) { -var isPlainObject = __webpack_require__(603); +var isPlainObject = __webpack_require__(597); module.exports = function isExtendable(val) { return isPlainObject(val) || typeof val === 'function' || Array.isArray(val); @@ -81705,7 +79657,7 @@ module.exports = function isExtendable(val) { /***/ }), -/* 706 */ +/* 700 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82051,15 +80003,15 @@ module.exports = function(nanomatch, options) { /***/ }), -/* 707 */ +/* 701 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regexNot = __webpack_require__(605); -var toRegex = __webpack_require__(588); -var isOdd = __webpack_require__(708); +var regexNot = __webpack_require__(599); +var toRegex = __webpack_require__(582); +var isOdd = __webpack_require__(702); /** * Characters to use in negation regex (we want to "not" match @@ -82445,7 +80397,7 @@ module.exports.not = NOT_REGEX; /***/ }), -/* 708 */ +/* 702 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82458,7 +80410,7 @@ module.exports.not = NOT_REGEX; -var isNumber = __webpack_require__(709); +var isNumber = __webpack_require__(703); module.exports = function isOdd(i) { if (!isNumber(i)) { @@ -82472,7 +80424,7 @@ module.exports = function isOdd(i) { /***/ }), -/* 709 */ +/* 703 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82500,14 +80452,14 @@ module.exports = function isNumber(num) { /***/ }), -/* 710 */ +/* 704 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(711))(); +module.exports = new (__webpack_require__(705))(); /***/ }), -/* 711 */ +/* 705 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82520,7 +80472,7 @@ module.exports = new (__webpack_require__(711))(); -var MapCache = __webpack_require__(698); +var MapCache = __webpack_require__(692); /** * Create a new `FragmentCache` with an optional object to use for `caches`. @@ -82642,7 +80594,7 @@ exports = module.exports = FragmentCache; /***/ }), -/* 712 */ +/* 706 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -82655,14 +80607,14 @@ var path = __webpack_require__(4); * Module dependencies */ -var isWindows = __webpack_require__(713)(); -var Snapdragon = __webpack_require__(632); -utils.define = __webpack_require__(714); -utils.diff = __webpack_require__(715); -utils.extend = __webpack_require__(704); -utils.pick = __webpack_require__(716); -utils.typeOf = __webpack_require__(598); -utils.unique = __webpack_require__(608); +var isWindows = __webpack_require__(707)(); +var Snapdragon = __webpack_require__(626); +utils.define = __webpack_require__(708); +utils.diff = __webpack_require__(709); +utils.extend = __webpack_require__(698); +utils.pick = __webpack_require__(710); +utils.typeOf = __webpack_require__(592); +utils.unique = __webpack_require__(602); /** * Returns true if the given value is effectively an empty string @@ -83028,7 +80980,7 @@ utils.unixify = function(options) { /***/ }), -/* 713 */ +/* 707 */ /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! @@ -83056,7 +81008,7 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ /***/ }), -/* 714 */ +/* 708 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83069,8 +81021,8 @@ var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_ -var isobject = __webpack_require__(596); -var isDescriptor = __webpack_require__(597); +var isobject = __webpack_require__(590); +var isDescriptor = __webpack_require__(591); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -83101,7 +81053,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 715 */ +/* 709 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83155,7 +81107,7 @@ function diffArray(one, two) { /***/ }), -/* 716 */ +/* 710 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83168,7 +81120,7 @@ function diffArray(one, two) { -var isObject = __webpack_require__(596); +var isObject = __webpack_require__(590); module.exports = function pick(obj, keys) { if (!isObject(obj) && typeof obj !== 'function') { @@ -83197,7 +81149,7 @@ module.exports = function pick(obj, keys) { /***/ }), -/* 717 */ +/* 711 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83207,18 +81159,18 @@ module.exports = function pick(obj, keys) { * Module dependencies */ -var extend = __webpack_require__(647); -var unique = __webpack_require__(608); -var toRegex = __webpack_require__(588); +var extend = __webpack_require__(641); +var unique = __webpack_require__(602); +var toRegex = __webpack_require__(582); /** * Local dependencies */ -var compilers = __webpack_require__(718); -var parsers = __webpack_require__(724); -var Extglob = __webpack_require__(727); -var utils = __webpack_require__(726); +var compilers = __webpack_require__(712); +var parsers = __webpack_require__(718); +var Extglob = __webpack_require__(721); +var utils = __webpack_require__(720); var MAX_LENGTH = 1024 * 64; /** @@ -83535,13 +81487,13 @@ module.exports = extglob; /***/ }), -/* 718 */ +/* 712 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(719); +var brackets = __webpack_require__(713); /** * Extglob compilers @@ -83711,7 +81663,7 @@ module.exports = function(extglob) { /***/ }), -/* 719 */ +/* 713 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -83721,17 +81673,17 @@ module.exports = function(extglob) { * Local dependencies */ -var compilers = __webpack_require__(720); -var parsers = __webpack_require__(722); +var compilers = __webpack_require__(714); +var parsers = __webpack_require__(716); /** * Module dependencies */ var debug = __webpack_require__(205)('expand-brackets'); -var extend = __webpack_require__(647); -var Snapdragon = __webpack_require__(632); -var toRegex = __webpack_require__(588); +var extend = __webpack_require__(641); +var Snapdragon = __webpack_require__(626); +var toRegex = __webpack_require__(582); /** * Parses the given POSIX character class `pattern` and returns a @@ -83929,13 +81881,13 @@ module.exports = brackets; /***/ }), -/* 720 */ +/* 714 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var posix = __webpack_require__(721); +var posix = __webpack_require__(715); module.exports = function(brackets) { brackets.compiler @@ -84023,7 +81975,7 @@ module.exports = function(brackets) { /***/ }), -/* 721 */ +/* 715 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84052,14 +82004,14 @@ module.exports = { /***/ }), -/* 722 */ +/* 716 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var utils = __webpack_require__(723); -var define = __webpack_require__(663); +var utils = __webpack_require__(717); +var define = __webpack_require__(657); /** * Text regex @@ -84278,14 +82230,14 @@ module.exports.TEXT_REGEX = TEXT_REGEX; /***/ }), -/* 723 */ +/* 717 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var toRegex = __webpack_require__(588); -var regexNot = __webpack_require__(605); +var toRegex = __webpack_require__(582); +var regexNot = __webpack_require__(599); var cached; /** @@ -84319,15 +82271,15 @@ exports.createRegex = function(pattern, include) { /***/ }), -/* 724 */ +/* 718 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var brackets = __webpack_require__(719); -var define = __webpack_require__(725); -var utils = __webpack_require__(726); +var brackets = __webpack_require__(713); +var define = __webpack_require__(719); +var utils = __webpack_require__(720); /** * Characters to use in text regex (we want to "not" match @@ -84482,7 +82434,7 @@ module.exports = parsers; /***/ }), -/* 725 */ +/* 719 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84495,7 +82447,7 @@ module.exports = parsers; -var isDescriptor = __webpack_require__(597); +var isDescriptor = __webpack_require__(591); module.exports = function defineProperty(obj, prop, val) { if (typeof obj !== 'object' && typeof obj !== 'function') { @@ -84520,14 +82472,14 @@ module.exports = function defineProperty(obj, prop, val) { /***/ }), -/* 726 */ +/* 720 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var regex = __webpack_require__(605); -var Cache = __webpack_require__(711); +var regex = __webpack_require__(599); +var Cache = __webpack_require__(705); /** * Utils @@ -84596,7 +82548,7 @@ utils.createRegex = function(str) { /***/ }), -/* 727 */ +/* 721 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84606,16 +82558,16 @@ utils.createRegex = function(str) { * Module dependencies */ -var Snapdragon = __webpack_require__(632); -var define = __webpack_require__(725); -var extend = __webpack_require__(647); +var Snapdragon = __webpack_require__(626); +var define = __webpack_require__(719); +var extend = __webpack_require__(641); /** * Local dependencies */ -var compilers = __webpack_require__(718); -var parsers = __webpack_require__(724); +var compilers = __webpack_require__(712); +var parsers = __webpack_require__(718); /** * Customize Snapdragon parser and renderer @@ -84681,16 +82633,16 @@ module.exports = Extglob; /***/ }), -/* 728 */ +/* 722 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -var extglob = __webpack_require__(717); -var nanomatch = __webpack_require__(703); -var regexNot = __webpack_require__(605); -var toRegex = __webpack_require__(588); +var extglob = __webpack_require__(711); +var nanomatch = __webpack_require__(697); +var regexNot = __webpack_require__(599); +var toRegex = __webpack_require__(582); var not; /** @@ -84771,14 +82723,14 @@ function textRegex(pattern) { /***/ }), -/* 729 */ +/* 723 */ /***/ (function(module, exports, __webpack_require__) { -module.exports = new (__webpack_require__(711))(); +module.exports = new (__webpack_require__(705))(); /***/ }), -/* 730 */ +/* 724 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -84791,13 +82743,13 @@ var path = __webpack_require__(4); * Module dependencies */ -var Snapdragon = __webpack_require__(632); -utils.define = __webpack_require__(731); -utils.diff = __webpack_require__(715); -utils.extend = __webpack_require__(700); -utils.pick = __webpack_require__(716); -utils.typeOf = __webpack_require__(598); -utils.unique = __webpack_require__(608); +var Snapdragon = __webpack_require__(626); +utils.define = __webpack_require__(725); +utils.diff = __webpack_require__(709); +utils.extend = __webpack_require__(694); +utils.pick = __webpack_require__(710); +utils.typeOf = __webpack_require__(592); +utils.unique = __webpack_require__(602); /** * Returns true if the platform is windows, or `path.sep` is `\\`. @@ -85094,7 +83046,7 @@ utils.unixify = function(options) { /***/ }), -/* 731 */ +/* 725 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85107,8 +83059,8 @@ utils.unixify = function(options) { -var isobject = __webpack_require__(596); -var isDescriptor = __webpack_require__(597); +var isobject = __webpack_require__(590); +var isDescriptor = __webpack_require__(591); var define = (typeof Reflect !== 'undefined' && Reflect.defineProperty) ? Reflect.defineProperty : Object.defineProperty; @@ -85139,7 +83091,7 @@ module.exports = function defineProperty(obj, key, val) { /***/ }), -/* 732 */ +/* 726 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85158,9 +83110,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(733); -var reader_1 = __webpack_require__(746); -var fs_stream_1 = __webpack_require__(750); +var readdir = __webpack_require__(727); +var reader_1 = __webpack_require__(740); +var fs_stream_1 = __webpack_require__(744); var ReaderAsync = /** @class */ (function (_super) { __extends(ReaderAsync, _super); function ReaderAsync() { @@ -85221,15 +83173,15 @@ exports.default = ReaderAsync; /***/ }), -/* 733 */ +/* 727 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const readdirSync = __webpack_require__(734); -const readdirAsync = __webpack_require__(742); -const readdirStream = __webpack_require__(745); +const readdirSync = __webpack_require__(728); +const readdirAsync = __webpack_require__(736); +const readdirStream = __webpack_require__(739); module.exports = exports = readdirAsyncPath; exports.readdir = exports.readdirAsync = exports.async = readdirAsyncPath; @@ -85313,7 +83265,7 @@ function readdirStreamStat (dir, options) { /***/ }), -/* 734 */ +/* 728 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85321,11 +83273,11 @@ function readdirStreamStat (dir, options) { module.exports = readdirSync; -const DirectoryReader = __webpack_require__(735); +const DirectoryReader = __webpack_require__(729); let syncFacade = { - fs: __webpack_require__(740), - forEach: __webpack_require__(741), + fs: __webpack_require__(734), + forEach: __webpack_require__(735), sync: true }; @@ -85354,7 +83306,7 @@ function readdirSync (dir, options, internalOptions) { /***/ }), -/* 735 */ +/* 729 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -85363,9 +83315,9 @@ function readdirSync (dir, options, internalOptions) { const Readable = __webpack_require__(173).Readable; const EventEmitter = __webpack_require__(164).EventEmitter; const path = __webpack_require__(4); -const normalizeOptions = __webpack_require__(736); -const stat = __webpack_require__(738); -const call = __webpack_require__(739); +const normalizeOptions = __webpack_require__(730); +const stat = __webpack_require__(732); +const call = __webpack_require__(733); /** * Asynchronously reads the contents of a directory and streams the results @@ -85741,14 +83693,14 @@ module.exports = DirectoryReader; /***/ }), -/* 736 */ +/* 730 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const globToRegExp = __webpack_require__(737); +const globToRegExp = __webpack_require__(731); module.exports = normalizeOptions; @@ -85925,7 +83877,7 @@ function normalizeOptions (options, internalOptions) { /***/ }), -/* 737 */ +/* 731 */ /***/ (function(module, exports) { module.exports = function (glob, opts) { @@ -86062,13 +84014,13 @@ module.exports = function (glob, opts) { /***/ }), -/* 738 */ +/* 732 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const call = __webpack_require__(739); +const call = __webpack_require__(733); module.exports = stat; @@ -86143,7 +84095,7 @@ function symlinkStat (fs, path, lstats, callback) { /***/ }), -/* 739 */ +/* 733 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86204,14 +84156,14 @@ function callOnce (fn) { /***/ }), -/* 740 */ +/* 734 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(132); -const call = __webpack_require__(739); +const call = __webpack_require__(733); /** * A facade around {@link fs.readdirSync} that allows it to be called @@ -86275,7 +84227,7 @@ exports.lstat = function (path, callback) { /***/ }), -/* 741 */ +/* 735 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86304,7 +84256,7 @@ function syncForEach (array, iterator, done) { /***/ }), -/* 742 */ +/* 736 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86312,12 +84264,12 @@ function syncForEach (array, iterator, done) { module.exports = readdirAsync; -const maybe = __webpack_require__(743); -const DirectoryReader = __webpack_require__(735); +const maybe = __webpack_require__(737); +const DirectoryReader = __webpack_require__(729); let asyncFacade = { fs: __webpack_require__(132), - forEach: __webpack_require__(744), + forEach: __webpack_require__(738), async: true }; @@ -86359,7 +84311,7 @@ function readdirAsync (dir, options, callback, internalOptions) { /***/ }), -/* 743 */ +/* 737 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86386,7 +84338,7 @@ module.exports = function maybe (cb, promise) { /***/ }), -/* 744 */ +/* 738 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86422,7 +84374,7 @@ function asyncForEach (array, iterator, done) { /***/ }), -/* 745 */ +/* 739 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86430,11 +84382,11 @@ function asyncForEach (array, iterator, done) { module.exports = readdirStream; -const DirectoryReader = __webpack_require__(735); +const DirectoryReader = __webpack_require__(729); let streamFacade = { fs: __webpack_require__(132), - forEach: __webpack_require__(744), + forEach: __webpack_require__(738), async: true }; @@ -86454,16 +84406,16 @@ function readdirStream (dir, options, internalOptions) { /***/ }), -/* 746 */ +/* 740 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var path = __webpack_require__(4); -var deep_1 = __webpack_require__(747); -var entry_1 = __webpack_require__(749); -var pathUtil = __webpack_require__(748); +var deep_1 = __webpack_require__(741); +var entry_1 = __webpack_require__(743); +var pathUtil = __webpack_require__(742); var Reader = /** @class */ (function () { function Reader(options) { this.options = options; @@ -86529,14 +84481,14 @@ exports.default = Reader; /***/ }), -/* 747 */ +/* 741 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(748); -var patternUtils = __webpack_require__(582); +var pathUtils = __webpack_require__(742); +var patternUtils = __webpack_require__(576); var DeepFilter = /** @class */ (function () { function DeepFilter(options, micromatchOptions) { this.options = options; @@ -86619,7 +84571,7 @@ exports.default = DeepFilter; /***/ }), -/* 748 */ +/* 742 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86650,14 +84602,14 @@ exports.makeAbsolute = makeAbsolute; /***/ }), -/* 749 */ +/* 743 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var pathUtils = __webpack_require__(748); -var patternUtils = __webpack_require__(582); +var pathUtils = __webpack_require__(742); +var patternUtils = __webpack_require__(576); var EntryFilter = /** @class */ (function () { function EntryFilter(options, micromatchOptions) { this.options = options; @@ -86742,7 +84694,7 @@ exports.default = EntryFilter; /***/ }), -/* 750 */ +/* 744 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86762,8 +84714,8 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(173); -var fsStat = __webpack_require__(751); -var fs_1 = __webpack_require__(755); +var fsStat = __webpack_require__(745); +var fs_1 = __webpack_require__(749); var FileSystemStream = /** @class */ (function (_super) { __extends(FileSystemStream, _super); function FileSystemStream() { @@ -86813,14 +84765,14 @@ exports.default = FileSystemStream; /***/ }), -/* 751 */ +/* 745 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const optionsManager = __webpack_require__(752); -const statProvider = __webpack_require__(754); +const optionsManager = __webpack_require__(746); +const statProvider = __webpack_require__(748); /** * Asynchronous API. */ @@ -86851,13 +84803,13 @@ exports.statSync = statSync; /***/ }), -/* 752 */ +/* 746 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const fsAdapter = __webpack_require__(753); +const fsAdapter = __webpack_require__(747); function prepare(opts) { const options = Object.assign({ fs: fsAdapter.getFileSystemAdapter(opts ? opts.fs : undefined), @@ -86870,7 +84822,7 @@ exports.prepare = prepare; /***/ }), -/* 753 */ +/* 747 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86893,7 +84845,7 @@ exports.getFileSystemAdapter = getFileSystemAdapter; /***/ }), -/* 754 */ +/* 748 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86945,7 +84897,7 @@ exports.isFollowedSymlink = isFollowedSymlink; /***/ }), -/* 755 */ +/* 749 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86976,7 +84928,7 @@ exports.default = FileSystem; /***/ }), -/* 756 */ +/* 750 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -86996,9 +84948,9 @@ var __extends = (this && this.__extends) || (function () { })(); Object.defineProperty(exports, "__esModule", { value: true }); var stream = __webpack_require__(173); -var readdir = __webpack_require__(733); -var reader_1 = __webpack_require__(746); -var fs_stream_1 = __webpack_require__(750); +var readdir = __webpack_require__(727); +var reader_1 = __webpack_require__(740); +var fs_stream_1 = __webpack_require__(744); var TransformStream = /** @class */ (function (_super) { __extends(TransformStream, _super); function TransformStream(reader) { @@ -87066,7 +85018,7 @@ exports.default = ReaderStream; /***/ }), -/* 757 */ +/* 751 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87085,9 +85037,9 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var readdir = __webpack_require__(733); -var reader_1 = __webpack_require__(746); -var fs_sync_1 = __webpack_require__(758); +var readdir = __webpack_require__(727); +var reader_1 = __webpack_require__(740); +var fs_sync_1 = __webpack_require__(752); var ReaderSync = /** @class */ (function (_super) { __extends(ReaderSync, _super); function ReaderSync() { @@ -87147,7 +85099,7 @@ exports.default = ReaderSync; /***/ }), -/* 758 */ +/* 752 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87166,8 +85118,8 @@ var __extends = (this && this.__extends) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -var fsStat = __webpack_require__(751); -var fs_1 = __webpack_require__(755); +var fsStat = __webpack_require__(745); +var fs_1 = __webpack_require__(749); var FileSystemSync = /** @class */ (function (_super) { __extends(FileSystemSync, _super); function FileSystemSync() { @@ -87213,7 +85165,7 @@ exports.default = FileSystemSync; /***/ }), -/* 759 */ +/* 753 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87229,7 +85181,7 @@ exports.flatten = flatten; /***/ }), -/* 760 */ +/* 754 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87250,13 +85202,13 @@ exports.merge = merge; /***/ }), -/* 761 */ +/* 755 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const pathType = __webpack_require__(762); +const pathType = __webpack_require__(756); const getExtensions = extensions => extensions.length > 1 ? `{${extensions.join(',')}}` : extensions[0]; @@ -87322,13 +85274,13 @@ module.exports.sync = (input, opts) => { /***/ }), -/* 762 */ +/* 756 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(132); -const pify = __webpack_require__(763); +const pify = __webpack_require__(757); function type(fn, fn2, fp) { if (typeof fp !== 'string') { @@ -87371,7 +85323,7 @@ exports.symlinkSync = typeSync.bind(null, 'lstatSync', 'isSymbolicLink'); /***/ }), -/* 763 */ +/* 757 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -87462,17 +85414,17 @@ module.exports = (obj, opts) => { /***/ }), -/* 764 */ +/* 758 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const fs = __webpack_require__(132); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(578); -const gitIgnore = __webpack_require__(765); -const pify = __webpack_require__(410); -const slash = __webpack_require__(766); +const fastGlob = __webpack_require__(572); +const gitIgnore = __webpack_require__(759); +const pify = __webpack_require__(404); +const slash = __webpack_require__(760); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -87570,7 +85522,7 @@ module.exports.sync = options => { /***/ }), -/* 765 */ +/* 759 */ /***/ (function(module, exports) { // A simple implementation of make-array @@ -88039,7 +85991,7 @@ module.exports = options => new IgnoreBase(options) /***/ }), -/* 766 */ +/* 760 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88057,7 +86009,7 @@ module.exports = input => { /***/ }), -/* 767 */ +/* 761 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88070,7 +86022,7 @@ module.exports = input => { -var isGlob = __webpack_require__(768); +var isGlob = __webpack_require__(762); module.exports = function hasGlob(val) { if (val == null) return false; @@ -88090,7 +86042,7 @@ module.exports = function hasGlob(val) { /***/ }), -/* 768 */ +/* 762 */ /***/ (function(module, exports, __webpack_require__) { /*! @@ -88121,17 +86073,17 @@ module.exports = function isGlob(str) { /***/ }), -/* 769 */ +/* 763 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); const {constants: fsConstants} = __webpack_require__(132); -const pEvent = __webpack_require__(770); -const CpFileError = __webpack_require__(773); -const fs = __webpack_require__(775); -const ProgressEmitter = __webpack_require__(778); +const pEvent = __webpack_require__(764); +const CpFileError = __webpack_require__(767); +const fs = __webpack_require__(769); +const ProgressEmitter = __webpack_require__(772); const cpFileAsync = async (source, destination, options, progressEmitter) => { let readError; @@ -88245,12 +86197,12 @@ module.exports.sync = (source, destination, options) => { /***/ }), -/* 770 */ +/* 764 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pTimeout = __webpack_require__(771); +const pTimeout = __webpack_require__(765); const symbolAsyncIterator = Symbol.asyncIterator || '@@asyncIterator'; @@ -88541,12 +86493,12 @@ module.exports.iterator = (emitter, event, options) => { /***/ }), -/* 771 */ +/* 765 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pFinally = __webpack_require__(772); +const pFinally = __webpack_require__(766); class TimeoutError extends Error { constructor(message) { @@ -88592,7 +86544,7 @@ module.exports.TimeoutError = TimeoutError; /***/ }), -/* 772 */ +/* 766 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88614,12 +86566,12 @@ module.exports = (promise, onFinally) => { /***/ }), -/* 773 */ +/* 767 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(774); +const NestedError = __webpack_require__(768); class CpFileError extends NestedError { constructor(message, nested) { @@ -88633,7 +86585,7 @@ module.exports = CpFileError; /***/ }), -/* 774 */ +/* 768 */ /***/ (function(module, exports, __webpack_require__) { var inherits = __webpack_require__(113).inherits; @@ -88689,16 +86641,16 @@ module.exports = NestedError; /***/ }), -/* 775 */ +/* 769 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const {promisify} = __webpack_require__(113); const fs = __webpack_require__(233); -const makeDir = __webpack_require__(776); -const pEvent = __webpack_require__(770); -const CpFileError = __webpack_require__(773); +const makeDir = __webpack_require__(770); +const pEvent = __webpack_require__(764); +const CpFileError = __webpack_require__(767); const stat = promisify(fs.stat); const lstat = promisify(fs.lstat); @@ -88795,7 +86747,7 @@ exports.copyFileSync = (source, destination, flags) => { /***/ }), -/* 776 */ +/* 770 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -88803,7 +86755,7 @@ exports.copyFileSync = (source, destination, flags) => { const fs = __webpack_require__(132); const path = __webpack_require__(4); const {promisify} = __webpack_require__(113); -const semver = __webpack_require__(777); +const semver = __webpack_require__(771); const useNativeRecursiveOption = semver.satisfies(process.version, '>=10.12.0'); @@ -88958,7 +86910,7 @@ module.exports.sync = (input, options) => { /***/ }), -/* 777 */ +/* 771 */ /***/ (function(module, exports) { exports = module.exports = SemVer @@ -90560,7 +88512,7 @@ function coerce (version, options) { /***/ }), -/* 778 */ +/* 772 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90601,7 +88553,7 @@ module.exports = ProgressEmitter; /***/ }), -/* 779 */ +/* 773 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90647,12 +88599,12 @@ exports.default = module.exports; /***/ }), -/* 780 */ +/* 774 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const pMap = __webpack_require__(781); +const pMap = __webpack_require__(775); const pFilter = async (iterable, filterer, options) => { const values = await pMap( @@ -90669,7 +88621,7 @@ module.exports.default = pFilter; /***/ }), -/* 781 */ +/* 775 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90748,12 +88700,12 @@ module.exports.default = pMap; /***/ }), -/* 782 */ +/* 776 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const NestedError = __webpack_require__(774); +const NestedError = __webpack_require__(768); class CpyError extends NestedError { constructor(message, nested) { @@ -90767,7 +88719,7 @@ module.exports = CpyError; /***/ }), -/* 783 */ +/* 777 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -90775,10 +88727,10 @@ module.exports = CpyError; const fs = __webpack_require__(132); const arrayUnion = __webpack_require__(242); const merge2 = __webpack_require__(243); -const fastGlob = __webpack_require__(784); -const dirGlob = __webpack_require__(332); -const gitignore = __webpack_require__(815); -const {FilterStream, UniqueStream} = __webpack_require__(816); +const fastGlob = __webpack_require__(778); +const dirGlob = __webpack_require__(326); +const gitignore = __webpack_require__(809); +const {FilterStream, UniqueStream} = __webpack_require__(810); const DEFAULT_FILTER = () => false; @@ -90955,425 +88907,465 @@ module.exports.gitignore = gitignore; /***/ }), -/* 784 */ +/* 778 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -const taskManager = __webpack_require__(785); -const async_1 = __webpack_require__(801); -const stream_1 = __webpack_require__(811); -const sync_1 = __webpack_require__(812); -const settings_1 = __webpack_require__(814); -const utils = __webpack_require__(786); -async function FastGlob(source, options) { - assertPatternsInput(source); - const works = getWorks(source, async_1.default, options); - const result = await Promise.all(works); - return utils.array.flatten(result); -} -// https://github.com/typescript-eslint/typescript-eslint/issues/60 -// eslint-disable-next-line no-redeclare -(function (FastGlob) { - function sync(source, options) { - assertPatternsInput(source); - const works = getWorks(source, sync_1.default, options); - return utils.array.flatten(works); - } - FastGlob.sync = sync; - function stream(source, options) { - assertPatternsInput(source); - const works = getWorks(source, stream_1.default, options); - /** - * The stream returned by the provider cannot work with an asynchronous iterator. - * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. - * This affects performance (+25%). I don't see best solution right now. - */ - return utils.stream.merge(works); - } - FastGlob.stream = stream; - function generateTasks(source, options) { - assertPatternsInput(source); - const patterns = [].concat(source); - const settings = new settings_1.default(options); - return taskManager.generate(patterns, settings); - } - FastGlob.generateTasks = generateTasks; - function isDynamicPattern(source, options) { - assertPatternsInput(source); - const settings = new settings_1.default(options); - return utils.pattern.isDynamicPattern(source, settings); - } - FastGlob.isDynamicPattern = isDynamicPattern; - function escapePath(source) { - assertPatternsInput(source); - return utils.path.escape(source); - } - FastGlob.escapePath = escapePath; -})(FastGlob || (FastGlob = {})); -function getWorks(source, _Provider, options) { - const patterns = [].concat(source); - const settings = new settings_1.default(options); - const tasks = taskManager.generate(patterns, settings); - const provider = new _Provider(settings); - return tasks.map(provider.read, provider); -} -function assertPatternsInput(input) { - const source = [].concat(input); - const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); - if (!isValidSource) { - throw new TypeError('Patterns must be a string (non empty) or an array of strings'); - } -} -module.exports = FastGlob; + +const taskManager = __webpack_require__(779); +const async_1 = __webpack_require__(795); +const stream_1 = __webpack_require__(805); +const sync_1 = __webpack_require__(806); +const settings_1 = __webpack_require__(808); +const utils = __webpack_require__(780); +async function FastGlob(source, options) { + assertPatternsInput(source); + const works = getWorks(source, async_1.default, options); + const result = await Promise.all(works); + return utils.array.flatten(result); +} +// https://github.com/typescript-eslint/typescript-eslint/issues/60 +// eslint-disable-next-line no-redeclare +(function (FastGlob) { + function sync(source, options) { + assertPatternsInput(source); + const works = getWorks(source, sync_1.default, options); + return utils.array.flatten(works); + } + FastGlob.sync = sync; + function stream(source, options) { + assertPatternsInput(source); + const works = getWorks(source, stream_1.default, options); + /** + * The stream returned by the provider cannot work with an asynchronous iterator. + * To support asynchronous iterators, regardless of the number of tasks, we always multiplex streams. + * This affects performance (+25%). I don't see best solution right now. + */ + return utils.stream.merge(works); + } + FastGlob.stream = stream; + function generateTasks(source, options) { + assertPatternsInput(source); + const patterns = [].concat(source); + const settings = new settings_1.default(options); + return taskManager.generate(patterns, settings); + } + FastGlob.generateTasks = generateTasks; + function isDynamicPattern(source, options) { + assertPatternsInput(source); + const settings = new settings_1.default(options); + return utils.pattern.isDynamicPattern(source, settings); + } + FastGlob.isDynamicPattern = isDynamicPattern; + function escapePath(source) { + assertPatternsInput(source); + return utils.path.escape(source); + } + FastGlob.escapePath = escapePath; +})(FastGlob || (FastGlob = {})); +function getWorks(source, _Provider, options) { + const patterns = [].concat(source); + const settings = new settings_1.default(options); + const tasks = taskManager.generate(patterns, settings); + const provider = new _Provider(settings); + return tasks.map(provider.read, provider); +} +function assertPatternsInput(input) { + const source = [].concat(input); + const isValidSource = source.every((item) => utils.string.isString(item) && !utils.string.isEmpty(item)); + if (!isValidSource) { + throw new TypeError('Patterns must be a string (non empty) or an array of strings'); + } +} +module.exports = FastGlob; /***/ }), -/* 785 */ +/* 779 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0; -const utils = __webpack_require__(786); -function generate(patterns, settings) { - const positivePatterns = getPositivePatterns(patterns); - const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); - const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); - const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); - const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); - const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); - return staticTasks.concat(dynamicTasks); -} -exports.generate = generate; -function convertPatternsToTasks(positive, negative, dynamic) { - const positivePatternsGroup = groupPatternsByBaseDirectory(positive); - // When we have a global group – there is no reason to divide the patterns into independent tasks. - // In this case, the global task covers the rest. - if ('.' in positivePatternsGroup) { - const task = convertPatternGroupToTask('.', positive, negative, dynamic); - return [task]; - } - return convertPatternGroupsToTasks(positivePatternsGroup, negative, dynamic); -} -exports.convertPatternsToTasks = convertPatternsToTasks; -function getPositivePatterns(patterns) { - return utils.pattern.getPositivePatterns(patterns); -} -exports.getPositivePatterns = getPositivePatterns; -function getNegativePatternsAsPositive(patterns, ignore) { - const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); - const positive = negative.map(utils.pattern.convertToPositivePattern); - return positive; -} -exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; -function groupPatternsByBaseDirectory(patterns) { - const group = {}; - return patterns.reduce((collection, pattern) => { - const base = utils.pattern.getBaseDirectory(pattern); - if (base in collection) { - collection[base].push(pattern); - } - else { - collection[base] = [pattern]; - } - return collection; - }, group); -} -exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; -function convertPatternGroupsToTasks(positive, negative, dynamic) { - return Object.keys(positive).map((base) => { - return convertPatternGroupToTask(base, positive[base], negative, dynamic); - }); -} -exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; -function convertPatternGroupToTask(base, positive, negative, dynamic) { - return { - dynamic, - positive, - negative, - base, - patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) - }; -} -exports.convertPatternGroupToTask = convertPatternGroupToTask; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.convertPatternGroupToTask = exports.convertPatternGroupsToTasks = exports.groupPatternsByBaseDirectory = exports.getNegativePatternsAsPositive = exports.getPositivePatterns = exports.convertPatternsToTasks = exports.generate = void 0; +const utils = __webpack_require__(780); +function generate(patterns, settings) { + const positivePatterns = getPositivePatterns(patterns); + const negativePatterns = getNegativePatternsAsPositive(patterns, settings.ignore); + const staticPatterns = positivePatterns.filter((pattern) => utils.pattern.isStaticPattern(pattern, settings)); + const dynamicPatterns = positivePatterns.filter((pattern) => utils.pattern.isDynamicPattern(pattern, settings)); + const staticTasks = convertPatternsToTasks(staticPatterns, negativePatterns, /* dynamic */ false); + const dynamicTasks = convertPatternsToTasks(dynamicPatterns, negativePatterns, /* dynamic */ true); + return staticTasks.concat(dynamicTasks); +} +exports.generate = generate; +/** + * Returns tasks grouped by basic pattern directories. + * + * Patterns that can be found inside (`./`) and outside (`../`) the current directory are handled separately. + * This is necessary because directory traversal starts at the base directory and goes deeper. + */ +function convertPatternsToTasks(positive, negative, dynamic) { + const tasks = []; + const patternsOutsideCurrentDirectory = utils.pattern.getPatternsOutsideCurrentDirectory(positive); + const patternsInsideCurrentDirectory = utils.pattern.getPatternsInsideCurrentDirectory(positive); + const outsideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsOutsideCurrentDirectory); + const insideCurrentDirectoryGroup = groupPatternsByBaseDirectory(patternsInsideCurrentDirectory); + tasks.push(...convertPatternGroupsToTasks(outsideCurrentDirectoryGroup, negative, dynamic)); + /* + * For the sake of reducing future accesses to the file system, we merge all tasks within the current directory + * into a global task, if at least one pattern refers to the root (`.`). In this case, the global task covers the rest. + */ + if ('.' in insideCurrentDirectoryGroup) { + tasks.push(convertPatternGroupToTask('.', patternsInsideCurrentDirectory, negative, dynamic)); + } + else { + tasks.push(...convertPatternGroupsToTasks(insideCurrentDirectoryGroup, negative, dynamic)); + } + return tasks; +} +exports.convertPatternsToTasks = convertPatternsToTasks; +function getPositivePatterns(patterns) { + return utils.pattern.getPositivePatterns(patterns); +} +exports.getPositivePatterns = getPositivePatterns; +function getNegativePatternsAsPositive(patterns, ignore) { + const negative = utils.pattern.getNegativePatterns(patterns).concat(ignore); + const positive = negative.map(utils.pattern.convertToPositivePattern); + return positive; +} +exports.getNegativePatternsAsPositive = getNegativePatternsAsPositive; +function groupPatternsByBaseDirectory(patterns) { + const group = {}; + return patterns.reduce((collection, pattern) => { + const base = utils.pattern.getBaseDirectory(pattern); + if (base in collection) { + collection[base].push(pattern); + } + else { + collection[base] = [pattern]; + } + return collection; + }, group); +} +exports.groupPatternsByBaseDirectory = groupPatternsByBaseDirectory; +function convertPatternGroupsToTasks(positive, negative, dynamic) { + return Object.keys(positive).map((base) => { + return convertPatternGroupToTask(base, positive[base], negative, dynamic); + }); +} +exports.convertPatternGroupsToTasks = convertPatternGroupsToTasks; +function convertPatternGroupToTask(base, positive, negative, dynamic) { + return { + dynamic, + positive, + negative, + base, + patterns: [].concat(positive, negative.map(utils.pattern.convertToNegativePattern)) + }; +} +exports.convertPatternGroupToTask = convertPatternGroupToTask; /***/ }), -/* 786 */ +/* 780 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0; -const array = __webpack_require__(787); -exports.array = array; -const errno = __webpack_require__(788); -exports.errno = errno; -const fs = __webpack_require__(789); -exports.fs = fs; -const path = __webpack_require__(790); -exports.path = path; -const pattern = __webpack_require__(791); -exports.pattern = pattern; -const stream = __webpack_require__(799); -exports.stream = stream; -const string = __webpack_require__(800); -exports.string = string; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.string = exports.stream = exports.pattern = exports.path = exports.fs = exports.errno = exports.array = void 0; +const array = __webpack_require__(781); +exports.array = array; +const errno = __webpack_require__(782); +exports.errno = errno; +const fs = __webpack_require__(783); +exports.fs = fs; +const path = __webpack_require__(784); +exports.path = path; +const pattern = __webpack_require__(785); +exports.pattern = pattern; +const stream = __webpack_require__(793); +exports.stream = stream; +const string = __webpack_require__(794); +exports.string = string; /***/ }), -/* 787 */ +/* 781 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.splitWhen = exports.flatten = void 0; -function flatten(items) { - return items.reduce((collection, item) => [].concat(collection, item), []); -} -exports.flatten = flatten; -function splitWhen(items, predicate) { - const result = [[]]; - let groupIndex = 0; - for (const item of items) { - if (predicate(item)) { - groupIndex++; - result[groupIndex] = []; - } - else { - result[groupIndex].push(item); - } - } - return result; -} -exports.splitWhen = splitWhen; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.splitWhen = exports.flatten = void 0; +function flatten(items) { + return items.reduce((collection, item) => [].concat(collection, item), []); +} +exports.flatten = flatten; +function splitWhen(items, predicate) { + const result = [[]]; + let groupIndex = 0; + for (const item of items) { + if (predicate(item)) { + groupIndex++; + result[groupIndex] = []; + } + else { + result[groupIndex].push(item); + } + } + return result; +} +exports.splitWhen = splitWhen; /***/ }), -/* 788 */ +/* 782 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEnoentCodeError = void 0; -function isEnoentCodeError(error) { - return error.code === 'ENOENT'; -} -exports.isEnoentCodeError = isEnoentCodeError; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isEnoentCodeError = void 0; +function isEnoentCodeError(error) { + return error.code === 'ENOENT'; +} +exports.isEnoentCodeError = isEnoentCodeError; /***/ }), -/* 789 */ +/* 783 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createDirentFromStats = void 0; -class DirentFromStats { - constructor(name, stats) { - this.name = name; - this.isBlockDevice = stats.isBlockDevice.bind(stats); - this.isCharacterDevice = stats.isCharacterDevice.bind(stats); - this.isDirectory = stats.isDirectory.bind(stats); - this.isFIFO = stats.isFIFO.bind(stats); - this.isFile = stats.isFile.bind(stats); - this.isSocket = stats.isSocket.bind(stats); - this.isSymbolicLink = stats.isSymbolicLink.bind(stats); - } -} -function createDirentFromStats(name, stats) { - return new DirentFromStats(name, stats); -} -exports.createDirentFromStats = createDirentFromStats; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createDirentFromStats = void 0; +class DirentFromStats { + constructor(name, stats) { + this.name = name; + this.isBlockDevice = stats.isBlockDevice.bind(stats); + this.isCharacterDevice = stats.isCharacterDevice.bind(stats); + this.isDirectory = stats.isDirectory.bind(stats); + this.isFIFO = stats.isFIFO.bind(stats); + this.isFile = stats.isFile.bind(stats); + this.isSocket = stats.isSocket.bind(stats); + this.isSymbolicLink = stats.isSymbolicLink.bind(stats); + } +} +function createDirentFromStats(name, stats) { + return new DirentFromStats(name, stats); +} +exports.createDirentFromStats = createDirentFromStats; /***/ }), -/* 790 */ +/* 784 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.removeLeadingDotSegment = exports.escape = exports.makeAbsolute = exports.unixify = void 0; -const path = __webpack_require__(4); -const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ -const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; -/** - * Designed to work only with simple paths: `dir\\file`. - */ -function unixify(filepath) { - return filepath.replace(/\\/g, '/'); -} -exports.unixify = unixify; -function makeAbsolute(cwd, filepath) { - return path.resolve(cwd, filepath); -} -exports.makeAbsolute = makeAbsolute; -function escape(pattern) { - return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); -} -exports.escape = escape; -function removeLeadingDotSegment(entry) { - // We do not use `startsWith` because this is 10x slower than current implementation for some cases. - // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with - if (entry.charAt(0) === '.') { - const secondCharactery = entry.charAt(1); - if (secondCharactery === '/' || secondCharactery === '\\') { - return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); - } - } - return entry; -} -exports.removeLeadingDotSegment = removeLeadingDotSegment; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.removeLeadingDotSegment = exports.escape = exports.makeAbsolute = exports.unixify = void 0; +const path = __webpack_require__(4); +const LEADING_DOT_SEGMENT_CHARACTERS_COUNT = 2; // ./ or .\\ +const UNESCAPED_GLOB_SYMBOLS_RE = /(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g; +/** + * Designed to work only with simple paths: `dir\\file`. + */ +function unixify(filepath) { + return filepath.replace(/\\/g, '/'); +} +exports.unixify = unixify; +function makeAbsolute(cwd, filepath) { + return path.resolve(cwd, filepath); +} +exports.makeAbsolute = makeAbsolute; +function escape(pattern) { + return pattern.replace(UNESCAPED_GLOB_SYMBOLS_RE, '\\$2'); +} +exports.escape = escape; +function removeLeadingDotSegment(entry) { + // We do not use `startsWith` because this is 10x slower than current implementation for some cases. + // eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with + if (entry.charAt(0) === '.') { + const secondCharactery = entry.charAt(1); + if (secondCharactery === '/' || secondCharactery === '\\') { + return entry.slice(LEADING_DOT_SEGMENT_CHARACTERS_COUNT); + } + } + return entry; +} +exports.removeLeadingDotSegment = removeLeadingDotSegment; /***/ }), -/* 791 */ +/* 785 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0; -const path = __webpack_require__(4); -const globParent = __webpack_require__(265); -const micromatch = __webpack_require__(792); -const picomatch = __webpack_require__(285); -const GLOBSTAR = '**'; -const ESCAPE_SYMBOL = '\\'; -const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; -const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[.*]/; -const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\(.*\|.*\)/; -const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; -const BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\.\.).*}/; -function isStaticPattern(pattern, options = {}) { - return !isDynamicPattern(pattern, options); -} -exports.isStaticPattern = isStaticPattern; -function isDynamicPattern(pattern, options = {}) { - /** - * A special case with an empty string is necessary for matching patterns that start with a forward slash. - * An empty string cannot be a dynamic pattern. - * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'. - */ - if (pattern === '') { - return false; - } - /** - * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check - * filepath directly (without read directory). - */ - if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { - return true; - } - if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { - return true; - } - if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) { - return true; - } - return false; -} -exports.isDynamicPattern = isDynamicPattern; -function convertToPositivePattern(pattern) { - return isNegativePattern(pattern) ? pattern.slice(1) : pattern; -} -exports.convertToPositivePattern = convertToPositivePattern; -function convertToNegativePattern(pattern) { - return '!' + pattern; -} -exports.convertToNegativePattern = convertToNegativePattern; -function isNegativePattern(pattern) { - return pattern.startsWith('!') && pattern[1] !== '('; -} -exports.isNegativePattern = isNegativePattern; -function isPositivePattern(pattern) { - return !isNegativePattern(pattern); -} -exports.isPositivePattern = isPositivePattern; -function getNegativePatterns(patterns) { - return patterns.filter(isNegativePattern); -} -exports.getNegativePatterns = getNegativePatterns; -function getPositivePatterns(patterns) { - return patterns.filter(isPositivePattern); -} -exports.getPositivePatterns = getPositivePatterns; -function getBaseDirectory(pattern) { - return globParent(pattern, { flipBackslashes: false }); -} -exports.getBaseDirectory = getBaseDirectory; -function hasGlobStar(pattern) { - return pattern.includes(GLOBSTAR); -} -exports.hasGlobStar = hasGlobStar; -function endsWithSlashGlobStar(pattern) { - return pattern.endsWith('/' + GLOBSTAR); -} -exports.endsWithSlashGlobStar = endsWithSlashGlobStar; -function isAffectDepthOfReadingPattern(pattern) { - const basename = path.basename(pattern); - return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); -} -exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; -function expandPatternsWithBraceExpansion(patterns) { - return patterns.reduce((collection, pattern) => { - return collection.concat(expandBraceExpansion(pattern)); - }, []); -} -exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; -function expandBraceExpansion(pattern) { - return micromatch.braces(pattern, { - expand: true, - nodupes: true - }); -} -exports.expandBraceExpansion = expandBraceExpansion; -function getPatternParts(pattern, options) { - let { parts } = picomatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); - /** - * The scan method returns an empty array in some cases. - * See micromatch/picomatch#58 for more details. - */ - if (parts.length === 0) { - parts = [pattern]; - } - /** - * The scan method does not return an empty part for the pattern with a forward slash. - * This is another part of micromatch/picomatch#58. - */ - if (parts[0].startsWith('/')) { - parts[0] = parts[0].slice(1); - parts.unshift(''); - } - return parts; -} -exports.getPatternParts = getPatternParts; -function makeRe(pattern, options) { - return micromatch.makeRe(pattern, options); -} -exports.makeRe = makeRe; -function convertPatternsToRe(patterns, options) { - return patterns.map((pattern) => makeRe(pattern, options)); -} -exports.convertPatternsToRe = convertPatternsToRe; -function matchAny(entry, patternsRe) { - return patternsRe.some((patternRe) => patternRe.test(entry)); -} -exports.matchAny = matchAny; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.matchAny = exports.convertPatternsToRe = exports.makeRe = exports.getPatternParts = exports.expandBraceExpansion = exports.expandPatternsWithBraceExpansion = exports.isAffectDepthOfReadingPattern = exports.endsWithSlashGlobStar = exports.hasGlobStar = exports.getBaseDirectory = exports.isPatternRelatedToParentDirectory = exports.getPatternsOutsideCurrentDirectory = exports.getPatternsInsideCurrentDirectory = exports.getPositivePatterns = exports.getNegativePatterns = exports.isPositivePattern = exports.isNegativePattern = exports.convertToNegativePattern = exports.convertToPositivePattern = exports.isDynamicPattern = exports.isStaticPattern = void 0; +const path = __webpack_require__(4); +const globParent = __webpack_require__(265); +const micromatch = __webpack_require__(786); +const GLOBSTAR = '**'; +const ESCAPE_SYMBOL = '\\'; +const COMMON_GLOB_SYMBOLS_RE = /[*?]|^!/; +const REGEX_CHARACTER_CLASS_SYMBOLS_RE = /\[.*]/; +const REGEX_GROUP_SYMBOLS_RE = /(?:^|[^!*+?@])\(.*\|.*\)/; +const GLOB_EXTENSION_SYMBOLS_RE = /[!*+?@]\(.*\)/; +const BRACE_EXPANSIONS_SYMBOLS_RE = /{.*(?:,|\.\.).*}/; +function isStaticPattern(pattern, options = {}) { + return !isDynamicPattern(pattern, options); +} +exports.isStaticPattern = isStaticPattern; +function isDynamicPattern(pattern, options = {}) { + /** + * A special case with an empty string is necessary for matching patterns that start with a forward slash. + * An empty string cannot be a dynamic pattern. + * For example, the pattern `/lib/*` will be spread into parts: '', 'lib', '*'. + */ + if (pattern === '') { + return false; + } + /** + * When the `caseSensitiveMatch` option is disabled, all patterns must be marked as dynamic, because we cannot check + * filepath directly (without read directory). + */ + if (options.caseSensitiveMatch === false || pattern.includes(ESCAPE_SYMBOL)) { + return true; + } + if (COMMON_GLOB_SYMBOLS_RE.test(pattern) || REGEX_CHARACTER_CLASS_SYMBOLS_RE.test(pattern) || REGEX_GROUP_SYMBOLS_RE.test(pattern)) { + return true; + } + if (options.extglob !== false && GLOB_EXTENSION_SYMBOLS_RE.test(pattern)) { + return true; + } + if (options.braceExpansion !== false && BRACE_EXPANSIONS_SYMBOLS_RE.test(pattern)) { + return true; + } + return false; +} +exports.isDynamicPattern = isDynamicPattern; +function convertToPositivePattern(pattern) { + return isNegativePattern(pattern) ? pattern.slice(1) : pattern; +} +exports.convertToPositivePattern = convertToPositivePattern; +function convertToNegativePattern(pattern) { + return '!' + pattern; +} +exports.convertToNegativePattern = convertToNegativePattern; +function isNegativePattern(pattern) { + return pattern.startsWith('!') && pattern[1] !== '('; +} +exports.isNegativePattern = isNegativePattern; +function isPositivePattern(pattern) { + return !isNegativePattern(pattern); +} +exports.isPositivePattern = isPositivePattern; +function getNegativePatterns(patterns) { + return patterns.filter(isNegativePattern); +} +exports.getNegativePatterns = getNegativePatterns; +function getPositivePatterns(patterns) { + return patterns.filter(isPositivePattern); +} +exports.getPositivePatterns = getPositivePatterns; +/** + * Returns patterns that can be applied inside the current directory. + * + * @example + * // ['./*', '*', 'a/*'] + * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) + */ +function getPatternsInsideCurrentDirectory(patterns) { + return patterns.filter((pattern) => !isPatternRelatedToParentDirectory(pattern)); +} +exports.getPatternsInsideCurrentDirectory = getPatternsInsideCurrentDirectory; +/** + * Returns patterns to be expanded relative to (outside) the current directory. + * + * @example + * // ['../*', './../*'] + * getPatternsInsideCurrentDirectory(['./*', '*', 'a/*', '../*', './../*']) + */ +function getPatternsOutsideCurrentDirectory(patterns) { + return patterns.filter(isPatternRelatedToParentDirectory); +} +exports.getPatternsOutsideCurrentDirectory = getPatternsOutsideCurrentDirectory; +function isPatternRelatedToParentDirectory(pattern) { + return pattern.startsWith('..') || pattern.startsWith('./..'); +} +exports.isPatternRelatedToParentDirectory = isPatternRelatedToParentDirectory; +function getBaseDirectory(pattern) { + return globParent(pattern, { flipBackslashes: false }); +} +exports.getBaseDirectory = getBaseDirectory; +function hasGlobStar(pattern) { + return pattern.includes(GLOBSTAR); +} +exports.hasGlobStar = hasGlobStar; +function endsWithSlashGlobStar(pattern) { + return pattern.endsWith('/' + GLOBSTAR); +} +exports.endsWithSlashGlobStar = endsWithSlashGlobStar; +function isAffectDepthOfReadingPattern(pattern) { + const basename = path.basename(pattern); + return endsWithSlashGlobStar(pattern) || isStaticPattern(basename); +} +exports.isAffectDepthOfReadingPattern = isAffectDepthOfReadingPattern; +function expandPatternsWithBraceExpansion(patterns) { + return patterns.reduce((collection, pattern) => { + return collection.concat(expandBraceExpansion(pattern)); + }, []); +} +exports.expandPatternsWithBraceExpansion = expandPatternsWithBraceExpansion; +function expandBraceExpansion(pattern) { + return micromatch.braces(pattern, { + expand: true, + nodupes: true + }); +} +exports.expandBraceExpansion = expandBraceExpansion; +function getPatternParts(pattern, options) { + let { parts } = micromatch.scan(pattern, Object.assign(Object.assign({}, options), { parts: true })); + /** + * The scan method returns an empty array in some cases. + * See micromatch/picomatch#58 for more details. + */ + if (parts.length === 0) { + parts = [pattern]; + } + /** + * The scan method does not return an empty part for the pattern with a forward slash. + * This is another part of micromatch/picomatch#58. + */ + if (parts[0].startsWith('/')) { + parts[0] = parts[0].slice(1); + parts.unshift(''); + } + return parts; +} +exports.getPatternParts = getPatternParts; +function makeRe(pattern, options) { + return micromatch.makeRe(pattern, options); +} +exports.makeRe = makeRe; +function convertPatternsToRe(patterns, options) { + return patterns.map((pattern) => makeRe(pattern, options)); +} +exports.convertPatternsToRe = convertPatternsToRe; +function matchAny(entry, patternsRe) { + return patternsRe.some((patternRe) => patternRe.test(entry)); +} +exports.matchAny = matchAny; /***/ }), -/* 792 */ +/* 786 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -91381,8 +89373,8 @@ exports.matchAny = matchAny; const util = __webpack_require__(113); const braces = __webpack_require__(269); -const picomatch = __webpack_require__(793); -const utils = __webpack_require__(796); +const picomatch = __webpack_require__(787); +const utils = __webpack_require__(790); const isEmptyString = val => val === '' || val === './'; /** @@ -91847,27 +89839,27 @@ module.exports = micromatch; /***/ }), -/* 793 */ +/* 787 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -module.exports = __webpack_require__(794); +module.exports = __webpack_require__(788); /***/ }), -/* 794 */ +/* 788 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(4); -const scan = __webpack_require__(795); -const parse = __webpack_require__(798); -const utils = __webpack_require__(796); -const constants = __webpack_require__(797); +const scan = __webpack_require__(789); +const parse = __webpack_require__(792); +const utils = __webpack_require__(790); +const constants = __webpack_require__(791); const isObject = val => val && typeof val === 'object' && !Array.isArray(val); /** @@ -92206,13 +90198,13 @@ module.exports = picomatch; /***/ }), -/* 795 */ +/* 789 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const utils = __webpack_require__(796); +const utils = __webpack_require__(790); const { CHAR_ASTERISK, /* * */ CHAR_AT, /* @ */ @@ -92229,7 +90221,7 @@ const { CHAR_RIGHT_CURLY_BRACE, /* } */ CHAR_RIGHT_PARENTHESES, /* ) */ CHAR_RIGHT_SQUARE_BRACKET /* ] */ -} = __webpack_require__(797); +} = __webpack_require__(791); const isPathSeparator = code => { return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; @@ -92604,7 +90596,7 @@ module.exports = scan; /***/ }), -/* 796 */ +/* 790 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92617,7 +90609,7 @@ const { REGEX_REMOVE_BACKSLASH, REGEX_SPECIAL_CHARS, REGEX_SPECIAL_CHARS_GLOBAL -} = __webpack_require__(797); +} = __webpack_require__(791); exports.isObject = val => val !== null && typeof val === 'object' && !Array.isArray(val); exports.hasRegexChars = str => REGEX_SPECIAL_CHARS.test(str); @@ -92675,7 +90667,7 @@ exports.wrapOutput = (input, state = {}, options = {}) => { /***/ }), -/* 797 */ +/* 791 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -92861,14 +90853,14 @@ module.exports = { /***/ }), -/* 798 */ +/* 792 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const constants = __webpack_require__(797); -const utils = __webpack_require__(796); +const constants = __webpack_require__(791); +const utils = __webpack_require__(790); /** * Constants @@ -93952,712 +91944,712 @@ module.exports = parse; /***/ }), -/* 799 */ +/* 793 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.merge = void 0; -const merge2 = __webpack_require__(243); -function merge(streams) { - const mergedStream = merge2(streams); - streams.forEach((stream) => { - stream.once('error', (error) => mergedStream.emit('error', error)); - }); - mergedStream.once('close', () => propagateCloseEventToSources(streams)); - mergedStream.once('end', () => propagateCloseEventToSources(streams)); - return mergedStream; -} -exports.merge = merge; -function propagateCloseEventToSources(streams) { - streams.forEach((stream) => stream.emit('close')); -} + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.merge = void 0; +const merge2 = __webpack_require__(243); +function merge(streams) { + const mergedStream = merge2(streams); + streams.forEach((stream) => { + stream.once('error', (error) => mergedStream.emit('error', error)); + }); + mergedStream.once('close', () => propagateCloseEventToSources(streams)); + mergedStream.once('end', () => propagateCloseEventToSources(streams)); + return mergedStream; +} +exports.merge = merge; +function propagateCloseEventToSources(streams) { + streams.forEach((stream) => stream.emit('close')); +} /***/ }), -/* 800 */ +/* 794 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isEmpty = exports.isString = void 0; -function isString(input) { - return typeof input === 'string'; -} -exports.isString = isString; -function isEmpty(input) { - return input === ''; -} -exports.isEmpty = isEmpty; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.isEmpty = exports.isString = void 0; +function isString(input) { + return typeof input === 'string'; +} +exports.isString = isString; +function isEmpty(input) { + return input === ''; +} +exports.isEmpty = isEmpty; /***/ }), -/* 801 */ +/* 795 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(802); -const provider_1 = __webpack_require__(804); -class ProviderAsync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = []; - return new Promise((resolve, reject) => { - const stream = this.api(root, task, options); - stream.once('error', reject); - stream.on('data', (entry) => entries.push(options.transform(entry))); - stream.once('end', () => resolve(entries)); - }); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderAsync; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(796); +const provider_1 = __webpack_require__(798); +class ProviderAsync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = []; + return new Promise((resolve, reject) => { + const stream = this.api(root, task, options); + stream.once('error', reject); + stream.on('data', (entry) => entries.push(options.transform(entry))); + stream.once('end', () => resolve(entries)); + }); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderAsync; /***/ }), -/* 802 */ +/* 796 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(173); -const fsStat = __webpack_require__(295); -const fsWalk = __webpack_require__(300); -const reader_1 = __webpack_require__(803); -class ReaderStream extends reader_1.default { - constructor() { - super(...arguments); - this._walkStream = fsWalk.walkStream; - this._stat = fsStat.stat; - } - dynamic(root, options) { - return this._walkStream(root, options); - } - static(patterns, options) { - const filepaths = patterns.map(this._getFullEntryPath, this); - const stream = new stream_1.PassThrough({ objectMode: true }); - stream._write = (index, _enc, done) => { - return this._getEntry(filepaths[index], patterns[index], options) - .then((entry) => { - if (entry !== null && options.entryFilter(entry)) { - stream.push(entry); - } - if (index === filepaths.length - 1) { - stream.end(); - } - done(); - }) - .catch(done); - }; - for (let i = 0; i < filepaths.length; i++) { - stream.write(i); - } - return stream; - } - _getEntry(filepath, pattern, options) { - return this._getStat(filepath) - .then((stats) => this._makeEntry(stats, pattern)) - .catch((error) => { - if (options.errorFilter(error)) { - return null; - } - throw error; - }); - } - _getStat(filepath) { - return new Promise((resolve, reject) => { - this._stat(filepath, this._fsStatSettings, (error, stats) => { - return error === null ? resolve(stats) : reject(error); - }); - }); - } -} -exports.default = ReaderStream; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(173); +const fsStat = __webpack_require__(289); +const fsWalk = __webpack_require__(294); +const reader_1 = __webpack_require__(797); +class ReaderStream extends reader_1.default { + constructor() { + super(...arguments); + this._walkStream = fsWalk.walkStream; + this._stat = fsStat.stat; + } + dynamic(root, options) { + return this._walkStream(root, options); + } + static(patterns, options) { + const filepaths = patterns.map(this._getFullEntryPath, this); + const stream = new stream_1.PassThrough({ objectMode: true }); + stream._write = (index, _enc, done) => { + return this._getEntry(filepaths[index], patterns[index], options) + .then((entry) => { + if (entry !== null && options.entryFilter(entry)) { + stream.push(entry); + } + if (index === filepaths.length - 1) { + stream.end(); + } + done(); + }) + .catch(done); + }; + for (let i = 0; i < filepaths.length; i++) { + stream.write(i); + } + return stream; + } + _getEntry(filepath, pattern, options) { + return this._getStat(filepath) + .then((stats) => this._makeEntry(stats, pattern)) + .catch((error) => { + if (options.errorFilter(error)) { + return null; + } + throw error; + }); + } + _getStat(filepath) { + return new Promise((resolve, reject) => { + this._stat(filepath, this._fsStatSettings, (error, stats) => { + return error === null ? resolve(stats) : reject(error); + }); + }); + } +} +exports.default = ReaderStream; /***/ }), -/* 803 */ +/* 797 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const fsStat = __webpack_require__(295); -const utils = __webpack_require__(786); -class Reader { - constructor(_settings) { - this._settings = _settings; - this._fsStatSettings = new fsStat.Settings({ - followSymbolicLink: this._settings.followSymbolicLinks, - fs: this._settings.fs, - throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks - }); - } - _getFullEntryPath(filepath) { - return path.resolve(this._settings.cwd, filepath); - } - _makeEntry(stats, pattern) { - const entry = { - name: pattern, - path: pattern, - dirent: utils.fs.createDirentFromStats(pattern, stats) - }; - if (this._settings.stats) { - entry.stats = stats; - } - return entry; - } - _isFatalError(error) { - return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; - } -} -exports.default = Reader; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const fsStat = __webpack_require__(289); +const utils = __webpack_require__(780); +class Reader { + constructor(_settings) { + this._settings = _settings; + this._fsStatSettings = new fsStat.Settings({ + followSymbolicLink: this._settings.followSymbolicLinks, + fs: this._settings.fs, + throwErrorOnBrokenSymbolicLink: this._settings.followSymbolicLinks + }); + } + _getFullEntryPath(filepath) { + return path.resolve(this._settings.cwd, filepath); + } + _makeEntry(stats, pattern) { + const entry = { + name: pattern, + path: pattern, + dirent: utils.fs.createDirentFromStats(pattern, stats) + }; + if (this._settings.stats) { + entry.stats = stats; + } + return entry; + } + _isFatalError(error) { + return !utils.errno.isEnoentCodeError(error) && !this._settings.suppressErrors; + } +} +exports.default = Reader; /***/ }), -/* 804 */ +/* 798 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const path = __webpack_require__(4); -const deep_1 = __webpack_require__(805); -const entry_1 = __webpack_require__(808); -const error_1 = __webpack_require__(809); -const entry_2 = __webpack_require__(810); -class Provider { - constructor(_settings) { - this._settings = _settings; - this.errorFilter = new error_1.default(this._settings); - this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); - this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); - this.entryTransformer = new entry_2.default(this._settings); - } - _getRootDirectory(task) { - return path.resolve(this._settings.cwd, task.base); - } - _getReaderOptions(task) { - const basePath = task.base === '.' ? '' : task.base; - return { - basePath, - pathSegmentSeparator: '/', - concurrency: this._settings.concurrency, - deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), - entryFilter: this.entryFilter.getFilter(task.positive, task.negative), - errorFilter: this.errorFilter.getFilter(), - followSymbolicLinks: this._settings.followSymbolicLinks, - fs: this._settings.fs, - stats: this._settings.stats, - throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, - transform: this.entryTransformer.getTransformer() - }; - } - _getMicromatchOptions() { - return { - dot: this._settings.dot, - matchBase: this._settings.baseNameMatch, - nobrace: !this._settings.braceExpansion, - nocase: !this._settings.caseSensitiveMatch, - noext: !this._settings.extglob, - noglobstar: !this._settings.globstar, - posix: true, - strictSlashes: false - }; - } -} -exports.default = Provider; + +Object.defineProperty(exports, "__esModule", { value: true }); +const path = __webpack_require__(4); +const deep_1 = __webpack_require__(799); +const entry_1 = __webpack_require__(802); +const error_1 = __webpack_require__(803); +const entry_2 = __webpack_require__(804); +class Provider { + constructor(_settings) { + this._settings = _settings; + this.errorFilter = new error_1.default(this._settings); + this.entryFilter = new entry_1.default(this._settings, this._getMicromatchOptions()); + this.deepFilter = new deep_1.default(this._settings, this._getMicromatchOptions()); + this.entryTransformer = new entry_2.default(this._settings); + } + _getRootDirectory(task) { + return path.resolve(this._settings.cwd, task.base); + } + _getReaderOptions(task) { + const basePath = task.base === '.' ? '' : task.base; + return { + basePath, + pathSegmentSeparator: '/', + concurrency: this._settings.concurrency, + deepFilter: this.deepFilter.getFilter(basePath, task.positive, task.negative), + entryFilter: this.entryFilter.getFilter(task.positive, task.negative), + errorFilter: this.errorFilter.getFilter(), + followSymbolicLinks: this._settings.followSymbolicLinks, + fs: this._settings.fs, + stats: this._settings.stats, + throwErrorOnBrokenSymbolicLink: this._settings.throwErrorOnBrokenSymbolicLink, + transform: this.entryTransformer.getTransformer() + }; + } + _getMicromatchOptions() { + return { + dot: this._settings.dot, + matchBase: this._settings.baseNameMatch, + nobrace: !this._settings.braceExpansion, + nocase: !this._settings.caseSensitiveMatch, + noext: !this._settings.extglob, + noglobstar: !this._settings.globstar, + posix: true, + strictSlashes: false + }; + } +} +exports.default = Provider; /***/ }), -/* 805 */ +/* 799 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(786); -const partial_1 = __webpack_require__(806); -class DeepFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - } - getFilter(basePath, positive, negative) { - const matcher = this._getMatcher(positive); - const negativeRe = this._getNegativePatternsRe(negative); - return (entry) => this._filter(basePath, entry, matcher, negativeRe); - } - _getMatcher(patterns) { - return new partial_1.default(patterns, this._settings, this._micromatchOptions); - } - _getNegativePatternsRe(patterns) { - const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); - return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); - } - _filter(basePath, entry, matcher, negativeRe) { - if (this._isSkippedByDeep(basePath, entry.path)) { - return false; - } - if (this._isSkippedSymbolicLink(entry)) { - return false; - } - const filepath = utils.path.removeLeadingDotSegment(entry.path); - if (this._isSkippedByPositivePatterns(filepath, matcher)) { - return false; - } - return this._isSkippedByNegativePatterns(filepath, negativeRe); - } - _isSkippedByDeep(basePath, entryPath) { - /** - * Avoid unnecessary depth calculations when it doesn't matter. - */ - if (this._settings.deep === Infinity) { - return false; - } - return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; - } - _getEntryLevel(basePath, entryPath) { - const entryPathDepth = entryPath.split('/').length; - if (basePath === '') { - return entryPathDepth; - } - const basePathDepth = basePath.split('/').length; - return entryPathDepth - basePathDepth; - } - _isSkippedSymbolicLink(entry) { - return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); - } - _isSkippedByPositivePatterns(entryPath, matcher) { - return !this._settings.baseNameMatch && !matcher.match(entryPath); - } - _isSkippedByNegativePatterns(entryPath, patternsRe) { - return !utils.pattern.matchAny(entryPath, patternsRe); - } -} -exports.default = DeepFilter; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(780); +const partial_1 = __webpack_require__(800); +class DeepFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + } + getFilter(basePath, positive, negative) { + const matcher = this._getMatcher(positive); + const negativeRe = this._getNegativePatternsRe(negative); + return (entry) => this._filter(basePath, entry, matcher, negativeRe); + } + _getMatcher(patterns) { + return new partial_1.default(patterns, this._settings, this._micromatchOptions); + } + _getNegativePatternsRe(patterns) { + const affectDepthOfReadingPatterns = patterns.filter(utils.pattern.isAffectDepthOfReadingPattern); + return utils.pattern.convertPatternsToRe(affectDepthOfReadingPatterns, this._micromatchOptions); + } + _filter(basePath, entry, matcher, negativeRe) { + if (this._isSkippedByDeep(basePath, entry.path)) { + return false; + } + if (this._isSkippedSymbolicLink(entry)) { + return false; + } + const filepath = utils.path.removeLeadingDotSegment(entry.path); + if (this._isSkippedByPositivePatterns(filepath, matcher)) { + return false; + } + return this._isSkippedByNegativePatterns(filepath, negativeRe); + } + _isSkippedByDeep(basePath, entryPath) { + /** + * Avoid unnecessary depth calculations when it doesn't matter. + */ + if (this._settings.deep === Infinity) { + return false; + } + return this._getEntryLevel(basePath, entryPath) >= this._settings.deep; + } + _getEntryLevel(basePath, entryPath) { + const entryPathDepth = entryPath.split('/').length; + if (basePath === '') { + return entryPathDepth; + } + const basePathDepth = basePath.split('/').length; + return entryPathDepth - basePathDepth; + } + _isSkippedSymbolicLink(entry) { + return !this._settings.followSymbolicLinks && entry.dirent.isSymbolicLink(); + } + _isSkippedByPositivePatterns(entryPath, matcher) { + return !this._settings.baseNameMatch && !matcher.match(entryPath); + } + _isSkippedByNegativePatterns(entryPath, patternsRe) { + return !utils.pattern.matchAny(entryPath, patternsRe); + } +} +exports.default = DeepFilter; /***/ }), -/* 806 */ +/* 800 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const matcher_1 = __webpack_require__(807); -class PartialMatcher extends matcher_1.default { - match(filepath) { - const parts = filepath.split('/'); - const levels = parts.length; - const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); - for (const pattern of patterns) { - const section = pattern.sections[0]; - /** - * In this case, the pattern has a globstar and we must read all directories unconditionally, - * but only if the level has reached the end of the first group. - * - * fixtures/{a,b}/** - * ^ true/false ^ always true - */ - if (!pattern.complete && levels > section.length) { - return true; - } - const match = parts.every((part, index) => { - const segment = pattern.segments[index]; - if (segment.dynamic && segment.patternRe.test(part)) { - return true; - } - if (!segment.dynamic && segment.pattern === part) { - return true; - } - return false; - }); - if (match) { - return true; - } - } - return false; - } -} -exports.default = PartialMatcher; + +Object.defineProperty(exports, "__esModule", { value: true }); +const matcher_1 = __webpack_require__(801); +class PartialMatcher extends matcher_1.default { + match(filepath) { + const parts = filepath.split('/'); + const levels = parts.length; + const patterns = this._storage.filter((info) => !info.complete || info.segments.length > levels); + for (const pattern of patterns) { + const section = pattern.sections[0]; + /** + * In this case, the pattern has a globstar and we must read all directories unconditionally, + * but only if the level has reached the end of the first group. + * + * fixtures/{a,b}/** + * ^ true/false ^ always true + */ + if (!pattern.complete && levels > section.length) { + return true; + } + const match = parts.every((part, index) => { + const segment = pattern.segments[index]; + if (segment.dynamic && segment.patternRe.test(part)) { + return true; + } + if (!segment.dynamic && segment.pattern === part) { + return true; + } + return false; + }); + if (match) { + return true; + } + } + return false; + } +} +exports.default = PartialMatcher; /***/ }), -/* 807 */ +/* 801 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(786); -class Matcher { - constructor(_patterns, _settings, _micromatchOptions) { - this._patterns = _patterns; - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this._storage = []; - this._fillStorage(); - } - _fillStorage() { - /** - * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level). - * So, before expand patterns with brace expansion into separated patterns. - */ - const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns); - for (const pattern of patterns) { - const segments = this._getPatternSegments(pattern); - const sections = this._splitSegmentsIntoSections(segments); - this._storage.push({ - complete: sections.length <= 1, - pattern, - segments, - sections - }); - } - } - _getPatternSegments(pattern) { - const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); - return parts.map((part) => { - const dynamic = utils.pattern.isDynamicPattern(part, this._settings); - if (!dynamic) { - return { - dynamic: false, - pattern: part - }; - } - return { - dynamic: true, - pattern: part, - patternRe: utils.pattern.makeRe(part, this._micromatchOptions) - }; - }); - } - _splitSegmentsIntoSections(segments) { - return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); - } -} -exports.default = Matcher; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(780); +class Matcher { + constructor(_patterns, _settings, _micromatchOptions) { + this._patterns = _patterns; + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this._storage = []; + this._fillStorage(); + } + _fillStorage() { + /** + * The original pattern may include `{,*,**,a/*}`, which will lead to problems with matching (unresolved level). + * So, before expand patterns with brace expansion into separated patterns. + */ + const patterns = utils.pattern.expandPatternsWithBraceExpansion(this._patterns); + for (const pattern of patterns) { + const segments = this._getPatternSegments(pattern); + const sections = this._splitSegmentsIntoSections(segments); + this._storage.push({ + complete: sections.length <= 1, + pattern, + segments, + sections + }); + } + } + _getPatternSegments(pattern) { + const parts = utils.pattern.getPatternParts(pattern, this._micromatchOptions); + return parts.map((part) => { + const dynamic = utils.pattern.isDynamicPattern(part, this._settings); + if (!dynamic) { + return { + dynamic: false, + pattern: part + }; + } + return { + dynamic: true, + pattern: part, + patternRe: utils.pattern.makeRe(part, this._micromatchOptions) + }; + }); + } + _splitSegmentsIntoSections(segments) { + return utils.array.splitWhen(segments, (segment) => segment.dynamic && utils.pattern.hasGlobStar(segment.pattern)); + } +} +exports.default = Matcher; /***/ }), -/* 808 */ +/* 802 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(786); -class EntryFilter { - constructor(_settings, _micromatchOptions) { - this._settings = _settings; - this._micromatchOptions = _micromatchOptions; - this.index = new Map(); - } - getFilter(positive, negative) { - const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); - const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); - return (entry) => this._filter(entry, positiveRe, negativeRe); - } - _filter(entry, positiveRe, negativeRe) { - if (this._settings.unique && this._isDuplicateEntry(entry)) { - return false; - } - if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { - return false; - } - if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) { - return false; - } - const filepath = this._settings.baseNameMatch ? entry.name : entry.path; - const isMatched = this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); - if (this._settings.unique && isMatched) { - this._createIndexRecord(entry); - } - return isMatched; - } - _isDuplicateEntry(entry) { - return this.index.has(entry.path); - } - _createIndexRecord(entry) { - this.index.set(entry.path, undefined); - } - _onlyFileFilter(entry) { - return this._settings.onlyFiles && !entry.dirent.isFile(); - } - _onlyDirectoryFilter(entry) { - return this._settings.onlyDirectories && !entry.dirent.isDirectory(); - } - _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) { - if (!this._settings.absolute) { - return false; - } - const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath); - return utils.pattern.matchAny(fullpath, patternsRe); - } - _isMatchToPatterns(entryPath, patternsRe) { - const filepath = utils.path.removeLeadingDotSegment(entryPath); - return utils.pattern.matchAny(filepath, patternsRe); - } -} -exports.default = EntryFilter; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(780); +class EntryFilter { + constructor(_settings, _micromatchOptions) { + this._settings = _settings; + this._micromatchOptions = _micromatchOptions; + this.index = new Map(); + } + getFilter(positive, negative) { + const positiveRe = utils.pattern.convertPatternsToRe(positive, this._micromatchOptions); + const negativeRe = utils.pattern.convertPatternsToRe(negative, this._micromatchOptions); + return (entry) => this._filter(entry, positiveRe, negativeRe); + } + _filter(entry, positiveRe, negativeRe) { + if (this._settings.unique && this._isDuplicateEntry(entry)) { + return false; + } + if (this._onlyFileFilter(entry) || this._onlyDirectoryFilter(entry)) { + return false; + } + if (this._isSkippedByAbsoluteNegativePatterns(entry.path, negativeRe)) { + return false; + } + const filepath = this._settings.baseNameMatch ? entry.name : entry.path; + const isMatched = this._isMatchToPatterns(filepath, positiveRe) && !this._isMatchToPatterns(entry.path, negativeRe); + if (this._settings.unique && isMatched) { + this._createIndexRecord(entry); + } + return isMatched; + } + _isDuplicateEntry(entry) { + return this.index.has(entry.path); + } + _createIndexRecord(entry) { + this.index.set(entry.path, undefined); + } + _onlyFileFilter(entry) { + return this._settings.onlyFiles && !entry.dirent.isFile(); + } + _onlyDirectoryFilter(entry) { + return this._settings.onlyDirectories && !entry.dirent.isDirectory(); + } + _isSkippedByAbsoluteNegativePatterns(entryPath, patternsRe) { + if (!this._settings.absolute) { + return false; + } + const fullpath = utils.path.makeAbsolute(this._settings.cwd, entryPath); + return utils.pattern.matchAny(fullpath, patternsRe); + } + _isMatchToPatterns(entryPath, patternsRe) { + const filepath = utils.path.removeLeadingDotSegment(entryPath); + return utils.pattern.matchAny(filepath, patternsRe); + } +} +exports.default = EntryFilter; /***/ }), -/* 809 */ +/* 803 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(786); -class ErrorFilter { - constructor(_settings) { - this._settings = _settings; - } - getFilter() { - return (error) => this._isNonFatalError(error); - } - _isNonFatalError(error) { - return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; - } -} -exports.default = ErrorFilter; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(780); +class ErrorFilter { + constructor(_settings) { + this._settings = _settings; + } + getFilter() { + return (error) => this._isNonFatalError(error); + } + _isNonFatalError(error) { + return utils.errno.isEnoentCodeError(error) || this._settings.suppressErrors; + } +} +exports.default = ErrorFilter; /***/ }), -/* 810 */ +/* 804 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const utils = __webpack_require__(786); -class EntryTransformer { - constructor(_settings) { - this._settings = _settings; - } - getTransformer() { - return (entry) => this._transform(entry); - } - _transform(entry) { - let filepath = entry.path; - if (this._settings.absolute) { - filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); - filepath = utils.path.unixify(filepath); - } - if (this._settings.markDirectories && entry.dirent.isDirectory()) { - filepath += '/'; - } - if (!this._settings.objectMode) { - return filepath; - } - return Object.assign(Object.assign({}, entry), { path: filepath }); - } -} -exports.default = EntryTransformer; + +Object.defineProperty(exports, "__esModule", { value: true }); +const utils = __webpack_require__(780); +class EntryTransformer { + constructor(_settings) { + this._settings = _settings; + } + getTransformer() { + return (entry) => this._transform(entry); + } + _transform(entry) { + let filepath = entry.path; + if (this._settings.absolute) { + filepath = utils.path.makeAbsolute(this._settings.cwd, filepath); + filepath = utils.path.unixify(filepath); + } + if (this._settings.markDirectories && entry.dirent.isDirectory()) { + filepath += '/'; + } + if (!this._settings.objectMode) { + return filepath; + } + return Object.assign(Object.assign({}, entry), { path: filepath }); + } +} +exports.default = EntryTransformer; /***/ }), -/* 811 */ +/* 805 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const stream_1 = __webpack_require__(173); -const stream_2 = __webpack_require__(802); -const provider_1 = __webpack_require__(804); -class ProviderStream extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new stream_2.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const source = this.api(root, task, options); - const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); - source - .once('error', (error) => destination.emit('error', error)) - .on('data', (entry) => destination.emit('data', options.transform(entry))) - .once('end', () => destination.emit('end')); - destination - .once('close', () => source.destroy()); - return destination; - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderStream; + +Object.defineProperty(exports, "__esModule", { value: true }); +const stream_1 = __webpack_require__(173); +const stream_2 = __webpack_require__(796); +const provider_1 = __webpack_require__(798); +class ProviderStream extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new stream_2.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const source = this.api(root, task, options); + const destination = new stream_1.Readable({ objectMode: true, read: () => { } }); + source + .once('error', (error) => destination.emit('error', error)) + .on('data', (entry) => destination.emit('data', options.transform(entry))) + .once('end', () => destination.emit('end')); + destination + .once('close', () => source.destroy()); + return destination; + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderStream; /***/ }), -/* 812 */ +/* 806 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const sync_1 = __webpack_require__(813); -const provider_1 = __webpack_require__(804); -class ProviderSync extends provider_1.default { - constructor() { - super(...arguments); - this._reader = new sync_1.default(this._settings); - } - read(task) { - const root = this._getRootDirectory(task); - const options = this._getReaderOptions(task); - const entries = this.api(root, task, options); - return entries.map(options.transform); - } - api(root, task, options) { - if (task.dynamic) { - return this._reader.dynamic(root, options); - } - return this._reader.static(task.patterns, options); - } -} -exports.default = ProviderSync; + +Object.defineProperty(exports, "__esModule", { value: true }); +const sync_1 = __webpack_require__(807); +const provider_1 = __webpack_require__(798); +class ProviderSync extends provider_1.default { + constructor() { + super(...arguments); + this._reader = new sync_1.default(this._settings); + } + read(task) { + const root = this._getRootDirectory(task); + const options = this._getReaderOptions(task); + const entries = this.api(root, task, options); + return entries.map(options.transform); + } + api(root, task, options) { + if (task.dynamic) { + return this._reader.dynamic(root, options); + } + return this._reader.static(task.patterns, options); + } +} +exports.default = ProviderSync; /***/ }), -/* 813 */ +/* 807 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const fsStat = __webpack_require__(295); -const fsWalk = __webpack_require__(300); -const reader_1 = __webpack_require__(803); -class ReaderSync extends reader_1.default { - constructor() { - super(...arguments); - this._walkSync = fsWalk.walkSync; - this._statSync = fsStat.statSync; - } - dynamic(root, options) { - return this._walkSync(root, options); - } - static(patterns, options) { - const entries = []; - for (const pattern of patterns) { - const filepath = this._getFullEntryPath(pattern); - const entry = this._getEntry(filepath, pattern, options); - if (entry === null || !options.entryFilter(entry)) { - continue; - } - entries.push(entry); - } - return entries; - } - _getEntry(filepath, pattern, options) { - try { - const stats = this._getStat(filepath); - return this._makeEntry(stats, pattern); - } - catch (error) { - if (options.errorFilter(error)) { - return null; - } - throw error; - } - } - _getStat(filepath) { - return this._statSync(filepath, this._fsStatSettings); - } -} -exports.default = ReaderSync; + +Object.defineProperty(exports, "__esModule", { value: true }); +const fsStat = __webpack_require__(289); +const fsWalk = __webpack_require__(294); +const reader_1 = __webpack_require__(797); +class ReaderSync extends reader_1.default { + constructor() { + super(...arguments); + this._walkSync = fsWalk.walkSync; + this._statSync = fsStat.statSync; + } + dynamic(root, options) { + return this._walkSync(root, options); + } + static(patterns, options) { + const entries = []; + for (const pattern of patterns) { + const filepath = this._getFullEntryPath(pattern); + const entry = this._getEntry(filepath, pattern, options); + if (entry === null || !options.entryFilter(entry)) { + continue; + } + entries.push(entry); + } + return entries; + } + _getEntry(filepath, pattern, options) { + try { + const stats = this._getStat(filepath); + return this._makeEntry(stats, pattern); + } + catch (error) { + if (options.errorFilter(error)) { + return null; + } + throw error; + } + } + _getStat(filepath) { + return this._statSync(filepath, this._fsStatSettings); + } +} +exports.default = ReaderSync; /***/ }), -/* 814 */ +/* 808 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; -const fs = __webpack_require__(132); -const os = __webpack_require__(122); -/** - * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero. - * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107 - */ -const CPU_COUNT = Math.max(os.cpus().length, 1); -exports.DEFAULT_FILE_SYSTEM_ADAPTER = { - lstat: fs.lstat, - lstatSync: fs.lstatSync, - stat: fs.stat, - statSync: fs.statSync, - readdir: fs.readdir, - readdirSync: fs.readdirSync -}; -class Settings { - constructor(_options = {}) { - this._options = _options; - this.absolute = this._getValue(this._options.absolute, false); - this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); - this.braceExpansion = this._getValue(this._options.braceExpansion, true); - this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); - this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); - this.cwd = this._getValue(this._options.cwd, process.cwd()); - this.deep = this._getValue(this._options.deep, Infinity); - this.dot = this._getValue(this._options.dot, false); - this.extglob = this._getValue(this._options.extglob, true); - this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); - this.fs = this._getFileSystemMethods(this._options.fs); - this.globstar = this._getValue(this._options.globstar, true); - this.ignore = this._getValue(this._options.ignore, []); - this.markDirectories = this._getValue(this._options.markDirectories, false); - this.objectMode = this._getValue(this._options.objectMode, false); - this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); - this.onlyFiles = this._getValue(this._options.onlyFiles, true); - this.stats = this._getValue(this._options.stats, false); - this.suppressErrors = this._getValue(this._options.suppressErrors, false); - this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); - this.unique = this._getValue(this._options.unique, true); - if (this.onlyDirectories) { - this.onlyFiles = false; - } - if (this.stats) { - this.objectMode = true; - } - } - _getValue(option, value) { - return option === undefined ? value : option; - } - _getFileSystemMethods(methods = {}) { - return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); - } -} -exports.default = Settings; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.DEFAULT_FILE_SYSTEM_ADAPTER = void 0; +const fs = __webpack_require__(132); +const os = __webpack_require__(122); +/** + * The `os.cpus` method can return zero. We expect the number of cores to be greater than zero. + * https://github.com/nodejs/node/blob/7faeddf23a98c53896f8b574a6e66589e8fb1eb8/lib/os.js#L106-L107 + */ +const CPU_COUNT = Math.max(os.cpus().length, 1); +exports.DEFAULT_FILE_SYSTEM_ADAPTER = { + lstat: fs.lstat, + lstatSync: fs.lstatSync, + stat: fs.stat, + statSync: fs.statSync, + readdir: fs.readdir, + readdirSync: fs.readdirSync +}; +class Settings { + constructor(_options = {}) { + this._options = _options; + this.absolute = this._getValue(this._options.absolute, false); + this.baseNameMatch = this._getValue(this._options.baseNameMatch, false); + this.braceExpansion = this._getValue(this._options.braceExpansion, true); + this.caseSensitiveMatch = this._getValue(this._options.caseSensitiveMatch, true); + this.concurrency = this._getValue(this._options.concurrency, CPU_COUNT); + this.cwd = this._getValue(this._options.cwd, process.cwd()); + this.deep = this._getValue(this._options.deep, Infinity); + this.dot = this._getValue(this._options.dot, false); + this.extglob = this._getValue(this._options.extglob, true); + this.followSymbolicLinks = this._getValue(this._options.followSymbolicLinks, true); + this.fs = this._getFileSystemMethods(this._options.fs); + this.globstar = this._getValue(this._options.globstar, true); + this.ignore = this._getValue(this._options.ignore, []); + this.markDirectories = this._getValue(this._options.markDirectories, false); + this.objectMode = this._getValue(this._options.objectMode, false); + this.onlyDirectories = this._getValue(this._options.onlyDirectories, false); + this.onlyFiles = this._getValue(this._options.onlyFiles, true); + this.stats = this._getValue(this._options.stats, false); + this.suppressErrors = this._getValue(this._options.suppressErrors, false); + this.throwErrorOnBrokenSymbolicLink = this._getValue(this._options.throwErrorOnBrokenSymbolicLink, false); + this.unique = this._getValue(this._options.unique, true); + if (this.onlyDirectories) { + this.onlyFiles = false; + } + if (this.stats) { + this.objectMode = true; + } + } + _getValue(option, value) { + return option === undefined ? value : option; + } + _getFileSystemMethods(methods = {}) { + return Object.assign(Object.assign({}, exports.DEFAULT_FILE_SYSTEM_ADAPTER), methods); + } +} +exports.default = Settings; /***/ }), -/* 815 */ +/* 809 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -94665,9 +92657,9 @@ exports.default = Settings; const {promisify} = __webpack_require__(113); const fs = __webpack_require__(132); const path = __webpack_require__(4); -const fastGlob = __webpack_require__(784); -const gitIgnore = __webpack_require__(335); -const slash = __webpack_require__(336); +const fastGlob = __webpack_require__(778); +const gitIgnore = __webpack_require__(329); +const slash = __webpack_require__(330); const DEFAULT_IGNORE = [ '**/node_modules/**', @@ -94784,7 +92776,7 @@ module.exports.sync = options => { /***/ }), -/* 816 */ +/* 810 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -94837,7 +92829,7 @@ module.exports = { /***/ }), -/* 817 */ +/* 811 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; @@ -94845,17 +92837,17 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildNonBazelProductionProjects", function() { return buildNonBazelProductionProjects; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getProductionProjects", function() { return getProductionProjects; }); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buildProject", function() { return buildProject; }); -/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(571); +/* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(565); /* harmony import */ var cpy__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(cpy__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(240); /* harmony import */ var del__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(del__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(4); /* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(568); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(562); /* harmony import */ var _utils_fs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); /* harmony import */ var _utils_log__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); -/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(349); -/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(346); +/* harmony import */ var _utils_package_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(343); +/* harmony import */ var _utils_projects__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(340); /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License diff --git a/packages/kbn-react-field/BUILD.bazel b/packages/kbn-react-field/BUILD.bazel index d7645d86dbd1a7..5165ca2fc90fca 100644 --- a/packages/kbn-react-field/BUILD.bazel +++ b/packages/kbn-react-field/BUILD.bazel @@ -49,7 +49,6 @@ TYPES_DEPS = [ "@npm//@types/classnames", "@npm//@types/react", "@npm//@elastic/eui", - "@npm//resize-observer-polyfill", ] jsts_transpiler( diff --git a/packages/kbn-react-field/tsconfig.json b/packages/kbn-react-field/tsconfig.json index 90c8a63c746f10..4d37e1825c85a5 100644 --- a/packages/kbn-react-field/tsconfig.json +++ b/packages/kbn-react-field/tsconfig.json @@ -10,7 +10,6 @@ "types": [ "jest", "node", - "resize-observer-polyfill" ] }, "include": [ diff --git a/packages/kbn-securitysolution-autocomplete/BUILD.bazel b/packages/kbn-securitysolution-autocomplete/BUILD.bazel index ac90a0479ce2ab..57ac8c62273e0b 100644 --- a/packages/kbn-securitysolution-autocomplete/BUILD.bazel +++ b/packages/kbn-securitysolution-autocomplete/BUILD.bazel @@ -42,7 +42,6 @@ RUNTIME_DEPS = [ "@npm//enzyme", "@npm//moment", "@npm//react", - "@npm//resize-observer-polyfill", ] TYPES_DEPS = [ @@ -55,7 +54,6 @@ TYPES_DEPS = [ "@npm//@testing-library/react", "@npm//@testing-library/react-hooks", "@npm//moment", - "@npm//resize-observer-polyfill", "@npm//@types/enzyme", "@npm//@types/jest", "@npm//@types/node", diff --git a/packages/kbn-securitysolution-autocomplete/tsconfig.json b/packages/kbn-securitysolution-autocomplete/tsconfig.json index fa7eff82340115..b2e24676cdbd41 100644 --- a/packages/kbn-securitysolution-autocomplete/tsconfig.json +++ b/packages/kbn-securitysolution-autocomplete/tsconfig.json @@ -8,7 +8,7 @@ "sourceMap": true, "sourceRoot": "../../../../packages/kbn-securitysolution-autocomplete/src", "rootDir": "src", - "types": ["jest", "node", "resize-observer-polyfill"] + "types": ["jest", "node"] }, "include": ["src/**/*"], } diff --git a/packages/kbn-storybook/src/webpack.config.ts b/packages/kbn-storybook/src/webpack.config.ts index 53f9c82b868159..94b1a347287797 100644 --- a/packages/kbn-storybook/src/webpack.config.ts +++ b/packages/kbn-storybook/src/webpack.config.ts @@ -32,9 +32,11 @@ function isHtmlPlugin(plugin: any): plugin is { options: { template: string } } return !!(typeof plugin.options?.template === 'string'); } -function isBabelLoaderRule(rule: webpack.RuleSetRule): rule is webpack.RuleSetRule & { +interface BabelLoaderRule extends webpack.RuleSetRule { use: webpack.RuleSetLoader[]; -} { +} + +function isBabelLoaderRule(rule: webpack.RuleSetRule): rule is BabelLoaderRule { return !!( rule.use && Array.isArray(rule.use) && diff --git a/packages/kbn-test/src/jest/run.ts b/packages/kbn-test/src/jest/run.ts index 697402adf3dd15..26fa12497357c6 100644 --- a/packages/kbn-test/src/jest/run.ts +++ b/packages/kbn-test/src/jest/run.ts @@ -36,8 +36,7 @@ declare global { interface Global {} interface InspectOptions {} - interface ConsoleConstructor - extends console.ConsoleConstructor {} + interface ConsoleConstructor extends console.ConsoleConstructor {} } } /* eslint-enable */ @@ -59,7 +58,7 @@ export function runJest(configName = 'jest.config.js') { const cwd: string = process.env.INIT_CWD || process.cwd(); if (!argv.config) { - testFiles = argv._.splice(2).map((p) => resolve(cwd, p)); + testFiles = argv._.splice(2).map((p) => resolve(cwd, p.toString())); const commonTestFiles = commonBasePath(testFiles); const testFilesProvided = testFiles.length > 0; diff --git a/packages/kbn-typed-react-router-config/BUILD.bazel b/packages/kbn-typed-react-router-config/BUILD.bazel index 7fccc53bd7449e..b347915ae33103 100644 --- a/packages/kbn-typed-react-router-config/BUILD.bazel +++ b/packages/kbn-typed-react-router-config/BUILD.bazel @@ -41,6 +41,7 @@ TYPES_DEPS = [ "@npm//query-string", "@npm//utility-types", "@npm//@types/jest", + "@npm//@types/history", "@npm//@types/node", "@npm//@types/react-router-config", "@npm//@types/react-router-dom", diff --git a/packages/kbn-typed-react-router-config/src/create_router.test.tsx b/packages/kbn-typed-react-router-config/src/create_router.test.tsx index ac337f8bb5b877..e82fcf791804e3 100644 --- a/packages/kbn-typed-react-router-config/src/create_router.test.tsx +++ b/packages/kbn-typed-react-router-config/src/create_router.test.tsx @@ -267,6 +267,7 @@ describe('createRouter', () => { const matches = router.matchRoutes('/', history.location); + // @ts-expect-error 4.3.5 upgrade - router doesn't seem able to merge properly when two routes match expect(matches[1]?.match.params).toEqual({ query: { rangeFrom: 'now-30m', @@ -285,6 +286,7 @@ describe('createRouter', () => { expect(matchedRoutes.length).toEqual(4); + // @ts-expect-error 4.3.5 upgrade - router doesn't seem able to merge properly when two routes match expect(matchedRoutes[matchedRoutes.length - 1].match).toEqual({ isExact: true, params: { diff --git a/packages/kbn-typed-react-router-config/src/create_router.ts b/packages/kbn-typed-react-router-config/src/create_router.ts index 89ff4fc6b0c6cf..186f949d9c8e8d 100644 --- a/packages/kbn-typed-react-router-config/src/create_router.ts +++ b/packages/kbn-typed-react-router-config/src/create_router.ts @@ -23,7 +23,7 @@ function toReactRouterPath(path: string) { return path.replace(/(?:{([^\/]+)})/g, ':$1'); } -export function createRouter(routes: TRoutes): Router { +export function createRouter(routes: TRoute[]): Router { const routesByReactRouterConfig = new Map(); const reactRouterConfigsByRoute = new Map(); @@ -181,10 +181,8 @@ export function createRouter(routes: TRoutes): Router { - return link(path, ...args); - }, + const router = { + link, getParams: (...args: any[]) => { const matches = matchRoutes(...args); return matches.length @@ -197,11 +195,13 @@ export function createRouter(routes: TRoutes): Router { return matchRoutes(...args) as any; }, - getRoutePath: (route) => { + getRoutePath: (route: Route) => { return reactRouterConfigsByRoute.get(route)!.path as string; }, getRoutesToMatch: (path: string) => { - return getRoutesToMatch(path) as unknown as FlattenRoutesOf; + return getRoutesToMatch(path) as unknown as FlattenRoutesOf; }, }; + + return router; } diff --git a/packages/kbn-typed-react-router-config/src/types/index.ts b/packages/kbn-typed-react-router-config/src/types/index.ts index c1ae5afd816ee3..3c09b60054a0c4 100644 --- a/packages/kbn-typed-react-router-config/src/types/index.ts +++ b/packages/kbn-typed-react-router-config/src/types/index.ts @@ -115,7 +115,7 @@ export interface RouteMatch { params: t.Type; } ? t.TypeOf - : {}; + : AnyObj; }; } @@ -160,10 +160,11 @@ interface ReadonlyPlainRoute { } export type Route = PlainRoute | ReadonlyPlainRoute; +type AnyObj = Record; interface DefaultOutput { - path: {}; - query: {}; + path: AnyObj; + query: AnyObj; } type OutputOfRouteMatch = TRouteMatch extends { @@ -190,20 +191,21 @@ type TypeOfRouteMatch = TRouteMatch extends { route: { params: t.Type }; } ? t.TypeOf - : {}; + : AnyObj; type TypeOfMatches = TRouteMatches extends [RouteMatch] ? TypeOfRouteMatch : TRouteMatches extends [RouteMatch, ...infer TNextRouteMatches] ? TypeOfRouteMatch & - (TNextRouteMatches extends RouteMatch[] ? TypeOfMatches : {}) - : {}; + (TNextRouteMatches extends RouteMatch[] ? TypeOfMatches : AnyObj) + : AnyObj; export type TypeOf< TRoutes extends Route[], TPath extends PathsOf, TWithDefaultOutput extends boolean = true -> = TypeOfMatches> & (TWithDefaultOutput extends true ? DefaultOutput : {}); +> = TypeOfMatches> & + (TWithDefaultOutput extends true ? DefaultOutput : AnyObj); export type TypeAsArgs = keyof TObject extends never ? [] @@ -276,7 +278,7 @@ type MapRoute = MaybeUnion< >; } > - : {} + : AnyObj >; type MapRoutes = TRoutes extends [Route] @@ -341,7 +343,7 @@ type MapRoutes = TRoutes extends [Route] MapRoute & MapRoute & MapRoute - : {}; + : AnyObj; // const element = null as any; diff --git a/packages/kbn-ui-shared-deps-npm/BUILD.bazel b/packages/kbn-ui-shared-deps-npm/BUILD.bazel index b75315120e90db..2beedafd699fdf 100644 --- a/packages/kbn-ui-shared-deps-npm/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-npm/BUILD.bazel @@ -53,7 +53,6 @@ RUNTIME_DEPS = [ "@npm//react-router", "@npm//react", "@npm//regenerator-runtime", - "@npm//resize-observer-polyfill", "@npm//rison-node", "@npm//rxjs", "@npm//styled-components", @@ -90,7 +89,6 @@ TYPES_DEPS = [ "@npm//react-router", "@npm//react-router-dom", "@npm//regenerator-runtime", - "@npm//resize-observer-polyfill", "@npm//rison-node", "@npm//rxjs", "@npm//styled-components", diff --git a/packages/kbn-ui-shared-deps-npm/tsconfig.json b/packages/kbn-ui-shared-deps-npm/tsconfig.json index be9a9462f76d80..107d82aa59ee8c 100644 --- a/packages/kbn-ui-shared-deps-npm/tsconfig.json +++ b/packages/kbn-ui-shared-deps-npm/tsconfig.json @@ -11,7 +11,6 @@ "sourceRoot": "../../../../packages/kbn-ui-shared-deps-npm/src", "types": [ "node", - "resize-observer-polyfill" ] }, "include": [ diff --git a/packages/kbn-ui-shared-deps-src/tsconfig.json b/packages/kbn-ui-shared-deps-src/tsconfig.json index bfee34694748d8..521fb122e4659d 100644 --- a/packages/kbn-ui-shared-deps-src/tsconfig.json +++ b/packages/kbn-ui-shared-deps-src/tsconfig.json @@ -11,7 +11,6 @@ "sourceRoot": "../../../../packages/kbn-ui-shared-deps-src/src", "types": [ "node", - "resize-observer-polyfill" ] }, "include": [ diff --git a/src/core/public/application/scoped_history.ts b/src/core/public/application/scoped_history.ts index 2ab60e66b860fa..284465c8f305bf 100644 --- a/src/core/public/application/scoped_history.ts +++ b/src/core/public/application/scoped_history.ts @@ -57,7 +57,10 @@ export class ScopedHistory */ private blockUnregisterCallbacks: Set = new Set(); - constructor(private readonly parentHistory: History, private readonly basePath: string) { + constructor( + private readonly parentHistory: History, + private readonly basePath: string + ) { const parentPath = this.parentHistory.location.pathname; if (!parentPath.startsWith(basePath)) { throw new Error( @@ -75,10 +78,8 @@ export class ScopedHistory * * @param basePath the URL path scope for the sub history */ - public createSubHistory = ( - basePath: string - ): ScopedHistory => { - return new ScopedHistory(this, basePath); + public createSubHistory = (basePath: string) => { + return new ScopedHistory(this, basePath); }; /** diff --git a/src/core/public/chrome/chrome_service.tsx b/src/core/public/chrome/chrome_service.tsx index ceb65827cd9a48..1a2f9d4296f8a4 100644 --- a/src/core/public/chrome/chrome_service.tsx +++ b/src/core/public/chrome/chrome_service.tsx @@ -43,7 +43,7 @@ interface ConstructorParams { kibanaVersion: string; } -interface StartDeps { +export interface StartDeps { application: InternalApplicationStart; docLinks: DocLinksStart; http: HttpStart; diff --git a/src/core/public/core_app/core_app.ts b/src/core/public/core_app/core_app.ts index 00532b9150aefd..648677e67e1cf7 100644 --- a/src/core/public/core_app/core_app.ts +++ b/src/core/public/core_app/core_app.ts @@ -26,14 +26,14 @@ import { import { renderApp as renderStatusApp } from './status'; import { DocLinksStart } from '../doc_links'; -interface SetupDeps { +export interface SetupDeps { application: InternalApplicationSetup; http: HttpSetup; injectedMetadata: InjectedMetadataSetup; notifications: NotificationsSetup; } -interface StartDeps { +export interface StartDeps { application: InternalApplicationStart; docLinks: DocLinksStart; http: HttpStart; diff --git a/src/core/public/doc_links/doc_links_service.ts b/src/core/public/doc_links/doc_links_service.ts index f99f621a52c83a..24c085ef64de35 100644 --- a/src/core/public/doc_links/doc_links_service.ts +++ b/src/core/public/doc_links/doc_links_service.ts @@ -9,7 +9,7 @@ import { deepFreeze } from '@kbn/std'; import { InjectedMetadataSetup } from '../injected_metadata'; -interface StartDeps { +export interface StartDeps { injectedMetadata: InjectedMetadataSetup; } diff --git a/src/core/public/fatal_errors/fatal_errors_service.tsx b/src/core/public/fatal_errors/fatal_errors_service.tsx index 975c0160d83b2d..262ee9e702f408 100644 --- a/src/core/public/fatal_errors/fatal_errors_service.tsx +++ b/src/core/public/fatal_errors/fatal_errors_service.tsx @@ -16,7 +16,7 @@ import { InjectedMetadataSetup } from '../injected_metadata'; import { FatalErrorsScreen } from './fatal_errors_screen'; import { FatalErrorInfo, getErrorInfo } from './get_error_info'; -interface Deps { +export interface Deps { i18n: I18nStart; injectedMetadata: InjectedMetadataSetup; } diff --git a/src/core/public/integrations/integrations_service.ts b/src/core/public/integrations/integrations_service.ts index d6f2b8c5fb2f70..7c522050224405 100644 --- a/src/core/public/integrations/integrations_service.ts +++ b/src/core/public/integrations/integrations_service.ts @@ -12,7 +12,7 @@ import { CoreService } from '../../types'; import { MomentService } from './moment'; import { StylesService } from './styles'; -interface Deps { +export interface Deps { uiSettings: IUiSettingsClient; } diff --git a/src/core/public/notifications/notifications_service.ts b/src/core/public/notifications/notifications_service.ts index 383fa2d1914cc7..d31909a19ff75d 100644 --- a/src/core/public/notifications/notifications_service.ts +++ b/src/core/public/notifications/notifications_service.ts @@ -15,11 +15,11 @@ import { ToastsService, ToastsSetup, ToastsStart } from './toasts'; import { IUiSettingsClient } from '../ui_settings'; import { OverlayStart } from '../overlays'; -interface SetupDeps { +export interface SetupDeps { uiSettings: IUiSettingsClient; } -interface StartDeps { +export interface StartDeps { i18n: I18nStart; overlays: OverlayStart; theme: ThemeServiceStart; diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md index 9bb65a9dd0b573..30225acb3dd8da 100644 --- a/src/core/public/public.api.md +++ b/src/core/public/public.api.md @@ -42,6 +42,7 @@ import { Request as Request_2 } from '@hapi/hapi'; import * as Rx from 'rxjs'; import { SchemaTypeError } from '@kbn/config-schema'; import type { ThemeVersion } from '@kbn/ui-shared-deps-npm'; +import { TransitionPromptHook } from 'history'; import type { TransportRequestOptions } from '@elastic/elasticsearch'; import type { TransportRequestParams } from '@elastic/elasticsearch'; import type { TransportResult } from '@elastic/elasticsearch'; @@ -1680,13 +1681,13 @@ export interface SavedObjectsUpdateOptions { // @public export class ScopedHistory implements History_2 { - constructor(parentHistory: History_2, basePath: string); + constructor(parentHistory: History_2, basePath: string); get action(): Action; - block: (prompt?: string | boolean | History_2.TransitionPromptHook | undefined) => UnregisterCallback; + block: (prompt?: string | boolean | TransitionPromptHook | undefined) => UnregisterCallback; createHref: (location: LocationDescriptorObject, { prependBasePath }?: { prependBasePath?: boolean | undefined; }) => Href; - createSubHistory: (basePath: string) => ScopedHistory; + createSubHistory: (basePath: string) => ScopedHistory; go: (n: number) => void; goBack: () => void; goForward: () => void; diff --git a/src/core/public/rendering/rendering_service.tsx b/src/core/public/rendering/rendering_service.tsx index 7c84146d1aa866..92c0f2a9b7fca7 100644 --- a/src/core/public/rendering/rendering_service.tsx +++ b/src/core/public/rendering/rendering_service.tsx @@ -18,7 +18,7 @@ import type { I18nStart } from '../i18n'; import { CoreContextProvider } from '../utils'; import { AppWrapper } from './app_containers'; -interface StartDeps { +export interface StartDeps { application: InternalApplicationStart; chrome: InternalChromeStart; overlays: OverlayStart; diff --git a/src/core/public/theme/theme_service.ts b/src/core/public/theme/theme_service.ts index fc67ac4a595eb6..bdb00ee4fdce9e 100644 --- a/src/core/public/theme/theme_service.ts +++ b/src/core/public/theme/theme_service.ts @@ -11,7 +11,7 @@ import { shareReplay, takeUntil } from 'rxjs/operators'; import { InjectedMetadataSetup } from '../injected_metadata'; import type { CoreTheme, ThemeServiceSetup, ThemeServiceStart } from './types'; -interface SetupDeps { +export interface SetupDeps { injectedMetadata: InjectedMetadataSetup; } diff --git a/src/core/public/ui_settings/ui_settings_service.ts b/src/core/public/ui_settings/ui_settings_service.ts index 6bbbed9a1ca60c..1a3f275aa31ede 100644 --- a/src/core/public/ui_settings/ui_settings_service.ts +++ b/src/core/public/ui_settings/ui_settings_service.ts @@ -15,7 +15,7 @@ import { UiSettingsApi } from './ui_settings_api'; import { UiSettingsClient } from './ui_settings_client'; import { IUiSettingsClient } from './types'; -interface UiSettingsServiceDeps { +export interface UiSettingsServiceDeps { http: HttpSetup; injectedMetadata: InjectedMetadataSetup; } diff --git a/src/core/server/context/container/context.mock.ts b/src/core/server/context/container/context.mock.ts index 9996d609fc074c..c8fcea83eae457 100644 --- a/src/core/server/context/container/context.mock.ts +++ b/src/core/server/context/container/context.mock.ts @@ -12,7 +12,6 @@ export type ContextContainerMock = jest.Mocked; const createContextMock = (mockContext: any = {}) => { const contextMock: ContextContainerMock = { - // @ts-expect-error since ContextContainerMock cannot infer ContextName and fallsback to never registerContext: jest.fn(), createHandler: jest.fn(), }; diff --git a/src/core/server/context/context_service.ts b/src/core/server/context/context_service.ts index 9e77786c1562cb..b2948a4d59129b 100644 --- a/src/core/server/context/context_service.ts +++ b/src/core/server/context/context_service.ts @@ -12,7 +12,7 @@ import { CoreContext } from '../core_context'; type PrebootDeps = SetupDeps; -interface SetupDeps { +export interface SetupDeps { pluginDependencies: ReadonlyMap; } diff --git a/src/core/server/http/http_service.mock.ts b/src/core/server/http/http_service.mock.ts index 894ff38e12a352..1b6aa2de3c1925 100644 --- a/src/core/server/http/http_service.mock.ts +++ b/src/core/server/http/http_service.mock.ts @@ -81,7 +81,6 @@ const createAuthMock = () => { const createInternalPrebootContractMock = () => { const mock: InternalHttpServicePrebootMock = { registerRoutes: jest.fn(), - // @ts-expect-error tsc cannot infer ContextName and uses never registerRouteHandlerContext: jest.fn(), registerStaticDir: jest.fn(), basePath: createBasePathMock(), @@ -89,6 +88,15 @@ const createInternalPrebootContractMock = () => { externalUrl: ExternalUrlConfig.DEFAULT, auth: createAuthMock(), getServerInfo: jest.fn(), + server: { + name: 'http-preboot-server-test', + version: 'kibana', + route: jest.fn(), + start: jest.fn(), + stop: jest.fn(), + config: jest.fn().mockReturnValue(configMock.create()), + // @ts-expect-error somehow it thinks that `Server` isn't a `Construtable` + } as unknown as jest.MockedClass, }; return mock; }; @@ -122,7 +130,6 @@ const createInternalSetupContractMock = () => { registerOnPreAuth: jest.fn(), registerAuth: jest.fn(), registerOnPostAuth: jest.fn(), - // @ts-expect-error tsc cannot infer ContextName and uses never registerRouteHandlerContext: jest.fn(), registerOnPreResponse: jest.fn(), createRouter: jest.fn().mockImplementation(() => mockRouter.create({})), @@ -134,6 +141,7 @@ const createInternalSetupContractMock = () => { getAuthHeaders: jest.fn(), getServerInfo: jest.fn(), registerPrebootRoutes: jest.fn(), + registerRouterAfterListening: jest.fn(), }; mock.createCookieSessionStorageFactory.mockResolvedValue(sessionStorageMock.createFactory()); mock.createRouter.mockImplementation(() => mockRouter.create()); @@ -160,7 +168,6 @@ const createSetupContractMock = () => { basePath: internalMock.basePath, csp: CspConfig.DEFAULT, createRouter: jest.fn(), - // @ts-expect-error tsc cannot infer ContextName and uses never registerRouteHandlerContext: jest.fn(), auth: { get: internalMock.auth.get, diff --git a/src/core/server/http/http_service.ts b/src/core/server/http/http_service.ts index 98ae0f8b81aa61..ca031e8ab282b4 100644 --- a/src/core/server/http/http_service.ts +++ b/src/core/server/http/http_service.ts @@ -40,11 +40,11 @@ import { ExternalUrlConfig, } from '../external_url'; -interface PrebootDeps { +export interface PrebootDeps { context: InternalContextPreboot; } -interface SetupDeps { +export interface SetupDeps { context: ContextSetup; executionContext: InternalExecutionContextSetup; } diff --git a/src/core/server/http/router/headers.ts b/src/core/server/http/router/headers.ts index 715337ba813b5a..89a32d6dc5d2ff 100644 --- a/src/core/server/http/router/headers.ts +++ b/src/core/server/http/router/headers.ts @@ -9,6 +9,16 @@ import { IncomingHttpHeaders } from 'http'; import { pick } from '@kbn/std'; +/** + * Converts an object type to a new object type where each string + * key is copied to the values of the object, and non string keys are + * given a `never` value. This allows us to map over the values and + * get the list of all string keys on a type in `KnownKeys` + */ +type StringKeysAsVals = { + [K in keyof T]: string extends K ? never : number extends K ? never : K; +}; + /** * Creates a Union type of all known keys of a given interface. * @example @@ -21,11 +31,7 @@ import { pick } from '@kbn/std'; * type PersonKnownKeys = KnownKeys; // "age" | "name" * ``` */ -type KnownKeys = { - [K in keyof T]: string extends K ? never : number extends K ? never : K; -} extends { [_ in keyof T]: infer U } - ? U - : never; +type KnownKeys = StringKeysAsVals extends { [_ in keyof T]: infer U } ? U : never; /** * Set of well-known HTTP headers. diff --git a/src/core/server/i18n/i18n_service.ts b/src/core/server/i18n/i18n_service.ts index 02a809b3c2c36b..5772703a5a6b8b 100644 --- a/src/core/server/i18n/i18n_service.ts +++ b/src/core/server/i18n/i18n_service.ts @@ -16,12 +16,12 @@ import { getKibanaTranslationFiles } from './get_kibana_translation_files'; import { initTranslations } from './init_translations'; import { registerRoutes } from './routes'; -interface PrebootDeps { +export interface PrebootDeps { http: InternalHttpServicePreboot; pluginPaths: string[]; } -interface SetupDeps { +export interface SetupDeps { http: InternalHttpServiceSetup; pluginPaths: string[]; } diff --git a/src/core/server/logging/logging_service.ts b/src/core/server/logging/logging_service.ts index 6c3eee4981725d..f5c6bbf8e94222 100644 --- a/src/core/server/logging/logging_service.ts +++ b/src/core/server/logging/logging_service.ts @@ -49,7 +49,7 @@ export interface InternalLoggingServicePreboot { /** @internal */ export type InternalLoggingServiceSetup = InternalLoggingServicePreboot; -interface PrebootDeps { +export interface PrebootDeps { loggingSystem: ILoggingSystem; } diff --git a/src/core/server/metrics/metrics_service.ts b/src/core/server/metrics/metrics_service.ts index 8e9604b50fb57e..30609837447d1a 100644 --- a/src/core/server/metrics/metrics_service.ts +++ b/src/core/server/metrics/metrics_service.ts @@ -17,7 +17,7 @@ import { OpsMetricsCollector } from './ops_metrics_collector'; import { opsConfig, OpsConfigType } from './ops_config'; import { getEcsOpsMetricsLog } from './logging'; -interface MetricsServiceSetupDeps { +export interface MetricsServiceSetupDeps { http: InternalHttpServiceSetup; } diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index fa461946d397f6..d4393791a74fa9 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -33,7 +33,6 @@ import type { KibanaClient } from '@elastic/elasticsearch/lib/api/kibana'; import { Logger } from '@kbn/logging'; import { LoggerFactory } from '@kbn/logging'; import { LogLevel as LogLevel_2 } from '@kbn/logging'; -import { LogLevelId } from '@kbn/logging'; import { LogMeta } from '@kbn/logging'; import { LogRecord } from '@kbn/logging'; import type { MaybePromise } from '@kbn/utility-types'; @@ -1372,14 +1371,32 @@ export type KibanaResponseFactory = typeof kibanaResponseFactory; export const kibanaResponseFactory: { custom: | Error | Buffer | Stream | { message: string | Error; - attributes?: Record | undefined; + attributes?: ResponseErrorAttributes | undefined; } | undefined>(options: CustomHttpResponseOptions) => KibanaResponse; - badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse; - unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse; - forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse; - notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse; - conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse; - customError: (options: CustomHttpResponseOptions) => KibanaResponse; + badRequest: (options?: ErrorHttpResponseOptions) => KibanaResponse; + unauthorized: (options?: ErrorHttpResponseOptions) => KibanaResponse; + forbidden: (options?: ErrorHttpResponseOptions) => KibanaResponse; + notFound: (options?: ErrorHttpResponseOptions) => KibanaResponse; + conflict: (options?: ErrorHttpResponseOptions) => KibanaResponse; + customError: (options: CustomHttpResponseOptions) => KibanaResponse; redirected: (options: RedirectResponseOptions) => KibanaResponse | Buffer | Stream>; ok: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; accepted: (options?: HttpResponseOptions) => KibanaResponse | Buffer | Stream>; diff --git a/src/core/server/status/status_service.ts b/src/core/server/status/status_service.ts index 29cc01da3f63d9..63a1b02d5b2e7c 100644 --- a/src/core/server/status/status_service.ts +++ b/src/core/server/status/status_service.ts @@ -32,7 +32,7 @@ interface StatusLogMeta extends LogMeta { kibana: { status: ServiceStatus }; } -interface SetupDeps { +export interface SetupDeps { elasticsearch: Pick; environment: InternalEnvironmentServiceSetup; pluginDependencies: ReadonlyMap; diff --git a/src/core/types/elasticsearch/search.ts b/src/core/types/elasticsearch/search.ts index 2e79bf6fea57cf..c28bf3c258f77a 100644 --- a/src/core/types/elasticsearch/search.ts +++ b/src/core/types/elasticsearch/search.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { ValuesType } from 'utility-types'; +import { ValuesType, UnionToIntersection } from 'utility-types'; import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; type InvalidAggregationRequest = unknown; @@ -21,11 +21,15 @@ type KeyOfSource = Record< (T extends Record ? null : never) | string | number >; -type KeysOfSources = T extends [infer U, ...infer V] - ? KeyOfSource & KeysOfSources - : T extends Array - ? KeyOfSource - : {}; +type KeysOfSources = T extends [any] + ? KeyOfSource + : T extends [any, any] + ? KeyOfSource & KeyOfSource + : T extends [any, any, any] + ? KeyOfSource & KeyOfSource & KeyOfSource + : T extends [any, any, any, any] + ? KeyOfSource & KeyOfSource & KeyOfSource & KeyOfSource + : Record; type CompositeKeysOf = TAggregationContainer extends { @@ -36,6 +40,13 @@ type CompositeKeysOf = + TAggregationContainer extends { top_metrics: { metrics: { field: infer TField } } } + ? TField + : TAggregationContainer extends { top_metrics: { metrics: Array<{ field: infer TField }> } } + ? TField + : string; + type ValueTypeOfField = T extends Record ? ValuesType : T extends Array @@ -532,12 +543,7 @@ export type AggregateOf< top_metrics: { top: Array<{ sort: number[] | string[]; - metrics: Record< - TAggregationContainer extends Record }> - ? TKeys - : string, - string | number | null - >; + metrics: Record, string | number | null>; }>; }; weighted_avg: { value: number | null }; @@ -547,8 +553,8 @@ export type AggregateOf< // t_test: {} not defined })[ValidAggregationKeysOf & AggregationTypeName]; -type AggregateOfMap = { - [TAggregationName in keyof TAggregationMap]: TAggregationMap[TAggregationName] extends estypes.AggregationsAggregationContainer +type AggregateOfMap = { + [TAggregationName in keyof TAggregationMap]: Required[TAggregationName] extends estypes.AggregationsAggregationContainer ? AggregateOf : never; // using never means we effectively ignore optional keys, using {} creates a union type of { ... } | {} }; @@ -567,7 +573,7 @@ type SearchResponseOf< > = SubAggregateOf; // if aggregation response cannot be inferred, fall back to unknown -type WrapAggregationResponse = keyof T extends never +type WrapAggregationResponse = keyof UnionToIntersection extends never ? { aggregations?: unknown } : { aggregations?: T }; diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index a5ed81c15c9b1d..9e3a419d639646 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -8,7 +8,7 @@ import { ToolingLog } from '@kbn/dev-utils'; -import { Config, createRunner } from './lib'; +import { Config, createRunner, Task, GlobalTask } from './lib'; import * as Tasks from './tasks'; export interface BuildOptions { @@ -32,12 +32,12 @@ export interface BuildOptions { createExamplePlugins: boolean; } -export async function buildDistributables(log: ToolingLog, options: BuildOptions) { +export async function buildDistributables(log: ToolingLog, options: BuildOptions): Promise { log.verbose('building distributables with options:', options); - const config = await Config.create(options); + const config: Config = await Config.create(options); - const run = createRunner({ + const run: (task: Task | GlobalTask) => Promise = createRunner({ config, log, }); diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index f5c1755b228e99..e3d9688e60962c 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -97,6 +97,7 @@ export const IGNORE_DIRECTORY_GLOBS = [ 'packages/kbn-pm/src/utils/__fixtures__/*', 'x-pack/dev-tools', 'packages/kbn-optimizer/src/__fixtures__/mock_repo/x-pack', + 'typings/*', ]; /** diff --git a/src/dev/typescript/run_type_check_cli.ts b/src/dev/typescript/run_type_check_cli.ts index 27998f881a03d0..5888e6eaf6806b 100644 --- a/src/dev/typescript/run_type_check_cli.ts +++ b/src/dev/typescript/run_type_check_cli.ts @@ -75,7 +75,7 @@ export async function runTypeCheckCli() { [ '--max-old-space-size=5120', require.resolve('typescript/bin/tsc'), - ...['--project', p.tsConfigPath, ...(flags.verbose ? ['--verbose'] : [])], + ...['--project', p.tsConfigPath], ...tscArgs, ], { 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 0f65d3f1e33e27..01a7786c5d8560 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 @@ -492,7 +492,9 @@ export class SenseEditor { return result.join('\n'); }; - updateActionsBar = () => this.coreEditor.legacyUpdateUI(this.currentReqRange); + updateActionsBar = () => { + return this.coreEditor.legacyUpdateUI(this.currentReqRange); + }; getCoreEditor() { return this.coreEditor; diff --git a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx index 09ac0c1dd94bbc..8be3526e3ad29c 100644 --- a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx +++ b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx @@ -17,7 +17,7 @@ import classNames from 'classnames'; import _ from 'lodash'; import React from 'react'; import { Subscription } from 'rxjs'; -import ReactGridLayout, { Layout } from 'react-grid-layout'; +import ReactGridLayout, { Layout, ReactGridLayoutProps } from 'react-grid-layout'; import { GridData } from '../../../../common'; import { ViewMode } from '../../../services/embeddable'; import { DASHBOARD_GRID_COLUMN_COUNT, DASHBOARD_GRID_HEIGHT } from '../dashboard_constants'; @@ -54,9 +54,9 @@ function ResponsiveGrid({ size: { width: number }; isViewMode: boolean; layout: Layout[]; - onLayoutChange: () => void; + onLayoutChange: ReactGridLayoutProps['onLayoutChange']; children: JSX.Element[]; - maximizedPanelId: string; + maximizedPanelId?: string; useMargins: boolean; }) { // This is to prevent a bug where view mode changes when the panel is expanded. View mode changes will trigger diff --git a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts index 180e826b5bc4ed..9e968c9bae8a08 100644 --- a/src/plugins/data/public/search/search_interceptor/search_interceptor.ts +++ b/src/plugins/data/public/search/search_interceptor/search_interceptor.ts @@ -383,7 +383,7 @@ export class SearchInterceptor { private showTimeoutErrorMemoized = memoize( this.showTimeoutErrorToast, - (_: SearchTimeoutError, sessionId: string) => { + (_: SearchTimeoutError, sessionId?: string) => { return sessionId; } ); @@ -400,12 +400,7 @@ export class SearchInterceptor { ); }; - private showRestoreWarning = memoize( - this.showRestoreWarningToast, - (_: SearchTimeoutError, sessionId: string) => { - return sessionId; - } - ); + private showRestoreWarning = memoize(this.showRestoreWarningToast); /** * Show one error notification per session. diff --git a/src/plugins/data/public/ui/search_bar/search_bar.tsx b/src/plugins/data/public/ui/search_bar/search_bar.tsx index 9478d84741b7e7..385f052adece6d 100644 --- a/src/plugins/data/public/ui/search_bar/search_bar.tsx +++ b/src/plugins/data/public/ui/search_bar/search_bar.tsx @@ -25,7 +25,7 @@ import { FilterBar } from '../filter_bar/filter_bar'; import { SavedQueryMeta, SaveQueryForm } from '../saved_query_form'; import { SavedQueryManagementComponent } from '../saved_query_management'; -interface SearchBarInjectedDeps { +export interface SearchBarInjectedDeps { kibana: KibanaReactContextValue; intl: InjectedIntl; timeHistory: TimeHistoryContract; diff --git a/src/plugins/data/server/search/collectors/usage.ts b/src/plugins/data/server/search/collectors/usage.ts index f9d703900fc048..836ff33b335c41 100644 --- a/src/plugins/data/server/search/collectors/usage.ts +++ b/src/plugins/data/server/search/collectors/usage.ts @@ -62,15 +62,15 @@ export function usageProvider(core: CoreSetup): SearchUsage { { maxWait: 5000 } ); - const trackSuccess = (duration: number) => { + const trackSuccess = async (duration: number) => { collectedUsage.successCount++; collectedUsage.totalDuration += duration; - return updateSearchUsage(); + return await updateSearchUsage(); }; - const trackError = () => { + const trackError = async () => { collectedUsage.errorCount++; - return updateSearchUsage(); + return await updateSearchUsage(); }; return { trackSuccess, trackError }; diff --git a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/number/number.tsx b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/number/number.tsx index 4a86d8322b9efe..dfbd43f99142c5 100644 --- a/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/number/number.tsx +++ b/src/plugins/data_view_field_editor/public/components/field_format_editor/editors/number/number.tsx @@ -26,7 +26,7 @@ export class NumberFormatEditor extends DefaultFormatEditor; + declare context: React.ContextType; state = { ...defaultState, sampleInputs: [10000, 12.345678, -1, -999, 0.52], diff --git a/src/plugins/data_view_management/public/components/field_editor/components/scripting_help/test_script.tsx b/src/plugins/data_view_management/public/components/field_editor/components/scripting_help/test_script.tsx index 76c460de4ed429..36e61af6cea33f 100644 --- a/src/plugins/data_view_management/public/components/field_editor/components/scripting_help/test_script.tsx +++ b/src/plugins/data_view_management/public/components/field_editor/components/scripting_help/test_script.tsx @@ -51,7 +51,7 @@ interface TestScriptState { export class TestScript extends Component { static contextType = contextType; - public readonly context!: IndexPatternManagmentContextValue; + public declare readonly context: IndexPatternManagmentContextValue; defaultProps = { name: 'myScriptedField', diff --git a/src/plugins/data_view_management/public/components/field_editor/field_editor.tsx b/src/plugins/data_view_management/public/components/field_editor/field_editor.tsx index ceaad76d6d1244..5beb4fb989d5b7 100644 --- a/src/plugins/data_view_management/public/components/field_editor/field_editor.tsx +++ b/src/plugins/data_view_management/public/components/field_editor/field_editor.tsx @@ -125,7 +125,7 @@ export interface FieldEdiorProps { export class FieldEditor extends PureComponent { static contextType = contextType; - public readonly context!: IndexPatternManagmentContextValue; + public declare readonly context: IndexPatternManagmentContextValue; supportedLangs: estypes.ScriptLanguage[] = []; deprecatedLangs: estypes.ScriptLanguage[] = []; diff --git a/src/plugins/discover/public/application/main/services/discover_search_session.ts b/src/plugins/discover/public/application/main/services/discover_search_session.ts index cace655a82a0fc..c864c06e4003c0 100644 --- a/src/plugins/discover/public/application/main/services/discover_search_session.ts +++ b/src/plugins/discover/public/application/main/services/discover_search_session.ts @@ -31,8 +31,10 @@ export class DiscoverSearchSessionManager { * skips if `searchSessionId` matches current search session id */ readonly newSearchSessionIdFromURL$: Rx.Observable; + private readonly deps: DiscoverSearchSessionManagerDeps; - constructor(private readonly deps: DiscoverSearchSessionManagerDeps) { + constructor(deps: DiscoverSearchSessionManagerDeps) { + this.deps = deps; this.newSearchSessionIdFromURL$ = createQueryParamObservable( this.deps.history, SEARCH_SESSION_ID_QUERY_PARAM diff --git a/src/plugins/discover/public/build_services.ts b/src/plugins/discover/public/build_services.ts index b86212251cb74b..9cc2eb78aafbe1 100644 --- a/src/plugins/discover/public/build_services.ts +++ b/src/plugins/discover/public/build_services.ts @@ -40,6 +40,10 @@ import { EmbeddableStart } from '../../embeddable/public'; import type { SpacesApi } from '../../../../x-pack/plugins/spaces/public'; +export interface HistoryLocationState { + referrer: string; +} + export interface DiscoverServices { addBasePath: (path: string) => string; capabilities: Capabilities; @@ -48,7 +52,7 @@ export interface DiscoverServices { data: DataPublicPluginStart; docLinks: DocLinksStart; embeddable: EmbeddableStart; - history: () => History; + history: () => History; theme: ChartsPluginStart['theme']; filterManager: FilterManager; fieldFormats: FieldFormatsStart; diff --git a/src/plugins/discover/public/kibana_services.ts b/src/plugins/discover/public/kibana_services.ts index 12b0a77a7865de..ffdfd82058693e 100644 --- a/src/plugins/discover/public/kibana_services.ts +++ b/src/plugins/discover/public/kibana_services.ts @@ -10,7 +10,7 @@ import { once } from 'lodash'; import { createHashHistory } from 'history'; import type { ScopedHistory, AppMountParameters } from 'kibana/public'; import type { UiActionsStart } from 'src/plugins/ui_actions/public'; -import { DiscoverServices } from './build_services'; +import { DiscoverServices, HistoryLocationState } from './build_services'; import { createGetterSetter } from '../../kibana_utils/public'; import { DocViewsRegistry } from './services/doc_views/doc_views_registry'; @@ -46,7 +46,7 @@ export const [getDocViewsRegistry, setDocViewsRegistry] = * Makes sure discover and context are using one instance of history. */ export const getHistory = once(() => { - const history = createHashHistory(); + const history = createHashHistory(); history.listen(() => { // keep at least one listener so that `history.location` always in sync }); diff --git a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx index 507d2be7198d5b..9a575a9446a011 100644 --- a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx +++ b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx @@ -94,7 +94,7 @@ export class AttributeService< ? await this.options.unwrapMethod(input.savedObjectId) : await this.defaultUnwrapMethod(input); } - return { attributes: input[ATTRIBUTE_SERVICE_KEY] }; + return { attributes: (input as ValType)[ATTRIBUTE_SERVICE_KEY] }; } public async wrapAttributes( @@ -141,7 +141,7 @@ export class AttributeService< getInputAsValueType = async (input: ValType | RefType): Promise => { if (!this.inputIsRefType(input)) { - return input; + return input as ValType; } const { attributes } = await this.unwrapAttributes(input); const { savedObjectId, ...originalInputToPropagate } = input; @@ -162,7 +162,7 @@ export class AttributeService< const onSave = async (props: OnSaveProps): Promise => { await this.options.checkForDuplicateTitle(props); try { - const newAttributes = { ...input[ATTRIBUTE_SERVICE_KEY] }; + const newAttributes = { ...(input as ValType)[ATTRIBUTE_SERVICE_KEY] }; newAttributes.title = props.newTitle; const wrappedInput = (await this.wrapAttributes(newAttributes, true)) as RefType; @@ -182,7 +182,11 @@ export class AttributeService< reject()} - title={get(saveOptions, 'saveModalTitle', input[ATTRIBUTE_SERVICE_KEY].title)} + title={get( + saveOptions, + 'saveModalTitle', + (input as ValType)[ATTRIBUTE_SERVICE_KEY].title + )} showCopyOnSave={false} objectType={this.type} showDescription={false} diff --git a/src/plugins/embeddable/public/lib/state_transfer/embeddable_state_transfer.ts b/src/plugins/embeddable/public/lib/state_transfer/embeddable_state_transfer.ts index 26d366bb8dabe6..fe471ef853b237 100644 --- a/src/plugins/embeddable/public/lib/state_transfer/embeddable_state_transfer.ts +++ b/src/plugins/embeddable/public/lib/state_transfer/embeddable_state_transfer.ts @@ -29,15 +29,17 @@ export const EMBEDDABLE_STATE_TRANSFER_STORAGE_KEY = 'EMBEDDABLE_STATE_TRANSFER' export class EmbeddableStateTransfer { public isTransferInProgress: boolean; private storage: Storage; + private appList: ReadonlyMap | undefined; constructor( private navigateToApp: ApplicationStart['navigateToApp'], currentAppId$: ApplicationStart['currentAppId$'], - private appList?: ReadonlyMap | undefined, + appList?: ReadonlyMap | undefined, customStorage?: Storage ) { this.storage = customStorage ? customStorage : new Storage(sessionStorage); this.isTransferInProgress = false; + this.appList = appList; currentAppId$.subscribe(() => { this.isTransferInProgress = false; }); diff --git a/src/plugins/expressions/common/execution/execution_contract.ts b/src/plugins/expressions/common/execution/execution_contract.ts index 14ab7bebbf0575..69587c58f10452 100644 --- a/src/plugins/expressions/common/execution/execution_contract.ts +++ b/src/plugins/expressions/common/execution/execution_contract.ts @@ -24,7 +24,11 @@ export class ExecutionContract) {} + protected readonly execution: Execution; + + constructor(execution: Execution) { + this.execution = execution; + } /** * Cancel the execution of the expression. This will set abort signal diff --git a/src/plugins/expressions/common/expression_types/expression_type.ts b/src/plugins/expressions/common/expression_types/expression_type.ts index d179beeb76860f..bf8a96a4ab1e61 100644 --- a/src/plugins/expressions/common/expression_types/expression_type.ts +++ b/src/plugins/expressions/common/expression_types/expression_type.ts @@ -30,8 +30,9 @@ export class ExpressionType { */ serialize?: (value: Serializable) => unknown; deserialize?: (serialized: unknown[]) => Serializable; + private readonly definition: AnyExpressionTypeDefinition; - constructor(private readonly definition: AnyExpressionTypeDefinition) { + constructor(definition: AnyExpressionTypeDefinition) { const { name, help, deserialize, serialize, validate } = definition; this.name = name; @@ -43,6 +44,7 @@ export class ExpressionType { this.serialize = serialize; this.deserialize = deserialize; + this.definition = definition; } getToFn = ( diff --git a/src/plugins/field_formats/common/field_formats_registry.ts b/src/plugins/field_formats/common/field_formats_registry.ts index 3d856e46861263..19af3a1f976ab1 100644 --- a/src/plugins/field_formats/common/field_formats_registry.ts +++ b/src/plugins/field_formats/common/field_formats_registry.ts @@ -177,7 +177,7 @@ export class FieldFormatsRegistry { return new ConcreteFieldFormat(params, this.getConfig); }, - (formatId: FieldFormatId, params: FieldFormatParams) => + (formatId: FieldFormatId, params?: FieldFormatParams) => JSON.stringify({ formatId, ...params, @@ -212,10 +212,10 @@ export class FieldFormatsRegistry { * https://lodash.com/docs#memoize * * @param {KBN_FIELD_TYPES} fieldType - * @param {ES_FIELD_TYPES[]} esTypes + * @param {ES_FIELD_TYPES[] | undefined} esTypes * @return {String} */ - getDefaultInstanceCacheResolver(fieldType: KBN_FIELD_TYPES, esTypes: ES_FIELD_TYPES[]): string { + getDefaultInstanceCacheResolver(fieldType: KBN_FIELD_TYPES, esTypes?: ES_FIELD_TYPES[]): string { // @ts-ignore return Array.isArray(esTypes) && esTypes.indexOf(fieldType) === -1 ? [fieldType, ...esTypes].join('-') diff --git a/src/plugins/input_control_vis/public/components/vis/input_control_vis.tsx b/src/plugins/input_control_vis/public/components/vis/input_control_vis.tsx index 956a6c55b61ba0..faeae649021df2 100644 --- a/src/plugins/input_control_vis/public/components/vis/input_control_vis.tsx +++ b/src/plugins/input_control_vis/public/components/vis/input_control_vis.tsx @@ -25,6 +25,10 @@ function isRangeControl(control: RangeControl | ListControl): control is RangeCo return control.type === CONTROL_TYPES.RANGE; } +interface UnknownControl { + type: string; +} + interface InputControlVisProps { stageFilter: (controlIndex: number, newValue: any) => void; submitFilters: () => void; @@ -90,7 +94,7 @@ export class InputControlVis extends Component { /> ); } else { - throw new Error(`Unhandled control type ${control!.type}`); + throw new Error(`Unhandled control type ${(control as UnknownControl)!.type}`); } return ( diff --git a/src/plugins/kibana_overview/public/components/add_data/add_data.tsx b/src/plugins/kibana_overview/public/components/add_data/add_data.tsx index 81121a17080c21..1be7cd133bca2c 100644 --- a/src/plugins/kibana_overview/public/components/add_data/add_data.tsx +++ b/src/plugins/kibana_overview/public/components/add_data/add_data.tsx @@ -12,7 +12,10 @@ import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiTitle } from ' import { FormattedMessage } from '@kbn/i18n-react'; import { CoreStart } from 'kibana/public'; import { RedirectAppLinks, useKibana } from '../../../../../../src/plugins/kibana_react/public'; -import { FeatureCatalogueEntry } from '../../../../../../src/plugins/home/public'; +import { + FeatureCatalogueEntry, + FeatureCatalogueCategory, +} from '../../../../../../src/plugins/home/public'; // @ts-expect-error untyped component import { Synopsis } from '../synopsis'; import { METRIC_TYPE, trackUiMetric } from '../../lib/ui_metric'; @@ -94,8 +97,8 @@ AddData.propTypes = { icon: PropTypes.string.isRequired, path: PropTypes.string.isRequired, showOnHomePage: PropTypes.bool.isRequired, - category: PropTypes.string.isRequired, - order: PropTypes.number, - }) - ), + category: PropTypes.oneOf(Object.values(FeatureCatalogueCategory)).isRequired, + order: PropTypes.number as PropTypes.Validator, + }).isRequired + ).isRequired, }; diff --git a/src/plugins/kibana_overview/public/components/manage_data/manage_data.tsx b/src/plugins/kibana_overview/public/components/manage_data/manage_data.tsx index fa9e33a2ba82ce..85f354d8a81cb2 100644 --- a/src/plugins/kibana_overview/public/components/manage_data/manage_data.tsx +++ b/src/plugins/kibana_overview/public/components/manage_data/manage_data.tsx @@ -12,7 +12,10 @@ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiSpacer, EuiTitle } fro import { FormattedMessage } from '@kbn/i18n-react'; import { CoreStart } from 'kibana/public'; import { RedirectAppLinks, useKibana } from '../../../../../../src/plugins/kibana_react/public'; -import { FeatureCatalogueEntry } from '../../../../../../src/plugins/home/public'; +import { + FeatureCatalogueEntry, + FeatureCatalogueCategory, +} from '../../../../../../src/plugins/home/public'; // @ts-expect-error untyped component import { Synopsis } from '../synopsis'; import { METRIC_TYPE, trackUiMetric } from '../../lib/ui_metric'; @@ -81,8 +84,8 @@ ManageData.propTypes = { icon: PropTypes.string.isRequired, path: PropTypes.string.isRequired, showOnHomePage: PropTypes.bool.isRequired, - category: PropTypes.string.isRequired, - order: PropTypes.number, - }) - ), + category: PropTypes.oneOf(Object.values(FeatureCatalogueCategory)).isRequired, + order: PropTypes.number as PropTypes.Validator, + }).isRequired + ).isRequired, }; diff --git a/src/plugins/presentation_util/public/components/controls/control_group/embeddable/control_group_container_factory.ts b/src/plugins/presentation_util/public/components/controls/control_group/embeddable/control_group_container_factory.ts index 33d0d079d26f87..5a71355da8bbe0 100644 --- a/src/plugins/presentation_util/public/components/controls/control_group/embeddable/control_group_container_factory.ts +++ b/src/plugins/presentation_util/public/components/controls/control_group/embeddable/control_group_container_factory.ts @@ -26,7 +26,6 @@ import { export class ControlGroupContainerFactory implements EmbeddableFactoryDefinition { public readonly isContainerType = true; public readonly type = CONTROL_GROUP_TYPE; - public inject: EmbeddablePersistableStateService['inject']; public extract: EmbeddablePersistableStateService['extract']; diff --git a/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts b/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts index 9e1cfe60caa3c7..0a1127cf11b3d0 100644 --- a/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts @@ -253,7 +253,7 @@ describe('useEditorUpdates', () => { describe('handle linked search changes', () => { test('should update saved search id in saved instance', () => { - // @ts-expect-error + // @ts-expect-error 4.3.5 upgrade savedVisInstance.savedSearch = { id: 'saved_search_id', }; @@ -287,7 +287,8 @@ describe('useEditorUpdates', () => { savedVisInstance.savedVis = { savedSearchId: 'saved_search_id', }; - // @ts-expect-error + + // @ts-expect-error 4.3.5 upgrade savedVisInstance.savedSearch = { id: 'saved_search_id', }; diff --git a/test/tsconfig.json b/test/tsconfig.json index 64c85dad73312e..abf320a6967149 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -5,7 +5,7 @@ "emitDeclarationOnly": true, "declaration": true, "declarationMap": true, - "types": ["node", "resize-observer-polyfill", "@emotion/react/types/css-prop"] + "types": ["node", "@emotion/react/types/css-prop"] }, "include": [ "**/*", diff --git a/tsconfig.base.json b/tsconfig.base.json index 18c0ad38f46011..ae06e39f7a2748 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -16,6 +16,9 @@ "@emotion/core": [ "typings/@emotion" ], + "resize-observer-polyfill": [ + "typings/resize-observer-polyfill" + ] }, // Support .tsx files and transform JSX into calls to React.createElement "jsx": "react", @@ -68,7 +71,6 @@ "flot", "jest-styled-components", "@testing-library/jest-dom", - "resize-observer-polyfill", "@emotion/react/types/css-prop" ] } diff --git a/typings/resize-observer-polyfill/index.d.ts b/typings/resize-observer-polyfill/index.d.ts new file mode 100644 index 00000000000000..a2d9c88664722e --- /dev/null +++ b/typings/resize-observer-polyfill/index.d.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +// eslint-disable-next-line import/no-default-export +export default ResizeObserver; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx index d1482c55429f40..91fb8552beed8f 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx @@ -33,7 +33,9 @@ export interface Params { export class DashboardToDiscoverDrilldown implements Drilldown { - constructor(protected readonly params: Params) {} + constructor(protected readonly params: Params) { + this.ReactCollectConfig = (props) => ; + } public readonly id = SAMPLE_DASHBOARD_TO_DISCOVER_DRILLDOWN; @@ -47,9 +49,7 @@ export class DashboardToDiscoverDrilldown return [APPLY_FILTER_TRIGGER]; } - private readonly ReactCollectConfig: React.FC = (props) => ( - - ); + private readonly ReactCollectConfig!: React.FC; public readonly CollectConfig = reactToUiComponent(this.ReactCollectConfig); diff --git a/x-pack/plugins/apm/kibana.json b/x-pack/plugins/apm/kibana.json index e57859bfa253ee..846847dcd7e059 100644 --- a/x-pack/plugins/apm/kibana.json +++ b/x-pack/plugins/apm/kibana.json @@ -22,14 +22,14 @@ "actions", "alerting", "cloud", + "fleet", "home", "maps", "ml", "security", "spaces", "taskManager", - "usageCollection", - "fleet" + "usageCollection" ], "server": true, "ui": true, diff --git a/x-pack/plugins/apm/public/application/uxApp.tsx b/x-pack/plugins/apm/public/application/uxApp.tsx index cfb1a5c354c2da..f7a8f7030d4f9a 100644 --- a/x-pack/plugins/apm/public/application/uxApp.tsx +++ b/x-pack/plugins/apm/public/application/uxApp.tsx @@ -130,6 +130,7 @@ export function UXAppRoot({ services={{ ...core, ...plugins, embeddable, data }} > + {/* @ts-expect-error Type instantiation is excessively deep */} diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index 155de8fbdd9473..6ca632eac4f2e8 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -46,7 +46,9 @@ function useServicesFetcher() { const { query: { rangeFrom, rangeTo, environment, kuery }, - } = useApmParams('/services/{serviceName}', '/services'); + } = + // @ts-ignore 4.3.5 upgrade - Type instantiation is excessively deep and possibly infinite. + useApmParams('/services/{serviceName}', '/services'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx index b61b225c2fe946..a862ff872f61aa 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/backend_contents.tsx @@ -25,6 +25,7 @@ export function BackendContents({ start, end, }: ContentsProps) { + // @ts-ignore 4.3.5 upgrade - Type instantiation is excessively deep and possibly infinite. const { query } = useApmParams( '/service-map', '/services/{serviceName}/service-map' diff --git a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx index 5d49f1d9a8f18e..30ca3e79f6d7b8 100644 --- a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx @@ -138,6 +138,7 @@ function UnoptimizedManagedTable(props: Props) { }, [isLoading, noItemsMessage]); return ( + // @ts-expect-error TS thinks pagination should be non-nullable, but it's not { - // a little too much effort needed to satisfy TS here - // @ts-ignore + const link = (...args: [any]) => { return core.http.basePath.prepend('/app/apm' + router.link(...args)); }; diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts index e9280ba3e59768..68e29f7afcc791 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts @@ -11,9 +11,9 @@ import { } from '../../../../../../../../src/core/server/mocks'; import { createHttpServer } from 'src/core/server/test_utils'; import supertest from 'supertest'; -import { createApmEventClient } from '.'; +import { APMEventClient } from '.'; -describe('createApmEventClient', () => { +describe('APMEventClient', () => { let server: ReturnType; beforeEach(() => { @@ -38,7 +38,7 @@ describe('createApmEventClient', () => { router.get( { path: '/', validate: false }, async (context, request, res) => { - const eventClient = createApmEventClient({ + const eventClient = new APMEventClient({ esClient: { search: async ( params: any, diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts index 6c9a0cb45e273d..6e09e2aecfd489 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts @@ -57,26 +57,13 @@ type TypeOfProcessorEvent = { profile: Profile; }[T]; -type ESSearchRequestOf = Omit< - TParams, - 'apm' -> & { index: string[] | string }; - type TypedSearchResponse = InferSearchResponseOf< TypeOfProcessorEvent>, - ESSearchRequestOf + TParams >; -export type APMEventClient = ReturnType; - -export function createApmEventClient({ - esClient, - debug, - request, - indices, - options: { includeFrozen } = { includeFrozen: false }, -}: { +export interface APMEventClientConfig { esClient: ElasticsearchClient; debug: boolean; request: KibanaRequest; @@ -84,102 +71,119 @@ export function createApmEventClient({ options: { includeFrozen: boolean; }; -}) { - return { - async search( - operationName: string, - params: TParams - ): Promise> { - const withProcessorEventFilter = unpackProcessorEvents(params, indices); - - const { includeLegacyData = false } = params.apm; - - const withPossibleLegacyDataFilter = !includeLegacyData - ? addFilterToExcludeLegacyData(withProcessorEventFilter) - : withProcessorEventFilter; - - const searchParams = { - ...withPossibleLegacyDataFilter, - ...(includeFrozen ? { ignore_throttled: false } : {}), - ignore_unavailable: true, - preference: 'any', - }; - - // only "search" operation is currently supported - const requestType = 'search'; - - return callAsyncWithDebug({ - cb: () => { - const searchPromise = withApmSpan(operationName, () => { - const controller = new AbortController(); - return cancelEsRequestOnAbort( - esClient.search(searchParams, { signal: controller.signal }), - request, - controller - ); - }); - - return unwrapEsResponse(searchPromise); - }, - getDebugMessage: () => ({ - body: getDebugBody({ - params: searchParams, - requestType, - operationName, - }), - title: getDebugTitle(request), +} + +export class APMEventClient { + private readonly esClient: ElasticsearchClient; + private readonly debug: boolean; + private readonly request: KibanaRequest; + private readonly indices: ApmIndicesConfig; + private readonly includeFrozen: boolean; + + constructor(config: APMEventClientConfig) { + this.esClient = config.esClient; + this.debug = config.debug; + this.request = config.request; + this.indices = config.indices; + this.includeFrozen = config.options.includeFrozen; + } + + async search( + operationName: string, + params: TParams + ): Promise> { + const withProcessorEventFilter = unpackProcessorEvents( + params, + this.indices + ); + + const { includeLegacyData = false } = params.apm; + + const withPossibleLegacyDataFilter = !includeLegacyData + ? addFilterToExcludeLegacyData(withProcessorEventFilter) + : withProcessorEventFilter; + + const searchParams = { + ...withPossibleLegacyDataFilter, + ...(this.includeFrozen ? { ignore_throttled: false } : {}), + ignore_unavailable: true, + preference: 'any', + }; + + // only "search" operation is currently supported + const requestType = 'search'; + + return callAsyncWithDebug({ + cb: () => { + const searchPromise = withApmSpan(operationName, () => { + const controller = new AbortController(); + return cancelEsRequestOnAbort( + this.esClient.search(searchParams, { signal: controller.signal }), + this.request, + controller + ); + }); + + return unwrapEsResponse(searchPromise); + }, + getDebugMessage: () => ({ + body: getDebugBody({ + params: searchParams, + requestType, + operationName, }), - isCalledWithInternalUser: false, - debug, - request, - requestType, - operationName, - requestParams: searchParams, - }); - }, - - async termsEnum( - operationName: string, - params: APMEventESTermsEnumRequest - ): Promise { - const requestType = 'terms_enum'; - const { index } = unpackProcessorEvents(params, indices); - - return callAsyncWithDebug({ - cb: () => { - const { apm, ...rest } = params; - const termsEnumPromise = withApmSpan(operationName, () => { - const controller = new AbortController(); - return cancelEsRequestOnAbort( - esClient.termsEnum( - { - index: Array.isArray(index) ? index.join(',') : index, - ...rest, - }, - { signal: controller.signal } - ), - request, - controller - ); - }); - - return unwrapEsResponse(termsEnumPromise); - }, - getDebugMessage: () => ({ - body: getDebugBody({ - params, - requestType, - operationName, - }), - title: getDebugTitle(request), + title: getDebugTitle(this.request), + }), + isCalledWithInternalUser: false, + debug: this.debug, + request: this.request, + requestType, + operationName, + requestParams: searchParams, + }); + } + + async termsEnum( + operationName: string, + params: APMEventESTermsEnumRequest + ): Promise { + const requestType = 'terms_enum'; + const { index } = unpackProcessorEvents(params, this.indices); + + return callAsyncWithDebug({ + cb: () => { + const { apm, ...rest } = params; + const termsEnumPromise = withApmSpan(operationName, () => { + const controller = new AbortController(); + return cancelEsRequestOnAbort( + this.esClient.termsEnum( + { + index: Array.isArray(index) ? index.join(',') : index, + ...rest, + }, + { signal: controller.signal } + ), + this.request, + controller + ); + }); + + return unwrapEsResponse(termsEnumPromise); + }, + getDebugMessage: () => ({ + body: getDebugBody({ + params, + requestType, + operationName, }), - isCalledWithInternalUser: false, - debug, - request, - requestType, - operationName, - requestParams: params, - }); - }, - }; + title: getDebugTitle(this.request), + }), + isCalledWithInternalUser: false, + debug: this.debug, + request: this.request, + requestType, + operationName, + requestParams: params, + }); + } } diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts index 85fb94dd765b06..fb2d46bfa5aa28 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.ts @@ -14,10 +14,7 @@ import { ApmIndicesConfig, getApmIndices, } from '../../routes/settings/apm_indices/get_apm_indices'; -import { - APMEventClient, - createApmEventClient, -} from './create_es_client/create_apm_event_client'; +import { APMEventClient } from './create_es_client/create_apm_event_client'; import { APMInternalClient, createInternalESClient, @@ -58,7 +55,7 @@ export async function setupRequest({ return { indices, - apmEventClient: createApmEventClient({ + apmEventClient: new APMEventClient({ esClient: context.core.elasticsearch.client.asCurrentUser, debug: query._inspect, request, diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts index 04cee211c78db8..97dc298d11c569 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_transaction_group_stats.ts @@ -8,8 +8,10 @@ import { merge } from 'lodash'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { - TRANSACTION_TYPE, AGENT_NAME, + TRANSACTION_TYPE, + TRANSACTION_NAME, + SERVICE_NAME, } from '../../../common/elasticsearch_fieldnames'; import { arrayUnionToCallable } from '../../../common/utils/array_union_to_callable'; import { TransactionGroupRequestBase, TransactionGroupSetup } from './fetcher'; @@ -21,7 +23,7 @@ interface MetricParams { searchAggregatedTransactions: boolean; } -type BucketKey = Record; +type BucketKey = Record; function mergeRequestWithAggs< TRequestBase extends TransactionGroupRequestBase, diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index b0c21fe28abb21..b603d9e72a2b02 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -23,7 +23,7 @@ import { APM_FEATURE, registerFeaturesUsage } from './feature'; import { registerApmAlerts } from './routes/alerts/register_apm_alerts'; import { registerFleetPolicyCallbacks } from './routes/fleet/register_fleet_policy_callbacks'; import { createApmTelemetry } from './lib/apm_telemetry'; -import { createApmEventClient } from './lib/helpers/create_es_client/create_apm_event_client'; +import { APMEventClient } from './lib/helpers/create_es_client/create_apm_event_client'; import { getInternalSavedObjectsClient } from './lib/helpers/get_internal_saved_objects_client'; import { createApmAgentConfigurationIndex } from './routes/settings/agent_configuration/create_agent_config_index'; import { getApmIndices } from './routes/settings/apm_indices/get_apm_indices'; @@ -66,7 +66,7 @@ export class APMPlugin public setup( core: CoreSetup, - plugins: Omit + plugins: APMPluginSetupDependencies ) { this.logger = this.initContext.logger.get(); const config$ = this.initContext.config.create(); @@ -224,7 +224,7 @@ export class APMPlugin const esClient = context.core.elasticsearch.client.asCurrentUser; - return createApmEventClient({ + return new APMEventClient({ debug: debug ?? false, esClient, request, diff --git a/x-pack/plugins/apm/server/routes/alerts/register_transaction_error_rate_alert_type.ts b/x-pack/plugins/apm/server/routes/alerts/register_transaction_error_rate_alert_type.ts index f196b718968da4..773b1ce6941256 100644 --- a/x-pack/plugins/apm/server/routes/alerts/register_transaction_error_rate_alert_type.ts +++ b/x-pack/plugins/apm/server/routes/alerts/register_transaction_error_rate_alert_type.ts @@ -171,27 +171,29 @@ export function registerTransactionErrorRateAlertType({ return {}; } - const results = response.aggregations.series.buckets - .map((bucket) => { - const [serviceName, environment, transactionType] = bucket.key; - - const failed = - bucket.outcomes.buckets.find( - (outcomeBucket) => outcomeBucket.key === EventOutcome.failure - )?.doc_count ?? 0; - const succesful = - bucket.outcomes.buckets.find( - (outcomeBucket) => outcomeBucket.key === EventOutcome.success - )?.doc_count ?? 0; - - return { + const results = []; + for (const bucket of response.aggregations.series.buckets) { + const [serviceName, environment, transactionType] = bucket.key; + + const failed = + bucket.outcomes.buckets.find( + (outcomeBucket) => outcomeBucket.key === EventOutcome.failure + )?.doc_count ?? 0; + const succesful = + bucket.outcomes.buckets.find( + (outcomeBucket) => outcomeBucket.key === EventOutcome.success + )?.doc_count ?? 0; + const errorRate = (failed / (failed + succesful)) * 100; + + if (errorRate >= alertParams.threshold) { + results.push({ serviceName, environment, transactionType, - errorRate: (failed / (failed + succesful)) * 100, - }; - }) - .filter((result) => result.errorRate >= alertParams.threshold); + errorRate, + }); + } + } results.forEach((result) => { const { serviceName, environment, transactionType, errorRate } = diff --git a/x-pack/plugins/apm/server/routes/data_view/route.ts b/x-pack/plugins/apm/server/routes/data_view/route.ts index 4e1c0ca050a096..83d2ac35b36720 100644 --- a/x-pack/plugins/apm/server/routes/data_view/route.ts +++ b/x-pack/plugins/apm/server/routes/data_view/route.ts @@ -22,12 +22,13 @@ const staticDataViewRoute = createApmServerRoute({ config, } = resources; - const [setup, savedObjectsClient] = await Promise.all([ - setupRequest(resources), - core - .start() - .then((coreStart) => coreStart.savedObjects.createInternalRepository()), - ]); + const setupPromise = setupRequest(resources); + const clientPromise = core + .start() + .then((coreStart) => coreStart.savedObjects.createInternalRepository()); + + const setup = await setupPromise; + const savedObjectsClient = await clientPromise; const spaceId = spaces?.setup.spacesService.getSpaceId(request); diff --git a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts index e460991029915f..d32e751a6ca996 100644 --- a/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts +++ b/x-pack/plugins/apm/server/routes/errors/get_error_groups/get_error_group_main_statistics.ts @@ -110,6 +110,7 @@ export async function getErrorGroupMainStatistics({ ); return ( + // @ts-ignore 4.3.5 upgrade - Expression produces a union type that is too complex to represent. ts(2590) response.aggregations?.error_groups.buckets.map((bucket) => ({ groupId: bucket.key as string, name: getErrorName(bucket.sample.hits.hits[0]._source), diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts index 66b12dab59775f..0a0a92760decd7 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts @@ -120,6 +120,7 @@ export async function getServiceAnomalies({ const relevantBuckets = uniqBy( sortBy( // make sure we only return data for jobs that are available in this space + // @ts-ignore 4.3.5 upgrade typedAnomalyResponse.aggregations?.services.buckets.filter((bucket) => jobIds.includes(bucket.key.jobId as string) ) ?? [], diff --git a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts index ec081916f455de..a9f5615acb1c03 100644 --- a/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts +++ b/x-pack/plugins/apm/server/routes/services/get_service_instances/get_service_instances_transaction_statistics.ts @@ -168,6 +168,7 @@ export async function getServiceInstancesTransactionStatistics< const { timeseries } = serviceNodeBucket; return { serviceNodeName, + // @ts-ignore 4.3.5 upgrade - Expression produces a union type that is too complex to represent. errorRate: timeseries.buckets.map((dateBucket) => ({ x: dateBucket.key, y: dateBucket.failures.doc_count / dateBucket.doc_count, diff --git a/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts b/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts index 6b917919bade53..347fca380c863d 100644 --- a/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts +++ b/x-pack/plugins/apm/server/routes/settings/apm_indices/get_apm_indices.ts @@ -52,7 +52,7 @@ export async function getApmIndices({ }: { config: APMConfig; savedObjectsClient: ISavedObjectsClient; -}) { +}): Promise { try { const apmIndicesSavedObject = await getApmIndicesSavedObject( savedObjectsClient diff --git a/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts b/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts index 419c3e44d68a62..7a38988ac1b17f 100644 --- a/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts +++ b/x-pack/plugins/apm/server/routes/traces/get_trace_items.ts @@ -71,10 +71,8 @@ export async function getTraceItems( }, }); - const [errorResponse, traceResponse] = await Promise.all([ - errorResponsePromise, - traceResponsePromise, - ]); + const errorResponse = await errorResponsePromise; + const traceResponse = await traceResponsePromise; const exceedsMax = traceResponse.hits.total.value > maxTraceItems; const traceDocs = traceResponse.hits.hits.map((hit) => hit._source); diff --git a/x-pack/plugins/apm/server/routes/typings.ts b/x-pack/plugins/apm/server/routes/typings.ts index 5b6d44ab9295db..a089c7bf3968ac 100644 --- a/x-pack/plugins/apm/server/routes/typings.ts +++ b/x-pack/plugins/apm/server/routes/typings.ts @@ -17,7 +17,10 @@ import { AlertingApiRequestHandlerContext } from '../../../alerting/server'; import type { RacApiRequestHandlerContext } from '../../../rule_registry/server'; import { LicensingApiRequestHandlerContext } from '../../../licensing/server'; import { APMConfig } from '..'; -import { APMPluginDependencies } from '../types'; +import { + APMPluginSetupDependencies, + APMPluginStartDependencies, +} from '../types'; import { UsageCollectionSetup } from '../../../../../src/plugins/usage_collection/server'; import { UxUIFilters } from '../../typings/ui_filters'; @@ -62,9 +65,9 @@ export interface APMRouteHandlerResources { start: () => Promise; }; plugins: { - [key in keyof APMPluginDependencies]: { - setup: Required[key]['setup']; - start: () => Promise[key]['start']>; + [key in keyof APMPluginSetupDependencies]: { + setup: Required[key]; + start: () => Promise[key]>; }; }; ruleDataClient: IRuleDataClient; diff --git a/x-pack/plugins/apm/server/types.ts b/x-pack/plugins/apm/server/types.ts index 02aae547407e5b..0044a5abe81767 100644 --- a/x-pack/plugins/apm/server/types.ts +++ b/x-pack/plugins/apm/server/types.ts @@ -4,9 +4,9 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { ValuesType } from 'utility-types'; + import { Observable } from 'rxjs'; -import { CoreSetup, CoreStart, KibanaRequest } from 'kibana/server'; +import { KibanaRequest } from 'kibana/server'; import { RuleRegistryPluginSetupContract, RuleRegistryPluginStartContract, @@ -47,130 +47,58 @@ import { FleetStartContract as FleetPluginStart, } from '../../fleet/server'; import { APMConfig } from '.'; -import { getApmIndices } from './routes/settings/apm_indices/get_apm_indices'; -import { createApmEventClient } from './lib/helpers/create_es_client/create_apm_event_client'; +import { ApmIndicesConfig } from './routes/settings/apm_indices/get_apm_indices'; +import { APMEventClient } from './lib/helpers/create_es_client/create_apm_event_client'; import { ApmPluginRequestHandlerContext } from './routes/typings'; export interface APMPluginSetup { config$: Observable; - getApmIndices: () => ReturnType; + getApmIndices: () => Promise; createApmEventClient: (params: { debug?: boolean; request: KibanaRequest; context: ApmPluginRequestHandlerContext; - }) => Promise>; -} - -interface DependencyMap { - core: { - setup: CoreSetup; - start: CoreStart; - }; - spaces: { - setup: SpacesPluginSetup; - start: SpacesPluginStart; - }; - home: { - setup: HomeServerPluginSetup; - start: HomeServerPluginStart; - }; - licensing: { - setup: LicensingPluginSetup; - start: LicensingPluginStart; - }; - cloud: { - setup: CloudSetup; - start: undefined; - }; - usageCollection: { - setup: UsageCollectionSetup; - start: undefined; - }; - taskManager: { - setup: TaskManagerSetupContract; - start: TaskManagerStartContract; - }; - alerting: { - setup: AlertingPlugin['setup']; - start: AlertingPlugin['start']; - }; - actions: { - setup: ActionsPlugin['setup']; - start: ActionsPlugin['start']; - }; - observability: { - setup: ObservabilityPluginSetup; - start: undefined; - }; - features: { - setup: FeaturesPluginSetup; - start: FeaturesPluginStart; - }; - security: { - setup: SecurityPluginSetup; - start: SecurityPluginStart; - }; - ml: { - setup: MlPluginSetup; - start: MlPluginStart; - }; - data: { - setup: DataPluginSetup; - start: DataPluginStart; - }; - ruleRegistry: { - setup: RuleRegistryPluginSetupContract; - start: RuleRegistryPluginStartContract; - }; - fleet: { - setup: FleetPluginSetup; - start: FleetPluginStart; - }; + }) => Promise; } -const requiredDependencies = [ - 'features', - 'data', - 'licensing', - 'triggersActionsUi', - 'embeddable', - 'infra', - 'observability', - 'ruleRegistry', -] as const; - -const optionalDependencies = [ - 'spaces', - 'cloud', - 'usageCollection', - 'taskManager', - 'actions', - 'alerting', - 'security', - 'ml', - 'home', - 'maps', - 'fleet', -] as const; +export interface APMPluginSetupDependencies { + // required dependencies + data: DataPluginSetup; + features: FeaturesPluginSetup; + licensing: LicensingPluginSetup; + observability: ObservabilityPluginSetup; + ruleRegistry: RuleRegistryPluginSetupContract; -type RequiredDependencies = Pick< - DependencyMap, - ValuesType & keyof DependencyMap ->; - -type OptionalDependencies = Partial< - Pick< - DependencyMap, - ValuesType & keyof DependencyMap - > ->; - -export type APMPluginDependencies = RequiredDependencies & OptionalDependencies; + // optional dependencies + actions?: ActionsPlugin['setup']; + alerting?: AlertingPlugin['setup']; + cloud?: CloudSetup; + fleet?: FleetPluginSetup; + home?: HomeServerPluginSetup; + ml?: MlPluginSetup; + security?: SecurityPluginSetup; + spaces?: SpacesPluginSetup; + taskManager?: TaskManagerSetupContract; + usageCollection?: UsageCollectionSetup; +} -export type APMPluginSetupDependencies = { - [key in keyof APMPluginDependencies]: Required[key]['setup']; -}; +export interface APMPluginStartDependencies { + // required dependencies + data: DataPluginStart; + features: FeaturesPluginStart; + licensing: LicensingPluginStart; + observability: undefined; + ruleRegistry: RuleRegistryPluginStartContract; -export type APMPluginStartDependencies = { - [key in keyof APMPluginDependencies]: Required[key]['start']; -}; + // optional dependencies + actions?: ActionsPlugin['start']; + alerting?: AlertingPlugin['start']; + cloud?: undefined; + fleet?: FleetPluginStart; + home?: HomeServerPluginStart; + ml?: MlPluginStart; + security?: SecurityPluginStart; + spaces?: SpacesPluginStart; + taskManager?: TaskManagerStartContract; + usageCollection?: undefined; +} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx index 96a17bd8943915..daec52bccda379 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx @@ -9,6 +9,7 @@ import type { KibanaLocation } from 'src/plugins/share/public'; import React from 'react'; import { DataPublicPluginStart } from 'src/plugins/data/public'; import { DashboardStart } from 'src/plugins/dashboard/public'; +import { DrilldownConfig } from '../../../../common/drilldowns/dashboard_drilldown/types'; import { reactToUiComponent } from '../../../../../../../src/plugins/kibana_react/public'; import { CollectConfigContainer } from './components'; import { @@ -20,6 +21,7 @@ import { txtGoToDashboard } from './i18n'; import { CollectConfigProps, StartServicesGetter, + UiComponent, } from '../../../../../../../src/plugins/kibana_utils/public'; import { Config } from './types'; @@ -34,7 +36,10 @@ export interface Params { export abstract class AbstractDashboardDrilldown implements Drilldown { - constructor(protected readonly params: Params) {} + constructor(protected readonly params: Params) { + this.ReactCollectConfig = (props) => ; + this.CollectConfig = reactToUiComponent(this.ReactCollectConfig); + } public abstract readonly id: string; @@ -50,9 +55,11 @@ export abstract class AbstractDashboardDrilldown - > = (props) => ; + >; - public readonly CollectConfig = reactToUiComponent(this.ReactCollectConfig); + public readonly CollectConfig: UiComponent< + CollectConfigProps + >; public readonly createConfig = () => ({ dashboardId: '', diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.test.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.test.ts index 586f636a088e19..60be59ab2db6c2 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.test.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.test.ts @@ -75,7 +75,7 @@ const kqlSavedSearch: SavedSearch = { title: 'farequote_filter_and_kuery', description: '', columns: ['_source'], - // @ts-expect-error + // @ts-expect-error this isn't a valid SavedSearch object... but does anyone care? kibanaSavedObjectMeta: { searchSourceJSON: '{"highlightAll":true,"version":true,"query":{"query":"responsetime > 49","language":"kuery"},"filter":[{"meta":{"index":"90a978e0-1c80-11ec-b1d7-f7e5cf21b9e0","negate":false,"disabled":false,"alias":null,"type":"phrase","key":"airline","value":"ASA","params":{"query":"ASA","type":"phrase"}},"query":{"match":{"airline":{"query":"ASA","type":"phrase"}}},"$state":{"store":"appState"}}],"indexRefName":"kibanaSavedObjectMeta.searchSourceJSON.index"}', diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx index 2219a50a5e7f37..2109160f5bb25d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/accordion_list.test.tsx @@ -48,7 +48,9 @@ describe('AccordionList', () => { expect(table.prop('items')).toEqual([{ item: 'first item' }, { item: 'second item' }]); - expect(table.prop('columns')[0].render({ item: 'first item' })).toEqual('first item'); + // columns from accordion_list.tsx always have a render function, so avoid type errors and just convert to any + const column: any = table.prop('columns')[0]; + expect(column.render({ item: 'first item' })).toEqual('first item'); }); it('is disabled when there are no items', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx index e11661e4a942eb..03e5d835df9b3e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx @@ -83,6 +83,7 @@ describe('CrawlRequestsTable', () => { const table = wrapper.find(EuiBasicTable); const columns = table.prop('columns'); + // @ts-expect-error 4.3.5 upgrade const crawlID = shallow(columns[0].render('618d0e66abe97bc688328900', { stage: 'crawl' })); expect(crawlID.text()).toContain('618d0e66abe97bc688328900'); @@ -90,6 +91,7 @@ describe('CrawlRequestsTable', () => { expect(actions.fetchCrawlRequest).toHaveBeenCalledWith('618d0e66abe97bc688328900'); expect(actions.openFlyout).toHaveBeenCalled(); + // @ts-expect-error 4.3.5 upgrade const processCrawlID = shallow(columns[0].render('54325423aef7890543', { stage: 'process' })); expect(processCrawlID.text()).toContain('54325423aef7890543'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.tsx index 0949be0ced0a65..70dd55f40ad4b0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.tsx @@ -12,7 +12,8 @@ import { useActions, useValues } from 'kea'; import { EuiBadge, EuiBasicTable, - EuiBasicTableColumn, + EuiTableFieldDataColumnType, + EuiTableComputedColumnType, EuiEmptyPrompt, EuiLink, } from '@elastic/eui'; @@ -30,7 +31,9 @@ export const CrawlRequestsTable: React.FC = () => { const { events } = useValues(CrawlerLogic); const { fetchCrawlRequest, openFlyout } = useActions(CrawlDetailLogic); - const columns: Array> = [ + const columns: Array< + EuiTableFieldDataColumnType | EuiTableComputedColumnType + > = [ { field: 'id', name: i18n.translate( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx index 13dd77da40931e..32e1b61a2c3e6e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials_list/credentials_list.test.tsx @@ -81,8 +81,8 @@ describe('CredentialsList', () => { ], }); const wrapper = shallow(); - const { items } = wrapper.find(EuiBasicTable).props(); - expect(items.map((i: ApiToken) => i.id)).toEqual([undefined, 1, 2]); + const items = wrapper.find(EuiBasicTable).props().items as ApiToken[]; + expect(items.map((i) => i.id)).toEqual([undefined, 1, 2]); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_history/components/ignored_queries_panel/ignored_queries_panel.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_history/components/ignored_queries_panel/ignored_queries_panel.test.tsx index 919e1e8706c945..8c1b4212040aaf 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_history/components/ignored_queries_panel/ignored_queries_panel.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/views/curations_history/components/ignored_queries_panel/ignored_queries_panel.test.tsx @@ -66,6 +66,7 @@ describe('IgnoredQueriesPanel', () => { }); it('show a query', () => { + // @ts-expect-error 4.3.5 upgrade const column = getColumn(0).render('test query'); expect(column).toEqual('test query'); }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/error_pages/components/no_data_layout.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/error_pages/components/no_data_layout.tsx index 8d867eeb74f86f..04b899e3cb886d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/error_pages/components/no_data_layout.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/error_pages/components/no_data_layout.tsx @@ -18,7 +18,7 @@ interface LayoutProps { export const NoDataLayout: React.FunctionComponent = withRouter< any, React.FunctionComponent ->(({ actionSection, title, modalClosePath, children }) => { +>(({ actionSection, title, modalClosePath, children }: React.PropsWithChildren) => { return ( diff --git a/x-pack/plugins/graph/public/components/field_manager/field_manager.test.tsx b/x-pack/plugins/graph/public/components/field_manager/field_manager.test.tsx index d582572862012a..be905cd67c9764 100644 --- a/x-pack/plugins/graph/public/components/field_manager/field_manager.test.tsx +++ b/x-pack/plugins/graph/public/components/field_manager/field_manager.test.tsx @@ -108,7 +108,7 @@ describe('field_manager', () => { ).toEqual(['field1', 'field2', 'field3']); act(() => { - getInstance().find(FieldPicker).dive().find(EuiSelectable).prop('onChange')([ + getInstance().find(FieldPicker).dive().find(EuiSelectable).prop('onChange')!([ { checked: 'on', label: 'field3' }, ]); }); diff --git a/x-pack/plugins/graph/public/state_management/fields.ts b/x-pack/plugins/graph/public/state_management/fields.ts index 34b1a74510e1a2..3e91f4c1fb58f4 100644 --- a/x-pack/plugins/graph/public/state_management/fields.ts +++ b/x-pack/plugins/graph/public/state_management/fields.ts @@ -84,8 +84,8 @@ export const updateSaveButtonSaga = ({ notifyReact }: GraphStoreDependencies) => * * Won't be necessary once the workspace is moved to redux */ -export const syncFieldsSaga = ({ getWorkspace }: GraphStoreDependencies) => { - function* syncFields() { +export const syncFieldsSaga = ({ getWorkspace }: GraphStoreDependencies): (() => Generator) => { + function* syncFields(): Generator { const workspace = getWorkspace(); if (!workspace) { return; diff --git a/x-pack/plugins/graph/public/state_management/persistence.ts b/x-pack/plugins/graph/public/state_management/persistence.ts index e3f106488571e1..27a635d25eeaf4 100644 --- a/x-pack/plugins/graph/public/state_management/persistence.ts +++ b/x-pack/plugins/graph/public/state_management/persistence.ts @@ -25,6 +25,7 @@ import { updateMetaData, metaDataSelector } from './meta_data'; import { openSaveModal, SaveWorkspaceHandler } from '../services/save_modal'; import { getEditPath } from '../services/url'; import { saveSavedWorkspace } from '../helpers/saved_workspace_utils'; +import type { IndexPattern } from '../../../../../src/plugins/data/public'; export interface LoadSavedWorkspacePayload { indexPatterns: IndexPatternSavedObject[]; @@ -49,7 +50,7 @@ export const loadingSaga = ({ notifications, indexPatternProvider, }: GraphStoreDependencies) => { - function* deserializeWorkspace(action: Action) { + function* deserializeWorkspace(action: Action): Generator { const { indexPatterns, savedWorkspace, urlQuery } = action.payload; const migrationStatus = migrateLegacyIndexPatternRef(savedWorkspace, indexPatterns); if (!migrationStatus.success) { @@ -65,8 +66,11 @@ export const loadingSaga = ({ } const selectedIndexPatternId = lookupIndexPatternId(savedWorkspace); - const indexPattern = yield call(indexPatternProvider.get, selectedIndexPatternId); - const initialSettings = settingsSelector(yield select()); + const indexPattern = (yield call( + indexPatternProvider.get, + selectedIndexPatternId + )) as IndexPattern; + const initialSettings = settingsSelector((yield select()) as GraphState); const createdWorkspace = createWorkspace(indexPattern.title, initialSettings); @@ -87,7 +91,7 @@ export const loadingSaga = ({ yield put( setDatasource({ type: 'indexpattern', - id: indexPattern.id, + id: indexPattern.id!, title: indexPattern.title, }) ); @@ -122,13 +126,13 @@ export const savingSaga = (deps: GraphStoreDependencies) => { return; } - const savedObjectId = yield cps(showModal, { + const savedObjectId = (yield cps(showModal, { deps, workspace, savedWorkspace, state, selectedDatasource, - }); + })) as string; if (savedObjectId) { yield put(updateMetaData({ savedObjectId })); } diff --git a/x-pack/plugins/graph/public/state_management/store.ts b/x-pack/plugins/graph/public/state_management/store.ts index ba9bff98b0ca90..b2b685f51573b6 100644 --- a/x-pack/plugins/graph/public/state_management/store.ts +++ b/x-pack/plugins/graph/public/state_management/store.ts @@ -83,7 +83,7 @@ function registerSagas(sagaMiddleware: SagaMiddleware, deps: GraphStoreD sagaMiddleware.run(submitSearchSaga(deps)); } -export const createGraphStore = (deps: GraphStoreDependencies) => { +export const createGraphStore = (deps: GraphStoreDependencies): Store => { const sagaMiddleware = createSagaMiddleware(); const rootReducer = createRootReducer(deps.addBasePath); diff --git a/x-pack/plugins/graph/public/state_management/workspace.ts b/x-pack/plugins/graph/public/state_management/workspace.ts index 9e8cca488e4ef8..48a428fd08b4cb 100644 --- a/x-pack/plugins/graph/public/state_management/workspace.ts +++ b/x-pack/plugins/graph/public/state_management/workspace.ts @@ -16,6 +16,7 @@ import { datasourceSelector } from './datasource'; import { liveResponseFieldsSelector, selectedFieldsSelector } from './fields'; import { fetchTopNodes } from '../services/fetch_top_nodes'; import { Workspace } from '../types'; +import type { ServerResultNode } from '../types'; const actionCreator = actionCreatorFactory('x-pack/graph/workspace'); @@ -52,21 +53,26 @@ export const fillWorkspaceSaga = ({ http, notifications, }: GraphStoreDependencies) => { - function* fetchNodes() { + function* fetchNodes(): Generator { try { const workspace = getWorkspace(); if (!workspace) { return; } - const state: GraphState = yield select(); + const state = (yield select()) as GraphState; const fields = selectedFieldsSelector(state); const datasource = datasourceSelector(state).current; if (datasource.type === 'none') { return; } - const topTermNodes = yield call(fetchTopNodes, http.post, datasource.title, fields); + const topTermNodes = (yield call( + fetchTopNodes, + http.post, + datasource.title, + fields + )) as ServerResultNode[]; workspace.mergeGraph({ nodes: topTermNodes, edges: [], diff --git a/x-pack/plugins/graph/public/types/app_state.ts b/x-pack/plugins/graph/public/types/app_state.ts index c2cbe16b62fb64..1ec21c4991a1bd 100644 --- a/x-pack/plugins/graph/public/types/app_state.ts +++ b/x-pack/plugins/graph/public/types/app_state.ts @@ -8,7 +8,7 @@ import { SimpleSavedObject } from 'src/core/public'; import { FontawesomeIcon } from '../helpers/style_choices'; import { OutlinkEncoder } from '../helpers/outlink_encoders'; -import { IndexPattern } from '../../../../../src/plugins/data/public'; +import type { IndexPattern } from '../../../../../src/plugins/data/public'; export interface UrlTemplate { url: string; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts index 2033ad53bf7b01..a650176f5f77cd 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts @@ -592,7 +592,5 @@ export const reducer = (state: State, action: Action): State => { isValid: action.value, }; } - default: - throw new Error(`Action "${action!.type}" not recognized.`); } }; diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx index 3dd092fa48b99b..485a104b3ff9d6 100644 --- a/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/criterion.tsx @@ -177,7 +177,7 @@ export const Criterion: React.FC = ({ value={criterion.field ?? 'a chosen field'} isActive={isFieldPopoverOpen} color={errors.field.length === 0 ? 'success' : 'danger'} - onClick={(e) => { + onClick={(e: React.MouseEvent) => { e.stopPropagation(); setIsFieldPopoverOpen(!isFieldPopoverOpen); }} @@ -185,7 +185,7 @@ export const Criterion: React.FC = ({ } isOpen={isFieldPopoverOpen} closePopover={() => setIsFieldPopoverOpen(false)} - onClick={(e) => e.stopPropagation()} + onClick={(e: React.MouseEvent) => e.stopPropagation()} ownFocus panelPaddingSize="s" anchorPosition="downLeft" @@ -230,7 +230,7 @@ export const Criterion: React.FC = ({ ? 'success' : 'danger' } - onClick={(e) => { + onClick={(e: React.MouseEvent) => { e.stopPropagation(); setIsComparatorPopoverOpen(!isComparatorPopoverOpen); }} diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx index 286fc5f769cad9..316249ec0fe3c8 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/loading_item_view.tsx @@ -43,7 +43,7 @@ const TIMESTAMP_FORMAT = { hour: 'numeric', minute: 'numeric', second: 'numeric', -}; +} as const; export class LogTextStreamLoadingItemView extends React.PureComponent< LogTextStreamLoadingItemViewProps, diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx index 5b437d3da69abe..097ec3d98e162b 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_create/pipelines_create.tsx @@ -6,7 +6,7 @@ */ import React, { useState, useEffect, useMemo } from 'react'; -import { RouteComponentProps } from 'react-router-dom'; +import { RouteComponentProps, useHistory } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiPageHeader, EuiButtonEmpty, EuiSpacer } from '@elastic/eui'; @@ -22,10 +22,14 @@ interface Props { sourcePipeline?: Pipeline; } +interface LocationState { + sourcePipeline?: Pipeline; +} + export const PipelinesCreate: React.FunctionComponent = ({ - history, sourcePipeline, }) => { + const history = useHistory(); const { services } = useKibana(); const [isSaving, setIsSaving] = useState(false); @@ -61,7 +65,7 @@ export const PipelinesCreate: React.FunctionComponent, getState: () => MapStoreState ) => { - const targetLayer = getLayerById(layerId, getState()); - if (!targetLayer || !('getFields' in targetLayer)) { + const targetLayer: ILayer | undefined = getLayerById(layerId, getState()); + if (!targetLayer) { return; } @@ -555,6 +555,10 @@ function updateStyleProperties(layerId: string, previousFields: IField[]) { return; } + if (!('getFields' in targetLayer)) { + return; + } + const nextFields = await (targetLayer as IVectorLayer).getFields(); // take into account all fields, since labels can be driven by any field (source or join) const { hasChanges, nextStyleDescriptor } = await ( style as IVectorStyle diff --git a/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx b/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx index bd178047b2251a..ff00ef958acdf3 100644 --- a/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx +++ b/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.tsx @@ -116,6 +116,8 @@ export class TooltipSelector extends Component { const prop: FieldProps | undefined = this.state.fieldProps.find((field: FieldProps) => { return field.name === propertyName; }); + + // @ts-expect-error 4.3.5 upgrade return prop ? prop!.label : propertyName; }; diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_geometry_filter_form.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_geometry_filter_form.tsx index d5ed944f7e7c8c..e42a5cc873c1c4 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_geometry_filter_form.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tooltip_control/features_tooltip/feature_geometry_filter_form.tsx @@ -98,7 +98,9 @@ export class FeatureGeometryFilterForm extends Component { // Ensure filter will not overflow URL. Filters that contain geometry can be extremely large. // No elasticsearch support for pre-indexed shapes and geo_point spatial queries. if ( - window.location.href.length + rison.encode(filter as RisonObject).length + META_OVERHEAD > + window.location.href.length + + rison.encode(filter as unknown as RisonObject).length + + META_OVERHEAD > URL_MAX_LENGTH ) { this.setState({ diff --git a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts index 85746298d4e51a..ac5602ddd830ff 100644 --- a/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts +++ b/x-pack/plugins/ml/server/lib/alerts/alerting_service.ts @@ -491,8 +491,7 @@ export function alertingServiceProvider( .filter((v) => v.doc_count > 0 && v[resultsLabel.aggGroupLabel].doc_count > 0) // Map response .map(formatter) - : // @ts-expect-error - [formatter(result as AggResultsResponse)] + : [formatter(result as unknown as AggResultsResponse)] ).filter(isDefined); }; diff --git a/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts b/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts index e853d5de5899d1..d4c3648d053255 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts +++ b/x-pack/plugins/ml/server/models/data_recognizer/data_recognizer.test.ts @@ -35,7 +35,7 @@ describe('ML - data recognizer', () => { } as unknown as SavedObjectsClientContract, { find: jest.fn() } as unknown as DataViewsService, {} as JobSavedObjectService, - { headers: { authorization: '' } } as KibanaRequest + { headers: { authorization: '' } } as unknown as KibanaRequest ); describe('jobOverrides', () => { diff --git a/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx index be8831860c9ec5..1afd36e406daf8 100644 --- a/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx +++ b/x-pack/plugins/osquery/public/routes/live_queries/new/index.tsx @@ -16,10 +16,14 @@ import { useRouterNavigate } from '../../../common/lib/kibana'; import { LiveQuery } from '../../../live_queries'; import { useBreadcrumbs } from '../../../common/hooks/use_breadcrumbs'; +interface LocationState { + form: Record; +} + const NewLiveQueryPageComponent = () => { useBreadcrumbs('live_query_new'); const { replace } = useHistory(); - const location = useLocation(); + const location = useLocation(); const liveQueryListProps = useRouterNavigate('live_queries'); const [initialFormData, setInitialFormData] = useState | undefined>({}); diff --git a/x-pack/plugins/reporting/public/lib/reporting_api_client/reporting_api_client.ts b/x-pack/plugins/reporting/public/lib/reporting_api_client/reporting_api_client.ts index c44427f3ca9e1c..178c4e5bc9fde5 100644 --- a/x-pack/plugins/reporting/public/lib/reporting_api_client/reporting_api_client.ts +++ b/x-pack/plugins/reporting/public/lib/reporting_api_client/reporting_api_client.ts @@ -69,11 +69,15 @@ interface IReportingAPI { } export class ReportingAPIClient implements IReportingAPI { + private http: HttpSetup; + constructor( - private http: HttpSetup, + http: HttpSetup, private uiSettings: IUiSettingsClient, private kibanaVersion: string - ) {} + ) { + this.http = http; + } public getKibanaAppHref(job: Job): string { const searchParams = stringify({ jobId: job.id }); diff --git a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.mock.ts b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.mock.ts index 323adcc7566746..63a159121e0091 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.mock.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_client/rule_data_client.mock.ts @@ -30,6 +30,7 @@ export const createRuleDataClientMock = ( kibanaVersion: '7.16.0', isWriteEnabled: jest.fn(() => true), + // @ts-ignore 4.3.5 upgrade getReader: jest.fn((_options?: { namespace?: string }) => ({ search, getDynamicIndexPattern, diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts index c65fdece6c5f04..fcddcab378bc6b 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts @@ -31,6 +31,7 @@ describe('createLifecycleExecutor', () => { it('wraps and unwraps the original executor state', async () => { const logger = loggerMock.create(); const ruleDataClientMock = createRuleDataClientMock(); + // @ts-ignore 4.3.5 upgrade - Expression produces a union type that is too complex to represent.ts(2590) const executor = createLifecycleExecutor( logger, ruleDataClientMock diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts index 3fa567b8aca962..2284ad5e796eec 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts @@ -276,6 +276,7 @@ describe('createLifecycleRuleTypeFactory', () => { return castArray(val); }); + // @ts-ignore 4.3.5 upgrade helpers.ruleDataClientMock.getReader().search.mockResolvedValueOnce({ hits: { hits: [{ fields: stored } as any], diff --git a/x-pack/plugins/security/public/management/users/edit_user/user_form.tsx b/x-pack/plugins/security/public/management/users/edit_user/user_form.tsx index b7c52361a33a1d..722f9a3f17f6d9 100644 --- a/x-pack/plugins/security/public/management/users/edit_user/user_form.tsx +++ b/x-pack/plugins/security/public/management/users/edit_user/user_form.tsx @@ -159,7 +159,7 @@ export const UserForm: FunctionComponent = ({ } else { try { const users = await getUsersThrottled(); - if (users.some((user) => user.username === values.username)) { + if (users?.some((user) => user.username === values.username)) { errors.username = i18n.translate( 'xpack.security.management.users.userForm.usernameTakenError', { diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts index 6e99db7e1ed0b2..4b04f15682777a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/trusted_apps.ts @@ -124,7 +124,7 @@ const EntriesSchema = schema.conditional( ) ); -const getTrustedAppForOsScheme = (forUpdateFlow: boolean = false) => +const getTrustedAppForOsScheme = () => schema.object({ name: schema.string({ minLength: 1, maxLength: 256 }), description: schema.maybe(schema.string({ minLength: 0, maxLength: 256, defaultValue: '' })), @@ -143,7 +143,7 @@ const getTrustedAppForOsScheme = (forUpdateFlow: boolean = false) => }), ]), entries: EntriesSchema, - ...(forUpdateFlow ? { version: schema.maybe(schema.string()) } : {}), + version: schema.maybe(schema.string()), }); export const PostTrustedAppCreateRequestSchema = { @@ -154,5 +154,5 @@ export const PutTrustedAppUpdateRequestSchema = { params: schema.object({ id: schema.string(), }), - body: getTrustedAppForOsScheme(true), + body: getTrustedAppForOsScheme(), }; diff --git a/x-pack/plugins/security_solution/cypress/tsconfig.json b/x-pack/plugins/security_solution/cypress/tsconfig.json index 6fdc868429138c..55ba3de5380608 100644 --- a/x-pack/plugins/security_solution/cypress/tsconfig.json +++ b/x-pack/plugins/security_solution/cypress/tsconfig.json @@ -15,7 +15,6 @@ "cypress-file-upload", "cypress-pipe", "node", - "resize-observer-polyfill", ], }, "references": [ diff --git a/x-pack/plugins/security_solution/public/common/mock/utils.ts b/x-pack/plugins/security_solution/public/common/mock/utils.ts index 0bafdc4fad1e8e..419bd2d9e7ee10 100644 --- a/x-pack/plugins/security_solution/public/common/mock/utils.ts +++ b/x-pack/plugins/security_solution/public/common/mock/utils.ts @@ -62,5 +62,5 @@ export const SUB_PLUGINS_REDUCER: SubPluginsInitReducer = { * These state's are wrapped in `Immutable`, but for compatibility with the overall app architecture, * they are cast to mutable versions here. */ - management: managementReducer as ManagementPluginReducer['management'], + management: managementReducer as unknown as ManagementPluginReducer['management'], }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx index d8c17f064d0169..e5381757670ea8 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/helpers.test.tsx @@ -35,7 +35,8 @@ import { import { getThreatMock } from '../../../../../common/detection_engine/schemas/types/threat.mock'; describe('rule helpers', () => { - // @ts-expect-error + // @ts-expect-error 4.3.5 upgrade - likely requires moment upgrade + // https://github.com/elastic/kibana/issues/120236 moment.suppressDeprecationWarnings = true; describe('getStepsData', () => { test('returns object with about, define, schedule and actions step properties formatted', () => { diff --git a/x-pack/plugins/security_solution/public/management/index.ts b/x-pack/plugins/security_solution/public/management/index.ts index 3e2c8b0ca2ec8f..4ca8adee5f9a88 100644 --- a/x-pack/plugins/security_solution/public/management/index.ts +++ b/x-pack/plugins/security_solution/public/management/index.ts @@ -53,7 +53,7 @@ export class Management { * Cast the ImmutableReducer to a regular reducer for compatibility with * the subplugin architecture (which expects plain redux reducers.) */ - reducer: { management: managementReducer } as ManagementPluginReducer, + reducer: { management: managementReducer } as unknown as ManagementPluginReducer, middleware: managementMiddlewareFactory(core, plugins), }, }; diff --git a/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts b/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts index b3289a510deef0..1ce268ee74a5ae 100644 --- a/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts +++ b/x-pack/plugins/security_solution/public/resolver/view/side_effect_simulator_factory.ts @@ -101,7 +101,14 @@ export const sideEffectSimulatorFactory: () => SideEffectSimulator = () => { */ simulateElementResize(target: Element, contentRect: DOMRect) { if (this.elements.has(target)) { - const entries: ResizeObserverEntry[] = [{ target, contentRect }]; + const entries: ResizeObserverEntry[] = [ + { + target, + contentRect, + borderBoxSize: [{ inlineSize: 0, blockSize: 0 }], + contentBoxSize: [{ inlineSize: 0, blockSize: 0 }], + }, + ]; this.callback(entries, this); } } diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/styles.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/styles.tsx index af05198ef9974e..feaad62b96e79c 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/styles.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/styles.tsx @@ -282,7 +282,7 @@ export const EventsTrSupplementContainer = styled.div.attrs(({ width }))``; export const EventsTrSupplement = styled.div.attrs(({ className = '' }) => ({ - className: `siemEventsTable__trSupplement ${className}`, + className: `siemEventsTable__trSupplement ${className}` as string, }))<{ className: string }>` font-size: ${({ theme }) => theme.eui.euiFontSizeXS}; line-height: ${({ theme }) => theme.eui.euiLineHeight}; @@ -410,7 +410,7 @@ export const EventsHeadingTitleSpan = styled.span.attrs(({ className }) => ({ `; export const EventsHeadingExtra = styled.div.attrs(({ className = '' }) => ({ - className: `siemEventsHeading__extra ${className}`, + className: `siemEventsHeading__extra ${className}` as string, }))` margin-left: auto; margin-right: 2px; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts index 0e436760a88ee6..0af6bceab26a53 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/query_signals_route.test.ts @@ -27,6 +27,7 @@ describe('query for signal', () => { server = serverMock.create(); ({ context } = requestContextMock.createTools()); + // @ts-expect-error 4.3.5 upgrade // eslint-disable-next-line @typescript-eslint/no-explicit-any ruleDataClient.getReader().search.mockResolvedValue(getEmptySignalsResponse() as any); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts index 8da9267daabacf..13106ec3012be4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/utils.test.ts @@ -17,7 +17,7 @@ import { ExceptionListClient } from '../../../../../lists/server'; import { getListArrayMock } from '../../../../common/detection_engine/schemas/types/lists.mock'; import { getExceptionListItemSchemaMock } from '../../../../../lists/common/schemas/response/exception_list_item_schema.mock'; -// @ts-expect-error +// @ts-expect-error 4.3.5 upgrade - likely requires moment upgrade moment.suppressDeprecationWarnings = true; import { diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts index 040ade4dad41ce..c10c63db62ee38 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/index.ts @@ -21,6 +21,17 @@ import { securitySolutionFactory } from './factory'; import { SecuritySolutionFactory } from './factory/types'; import { EndpointAppContext } from '../../endpoint/types'; +function isObj(req: unknown): req is Record { + return typeof req === 'object' && req !== null; +} +function assertValidRequestType( + req: unknown +): asserts req is StrategyRequestType & { factoryQueryType: FactoryQueryTypes } { + if (!isObj(req) || req.factoryQueryType == null) { + throw new Error('factoryQueryType is required'); + } +} + export const securitySolutionSearchStrategyProvider = ( data: PluginStart, endpointContext: EndpointAppContext @@ -29,9 +40,8 @@ export const securitySolutionSearchStrategyProvider = { - if (request.factoryQueryType == null) { - throw new Error('factoryQueryType is required'); - } + assertValidRequestType(request); + const queryFactory: SecuritySolutionFactory = securitySolutionFactory[request.factoryQueryType]; const dsl = queryFactory.buildDsl(request); diff --git a/x-pack/plugins/timelines/public/components/t_grid/styles.tsx b/x-pack/plugins/timelines/public/components/t_grid/styles.tsx index 9f957e2c619101..ceb19837c434d7 100644 --- a/x-pack/plugins/timelines/public/components/t_grid/styles.tsx +++ b/x-pack/plugins/timelines/public/components/t_grid/styles.tsx @@ -281,7 +281,7 @@ export const EventsTrSupplementContainer = styled.div.attrs(({ width }))``; export const EventsTrSupplement = styled.div.attrs(({ className = '' }) => ({ - className: `siemEventsTable__trSupplement ${className}`, + className: `siemEventsTable__trSupplement ${className}` as string, }))<{ className: string }>` font-size: ${({ theme }) => theme.eui.euiFontSizeXS}; line-height: ${({ theme }) => theme.eui.euiLineHeight}; @@ -409,7 +409,7 @@ export const EventsHeadingTitleSpan = styled.span.attrs(({ className }) => ({ `; export const EventsHeadingExtra = styled.div.attrs(({ className = '' }) => ({ - className: `siemEventsHeading__extra ${className}`, + className: `siemEventsHeading__extra ${className}` as string, }))` margin-left: auto; margin-right: 2px; diff --git a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts index 8532e2e4eece42..90adfdfa8fced7 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.test.ts @@ -8,7 +8,7 @@ import { KibanaRequest } from 'src/core/server'; import { loggingSystemMock, httpServerMock } from 'src/core/server/mocks'; import { securityMock } from '../../../../security/server/mocks'; -import { ReindexSavedObject } from '../../../common/types'; +import { ReindexStep, ReindexStatus, ReindexSavedObject } from '../../../common/types'; import { credentialStoreFactory } from './credential_store'; const basicAuthHeader = 'Basic abc'; @@ -25,7 +25,19 @@ const securityStartMock = securityMock.createStart(); const reindexOpMock = { id: 'asdf', - attributes: { indexName: 'test', lastCompletedStep: 1, locked: null }, + type: 'type', + references: [], + attributes: { + indexName: 'test', + newIndexName: 'new-index', + status: ReindexStatus.inProgress, + lastCompletedStep: ReindexStep.created, + locked: null, + reindexTaskId: null, + reindexTaskPercComplete: null, + errorMessage: null, + runningReindexCount: null, + }, } as ReindexSavedObject; describe('credentialStore', () => { @@ -52,7 +64,7 @@ describe('credentialStore', () => { security: securityStartMock, }); - reindexOpMock.attributes.lastCompletedStep = 0; + reindexOpMock.attributes.lastCompletedStep = ReindexStep.readonly; expect(credStore.get(reindexOpMock)).toBeUndefined(); }); diff --git a/x-pack/plugins/uptime/public/components/overview/monitor_list/use_monitor_histogram.ts b/x-pack/plugins/uptime/public/components/overview/monitor_list/use_monitor_histogram.ts index 8f500f54cf4bad..82299825b4154b 100644 --- a/x-pack/plugins/uptime/public/components/overview/monitor_list/use_monitor_histogram.ts +++ b/x-pack/plugins/uptime/public/components/overview/monitor_list/use_monitor_histogram.ts @@ -46,6 +46,7 @@ export const useMonitorHistogram = ({ items }: { items: MonitorSummary[] }) => { ); const histogramBuckets = data?.aggregations?.histogram.buckets ?? []; + // @ts-ignore 4.3.5 upgrade const simplified = histogramBuckets.map((histogramBucket) => { const byId: { [key: string]: number } = {}; histogramBucket.by_id.buckets.forEach((idBucket) => { diff --git a/x-pack/plugins/uptime/public/state/alerts/alerts.ts b/x-pack/plugins/uptime/public/state/alerts/alerts.ts index cc934a8c68d8b1..a86de3ac02b83a 100644 --- a/x-pack/plugins/uptime/public/state/alerts/alerts.ts +++ b/x-pack/plugins/uptime/public/state/alerts/alerts.ts @@ -10,7 +10,7 @@ import { handleActions, Action } from 'redux-actions'; import { call, put, select, takeLatest } from 'redux-saga/effects'; import { createAsyncAction } from '../actions/utils'; import { asyncInitState, handleAsyncAction } from '../reducers/utils'; -import { AppState } from '../index'; +import type { AppState } from '../../state'; import { AsyncInitState } from '../reducers/types'; import { fetchEffectFactory } from '../effects/fetch_effect'; import { @@ -110,7 +110,7 @@ export function* fetchAlertsEffect() { yield call(disableAlertById, action.payload); yield put(deleteAnomalyAlertAction.success(action.payload.alertId)); showAlertDisabledSuccess(); - const monitorId = yield select(monitorIdSelector); + const monitorId = (yield select(monitorIdSelector)) as AppState['ui']['monitorId']; yield put(getAnomalyAlertAction.get({ monitorId })); } catch (err) { showAlertDisabledFailed(err); @@ -145,9 +145,9 @@ export function* fetchAlertsEffect() { getMonitorAlertsAction.fail ) ); - yield takeLatest(createAlertAction.get, function* (action: Action) { + yield takeLatest(createAlertAction.get, function* (action: Action): Generator { try { - const response = yield call(createAlert, action.payload); + const response = (yield call(createAlert, action.payload)) as Alert; yield put(createAlertAction.success(response)); kibanaService.core.notifications.toasts.addSuccess( diff --git a/x-pack/plugins/uptime/public/state/effects/alerts.ts b/x-pack/plugins/uptime/public/state/effects/alerts.ts index c63c6c4bdb120c..4463a55b1744a5 100644 --- a/x-pack/plugins/uptime/public/state/effects/alerts.ts +++ b/x-pack/plugins/uptime/public/state/effects/alerts.ts @@ -5,8 +5,9 @@ * 2.0. */ -import { Action } from 'redux-actions'; +import type { Action } from 'redux-actions'; import { call, put, takeLatest, select } from 'redux-saga/effects'; + import { fetchEffectFactory } from './fetch_effect'; import { deleteAlertAction, getExistingAlertAction } from '../actions/alerts'; import { disableAlertById, fetchAlertRecords } from '../api/alerts'; @@ -23,18 +24,21 @@ export function* fetchAlertsEffect() { ) ); - yield takeLatest(String(deleteAlertAction.get), function* (action: Action<{ alertId: string }>) { - try { - const response = yield call(disableAlertById, action.payload); - yield put(deleteAlertAction.success(response)); - kibanaService.core.notifications.toasts.addSuccess('Alert successfully deleted!'); - const monitorId = yield select(monitorIdSelector); - yield put(getExistingAlertAction.get({ monitorId })); - } catch (err) { - kibanaService.core.notifications.toasts.addError(err, { - title: 'Alert cannot be deleted', - }); - yield put(deleteAlertAction.fail(err)); + yield takeLatest( + String(deleteAlertAction.get), + function* (action: Action<{ alertId: string }>): Generator { + try { + const response = yield call(disableAlertById, action.payload); + yield put(deleteAlertAction.success(response)); + kibanaService.core.notifications.toasts.addSuccess('Alert successfully deleted!'); + const monitorId = (yield select(monitorIdSelector)) as ReturnType; + yield put(getExistingAlertAction.get({ monitorId })); + } catch (err) { + kibanaService.core.notifications.toasts.addError(err, { + title: 'Alert cannot be deleted', + }); + yield put(deleteAlertAction.fail(err)); + } } - }); + ); } diff --git a/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts b/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts index 250873b90f1a06..4fbd60f7929ce7 100644 --- a/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts +++ b/x-pack/plugins/uptime/public/state/effects/fetch_effect.ts @@ -25,7 +25,7 @@ export function fetchEffectFactory( success: (response: R) => Action, fail: (error: IHttpFetchError) => Action ) { - return function* (action: Action) { + return function* (action: Action): Generator { try { const response = yield call(fetch, action.payload); if (response instanceof Error) { @@ -34,7 +34,7 @@ export function fetchEffectFactory( yield put(fail(response as IHttpFetchError)); } else { - yield put(success(response)); + yield put(success(response as R)); } } catch (error) { // eslint-disable-next-line no-console diff --git a/x-pack/plugins/uptime/public/state/effects/journey.ts b/x-pack/plugins/uptime/public/state/effects/journey.ts index 8d33179bde402b..8898eb0e5c5219 100644 --- a/x-pack/plugins/uptime/public/state/effects/journey.ts +++ b/x-pack/plugins/uptime/public/state/effects/journey.ts @@ -14,11 +14,15 @@ import { FetchJourneyStepsParams, } from '../actions/journey'; import { fetchJourneySteps } from '../api/journey'; +import type { SyntheticsJourneyApiResponse } from '../../../common/runtime_types'; -export function* fetchJourneyStepsEffect() { +export function* fetchJourneyStepsEffect(): Generator { yield takeLatest(getJourneySteps, function* (action: Action) { try { - const response = yield call(fetchJourneySteps, action.payload); + const response = (yield call( + fetchJourneySteps, + action.payload + )) as SyntheticsJourneyApiResponse; yield put(getJourneyStepsSuccess(response)); } catch (e) { yield put(getJourneyStepsFail({ checkGroup: action.payload.checkGroup, error: e })); diff --git a/x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts b/x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts index 6b2fa92a63b083..00c911e001fb3a 100644 --- a/x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts +++ b/x-pack/plugins/uptime/public/state/effects/ml_anomaly.ts @@ -22,8 +22,9 @@ import { deleteMLJob, getMLCapabilities, } from '../api/ml_anomaly'; -import { MonitorIdParam } from '../actions/types'; +import type { MonitorIdParam, DeleteJobResults } from '../actions/types'; import { anomalyAlertSelector, deleteAlertAction } from '../alerts/alerts'; +import type { AppState } from '../../state'; export function* fetchMLJobEffect() { yield takeLatest( @@ -43,20 +44,25 @@ export function* fetchMLJobEffect() { ) ); - yield takeLatest(String(deleteMLJobAction.get), function* (action: Action) { - try { - const response = yield call(deleteMLJob, action.payload); - yield put(deleteMLJobAction.success(response)); + yield takeLatest( + String(deleteMLJobAction.get), + function* (action: Action): Generator { + try { + const response = (yield call(deleteMLJob, action.payload)) as DeleteJobResults; + yield put(deleteMLJobAction.success(response)); - // let's delete alert as well if it's there - const { data: anomalyAlert } = yield select(anomalyAlertSelector); - if (anomalyAlert) { - yield put(deleteAlertAction.get({ alertId: anomalyAlert.id as string })); + // let's delete alert as well if it's there + const { data: anomalyAlert } = (yield select( + anomalyAlertSelector + )) as AppState['alerts']['anomalyAlert']; + if (anomalyAlert) { + yield put(deleteAlertAction.get({ alertId: anomalyAlert.id })); + } + } catch (err) { + yield put(deleteMLJobAction.fail(err)); } - } catch (err) { - yield put(deleteMLJobAction.fail(err)); } - }); + ); yield takeLatest( getMLCapabilitiesAction.get, diff --git a/x-pack/plugins/uptime/public/state/effects/network_events.ts b/x-pack/plugins/uptime/public/state/effects/network_events.ts index cad76dd059c011..75ea3d4467eb49 100644 --- a/x-pack/plugins/uptime/public/state/effects/network_events.ts +++ b/x-pack/plugins/uptime/public/state/effects/network_events.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { Action } from 'redux-actions'; +import type { Action } from 'redux-actions'; import { call, put, takeLatest } from 'redux-saga/effects'; import { getNetworkEvents, @@ -14,27 +14,34 @@ import { FetchNetworkEventsParams, } from '../actions/network_events'; import { fetchNetworkEvents } from '../api/network_events'; +import type { SyntheticsNetworkEventsApiResponse } from '../../../common/runtime_types'; export function* fetchNetworkEventsEffect() { - yield takeLatest(getNetworkEvents, function* (action: Action) { - try { - const response = yield call(fetchNetworkEvents, action.payload); + yield takeLatest( + getNetworkEvents, + function* (action: Action): Generator { + try { + const response = (yield call( + fetchNetworkEvents, + action.payload + )) as SyntheticsNetworkEventsApiResponse; - yield put( - getNetworkEventsSuccess({ - checkGroup: action.payload.checkGroup, - stepIndex: action.payload.stepIndex, - ...response, - }) - ); - } catch (e) { - yield put( - getNetworkEventsFail({ - checkGroup: action.payload.checkGroup, - stepIndex: action.payload.stepIndex, - error: e, - }) - ); + yield put( + getNetworkEventsSuccess({ + checkGroup: action.payload.checkGroup, + stepIndex: action.payload.stepIndex, + ...response, + }) + ); + } catch (e) { + yield put( + getNetworkEventsFail({ + checkGroup: action.payload.checkGroup, + stepIndex: action.payload.stepIndex, + error: e, + }) + ); + } } - }); + ); } diff --git a/x-pack/plugins/uptime/public/state/index.ts b/x-pack/plugins/uptime/public/state/index.ts index 61b1a5f9d9527e..506051b95fd5a1 100644 --- a/x-pack/plugins/uptime/public/state/index.ts +++ b/x-pack/plugins/uptime/public/state/index.ts @@ -6,6 +6,7 @@ */ import { createStore, applyMiddleware } from 'redux'; +import type { Store } from 'redux'; import { composeWithDevTools } from 'redux-devtools-extension'; import createSagaMiddleware from 'redux-saga'; import { rootEffect } from './effects'; @@ -15,6 +16,6 @@ export type AppState = ReturnType; const sagaMW = createSagaMiddleware(); -export const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(sagaMW))); +export const store: Store = createStore(rootReducer, composeWithDevTools(applyMiddleware(sagaMW))); sagaMW.run(rootEffect); diff --git a/x-pack/plugins/uptime/public/state/selectors/index.ts b/x-pack/plugins/uptime/public/state/selectors/index.ts index c0da9389f13af5..db18cbb9e114fc 100644 --- a/x-pack/plugins/uptime/public/state/selectors/index.ts +++ b/x-pack/plugins/uptime/public/state/selectors/index.ts @@ -6,7 +6,7 @@ */ import { createSelector } from 'reselect'; -import { AppState } from '../../state'; +import type { AppState } from '../../state'; // UI Selectors export const getBasePath = ({ ui: { basePath } }: AppState) => basePath; diff --git a/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts b/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts index 81a1e6ba7ca7ae..4fe7e94803fd76 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_monitor_status.ts @@ -189,6 +189,7 @@ export const getMonitorStatus: UMElasticsearchQueryFn< monitors = monitors.concat(monitorRes); } while (afterKey !== undefined); + // @ts-ignore 4.3.5 upgrade - Expression produces a union type that is too complex to represent.ts(2590) return monitors .filter((monitor) => monitor?.doc_count >= numTimes) .map(({ key, doc_count: count, fields }) => ({ diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.test.ts b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.test.ts index 22f714e408a1c4..f62c31b10e4592 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.test.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.test.ts @@ -217,4 +217,42 @@ describe('getPingHistogram', () => { expect(mockEsClient.search).toHaveBeenCalledTimes(1); expect(result).toMatchSnapshot(); }); + + it('returns an empty array if agg buckets are undefined', async () => { + const { esClient: mockEsClient, uptimeEsClient } = getUptimeESMockClient(); + + mockEsClient.search.mockResolvedValueOnce({ + body: { + aggregations: { + timeseries: { + buckets: undefined, + interval: '1m', + }, + }, + }, + } as any); + + const result = await getPingHistogram({ uptimeEsClient, dateStart: 'now-15m', dateEnd: 'now' }); + + expect(result.histogram).toEqual([]); + }); + + it('returns an empty array if agg buckets are empty', async () => { + const { esClient: mockEsClient, uptimeEsClient } = getUptimeESMockClient(); + + mockEsClient.search.mockResolvedValueOnce({ + body: { + aggregations: { + timeseries: { + buckets: [], + interval: '1m', + }, + }, + }, + } as any); + + const result = await getPingHistogram({ uptimeEsClient, dateStart: 'now-15m', dateEnd: 'now' }); + + expect(result.histogram).toEqual([]); + }); }); diff --git a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts index 600a335effe2ce..139ac8bad417cb 100644 --- a/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts +++ b/x-pack/plugins/uptime/server/lib/requests/get_ping_histogram.ts @@ -90,7 +90,7 @@ export const getPingHistogram: UMElasticsearchQueryFn { + const histogram = buckets.map((bucket: Pick) => { const x: number = bucket.key; const downCount = bucket.down.value || 0; const upCount = bucket.up.value || 0; diff --git a/x-pack/test/functional/services/observability/users.ts b/x-pack/test/functional/services/observability/users.ts index 7cb98603548ba5..ac2fc8ddd324e2 100644 --- a/x-pack/test/functional/services/observability/users.ts +++ b/x-pack/test/functional/services/observability/users.ts @@ -96,7 +96,6 @@ const defineBasicObservabilityRole = ( { spaces: ['*'], base: [], - // @ts-expect-error TypeScript doesn't distinguish between missing and // undefined props yet feature: features, }, diff --git a/yarn.lock b/yarn.lock index 7a1afe15ddd33d..ca0569e44007ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1477,14 +1477,6 @@ dependencies: tslib "^2.0.0" -"@dsherret/to-absolute-glob@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@dsherret/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1f6475dc8bd974cea07a2daf3864b317b1dd332c" - integrity sha1-H2R13IvZdM6gei2vOGSzF7HdMyw= - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - "@elastic/apm-rum-core@^5.12.1": version "5.12.1" resolved "https://registry.yarnpkg.com/@elastic/apm-rum-core/-/apm-rum-core-5.12.1.tgz#ad78787876c68b9ce718d1c42b8e7b12b12eaa69" @@ -4950,17 +4942,15 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== -"@ts-morph/common@~0.7.0": - version "0.7.3" - resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.7.3.tgz#380020c278e4aa6cecedf362a1157591d1003267" - integrity sha512-M6Tcu0EZDLL8Ht7WAYz7yJfDZ9eArhqR8XZ9Mk3q8jwU6MKFAttrw3JtW4JhneqTz7pZMv4XaimEdXI0E4K4rg== +"@ts-morph/common@~0.10.1": + version "0.10.1" + resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.10.1.tgz#be15b9ab13a32bbc1f6a6bd7dc056b2247b272eb" + integrity sha512-rKN/VtZUUlW4M+6vjLFSaFc1Z9sK+1hh0832ucPtPkXqOw/mSWE80Lau4z2zTPNTqtxAjfZbvKpQcEwJy0KIEg== dependencies: - "@dsherret/to-absolute-glob" "^2.0.2" - fast-glob "^3.2.4" - is-negated-glob "^1.0.0" + fast-glob "^3.2.5" + minimatch "^3.0.4" mkdirp "^1.0.4" - multimatch "^5.0.0" - typescript "~4.1.2" + path-browserify "^1.0.1" "@tsconfig/node10@^1.0.7": version "1.0.8" @@ -5626,11 +5616,16 @@ resolved "https://registry.yarnpkg.com/@types/he/-/he-1.1.1.tgz#19e14033c4ee8f1a702c74dcc6182664839ac2b7" integrity sha512-jpzrsR1ns0n3kyWt92QfOUQhIuJGQ9+QGa7M62rO6toe98woQjnsnzjdMtsQXCdvjjmqjS2ZBCC7xKw0cdzU+Q== -"@types/history@*", "@types/history@^4.7.3": +"@types/history@*": version "4.7.3" resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.3.tgz#856c99cdc1551d22c22b18b5402719affec9839a" integrity sha512-cS5owqtwzLN5kY+l+KgKdRJ/Cee8tlmQoGQuIE9tWnSmS3JMKzmxo2HIAk2wODMifGwO20d62xZQLYz+RLfXmw== +"@types/history@^4.7.9": + version "4.7.9" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.9.tgz#1cfb6d60ef3822c589f18e70f8b12f9a28ce8724" + integrity sha512-MUc6zSmU3tEVnkQ78q0peeEjKWPUADMlC/t++2bI8WnAG2tvYRPIgHG8lWkXwqc8MsUF6Z2MOf+Mh5sazOmhiQ== + "@types/hjson@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/hjson/-/hjson-2.4.2.tgz#fd0288a5b6778cda993c978e43cc978ddc8f22e9" @@ -13699,17 +13694,16 @@ fast-glob@2.2.7, fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" -fast-glob@3.2.5, fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.2, fast-glob@^3.2.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== +fast-glob@3.2.7, fast-glob@^3.0.3, fast-glob@^3.1.1, fast-glob@^3.2.2, fast-glob@^3.2.4, fast-glob@^3.2.5: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" + glob-parent "^5.1.2" merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" + micromatch "^4.0.4" fast-json-parse@^1.0.3: version "1.0.3" @@ -14751,7 +14745,7 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-parent@^5.1.0, glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: +glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -20022,17 +20016,6 @@ multimatch@^4.0.0: arrify "^2.0.1" minimatch "^3.0.4" -multimatch@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" - integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - multiparty@^4.1.2: version "4.2.1" resolved "https://registry.yarnpkg.com/multiparty/-/multiparty-4.2.1.tgz#d9b6c46d8b8deab1ee70c734b0af771dd46e0b13" @@ -21495,6 +21478,11 @@ path-browserify@0.0.1, path-browserify@~0.0.0: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== +path-browserify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" + integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== + path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -27509,13 +27497,12 @@ ts-loader@^7.0.5: micromatch "^4.0.0" semver "^6.0.0" -ts-morph@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-9.1.0.tgz#10d2088387c71f3c674f82492a3cec1e3538f0dd" - integrity sha512-sei4u651MBenr27sD6qLDXN3gZ4thiX71E3qV7SuVtDas0uvK2LtgZkIYUf9DKm/fLJ6AB/+yhRJ1vpEBJgy7Q== +ts-morph@^11.0.0: + version "11.0.3" + resolved "https://registry.yarnpkg.com/ts-morph/-/ts-morph-11.0.3.tgz#01a92b3c2b5a48ccdf318ec90864229b8061d056" + integrity sha512-ymuPkndv9rzqTLiHWMkVrFXWcN4nBiBGhRP/kTC9F5amAAl7BNLfyrsTzMD1o9A0zishKoF1KQT/0yyFhJnPgA== dependencies: - "@dsherret/to-absolute-glob" "^2.0.2" - "@ts-morph/common" "~0.7.0" + "@ts-morph/common" "~0.10.1" code-block-writer "^10.1.1" ts-node@^10.2.1: @@ -27737,10 +27724,10 @@ typescript-tuple@^2.2.1: dependencies: typescript-compare "^0.0.2" -typescript@4.1.3, typescript@^3.3.3333, typescript@^3.5.3, typescript@^4.3.5, typescript@~4.1.2, typescript@~4.4.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.3.tgz#519d582bd94cba0cf8934c7d8e8467e473f53bb7" - integrity sha512-B3ZIOf1IKeH2ixgHhj6la6xdwR9QrLC5d1VKeCSY4tvkqhF2eqd9O7txNlS0PO3GrBAFIdr3L1ndNwteUbZLYg== +typescript@4.3.5, typescript@^3.3.3333, typescript@^3.5.3, typescript@^4.3.5, typescript@~4.4.2: + version "4.3.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" + integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== ua-parser-js@^0.7.18: version "0.7.24" From 1b38b8ea1516d996432e9a280e455ef8d0d2fbd0 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 3 Dec 2021 02:48:51 +0000 Subject: [PATCH 081/126] chore(NA): splits types from code on @kbn/config (#120267) --- package.json | 1 + packages/BUILD.bazel | 1 + packages/kbn-cli-dev-mode/BUILD.bazel | 2 +- packages/kbn-config/BUILD.bazel | 26 ++++++++++++++++++++++---- packages/kbn-config/package.json | 1 - packages/kbn-docs-utils/BUILD.bazel | 2 +- packages/kbn-optimizer/BUILD.bazel | 4 +++- yarn.lock | 4 ++++ 8 files changed, 33 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 06e338ab87ca76..a6dfd03893c814 100644 --- a/package.json +++ b/package.json @@ -561,6 +561,7 @@ "@types/kbn__apm-config-loader": "link:bazel-bin/packages/kbn-apm-config-loader/npm_module_types", "@types/kbn__apm-utils": "link:bazel-bin/packages/kbn-apm-utils/npm_module_types", "@types/kbn__cli-dev-mode": "link:bazel-bin/packages/kbn-cli-dev-mode/npm_module_types", + "@types/kbn__config": "link:bazel-bin/packages/kbn-config/npm_module_types", "@types/kbn__i18n": "link:bazel-bin/packages/kbn-i18n/npm_module_types", "@types/kbn__i18n-react": "link:bazel-bin/packages/kbn-i18n-react/npm_module_types", "@types/license-checker": "15.0.0", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 9e124cf63a391e..8208496f7d8000 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -83,6 +83,7 @@ filegroup( "//packages/kbn-apm-config-loader:build_types", "//packages/kbn-apm-utils:build_types", "//packages/kbn-cli-dev-mode:build_types", + "//packages/kbn-config:build_types", "//packages/kbn-i18n:build_types", "//packages/kbn-i18n-react:build_types", ], diff --git a/packages/kbn-cli-dev-mode/BUILD.bazel b/packages/kbn-cli-dev-mode/BUILD.bazel index 686866ce7bc883..c6611e71e35ab9 100644 --- a/packages/kbn-cli-dev-mode/BUILD.bazel +++ b/packages/kbn-cli-dev-mode/BUILD.bazel @@ -48,7 +48,7 @@ RUNTIME_DEPS = [ ] TYPES_DEPS = [ - "//packages/kbn-config", + "//packages/kbn-config:npm_module_types", "//packages/kbn-config-schema", "//packages/kbn-dev-utils", "//packages/kbn-logging", diff --git a/packages/kbn-config/BUILD.bazel b/packages/kbn-config/BUILD.bazel index 061b8306bcc6f2..c0b75ab491ac04 100644 --- a/packages/kbn-config/BUILD.bazel +++ b/packages/kbn-config/BUILD.bazel @@ -1,9 +1,10 @@ -load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project") -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") -load("//src/dev/bazel:index.bzl", "jsts_transpiler") +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") PKG_BASE_NAME = "kbn-config" PKG_REQUIRE_NAME = "@kbn/config" +TYPES_PKG_REQUIRE_NAME = "@types/kbn__config" SOURCE_FILES = glob( [ @@ -91,7 +92,7 @@ ts_project( js_library( name = PKG_BASE_NAME, srcs = NPM_MODULE_EXTRA_FILES, - deps = RUNTIME_DEPS + [":target_node", ":tsc_types"], + deps = RUNTIME_DEPS + [":target_node"], package_name = PKG_REQUIRE_NAME, visibility = ["//visibility:public"], ) @@ -110,3 +111,20 @@ filegroup( ], visibility = ["//visibility:public"], ) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = TYPES_PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [ + ":npm_module_types", + ], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-config/package.json b/packages/kbn-config/package.json index e30db61ae0c28c..012b39d733a78e 100644 --- a/packages/kbn-config/package.json +++ b/packages/kbn-config/package.json @@ -1,7 +1,6 @@ { "name": "@kbn/config", "main": "./target_node/index.js", - "types": "./target_types/index.d.ts", "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", "private": true diff --git a/packages/kbn-docs-utils/BUILD.bazel b/packages/kbn-docs-utils/BUILD.bazel index ab018a0ab73b0d..6bb37b3500152b 100644 --- a/packages/kbn-docs-utils/BUILD.bazel +++ b/packages/kbn-docs-utils/BUILD.bazel @@ -36,7 +36,7 @@ RUNTIME_DEPS = [ ] TYPES_DEPS = [ - "//packages/kbn-config", + "//packages/kbn-config:npm_module_types", "//packages/kbn-dev-utils", "//packages/kbn-utils", "@npm//ts-morph", diff --git a/packages/kbn-optimizer/BUILD.bazel b/packages/kbn-optimizer/BUILD.bazel index 647fcdfcbaad32..cc03c810707453 100644 --- a/packages/kbn-optimizer/BUILD.bazel +++ b/packages/kbn-optimizer/BUILD.bazel @@ -46,6 +46,7 @@ RUNTIME_DEPS = [ "@npm//execa", "@npm//jest-diff", "@npm//json-stable-stringify", + "@npm//js-yaml", "@npm//lmdb-store", "@npm//loader-utils", "@npm//node-sass", @@ -61,7 +62,7 @@ RUNTIME_DEPS = [ ] TYPES_DEPS = [ - "//packages/kbn-config", + "//packages/kbn-config:npm_module_types", "//packages/kbn-config-schema", "//packages/kbn-dev-utils", "//packages/kbn-std", @@ -81,6 +82,7 @@ TYPES_DEPS = [ "@npm//@types/compression-webpack-plugin", "@npm//@types/jest", "@npm//@types/json-stable-stringify", + "@npm//@types/js-yaml", "@npm//@types/loader-utils", "@npm//@types/node", "@npm//@types/normalize-path", diff --git a/yarn.lock b/yarn.lock index ca0569e44007ba..9472271c20998d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5824,6 +5824,10 @@ version "0.0.0" uid "" +"@types/kbn__config@link:bazel-bin/packages/kbn-config/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__i18n-react@link:bazel-bin/packages/kbn-i18n-react/npm_module_types": version "0.0.0" uid "" From 31042342d61dfc3e778e9217eefd589c795f903c Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 2 Dec 2021 21:14:13 -0700 Subject: [PATCH 082/126] [jest] restore integration test running x-pack (#120252) --- jest.config.integration.js | 16 +++++++++++++++- .../get_searchable_types.test.ts | 3 ++- .../managed_configuration.test.ts | 3 ++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/jest.config.integration.js b/jest.config.integration.js index e2b2afaa715ee2..a2ac498986c08f 100644 --- a/jest.config.integration.js +++ b/jest.config.integration.js @@ -6,8 +6,22 @@ * Side Public License, v 1. */ +const Fs = require('fs'); +const Path = require('path'); + module.exports = { preset: '@kbn/test/jest_integration', rootDir: '.', - roots: ['/src', '/packages'], + roots: [ + '/src', + '/packages', + ...Fs.readdirSync(Path.resolve(__dirname, 'x-pack')).flatMap((name) => { + // create roots for all x-pack/* dirs except for test + if (name !== 'test' && Fs.statSync(Path.resolve(__dirname, 'x-pack', name)).isDirectory()) { + return [`/x-pack/${name}`]; + } + + return []; + }), + ], }; diff --git a/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts b/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts index d1a9f692c2e9fb..b8224d9a30d086 100644 --- a/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts +++ b/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts @@ -14,7 +14,8 @@ import { registerInternalSearchableTypesRoute } from '../get_searchable_types'; type SetupServerReturn = UnwrapPromise>; const pluginId = Symbol('globalSearch'); -describe('GET /internal/global_search/searchable_types', () => { +// FAILING: https://github.com/elastic/kibana/issues/120268 +describe.skip('GET /internal/global_search/searchable_types', () => { let server: SetupServerReturn['server']; let httpSetup: SetupServerReturn['httpSetup']; let globalSearchHandlerContext: ReturnType< diff --git a/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts b/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts index 271d24d73357b0..3442e69aab44a6 100644 --- a/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts +++ b/x-pack/plugins/task_manager/server/integration_tests/managed_configuration.test.ts @@ -16,7 +16,8 @@ import { TaskManagerPlugin, TaskManagerStartContract } from '../plugin'; import { coreMock } from '../../../../../src/core/server/mocks'; import { TaskManagerConfig } from '../config'; -describe('managed configuration', () => { +// FAILING: https://github.com/elastic/kibana/issues/120269 +describe.skip('managed configuration', () => { let taskManagerStart: TaskManagerStartContract; let logger: Logger; From 3ede8c4a8b09578b54d37f1e694bee58521be557 Mon Sep 17 00:00:00 2001 From: Peter Dyson Date: Fri, 3 Dec 2021 15:53:25 +1000 Subject: [PATCH 083/126] [DOCS] document missing enabledActionTypes value for Microsoft Teams action (#113211) * [DOCS] document missing value for Microsoft Teams action [DOCS] document missing value for Microsoft Teams action for xpack.actions.enabledActionTypes config. eg: xpack.actions.enabledActionTypes: ['.email','.teams'] * include the full list of possible values * Update docs/settings/alert-action-settings.asciidoc LGTM Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> * commit using @elastic.co Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- docs/settings/alert-action-settings.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 66e23686e14e04..f0c22ebf8b7304 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -126,7 +126,7 @@ into a single string. This configuration can be used for environments where the files cannot be made available. `xpack.actions.enabledActionTypes` {ess-icon}:: -A list of action types that are enabled. It defaults to `[*]`, enabling all types. The names for built-in {kib} action types are prefixed with a `.` and include: `.server-log`, `.slack`, `.email`, `.index`, `.pagerduty`, and `.webhook`. An empty list `[]` will disable all action types. +A list of action types that are enabled. It defaults to `[*]`, enabling all types. The names for built-in {kib} action types are prefixed with a `.` and include: `.email`, `.index`, `.jira`, `.pagerduty`, `.resilient`, `.server-log`, `.servicenow`, .`servicenow-itom`, `.servicenow-sir`, `.slack`, `.swimlane`, `.teams`, and `.webhook`. An empty list `[]` will disable all action types. + Disabled action types will not appear as an option when creating new connectors, but existing connectors and actions of that type will remain in {kib} and will not function. From 8e5b3a0fd33939a371e37be7e076ea7d19fb8b02 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 3 Dec 2021 09:05:04 +0200 Subject: [PATCH 084/126] [Canvas] Filters panel for element settings. (#117270) * Added filters panel on selecting the element. * Added unit tests. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../element_settings.component.tsx | 38 +++++++- .../workpad_filters/__stories__/elements.ts | 19 +++- .../__stories__/workpad_filters.stories.tsx | 5 +- .../hooks/use_canvas_filters.ts | 7 +- .../workpad_filters/workpad_filters.tsx | 19 +++- .../canvas/public/functions/filters.ts | 7 +- .../plugins/canvas/public/lib/filter.test.ts | 89 +++++++++++++++++++ x-pack/plugins/canvas/public/lib/filter.ts | 42 ++++++++- 8 files changed, 206 insertions(+), 20 deletions(-) diff --git a/x-pack/plugins/canvas/public/components/sidebar/element_settings/element_settings.component.tsx b/x-pack/plugins/canvas/public/components/sidebar/element_settings/element_settings.component.tsx index a912668d914320..0dcafd012ee7c7 100644 --- a/x-pack/plugins/canvas/public/components/sidebar/element_settings/element_settings.component.tsx +++ b/x-pack/plugins/canvas/public/components/sidebar/element_settings/element_settings.component.tsx @@ -5,9 +5,9 @@ * 2.0. */ -import React, { FunctionComponent } from 'react'; +import React, { FunctionComponent, useState } from 'react'; import PropTypes from 'prop-types'; -import { EuiTabbedContent } from '@elastic/eui'; +import { EuiTabbedContent, EuiTabbedContentTab } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; // @ts-expect-error unconverted component @@ -15,6 +15,8 @@ import { Datasource } from '../../datasource'; // @ts-expect-error unconverted component import { FunctionFormList } from '../../function_form_list'; import { PositionedElement } from '../../../../types'; +import { WorkpadFilters } from '../../workpad_filters/workpad_filters'; +import { isExpressionWithFilters } from '../../../lib/filter'; const strings = { getDataTabLabel: () => @@ -29,6 +31,11 @@ const strings = { defaultMessage: 'Display', description: 'This tab contains the settings for how data is displayed in a Canvas element', }), + getFiltersTabLabel: () => + i18n.translate('xpack.canvas.elementSettings.filtersTabLabel', { + defaultMessage: 'Filters', + description: 'This tab contains information about filters related to a Canvas element', + }), }; interface Props { @@ -39,6 +46,16 @@ interface Props { } export const ElementSettings: FunctionComponent = ({ element }) => { + const filtersTab = isExpressionWithFilters(element.expression) && { + id: 'filters', + name: strings.getFiltersTabLabel(), + content: ( +
+ +
+ ), + }; + const tabs = [ { id: 'edit', @@ -60,8 +77,23 @@ export const ElementSettings: FunctionComponent = ({ element }) => { ), }, + ...(filtersTab ? [filtersTab] : []), ]; - return ; + + const [selectedTab, setSelectedTab] = useState(tabs[0]); + + const onTabClick = (tab: EuiTabbedContentTab) => setSelectedTab(tab); + + const getTab = (tabId: string) => tabs.filter((tab) => tab.id === tabId)[0] ?? tabs[0]; + + return ( + + ); }; ElementSettings.propTypes = { diff --git a/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/elements.ts b/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/elements.ts index 9eacfb54a411f9..56df931ffade56 100644 --- a/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/elements.ts +++ b/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/elements.ts @@ -6,7 +6,7 @@ */ import moment from 'moment'; -import { CanvasElement } from '../../../../types'; +import { CanvasElement, PositionedElement } from '../../../../types'; const timeFormat = 'MM.dd.YYYY HH:mm'; @@ -31,6 +31,14 @@ const time2 = { }; const group2 = 'Group 2'; +export const element: CanvasElement = { + id: '0', + position: generatePosition(0), + type: 'element', + expression: `filters group="${group2}"`, + filter: '', +}; + const element1: CanvasElement = { id: '1', position: generatePosition(1), @@ -44,7 +52,7 @@ const element2: CanvasElement = { position: generatePosition(2), type: 'element', expression: '', - filter: `exactly value="machine-learning" column="project1" filterGroup="${group1}"`, + filter: `exactly value="machine-learning" column="project1" filterGroup="${group2}"`, }; const element3: CanvasElement = { @@ -63,4 +71,9 @@ const element4: CanvasElement = { filter: `exactly value="kibana" column="project2" filterGroup="${group2}"`, }; -export const elements = [element1, element2, element3, element4]; +export const elementWithGroup: PositionedElement = { + ...element, + ast: { type: 'expression', chain: [] }, +}; + +export const elements = [element, element1, element2, element3, element4]; diff --git a/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/workpad_filters.stories.tsx b/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/workpad_filters.stories.tsx index b97043bf83304a..b477ac220f6a9f 100644 --- a/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/workpad_filters.stories.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_filters/__stories__/workpad_filters.stories.tsx @@ -9,7 +9,7 @@ import { storiesOf } from '@storybook/react'; import React from 'react'; import { reduxDecorator } from '../../../../storybook'; import { WorkpadFilters } from '../workpad_filters'; -import { elements } from './elements'; +import { elementWithGroup, elements } from './elements'; storiesOf('components/WorkpadFilters/WorkpadFilters', module) .addDecorator((story) => ( @@ -20,4 +20,5 @@ storiesOf('components/WorkpadFilters/WorkpadFilters', module) )) .addDecorator(reduxDecorator({ elements })) - .add('redux: default', () => ); + .add('redux: default', () => ) + .add('redux: selected element with group', () => ); diff --git a/x-pack/plugins/canvas/public/components/workpad_filters/hooks/use_canvas_filters.ts b/x-pack/plugins/canvas/public/components/workpad_filters/hooks/use_canvas_filters.ts index ce8e90def5aad3..10643e729d8373 100644 --- a/x-pack/plugins/canvas/public/components/workpad_filters/hooks/use_canvas_filters.ts +++ b/x-pack/plugins/canvas/public/components/workpad_filters/hooks/use_canvas_filters.ts @@ -8,15 +8,18 @@ import { fromExpression } from '@kbn/interpreter/common'; import { shallowEqual, useSelector } from 'react-redux'; import { State } from '../../../../types'; +import { getFiltersByGroups } from '../../../lib/filter'; import { adaptCanvasFilter } from '../../../lib/filter_adapters'; import { getGlobalFilters } from '../../../state/selectors/workpad'; const extractExpressionAST = (filtersExpressions: string[]) => fromExpression(filtersExpressions.join(' | ')); -export function useCanvasFilters() { +export function useCanvasFilters(groups: string[] = [], ungrouped: boolean = false) { const filterExpressions = useSelector((state: State) => getGlobalFilters(state), shallowEqual); - const expression = extractExpressionAST(filterExpressions); + const filtersByGroups = getFiltersByGroups(filterExpressions, groups, ungrouped); + + const expression = extractExpressionAST(filtersByGroups); const filters = expression.chain.map(adaptCanvasFilter); return filters; diff --git a/x-pack/plugins/canvas/public/components/workpad_filters/workpad_filters.tsx b/x-pack/plugins/canvas/public/components/workpad_filters/workpad_filters.tsx index c04fe543804b4a..610e6e56af3502 100644 --- a/x-pack/plugins/canvas/public/components/workpad_filters/workpad_filters.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_filters/workpad_filters.tsx @@ -7,14 +7,22 @@ import React, { FC, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; -import { State, FilterField } from '../../../types'; -import { groupFiltersBy } from '../../lib/filter'; +import { State, FilterField, PositionedElement } from '../../../types'; +import { + extractGroupsFromElementsFilters, + groupFiltersBy, + extractUngroupedFromElementsFilters, +} from '../../lib/filter'; import { setGroupFiltersByOption } from '../../state/actions/sidebar'; import { getGroupFiltersByOption } from '../../state/selectors/sidebar'; import { useCanvasFilters } from './hooks'; import { WorkpadFilters as Component } from './workpad_filters.component'; -export const WorkpadFilters: FC = () => { +interface Props { + element?: PositionedElement | null; +} + +export const WorkpadFilters: FC = ({ element }) => { const groupFiltersByField: FilterField = useSelector((state: State) => getGroupFiltersByOption(state) ); @@ -28,7 +36,10 @@ export const WorkpadFilters: FC = () => { [dispatch] ); - const canvasFilters = useCanvasFilters(); + const groups = element ? extractGroupsFromElementsFilters(element.expression) : undefined; + const ungrouped = element ? extractUngroupedFromElementsFilters(element.expression) : false; + + const canvasFilters = useCanvasFilters(groups, ungrouped); const filtersGroups = groupFiltersByField ? groupFiltersBy(canvasFilters, groupFiltersByField) diff --git a/x-pack/plugins/canvas/public/functions/filters.ts b/x-pack/plugins/canvas/public/functions/filters.ts index bc6aedd4662c1f..ca2cede4e85554 100644 --- a/x-pack/plugins/canvas/public/functions/filters.ts +++ b/x-pack/plugins/canvas/public/functions/filters.ts @@ -15,6 +15,7 @@ import { getGlobalFilters, getWorkpadVariablesAsObject } from '../state/selector import { ExpressionValueFilter } from '../../types'; import { getFunctionHelp } from '../../i18n'; import { InitializeArguments } from '.'; +import { getFiltersByGroups } from '../lib/filter'; export interface Arguments { group: string[]; @@ -35,11 +36,7 @@ function getFiltersByGroup(allFilters: string[], groups?: string[], ungrouped = }); } - return allFilters.filter((filter: string) => { - const ast = fromExpression(filter); - const expGroups: string[] = get(ast, 'chain[0].arguments.filterGroup', []); - return expGroups.length > 0 && expGroups.every((expGroup) => groups.includes(expGroup)); - }); + return getFiltersByGroups(allFilters, groups); } type FiltersFunction = ExpressionFunctionDefinition< diff --git a/x-pack/plugins/canvas/public/lib/filter.test.ts b/x-pack/plugins/canvas/public/lib/filter.test.ts index 497f75b91650f7..bf19bd6ecf4b86 100644 --- a/x-pack/plugins/canvas/public/lib/filter.test.ts +++ b/x-pack/plugins/canvas/public/lib/filter.test.ts @@ -18,6 +18,10 @@ import { flattenFilterView, createFilledFilterView, groupFiltersBy, + getFiltersByGroups, + extractGroupsFromElementsFilters, + extractUngroupedFromElementsFilters, + isExpressionWithFilters, } from './filter'; const formatterFactory = (value: unknown) => () => JSON.stringify(value); @@ -280,3 +284,88 @@ describe('groupFiltersBy', () => { expect(grouped).toEqual([{ name: null, filters: filtersWithoutGroups }]); }); }); + +describe('getFiltersByGroups', () => { + const group1 = 'Group 1'; + const group2 = 'Group 2'; + + const filters = [ + `exactly value="x-pack" column="project1" filterGroup="${group1}"`, + `exactly value="beats" column="project1" filterGroup="${group2}"`, + `exactly value="machine-learning" column="project1"`, + `exactly value="kibana" column="project2" filterGroup="${group2}"`, + ]; + + it('returns all filters related to a specified groups', () => { + expect(getFiltersByGroups(filters, [group1, group2])).toEqual([ + filters[0], + filters[1], + filters[3], + ]); + + expect(getFiltersByGroups(filters, [group2])).toEqual([filters[1], filters[3]]); + }); + + it('returns filters without group if ungrouped is true', () => { + expect(getFiltersByGroups(filters, [], true)).toEqual([filters[2]]); + }); + + it('returns filters with group if ungrouped is true and groups are not empty', () => { + expect(getFiltersByGroups(filters, [group1], true)).toEqual([filters[0]]); + }); + + it('returns empty array if not found any filter with a specified group', () => { + expect(getFiltersByGroups(filters, ['absent group'])).toEqual([]); + }); + + it('returns empty array if not groups specified', () => { + expect(getFiltersByGroups(filters, [])).toEqual(filters); + }); +}); + +describe('extractGroupsFromElementsFilters', () => { + const exprFilters = 'filters'; + const exprRest = 'demodata | plot | render'; + + it('returns groups which are specified at filters expression', () => { + const groups = ['group 1', 'group 2', 'group 3', 'group 4']; + const additionalGroups = [...groups, 'group 5']; + const groupsExpr = groups.map((group) => `group="${group}"`).join(' '); + const additionalGroupsExpr = additionalGroups.map((group) => `group="${group}"`).join(' '); + + expect( + extractGroupsFromElementsFilters( + `${exprFilters} ${groupsExpr} | ${exprFilters} ${additionalGroupsExpr} | ${exprRest}` + ) + ).toEqual(additionalGroups); + }); + + it('returns empty array if no groups were specified at filters expression', () => { + expect(extractGroupsFromElementsFilters(`${exprFilters} | ${exprRest}`)).toEqual([]); + }); +}); + +describe('extractUngroupedFromElementsFilters', () => { + it('checks if ungrouped filters expression exist at the element', () => { + const expression = + 'filters group="10" group="11" | filters group="15" ungrouped=true | demodata | plot | render'; + const isUngrouped = extractUngroupedFromElementsFilters(expression); + expect(isUngrouped).toBeTruthy(); + + const nextExpression = + 'filters group="10" group="11" | filters group="15" | demodata | plot | render'; + const nextIsUngrouped = extractUngroupedFromElementsFilters(nextExpression); + expect(nextIsUngrouped).toBeFalsy(); + }); +}); + +describe('isExpressionWithFilters', () => { + it('checks if the expression is applying filters', () => { + const expression = + 'filters group="10" group="11" | filters group="15" ungrouped=true | demodata | plot | render'; + expect(isExpressionWithFilters(expression)).toBeTruthy(); + + const nextExpression = 'demodata | plot | render'; + expect(isExpressionWithFilters(nextExpression)).toBeFalsy(); + }); +}); diff --git a/x-pack/plugins/canvas/public/lib/filter.ts b/x-pack/plugins/canvas/public/lib/filter.ts index ae75822e4a7c92..56f6558eff48bd 100644 --- a/x-pack/plugins/canvas/public/lib/filter.ts +++ b/x-pack/plugins/canvas/public/lib/filter.ts @@ -5,7 +5,8 @@ * 2.0. */ -import { flowRight, groupBy } from 'lodash'; +import { fromExpression } from '@kbn/interpreter/common'; +import { flowRight, get, groupBy } from 'lodash'; import { Filter as FilterType, FilterField, @@ -53,3 +54,42 @@ export const groupFiltersBy = (filters: FilterType[], groupByField: FilterField) filters: groupedFilters[key], })); }; + +export const getFiltersByGroups = ( + filters: string[], + groups: string[], + ungrouped: boolean = false +) => + filters.filter((filter: string) => { + const ast = fromExpression(filter); + const expGroups: string[] = get(ast, 'chain[0].arguments.filterGroup', []); + if (!groups?.length && ungrouped) { + return expGroups.length === 0; + } + + return ( + !groups.length || + (expGroups.length > 0 && expGroups.every((expGroup) => groups.includes(expGroup))) + ); + }); + +export const extractGroupsFromElementsFilters = (expr: string) => { + const ast = fromExpression(expr); + const filtersFns = ast.chain.filter((expression) => expression.function === 'filters'); + const groups = filtersFns.reduce((foundGroups, filterFn) => { + const filterGroups = filterFn?.arguments.group?.map((g) => g.toString()) ?? []; + return [...foundGroups, ...filterGroups]; + }, []); + return [...new Set(groups)]; +}; + +export const extractUngroupedFromElementsFilters = (expr: string) => { + const ast = fromExpression(expr); + const filtersFns = ast.chain.filter((expression) => expression.function === 'filters'); + return filtersFns.some((filterFn) => filterFn?.arguments.ungrouped?.[0]); +}; + +export const isExpressionWithFilters = (expr: string) => { + const ast = fromExpression(expr); + return ast.chain.some((expression) => expression.function === 'filters'); +}; From fea14a0da5de5adf4baa54b5cfe4876952afe8d2 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 3 Dec 2021 09:12:46 +0200 Subject: [PATCH 085/126] [Canvas] Added KibanaThemeProvider to expression_error. (#120073) * Wrapped up debug and error with KibanaThemeProvider. 1. Replaced renderer with getRenderer function and factory. 2. Updated storybook. 3. Moved defaultTheme$ to presentain_util. * Fixed exports. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../__stories__/error_renderer.stories.tsx | 4 +- .../expression_renderers/debug_renderer.tsx | 35 ++++++++---- .../expression_renderers/error_renderer.tsx | 55 +++++++++++-------- .../public/expression_renderers/index.ts | 8 +-- src/plugins/expression_error/public/index.ts | 11 ++-- src/plugins/expression_error/public/plugin.ts | 6 +- .../common/lib/utils}/default_theme.ts | 6 +- .../common/lib/utils/index.ts | 1 + .../canvas_plugin_src/renderers/external.ts | 9 +-- .../renderers/markdown/index.tsx | 2 +- .../canvas_plugin_src/renderers/table.tsx | 2 +- .../canvas_plugin_src/renderers/text.tsx | 2 +- .../shareable_runtime/supported_renderers.js | 14 +++-- 13 files changed, 93 insertions(+), 62 deletions(-) rename {x-pack/plugins/canvas/public/lib => src/plugins/presentation_util/common/lib/utils}/default_theme.ts (66%) diff --git a/src/plugins/expression_error/public/expression_renderers/__stories__/error_renderer.stories.tsx b/src/plugins/expression_error/public/expression_renderers/__stories__/error_renderer.stories.tsx index 9081a8512c11ad..378e22f834e1d5 100644 --- a/src/plugins/expression_error/public/expression_renderers/__stories__/error_renderer.stories.tsx +++ b/src/plugins/expression_error/public/expression_renderers/__stories__/error_renderer.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; -import { errorRenderer } from '../error_renderer'; +import { getErrorRenderer } from '../error_renderer'; import { Render } from '../../../../presentation_util/public/__stories__'; storiesOf('renderers/error', module).add('default', () => { @@ -16,5 +16,5 @@ storiesOf('renderers/error', module).add('default', () => { const config = { error: thrownError, }; - return ; + return ; }); diff --git a/src/plugins/expression_error/public/expression_renderers/debug_renderer.tsx b/src/plugins/expression_error/public/expression_renderers/debug_renderer.tsx index e3cf86b67148f1..d4c74a9c646e73 100644 --- a/src/plugins/expression_error/public/expression_renderers/debug_renderer.tsx +++ b/src/plugins/expression_error/public/expression_renderers/debug_renderer.tsx @@ -8,9 +8,13 @@ import { render, unmountComponentAtNode } from 'react-dom'; import React from 'react'; +import { Observable } from 'rxjs'; +import { CoreTheme } from 'kibana/public'; import { ExpressionRenderDefinition } from 'src/plugins/expressions/common'; import { i18n } from '@kbn/i18n'; -import { withSuspense } from '../../../../../src/plugins/presentation_util/public'; +import { CoreSetup } from '../../../../core/public'; +import { KibanaThemeProvider } from '../../../kibana_react/public'; +import { withSuspense, defaultTheme$ } from '../../../../../src/plugins/presentation_util/public'; import { LazyDebugRenderComponent } from '../components'; import { JSON } from '../../common'; @@ -30,13 +34,22 @@ const strings = { }), }; -export const debugRenderer = (): ExpressionRenderDefinition => ({ - name: 'debug', - displayName: strings.getDisplayName(), - help: strings.getHelpDescription(), - reuseDomNode: true, - render(domNode, config, handlers) { - handlers.onDestroy(() => unmountComponentAtNode(domNode)); - render(, domNode); - }, -}); +export const getDebugRenderer = + (theme$: Observable = defaultTheme$) => + (): ExpressionRenderDefinition => ({ + name: 'debug', + displayName: strings.getDisplayName(), + help: strings.getHelpDescription(), + reuseDomNode: true, + render(domNode, config, handlers) { + handlers.onDestroy(() => unmountComponentAtNode(domNode)); + render( + + + , + domNode + ); + }, + }); + +export const debugRendererFactory = (core: CoreSetup) => getDebugRenderer(core.theme.theme$); diff --git a/src/plugins/expression_error/public/expression_renderers/error_renderer.tsx b/src/plugins/expression_error/public/expression_renderers/error_renderer.tsx index f0fbed22f38a03..65847a18d4e0a0 100644 --- a/src/plugins/expression_error/public/expression_renderers/error_renderer.tsx +++ b/src/plugins/expression_error/public/expression_renderers/error_renderer.tsx @@ -5,12 +5,17 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; +import { Observable } from 'rxjs'; +import { CoreTheme } from 'kibana/public'; import { I18nProvider } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; -import { withSuspense } from '../../../presentation_util/public'; +import { CoreSetup } from '../../../../core/public'; +import { KibanaThemeProvider } from '../../../kibana_react/public'; +import { withSuspense, defaultTheme$ } from '../../../presentation_util/public'; import { ErrorRendererConfig } from '../../common/types'; import { LazyErrorRenderComponent } from '../components'; @@ -27,25 +32,31 @@ const errorStrings = { const ErrorComponent = withSuspense(LazyErrorRenderComponent); -export const errorRenderer = (): ExpressionRenderDefinition => ({ - name: 'error', - displayName: errorStrings.getDisplayName(), - help: errorStrings.getHelpDescription(), - reuseDomNode: true, - render: async ( - domNode: HTMLElement, - config: ErrorRendererConfig, - handlers: IInterpreterRenderHandlers - ) => { - handlers.onDestroy(() => { - unmountComponentAtNode(domNode); - }); +export const getErrorRenderer = + (theme$: Observable = defaultTheme$) => + (): ExpressionRenderDefinition => ({ + name: 'error', + displayName: errorStrings.getDisplayName(), + help: errorStrings.getHelpDescription(), + reuseDomNode: true, + render: async ( + domNode: HTMLElement, + config: ErrorRendererConfig, + handlers: IInterpreterRenderHandlers + ) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); + + render( + + + + + , + domNode + ); + }, + }); - render( - - - , - domNode - ); - }, -}); +export const errorRendererFactory = (core: CoreSetup) => getErrorRenderer(core.theme.theme$); diff --git a/src/plugins/expression_error/public/expression_renderers/index.ts b/src/plugins/expression_error/public/expression_renderers/index.ts index 237ee5644cdc05..295e30fc1bffd4 100644 --- a/src/plugins/expression_error/public/expression_renderers/index.ts +++ b/src/plugins/expression_error/public/expression_renderers/index.ts @@ -6,9 +6,5 @@ * Side Public License, v 1. */ -import { errorRenderer } from './error_renderer'; -import { debugRenderer } from './debug_renderer'; - -export const renderers = [errorRenderer, debugRenderer]; - -export { errorRenderer, debugRenderer }; +export { getErrorRenderer, errorRendererFactory } from './error_renderer'; +export { getDebugRenderer, debugRendererFactory } from './debug_renderer'; diff --git a/src/plugins/expression_error/public/index.ts b/src/plugins/expression_error/public/index.ts index be34980045395f..acc5133f5b7d16 100755 --- a/src/plugins/expression_error/public/index.ts +++ b/src/plugins/expression_error/public/index.ts @@ -6,9 +6,6 @@ * Side Public License, v 1. */ -// TODO: https://github.com/elastic/kibana/issues/110893 -/* eslint-disable @kbn/eslint/no_export_all */ - import { ExpressionErrorPlugin } from './plugin'; export type { ExpressionErrorPluginSetup, ExpressionErrorPluginStart } from './plugin'; @@ -17,5 +14,11 @@ export function plugin() { return new ExpressionErrorPlugin(); } -export * from './expression_renderers'; +export { + getErrorRenderer, + getDebugRenderer, + errorRendererFactory, + debugRendererFactory, +} from './expression_renderers'; + export { LazyDebugComponent, LazyErrorComponent } from './components'; diff --git a/src/plugins/expression_error/public/plugin.ts b/src/plugins/expression_error/public/plugin.ts index 0b82ccf5d2dbaa..de3793b6a30aee 100755 --- a/src/plugins/expression_error/public/plugin.ts +++ b/src/plugins/expression_error/public/plugin.ts @@ -8,7 +8,7 @@ import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { ExpressionsStart, ExpressionsSetup } from '../../expressions/public'; -import { errorRenderer, debugRenderer } from './expression_renderers'; +import { debugRendererFactory, errorRendererFactory } from './expression_renderers'; interface SetupDeps { expressions: ExpressionsSetup; @@ -25,8 +25,8 @@ export class ExpressionErrorPlugin implements Plugin { public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionErrorPluginSetup { - expressions.registerRenderer(errorRenderer); - expressions.registerRenderer(debugRenderer); + expressions.registerRenderer(errorRendererFactory(core)); + expressions.registerRenderer(debugRendererFactory(core)); } public start(core: CoreStart): ExpressionErrorPluginStart {} diff --git a/x-pack/plugins/canvas/public/lib/default_theme.ts b/src/plugins/presentation_util/common/lib/utils/default_theme.ts similarity index 66% rename from x-pack/plugins/canvas/public/lib/default_theme.ts rename to src/plugins/presentation_util/common/lib/utils/default_theme.ts index 5256ba81c9b8ac..c403937016ec80 100644 --- a/x-pack/plugins/canvas/public/lib/default_theme.ts +++ b/src/plugins/presentation_util/common/lib/utils/default_theme.ts @@ -1,9 +1,11 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { CoreTheme } from 'kibana/public'; import { Observable } from 'rxjs'; diff --git a/src/plugins/presentation_util/common/lib/utils/index.ts b/src/plugins/presentation_util/common/lib/utils/index.ts index 232ec09cf8b06d..5fc7e31fdf9f59 100644 --- a/src/plugins/presentation_util/common/lib/utils/index.ts +++ b/src/plugins/presentation_util/common/lib/utils/index.ts @@ -10,6 +10,7 @@ export * from './dataurl'; export * from './httpurl'; export * from './resolve_dataurl'; export * from './url'; +export { defaultTheme$ } from './default_theme'; export async function getElasticLogo() { return await import('./elastic_logo'); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts index 94aadf6598b5a3..572771537ec721 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts @@ -7,7 +7,10 @@ import { imageRenderer } from '../../../../../src/plugins/expression_image/public'; import { metricRenderer } from '../../../../../src/plugins/expression_metric/public'; -import { errorRenderer, debugRenderer } from '../../../../../src/plugins/expression_error/public'; +import { + errorRendererFactory, + debugRendererFactory, +} from '../../../../../src/plugins/expression_error/public'; import { repeatImageRenderer } from '../../../../../src/plugins/expression_repeat_image/public'; import { revealImageRenderer } from '../../../../../src/plugins/expression_reveal_image/public'; import { @@ -16,8 +19,6 @@ import { } from '../../../../../src/plugins/expression_shape/public'; export const renderFunctions = [ - debugRenderer, - errorRenderer, imageRenderer, metricRenderer, revealImageRenderer, @@ -26,4 +27,4 @@ export const renderFunctions = [ progressRenderer, ]; -export const renderFunctionFactories = []; +export const renderFunctionFactories = [debugRendererFactory, errorRendererFactory]; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx index bc9748fa8f6abd..498e09e14b7e05 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx @@ -10,12 +10,12 @@ import ReactDOM from 'react-dom'; import { CoreTheme } from 'kibana/public'; import { Observable } from 'rxjs'; import { KibanaThemeProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { defaultTheme$ } from '../../../../../../src/plugins/presentation_util/common/lib'; import { StartInitializer } from '../../plugin'; import { RendererStrings } from '../../../i18n'; import { Return as Config } from '../../functions/browser/markdown'; import { Markdown } from '../../../../../../src/plugins/kibana_react/public'; import { RendererFactory } from '../../../types'; -import { defaultTheme$ } from '../../../public/lib/default_theme'; const { markdown: strings } = RendererStrings; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx index 3af0fe00f2465c..ec918f89321ad6 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/table.tsx @@ -10,11 +10,11 @@ import React from 'react'; import { CoreTheme } from 'kibana/public'; import { Observable } from 'rxjs'; import { KibanaThemeProvider } from '../../../../../src/plugins/kibana_react/public'; +import { defaultTheme$ } from '../../../../../src/plugins/presentation_util/common/lib'; import { StartInitializer } from '../plugin'; import { Datatable as DatatableComponent } from '../../public/components/datatable'; import { RendererStrings } from '../../i18n'; import { RendererFactory, Style, Datatable } from '../../types'; -import { defaultTheme$ } from '../../public/lib/default_theme'; const { dropdownFilter: strings } = RendererStrings; export interface TableArguments { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/text.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/text.tsx index 3bc62d888e02fc..a89c56c66ce275 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/text.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/text.tsx @@ -10,10 +10,10 @@ import React from 'react'; import { CoreTheme } from 'kibana/public'; import { Observable } from 'rxjs'; import { KibanaThemeProvider } from '../../../../../src/plugins/kibana_react/public'; +import { defaultTheme$ } from '../../../../../src/plugins/presentation_util/common/lib'; import { StartInitializer } from '../plugin'; import { RendererStrings } from '../../i18n'; import { RendererFactory } from '../../types'; -import { defaultTheme$ } from '../../public/lib/default_theme'; const { text: strings } = RendererStrings; diff --git a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js index db61cfaf86c51a..1d2326b77dd26d 100644 --- a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js +++ b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js @@ -12,8 +12,8 @@ import { getTableRenderer } from '../canvas_plugin_src/renderers/table'; import { getTextRenderer } from '../canvas_plugin_src/renderers/text'; import { imageRenderer as image } from '../../../../src/plugins/expression_image/public'; import { - errorRenderer as error, - debugRenderer as debug, + getErrorRenderer, + getDebugRenderer, } from '../../../../src/plugins/expression_error/public'; import { repeatImageRenderer as repeatImage } from '../../../../src/plugins/expression_repeat_image/public'; import { revealImageRenderer as revealImage } from '../../../../src/plugins/expression_reveal_image/public'; @@ -25,7 +25,13 @@ import { metricRenderer as metric } from '../../../../src/plugins/expression_met const unboxFactory = (factory) => factory(); -const renderFunctionsFactories = [getMarkdownRenderer, getTextRenderer, getTableRenderer]; +const renderFunctionsFactories = [ + getMarkdownRenderer, + getTextRenderer, + getTableRenderer, + getErrorRenderer, + getDebugRenderer, +]; /** * This is a collection of renderers which are bundled with the runtime. If @@ -33,8 +39,6 @@ const renderFunctionsFactories = [getMarkdownRenderer, getTextRenderer, getTable * not render. This includes any plugins. */ export const renderFunctions = [ - debug, - error, image, repeatImage, revealImage, From 7033517ced3a333ce421ff65926cba7273c0d4ba Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Fri, 3 Dec 2021 09:36:38 +0100 Subject: [PATCH 086/126] [navSearch] handle `displayName` for `savedObjects` result provider (#119442) * [navSearch] use the type's displayName in the `savedObjects` result provider * add unit tests * update documentation * adapt unit tests * address review comments and start to cleanup searchbar component * wrap onChange with useCallback * add unit tests for resultToOption Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- docs/user/introduction.asciidoc | 2 +- .../public/components/popover_footer.tsx | 78 ++++ .../public/components/popover_placeholder.tsx | 44 +++ .../public/components/result_tag_list.tsx | 70 ++++ .../public/components/search_bar.tsx | 344 ++++-------------- .../global_search_bar/public/lib/index.ts | 9 + .../public/lib/result_to_option.test.ts | 92 +++++ .../public/lib/result_to_option.tsx | 48 +++ .../public/lib/suggestion_to_option.ts | 24 ++ .../get_searchable_types.test.ts | 130 +++++++ .../saved_objects/get_searchable_types.ts | 29 ++ .../map_object_to_result.test.ts | 12 +- .../saved_objects/map_object_to_result.ts | 1 + .../providers/saved_objects/provider.test.ts | 4 +- .../providers/saved_objects/provider.ts | 12 +- 15 files changed, 617 insertions(+), 282 deletions(-) create mode 100644 x-pack/plugins/global_search_bar/public/components/popover_footer.tsx create mode 100644 x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx create mode 100644 x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx create mode 100644 x-pack/plugins/global_search_bar/public/lib/index.ts create mode 100644 x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts create mode 100644 x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx create mode 100644 x-pack/plugins/global_search_bar/public/lib/suggestion_to_option.ts create mode 100644 x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.test.ts create mode 100644 x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.ts diff --git a/docs/user/introduction.asciidoc b/docs/user/introduction.asciidoc index 89a21b0424ed08..fa5801e6227062 100644 --- a/docs/user/introduction.asciidoc +++ b/docs/user/introduction.asciidoc @@ -233,7 +233,7 @@ To get the most from the search feature, follow these tips: |Search by type |`type:dashboard` -Available types: `application`, `canvas-workpad`, `dashboard`, `index-pattern`, `lens`, `maps`, `query`, `search`, `visualization` +Available types: `application`, `canvas-workpad`, `dashboard`, `data-view`, `lens`, `maps`, `query`, `search`, `visualization` |Search by tag |`tag:mytagname` + diff --git a/x-pack/plugins/global_search_bar/public/components/popover_footer.tsx b/x-pack/plugins/global_search_bar/public/components/popover_footer.tsx new file mode 100644 index 00000000000000..da7f8997a16b67 --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/components/popover_footer.tsx @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { EuiCode, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; + +interface PopoverFooterProps { + isMac: boolean; +} + +export const PopoverFooter: FC = ({ isMac }) => { + return ( + + + +

+ +   + type:  + +   + tag: +

+
+
+ + +

+ + ), + commandDescription: ( + + {isMac ? ( + + ) : ( + + )} + + ), + }} + /> +

+
+
+
+ ); +}; diff --git a/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx b/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx new file mode 100644 index 00000000000000..2dd191a7bf672e --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/components/popover_placeholder.tsx @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { EuiImage, EuiSelectableMessage, EuiText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +interface PopoverPlaceholderProps { + darkMode: boolean; + basePath: string; +} + +export const PopoverPlaceholder: FC = ({ basePath, darkMode }) => { + return ( + + + +

+ +

+
+

+ +

+
+ ); +}; diff --git a/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx b/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx new file mode 100644 index 00000000000000..4cc75d207e287e --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/components/result_tag_list.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { FC } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiBadge } from '@elastic/eui'; +import type { Tag } from '../../../saved_objects_tagging/public'; + +const MAX_TAGS_TO_SHOW = 3; + +const TagListWrapper: FC = ({ children }) => ( +
    + {children} +
+); + +const buildListItem = ({ color, name, id }: Tag) => { + return ( +
  • + {name} +
  • + ); +}; + +interface ResultTagListProps { + tags: Tag[]; + searchTagIds: string[]; +} + +export const ResultTagList: FC = ({ tags, searchTagIds }) => { + const showOverflow = tags.length > MAX_TAGS_TO_SHOW; + + if (!showOverflow) { + return {tags.map(buildListItem)}; + } + + // float searched tags to the start of the list, actual order doesn't matter + tags.sort((a) => { + if (searchTagIds.find((id) => id === a.id)) return -1; + return 1; + }); + + const overflowList = tags.splice(MAX_TAGS_TO_SHOW); + const overflowMessage = i18n.translate('xpack.globalSearchBar.searchbar.overflowTagsAriaLabel', { + defaultMessage: '{n} more {n, plural, one {tag} other {tags}}: {tags}', + values: { + n: overflowList.length, + // @ts-ignore-line + tags: overflowList.map(({ name }) => name), + }, + }); + + return ( + + {tags.map(buildListItem)} +
  • + +{overflowList.length} +
  • +
    + ); +}; diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index fbf412ca704d8b..995f685d4287f7 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -5,48 +5,34 @@ * 2.0. */ +import React, { FC, useCallback, useRef, useState, useEffect } from 'react'; +import useDebounce from 'react-use/lib/useDebounce'; +import useEvent from 'react-use/lib/useEvent'; +import useMountedState from 'react-use/lib/useMountedState'; +import { Subscription } from 'rxjs'; import { - EuiCode, - EuiFlexGroup, - EuiFlexItem, EuiHeaderSectionItemButton, EuiIcon, - EuiImage, - EuiSelectableMessage, EuiSelectableTemplateSitewide, EuiSelectableTemplateSitewideOption, - EuiText, - EuiBadge, euiSelectableTemplateSitewideRenderOptions, } from '@elastic/eui'; import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { ApplicationStart } from 'kibana/public'; -import React, { ReactNode, useCallback, useRef, useState, useEffect } from 'react'; -import useDebounce from 'react-use/lib/useDebounce'; -import useEvent from 'react-use/lib/useEvent'; -import useMountedState from 'react-use/lib/useMountedState'; -import { Subscription } from 'rxjs'; -import { +import type { ApplicationStart } from 'kibana/public'; +import type { GlobalSearchPluginStart, GlobalSearchResult, GlobalSearchFindParams, } from '../../../global_search/public'; -import { SavedObjectTaggingPluginStart, Tag } from '../../../saved_objects_tagging/public'; +import type { SavedObjectTaggingPluginStart } from '../../../saved_objects_tagging/public'; import { parseSearchParams } from '../search_syntax'; import { getSuggestions, SearchSuggestion } from '../suggestions'; +import { resultToOption, suggestionToOption } from '../lib'; +import { PopoverFooter } from './popover_footer'; +import { PopoverPlaceholder } from './popover_placeholder'; import './search_bar.scss'; -interface Props { - globalSearch: GlobalSearchPluginStart; - navigateToUrl: ApplicationStart['navigateToUrl']; - trackUiMetric: (metricType: UiCounterMetricType, eventName: string | string[]) => void; - taggingApi?: SavedObjectTaggingPluginStart; - basePathUrl: string; - darkMode: boolean; -} - const isMac = navigator.platform.toLowerCase().indexOf('mac') >= 0; const setFieldValue = (field: HTMLInputElement, value: string) => { @@ -60,7 +46,6 @@ const setFieldValue = (field: HTMLInputElement, value: string) => { const clearField = (field: HTMLInputElement) => setFieldValue(field, ''); -const cleanMeta = (str: string) => (str.charAt(0).toUpperCase() + str.slice(1)).replace(/-/g, ' '); const blurEvent = new FocusEvent('blur'); const sortByScore = (a: GlobalSearchResult, b: GlobalSearchResult): number => { @@ -77,108 +62,23 @@ const sortByTitle = (a: GlobalSearchResult, b: GlobalSearchResult): number => { return 0; }; -const TagListWrapper = ({ children }: { children: ReactNode }) => ( -
      - {children} -
    -); - -const buildListItem = ({ color, name, id }: Tag) => { - return ( -
  • - {name} -
  • - ); -}; - -const tagList = (tags: Tag[], searchTagIds: string[]) => { - const TAGS_TO_SHOW = 3; - const showOverflow = tags.length > TAGS_TO_SHOW; - - if (!showOverflow) return {tags.map(buildListItem)}; - - // float searched tags to the start of the list, actual order doesn't matter - tags.sort((a) => { - if (searchTagIds.find((id) => id === a.id)) return -1; - return 1; - }); - - const overflowList = tags.splice(TAGS_TO_SHOW); - const overflowMessage = i18n.translate('xpack.globalSearchBar.searchbar.overflowTagsAriaLabel', { - defaultMessage: '{n} more {n, plural, one {tag} other {tags}}: {tags}', - values: { - n: overflowList.length, - // @ts-ignore-line - tags: overflowList.map(({ name }) => name), - }, - }); - - return ( - - {tags.map(buildListItem)} -
  • - +{overflowList.length} -
  • -
    - ); -}; - -const resultToOption = ( - result: GlobalSearchResult, - searchTagIds: string[], - getTag?: SavedObjectTaggingPluginStart['ui']['getTag'] -): EuiSelectableTemplateSitewideOption => { - const { id, title, url, icon, type, meta = {} } = result; - const { tagIds = [], categoryLabel = '' } = meta as { tagIds: string[]; categoryLabel: string }; - // only displaying icons for applications and integrations - const useIcon = type === 'application' || type === 'integration'; - const option: EuiSelectableTemplateSitewideOption = { - key: id, - label: title, - url, - type, - icon: { type: useIcon && icon ? icon : 'empty' }, - 'data-test-subj': `nav-search-option`, - }; - - if (type === 'application') option.meta = [{ text: categoryLabel }]; - else option.meta = [{ text: cleanMeta(type) }]; - - if (getTag && tagIds.length) { - // TODO #85189 - refactor to use TagList instead of getTag - // Casting to Tag[] because we know all our IDs will be valid here, no need to check for undefined - option.append = tagList(tagIds.map(getTag) as Tag[], searchTagIds); - } - - return option; -}; - -const suggestionToOption = (suggestion: SearchSuggestion): EuiSelectableTemplateSitewideOption => { - const { key, label, description, icon, suggestedSearch } = suggestion; - return { - key, - label, - type: '__suggestion__', - icon: { type: icon }, - suggestion: suggestedSearch, - meta: [{ text: description }], - 'data-test-subj': `nav-search-option`, - }; -}; +interface SearchBarProps { + globalSearch: GlobalSearchPluginStart; + navigateToUrl: ApplicationStart['navigateToUrl']; + trackUiMetric: (metricType: UiCounterMetricType, eventName: string | string[]) => void; + taggingApi?: SavedObjectTaggingPluginStart; + basePathUrl: string; + darkMode: boolean; +} -export function SearchBar({ +export const SearchBar: FC = ({ globalSearch, taggingApi, navigateToUrl, trackUiMetric, basePathUrl, darkMode, -}: Props) { +}) => { const isMounted = useMountedState(); const [initialLoad, setInitialLoad] = useState(false); const [searchValue, setSearchValue] = useState(''); @@ -312,79 +212,59 @@ export function SearchBar({ [buttonRef, searchRef, trackUiMetric] ); - const onChange = (selection: EuiSelectableTemplateSitewideOption[]) => { - const selected = selection.find(({ checked }) => checked === 'on'); - if (!selected) { - return; - } - - // @ts-ignore - ts error is "union type is too complex to express" - const { url, type, suggestion } = selected; + const onChange = useCallback( + (selection: EuiSelectableTemplateSitewideOption[]) => { + const selected = selection.find(({ checked }) => checked === 'on'); + if (!selected) { + return; + } - // if the type is a suggestion, we change the query on the input and trigger a new search - // by setting the searchValue (only setting the field value does not trigger a search) - if (type === '__suggestion__') { - setFieldValue(searchRef!, suggestion); - setSearchValue(suggestion); - return; - } + // @ts-ignore - ts error is "union type is too complex to express" + const { url, type, suggestion } = selected; - // errors in tracking should not prevent selection behavior - try { - if (type === 'application') { - const key = selected.keys ?? 'unknown'; - trackUiMetric(METRIC_TYPE.CLICK, [ - 'user_navigated_to_application', - `user_navigated_to_application_${key.toLowerCase().replaceAll(' ', '_')}`, // which application - ]); - } else { - trackUiMetric(METRIC_TYPE.CLICK, [ - 'user_navigated_to_saved_object', - `user_navigated_to_saved_object_${type}`, // which type of saved object - ]); + // if the type is a suggestion, we change the query on the input and trigger a new search + // by setting the searchValue (only setting the field value does not trigger a search) + if (type === '__suggestion__') { + setFieldValue(searchRef!, suggestion); + setSearchValue(suggestion); + return; } - } catch (e) { - // eslint-disable-next-line no-console - console.log('Error trying to track searchbar metrics', e); - } - navigateToUrl(url); + // errors in tracking should not prevent selection behavior + try { + if (type === 'application') { + const key = selected.keys ?? 'unknown'; + trackUiMetric(METRIC_TYPE.CLICK, [ + 'user_navigated_to_application', + `user_navigated_to_application_${key.toLowerCase().replaceAll(' ', '_')}`, // which application + ]); + } else { + trackUiMetric(METRIC_TYPE.CLICK, [ + 'user_navigated_to_saved_object', + `user_navigated_to_saved_object_${type}`, // which type of saved object + ]); + } + } catch (e) { + // eslint-disable-next-line no-console + console.log('Error trying to track searchbar metrics', e); + } - (document.activeElement as HTMLElement).blur(); - if (searchRef) { - clearField(searchRef); - searchRef.dispatchEvent(blurEvent); - } - }; + navigateToUrl(url); - const emptyMessage = ( - - - -

    - -

    -
    -

    - -

    -
    + (document.activeElement as HTMLElement).blur(); + if (searchRef) { + clearField(searchRef); + searchRef.dispatchEvent(blurEvent); + } + }, + [trackUiMetric, navigateToUrl, searchRef] ); + const emptyMessage = ; + const placeholderText = i18n.translate('xpack.globalSearchBar.searchBar.placeholder', { + defaultMessage: 'Search Elastic', + }); + useEvent('keydown', onKeyDown); return ( @@ -395,102 +275,38 @@ export function SearchBar({ popoverButtonBreakpoints={['xs', 's']} singleSelection={true} renderOption={(option) => euiSelectableTemplateSitewideRenderOptions(option, searchTerm)} - popoverButton={ - - - - } searchProps={{ onInput: (e: React.UIEvent) => setSearchValue(e.currentTarget.value), 'data-test-subj': 'nav-search-input', inputRef: setSearchRef, compressed: true, className: 'kbnSearchBar', - 'aria-label': i18n.translate('xpack.globalSearchBar.searchBar.placeholder', { - defaultMessage: 'Search Elastic', - }), - placeholder: i18n.translate('xpack.globalSearchBar.searchBar.placeholder', { - defaultMessage: 'Search Elastic', - }), + 'aria-label': placeholderText, + placeholder: placeholderText, onFocus: () => { trackUiMetric(METRIC_TYPE.COUNT, 'search_focus'); setInitialLoad(true); }, }} + emptyMessage={emptyMessage} + noMatchesMessage={emptyMessage} popoverProps={{ 'data-test-subj': 'nav-search-popover', panelClassName: 'navSearch__panel', repositionOnScroll: true, buttonRef: setButtonRef, }} - emptyMessage={emptyMessage} - noMatchesMessage={emptyMessage} - popoverFooter={ - - - -

    - -   - type:  - -   - tag: -

    -
    -
    - - -

    - - ), - commandDescription: ( - - {isMac ? ( - - ) : ( - - )} - - ), - }} - /> -

    -
    -
    -
    + + } + popoverFooter={} /> ); -} +}; diff --git a/x-pack/plugins/global_search_bar/public/lib/index.ts b/x-pack/plugins/global_search_bar/public/lib/index.ts new file mode 100644 index 00000000000000..91f4922c27e05a --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/lib/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { resultToOption } from './result_to_option'; +export { suggestionToOption } from './suggestion_to_option'; diff --git a/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts b/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts new file mode 100644 index 00000000000000..ab935522ab9215 --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/lib/result_to_option.test.ts @@ -0,0 +1,92 @@ +/* + * Copyright 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 { GlobalSearchResult } from '../../../global_search/common/types'; +import { resultToOption } from './result_to_option'; + +const createSearchResult = (parts: Partial = {}): GlobalSearchResult => ({ + id: 'id', + title: 'title', + type: 'application', + icon: 'some-icon', + score: 100, + url: '/url', + meta: {}, + ...parts, +}); + +describe('resultToOption', () => { + it('converts the result to the expected format', () => { + const input = createSearchResult({}); + expect(resultToOption(input, [])).toEqual({ + key: input.id, + label: input.title, + url: input.url, + type: input.type, + icon: { type: expect.any(String) }, + 'data-test-subj': expect.any(String), + meta: expect.any(Array), + }); + }); + + it('uses icon for `application` type', () => { + const input = createSearchResult({ type: 'application', icon: 'app-icon' }); + expect(resultToOption(input, [])).toEqual( + expect.objectContaining({ + icon: { type: 'app-icon' }, + }) + ); + }); + + it('uses icon for `integration` type', () => { + const input = createSearchResult({ type: 'integration', icon: 'integ-icon' }); + expect(resultToOption(input, [])).toEqual( + expect.objectContaining({ + icon: { type: 'integ-icon' }, + }) + ); + }); + + it('does not use icon for other types', () => { + const input = createSearchResult({ type: 'dashboard', icon: 'dash-icon' }); + expect(resultToOption(input, [])).toEqual( + expect.objectContaining({ + icon: { type: 'empty' }, + }) + ); + }); + + it('uses the category label as meta for `application` type', () => { + const input = createSearchResult({ type: 'application', meta: { categoryLabel: 'category' } }); + expect(resultToOption(input, [])).toEqual( + expect.objectContaining({ + meta: [{ text: 'category' }], + }) + ); + }); + + it('uses the type as meta for non-`application` type', () => { + const input = createSearchResult({ type: 'dashboard', meta: { categoryLabel: 'category' } }); + expect(resultToOption(input, [])).toEqual( + expect.objectContaining({ + meta: [{ text: 'Dashboard' }], + }) + ); + }); + + it('uses the displayName as meta for non-`application` type when provided', () => { + const input = createSearchResult({ + type: 'dashboard', + meta: { categoryLabel: 'category', displayName: 'foo' }, + }); + expect(resultToOption(input, [])).toEqual( + expect.objectContaining({ + meta: [{ text: 'Foo' }], + }) + ); + }); +}); diff --git a/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx b/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx new file mode 100644 index 00000000000000..85bf99f5e5a6d2 --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/lib/result_to_option.tsx @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { EuiSelectableTemplateSitewideOption } from '@elastic/eui'; +import type { GlobalSearchResult } from '../../../global_search/common/types'; +import type { SavedObjectTaggingPluginStart, Tag } from '../../../saved_objects_tagging/public'; +import { ResultTagList } from '../components/result_tag_list'; + +const cleanMeta = (str: string) => (str.charAt(0).toUpperCase() + str.slice(1)).replace(/-/g, ' '); + +export const resultToOption = ( + result: GlobalSearchResult, + searchTagIds: string[], + getTag?: SavedObjectTaggingPluginStart['ui']['getTag'] +): EuiSelectableTemplateSitewideOption => { + const { id, title, url, icon, type, meta = {} } = result; + const { tagIds = [], categoryLabel = '' } = meta as { tagIds: string[]; categoryLabel: string }; + // only displaying icons for applications and integrations + const useIcon = type === 'application' || type === 'integration'; + const option: EuiSelectableTemplateSitewideOption = { + key: id, + label: title, + url, + type, + icon: { type: useIcon && icon ? icon : 'empty' }, + 'data-test-subj': `nav-search-option`, + }; + + option.meta = + type === 'application' + ? [{ text: categoryLabel }] + : [{ text: cleanMeta((meta.displayName as string) ?? type) }]; + + if (getTag && tagIds.length) { + // TODO #85189 - refactor to use TagList instead of getTag + // Casting to Tag[] because we know all our IDs will be valid here, no need to check for undefined + option.append = ( + + ); + } + + return option; +}; diff --git a/x-pack/plugins/global_search_bar/public/lib/suggestion_to_option.ts b/x-pack/plugins/global_search_bar/public/lib/suggestion_to_option.ts new file mode 100644 index 00000000000000..d0ce6364208bcd --- /dev/null +++ b/x-pack/plugins/global_search_bar/public/lib/suggestion_to_option.ts @@ -0,0 +1,24 @@ +/* + * Copyright 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 { EuiSelectableTemplateSitewideOption } from '@elastic/eui'; +import { SearchSuggestion } from '../suggestions'; + +export const suggestionToOption = ( + suggestion: SearchSuggestion +): EuiSelectableTemplateSitewideOption => { + const { key, label, description, icon, suggestedSearch } = suggestion; + return { + key, + label, + type: '__suggestion__', + icon: { type: icon }, + suggestion: suggestedSearch, + meta: [{ text: description }], + 'data-test-subj': `nav-search-option`, + }; +}; diff --git a/x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.test.ts b/x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.test.ts new file mode 100644 index 00000000000000..3a8494cb7d0e8f --- /dev/null +++ b/x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.test.ts @@ -0,0 +1,130 @@ +/* + * Copyright 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 { SavedObjectTypeRegistry } from '../../../../../../src/core/server'; +import { getSearchableTypes } from './get_searchable_types'; + +describe('getSearchableTypes', () => { + let registry: SavedObjectTypeRegistry; + + beforeEach(() => { + registry = new SavedObjectTypeRegistry(); + }); + + const registerType = ({ + name, + displayName, + hidden = false, + noSearchField = false, + noGetInAppUrl = false, + }: { + name: string; + displayName?: string; + hidden?: boolean; + noSearchField?: boolean; + noGetInAppUrl?: boolean; + }) => { + registry.registerType({ + name, + hidden, + management: { + displayName, + defaultSearchField: noSearchField ? undefined : 'title', + getInAppUrl: noGetInAppUrl + ? undefined + : () => ({ path: 'path', uiCapabilitiesPath: 'uiCapabilitiesPath' }), + }, + namespaceType: 'multiple', + mappings: { properties: {} }, + }); + }; + + it('returns registered types that match', () => { + registerType({ name: 'foo' }); + registerType({ name: 'bar' }); + registerType({ name: 'dolly' }); + + const matching = getSearchableTypes(registry, ['foo', 'dolly']).map((type) => type.name); + expect(matching).toEqual(['foo', 'dolly']); + }); + + it('ignores hidden types', () => { + registerType({ name: 'foo', hidden: true }); + registerType({ name: 'bar' }); + registerType({ name: 'dolly' }); + + const matching = getSearchableTypes(registry, ['foo', 'dolly']).map((type) => type.name); + expect(matching).toEqual(['dolly']); + }); + + it('ignores types without `defaultSearchField`', () => { + registerType({ name: 'foo' }); + registerType({ name: 'bar' }); + registerType({ name: 'dolly', noSearchField: true }); + + const matching = getSearchableTypes(registry, ['foo', 'dolly']).map((type) => type.name); + expect(matching).toEqual(['foo']); + }); + + it('ignores types without `getInAppUrl`', () => { + registerType({ name: 'foo' }); + registerType({ name: 'bar' }); + registerType({ name: 'dolly', noGetInAppUrl: true }); + + const matching = getSearchableTypes(registry, ['foo', 'dolly']).map((type) => type.name); + expect(matching).toEqual(['foo']); + }); + + it('matches ignoring case', () => { + registerType({ name: 'foo' }); + registerType({ name: 'bar' }); + registerType({ name: 'dolly' }); + + const matching = getSearchableTypes(registry, ['FOO', 'DolLy']).map((type) => type.name); + expect(matching).toEqual(['foo', 'dolly']); + }); + + it('matches against the display name when provided', () => { + registerType({ name: 'foo' }); + registerType({ name: 'bar', displayName: 'display' }); + registerType({ name: 'dolly', displayName: 'name' }); + + const matching = getSearchableTypes(registry, ['display', 'name']).map((type) => type.name); + expect(matching).toEqual(['bar', 'dolly']); + }); + + it('ignores cases against the display name', () => { + registerType({ name: 'foo' }); + registerType({ name: 'bar', displayName: 'display' }); + registerType({ name: 'dolly', displayName: 'name' }); + + const matching = getSearchableTypes(registry, ['DISPLAY', 'NaMe']).map((type) => type.name); + expect(matching).toEqual(['bar', 'dolly']); + }); + + it('replaces whitespaces with dashes when matching against the display name', () => { + registerType({ name: 'dashboard' }); + registerType({ name: 'index-pattern', displayName: 'data view' }); + registerType({ name: 'map', displayName: 'my super display name' }); + + const matching = getSearchableTypes(registry, ['data-view', 'my-super-display-name']).map( + (type) => type.name + ); + expect(matching).toEqual(['index-pattern', 'map']); + }); + + it('replaces whitespaces with dashes when matching against the name', () => { + registerType({ name: 'dashboard' }); + registerType({ name: 'index-pattern' }); + registerType({ name: 'new-map' }); + + const matching = getSearchableTypes(registry, ['index pattern', 'new map']).map( + (type) => type.name + ); + expect(matching).toEqual(['index-pattern', 'new-map']); + }); +}); diff --git a/x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.ts b/x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.ts new file mode 100644 index 00000000000000..fa8153dc161cab --- /dev/null +++ b/x-pack/plugins/global_search_providers/server/providers/saved_objects/get_searchable_types.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ISavedObjectTypeRegistry, SavedObjectsType } from 'src/core/server'; + +export const getSearchableTypes = (typeRegistry: ISavedObjectTypeRegistry, types?: string[]) => { + const typeFilter = types + ? (type: SavedObjectsType) => { + if (type.management?.displayName && isTypeMatching(types, type.management.displayName)) { + return true; + } + return isTypeMatching(types, type.name); + } + : () => true; + + return typeRegistry + .getVisibleTypes() + .filter(typeFilter) + .filter((type) => type.management?.defaultSearchField && type.management?.getInAppUrl); +}; + +const isTypeMatching = (list: string[], item: string) => + list.some((e) => toCompareFormat(e) === toCompareFormat(item)); + +const toCompareFormat = (str: string) => str.toLowerCase().replace(/\s/g, '-'); diff --git a/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.test.ts b/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.test.ts index 277be1ef8ac802..3b6011aeab7fce 100644 --- a/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.test.ts +++ b/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.test.ts @@ -44,6 +44,7 @@ describe('mapToResult', () => { const type = createType({ name: 'dashboard', management: { + displayName: 'dashDisplayName', defaultSearchField: 'title', icon: 'dashboardApp', getInAppUrl: (obj) => ({ path: `/dashboard/${obj.id}`, uiCapabilitiesPath: '' }), @@ -68,7 +69,7 @@ describe('mapToResult', () => { url: '/dashboard/dash1', icon: 'dashboardApp', score: 42, - meta: { tagIds: [] }, + meta: { tagIds: [], displayName: 'dashDisplayName' }, }); }); @@ -140,6 +141,7 @@ describe('mapToResults', () => { createType({ name: 'typeB', management: { + displayName: 'typeBDisplayName', defaultSearchField: 'description', getInAppUrl: (obj) => ({ path: `/type-b/${obj.id}`, uiCapabilitiesPath: 'test.typeB' }), }, @@ -229,7 +231,7 @@ describe('mapToResults', () => { type: 'typeA', url: '/type-a/resultA', score: 100, - meta: { tagIds: [] }, + meta: { tagIds: [], displayName: 'typeA' }, }, { id: 'resultC', @@ -237,7 +239,7 @@ describe('mapToResults', () => { type: 'typeC', url: '/type-c/resultC', score: 42, - meta: { tagIds: ['1', '2'] }, + meta: { tagIds: ['1', '2'], displayName: 'typeC' }, }, { id: 'resultB', @@ -245,7 +247,7 @@ describe('mapToResults', () => { type: 'typeB', url: '/type-b/resultB', score: 69, - meta: { tagIds: [] }, + meta: { tagIds: [], displayName: 'typeBDisplayName' }, }, ]); }); @@ -283,7 +285,7 @@ describe('mapToResults', () => { type: 'typeA', url: '/type-a/resultA', score: 100, - meta: { tagIds: [] }, + meta: { tagIds: [], displayName: 'typeA' }, }, ]); }); diff --git a/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.ts b/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.ts index c96666dfbfe3c1..871710abee11b9 100644 --- a/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.ts +++ b/x-pack/plugins/global_search_providers/server/providers/saved_objects/map_object_to_result.ts @@ -56,6 +56,7 @@ export const mapToResult = ( score: object.score, meta: { tagIds: object.references.filter((ref) => ref.type === 'tag').map(({ id }) => id), + displayName: type.management?.displayName ?? object.type, }, }; }; diff --git a/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.test.ts b/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.test.ts index 2aa95fa5cb6ca6..f332747f1ccfc8 100644 --- a/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.test.ts +++ b/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.test.ts @@ -202,7 +202,7 @@ describe('savedObjectsResultProvider', () => { type: 'typeA', url: '/type-a/resultA', score: 50, - meta: { tagIds: [] }, + meta: { tagIds: [], displayName: 'typeA' }, }, { id: 'resultB', @@ -210,7 +210,7 @@ describe('savedObjectsResultProvider', () => { type: 'typeB', url: '/type-b/resultB', score: 78, - meta: { tagIds: [] }, + meta: { tagIds: [], displayName: 'typeB' }, }, ]); }); diff --git a/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.ts b/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.ts index 6557e6fe7b6633..ae1f6da10bc6e1 100644 --- a/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.ts +++ b/x-pack/plugins/global_search_providers/server/providers/saved_objects/provider.ts @@ -7,9 +7,10 @@ import { from, combineLatest, of } from 'rxjs'; import { map, takeUntil, first } from 'rxjs/operators'; -import { SavedObjectsFindOptionsReference, ISavedObjectTypeRegistry } from 'src/core/server'; +import { SavedObjectsFindOptionsReference } from 'src/core/server'; import { GlobalSearchResultProvider } from '../../../../global_search/server'; import { mapToResults } from './map_object_to_result'; +import { getSearchableTypes } from './get_searchable_types'; export const createSavedObjectsResultProvider = (): GlobalSearchResultProvider => { return { @@ -58,13 +59,4 @@ export const createSavedObjectsResultProvider = (): GlobalSearchResultProvider = }; }; -const getSearchableTypes = (typeRegistry: ISavedObjectTypeRegistry, types?: string[]) => - typeRegistry - .getVisibleTypes() - .filter(types ? (type) => includeIgnoreCase(types, type.name) : () => true) - .filter((type) => type.management?.defaultSearchField && type.management?.getInAppUrl); - const uniq = (values: T[]): T[] => [...new Set(values)]; - -const includeIgnoreCase = (list: string[], item: string) => - list.find((e) => e.toLowerCase() === item.toLowerCase()) !== undefined; From cc46febd519f79731f26b485d92249d84944a42e Mon Sep 17 00:00:00 2001 From: Thom Heymann <190132+thomheymann@users.noreply.github.com> Date: Fri, 3 Dec 2021 09:07:49 +0000 Subject: [PATCH 087/126] Bump json-schema and uglify-js (#120142) --- package.json | 3 +++ src/dev/license_checker/config.ts | 1 + yarn.lock | 21 +++++++++------------ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index a6dfd03893c814..1e5a135b723ed7 100644 --- a/package.json +++ b/package.json @@ -79,9 +79,12 @@ "**/chokidar": "^3.4.3", "**/deepmerge": "^4.2.2", "**/fast-deep-equal": "^3.1.1", + "**/handlebars/uglify-js": "^3.14.3", "**/hoist-non-react-statics": "^3.3.2", + "**/html-minifier/uglify-js": "^3.14.3", "**/isomorphic-fetch/node-fetch": "^2.6.1", "**/istanbul-instrumenter-loader/schema-utils": "1.0.0", + "**/json-schema": "^0.4.0", "**/minimist": "^1.2.5", "**/node-jose/node-forge": "^0.10.0", "**/pdfkit/crypto-js": "4.0.0", diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 078786abb8c647..52b1f816090dfd 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -25,6 +25,7 @@ export const LICENSE_ALLOWED = [ '(MIT OR WTFPL)', '(Unlicense OR Apache-2.0)', 'AFLv2.1', + '(AFL-2.1 OR BSD-3-Clause)', 'Apache 2.0', 'Apache License, v2.0', 'Apache License, Version 2.0', diff --git a/yarn.lock b/yarn.lock index 9472271c20998d..fc670fda132ca1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10093,7 +10093,7 @@ commander@2, commander@^2.19.0, commander@^2.20.0, commander@^2.7.1, commander@^ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@2.17.x, commander@~2.17.1: +commander@2.17.x: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== @@ -17982,10 +17982,10 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= +json-schema@0.2.3, json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" @@ -27743,13 +27743,10 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== -uglify-js@3.4.x, uglify-js@^3.1.4: - version "3.4.9" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== - dependencies: - commander "~2.17.1" - source-map "~0.6.1" +uglify-js@3.4.x, uglify-js@^3.1.4, uglify-js@^3.14.3: + version "3.14.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.4.tgz#68756f17d1b90b9d289341736cb9a567d6882f90" + integrity sha512-AbiSR44J0GoCeV81+oxcy/jDOElO2Bx3d0MfQCUShq7JRXaM4KtQopZsq2vFv8bCq2yMaGrw1FgygUd03RyRDA== uglify-js@^2.6.2: version "2.8.29" From 3fed3a4360f58476cca4535cc799b35d40538a52 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 3 Dec 2021 11:17:38 +0200 Subject: [PATCH 088/126] [Canvas] Added KibanaThemeProvider to expression_metric. (#120078) * Added KibanaThemeProvider to metric and changed exports. * Added kibanaReact bundle. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/expression_metric/kibana.json | 3 +- .../__stories__/metric_renderer.stories.tsx | 16 ++--- .../public/expression_renderers/index.ts | 6 +- .../expression_renderers/metric_renderer.tsx | 64 +++++++++++-------- src/plugins/expression_metric/public/index.ts | 5 +- .../expression_metric/public/plugin.ts | 4 +- .../canvas_plugin_src/renderers/external.ts | 9 ++- .../shareable_runtime/supported_renderers.js | 4 +- 8 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/plugins/expression_metric/kibana.json b/src/plugins/expression_metric/kibana.json index 2aaef04e3bec36..3d844fa4de9fcb 100755 --- a/src/plugins/expression_metric/kibana.json +++ b/src/plugins/expression_metric/kibana.json @@ -10,5 +10,6 @@ "server": true, "ui": true, "requiredPlugins": ["expressions", "presentationUtil"], - "optionalPlugins": [] + "optionalPlugins": [], + "requiredBundles": ["kibanaReact"] } diff --git a/src/plugins/expression_metric/public/expression_renderers/__stories__/metric_renderer.stories.tsx b/src/plugins/expression_metric/public/expression_renderers/__stories__/metric_renderer.stories.tsx index 0e04c32f52ba20..5835730e35f9bd 100644 --- a/src/plugins/expression_metric/public/expression_renderers/__stories__/metric_renderer.stories.tsx +++ b/src/plugins/expression_metric/public/expression_renderers/__stories__/metric_renderer.stories.tsx @@ -9,7 +9,7 @@ import React, { CSSProperties } from 'react'; import { storiesOf } from '@storybook/react'; import { Style } from 'src/plugins/expressions'; -import { metricRenderer } from '../metric_renderer'; +import { getMetricRenderer } from '../metric_renderer'; import { Render } from '../../../../presentation_util/public/__stories__'; import { MetricRendererConfig } from '../../../common'; @@ -45,7 +45,7 @@ storiesOf('renderers/Metric', module) label: '', metricFormat: '', }; - return ; + return ; }) .add('with number metric', () => { const config: MetricRendererConfig = { @@ -55,7 +55,7 @@ storiesOf('renderers/Metric', module) label: '', metricFormat: '', }; - return ; + return ; }) .add('with string metric', () => { const config: MetricRendererConfig = { @@ -65,7 +65,7 @@ storiesOf('renderers/Metric', module) label: '', metricFormat: '', }; - return ; + return ; }) .add('with label', () => { const config: MetricRendererConfig = { @@ -75,7 +75,7 @@ storiesOf('renderers/Metric', module) label: 'Average price', metricFormat: '', }; - return ; + return ; }) .add('with number metric and a specified format', () => { const config: MetricRendererConfig = { @@ -85,7 +85,7 @@ storiesOf('renderers/Metric', module) label: 'Average price', metricFormat: '0.00%', }; - return ; + return ; }) .add('with formatted string metric and a specified format', () => { const config: MetricRendererConfig = { @@ -95,7 +95,7 @@ storiesOf('renderers/Metric', module) label: 'Total Revenue', metricFormat: '$0a', }; - return ; + return ; }) .add('with invalid metricFont', () => { const config: MetricRendererConfig = { @@ -105,5 +105,5 @@ storiesOf('renderers/Metric', module) label: 'Total Revenue', metricFormat: '$0a', }; - return ; + return ; }); diff --git a/src/plugins/expression_metric/public/expression_renderers/index.ts b/src/plugins/expression_metric/public/expression_renderers/index.ts index b77e0bb76f1fdf..c8d6fa08147eab 100644 --- a/src/plugins/expression_metric/public/expression_renderers/index.ts +++ b/src/plugins/expression_metric/public/expression_renderers/index.ts @@ -6,8 +6,4 @@ * Side Public License, v 1. */ -import { metricRenderer } from './metric_renderer'; - -export const renderers = [metricRenderer]; - -export { metricRenderer }; +export { metricRendererFactory, getMetricRenderer } from './metric_renderer'; diff --git a/src/plugins/expression_metric/public/expression_renderers/metric_renderer.tsx b/src/plugins/expression_metric/public/expression_renderers/metric_renderer.tsx index 02c910640edeba..6a11910d4f26f9 100644 --- a/src/plugins/expression_metric/public/expression_renderers/metric_renderer.tsx +++ b/src/plugins/expression_metric/public/expression_renderers/metric_renderer.tsx @@ -6,10 +6,14 @@ * Side Public License, v 1. */ import React, { CSSProperties, lazy } from 'react'; +import { Observable } from 'rxjs'; +import { CoreTheme } from 'kibana/public'; import { render, unmountComponentAtNode } from 'react-dom'; import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; import { i18n } from '@kbn/i18n'; -import { withSuspense } from '../../../presentation_util/public'; +import { CoreSetup } from '../../../../core/public'; +import { KibanaThemeProvider } from '../../../kibana_react/public'; +import { withSuspense, defaultTheme$ } from '../../../presentation_util/public'; import { MetricRendererConfig } from '../../common/types'; const strings = { @@ -26,30 +30,36 @@ const strings = { const LazyMetricComponent = lazy(() => import('../components/metric_component')); const MetricComponent = withSuspense(LazyMetricComponent); -export const metricRenderer = (): ExpressionRenderDefinition => ({ - name: 'metric', - displayName: strings.getDisplayName(), - help: strings.getHelpDescription(), - reuseDomNode: true, - render: async ( - domNode: HTMLElement, - config: MetricRendererConfig, - handlers: IInterpreterRenderHandlers - ) => { - handlers.onDestroy(() => { - unmountComponentAtNode(domNode); - }); +export const getMetricRenderer = + (theme$: Observable = defaultTheme$) => + (): ExpressionRenderDefinition => ({ + name: 'metric', + displayName: strings.getDisplayName(), + help: strings.getHelpDescription(), + reuseDomNode: true, + render: async ( + domNode: HTMLElement, + config: MetricRendererConfig, + handlers: IInterpreterRenderHandlers + ) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); - render( - , - domNode, - () => handlers.done() - ); - }, -}); + render( + + + , + domNode, + () => handlers.done() + ); + }, + }); + +export const metricRendererFactory = (core: CoreSetup) => getMetricRenderer(core.theme.theme$); diff --git a/src/plugins/expression_metric/public/index.ts b/src/plugins/expression_metric/public/index.ts index 87499f279524d8..8a23c2319a3c2d 100755 --- a/src/plugins/expression_metric/public/index.ts +++ b/src/plugins/expression_metric/public/index.ts @@ -6,9 +6,6 @@ * Side Public License, v 1. */ -// TODO: https://github.com/elastic/kibana/issues/110893 -/* eslint-disable @kbn/eslint/no_export_all */ - import { ExpressionMetricPlugin } from './plugin'; export type { ExpressionMetricPluginSetup, ExpressionMetricPluginStart } from './plugin'; @@ -17,4 +14,4 @@ export function plugin() { return new ExpressionMetricPlugin(); } -export * from './expression_renderers'; +export { metricRendererFactory, getMetricRenderer } from './expression_renderers'; diff --git a/src/plugins/expression_metric/public/plugin.ts b/src/plugins/expression_metric/public/plugin.ts index 8711a824fb7b51..6830fd904751c7 100755 --- a/src/plugins/expression_metric/public/plugin.ts +++ b/src/plugins/expression_metric/public/plugin.ts @@ -9,7 +9,7 @@ import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { ExpressionsStart, ExpressionsSetup } from '../../expressions/public'; import { metricFunction } from '../common/expression_functions'; -import { metricRenderer } from './expression_renderers'; +import { metricRendererFactory } from './expression_renderers'; interface SetupDeps { expressions: ExpressionsSetup; @@ -27,7 +27,7 @@ export class ExpressionMetricPlugin { public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionMetricPluginSetup { expressions.registerFunction(metricFunction); - expressions.registerRenderer(metricRenderer); + expressions.registerRenderer(metricRendererFactory(core)); } public start(core: CoreStart): ExpressionMetricPluginStart {} diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts index 572771537ec721..f97ac6e5385756 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts @@ -6,7 +6,7 @@ */ import { imageRenderer } from '../../../../../src/plugins/expression_image/public'; -import { metricRenderer } from '../../../../../src/plugins/expression_metric/public'; +import { metricRendererFactory } from '../../../../../src/plugins/expression_metric/public'; import { errorRendererFactory, debugRendererFactory, @@ -20,11 +20,14 @@ import { export const renderFunctions = [ imageRenderer, - metricRenderer, revealImageRenderer, shapeRenderer, repeatImageRenderer, progressRenderer, ]; -export const renderFunctionFactories = [debugRendererFactory, errorRendererFactory]; +export const renderFunctionFactories = [ + debugRendererFactory, + errorRendererFactory, + metricRendererFactory, +]; diff --git a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js index 1d2326b77dd26d..b71e60e5ef0be6 100644 --- a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js +++ b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js @@ -21,7 +21,7 @@ import { shapeRenderer as shape, progressRenderer as progress, } from '../../../../src/plugins/expression_shape/public'; -import { metricRenderer as metric } from '../../../../src/plugins/expression_metric/public'; +import { getMetricRenderer } from '../../../../src/plugins/expression_metric/public'; const unboxFactory = (factory) => factory(); @@ -31,6 +31,7 @@ const renderFunctionsFactories = [ getTableRenderer, getErrorRenderer, getDebugRenderer, + getMetricRenderer, ]; /** @@ -42,7 +43,6 @@ export const renderFunctions = [ image, repeatImage, revealImage, - metric, pie, plot, progress, From 680d0e19ccbf4b78faa8781caa1875c9794e78e9 Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Fri, 3 Dec 2021 10:55:07 +0100 Subject: [PATCH 089/126] [Discover] Add new KibanaThemeProvider (#119784) * [Discover] Add new KibanaThemeProvider * Wrap remaining components in KibanaThemeProvider * Fix failing unit test * Fix failing unit test * Add missing theme Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../application/context/context_app.test.tsx | 6 +++- .../utils/use_context_app_fetch.test.ts | 6 +++- .../context/utils/use_context_app_fetch.tsx | 26 ++++++++++------ .../discover/public/application/index.tsx | 8 +++-- .../components/top_nav/get_top_nav_links.ts | 2 ++ .../top_nav/open_options_popover.tsx | 10 +++++-- .../top_nav/show_open_search_panel.tsx | 10 +++++-- .../application/not_found/not_found_route.tsx | 29 ++++++++++-------- .../embeddable/saved_search_embeddable.tsx | 30 ++++++++++++------- 9 files changed, 86 insertions(+), 41 deletions(-) diff --git a/src/plugins/discover/public/application/context/context_app.test.tsx b/src/plugins/discover/public/application/context/context_app.test.tsx index 7f78bb1c698ab8..a31557124d49af 100644 --- a/src/plugins/discover/public/application/context/context_app.test.tsx +++ b/src/plugins/discover/public/application/context/context_app.test.tsx @@ -19,6 +19,7 @@ import { DiscoverServices } from '../../build_services'; import { indexPatternsMock } from '../../__mocks__/index_patterns'; import { act } from 'react-dom/test-utils'; import { uiSettingsMock } from '../../__mocks__/ui_settings'; +import { themeServiceMock } from '../../../../../core/public/mocks'; const mockFilterManager = createFilterManagerMock(); const mockNavigationPlugin = { ui: { TopNavMenu: mockTopNavMenu } }; @@ -60,7 +61,10 @@ describe('ContextApp test', () => { indexPatterns: indexPatternsMock, toastNotifications: { addDanger: () => {} }, navigation: mockNavigationPlugin, - core: { notifications: { toasts: [] } }, + core: { + notifications: { toasts: [] }, + theme: { theme$: themeServiceMock.createStartContract().theme$ }, + }, history: () => {}, fieldFormats: { getDefaultInstance: jest.fn(() => ({ convert: (value: unknown) => value })), diff --git a/src/plugins/discover/public/application/context/utils/use_context_app_fetch.test.ts b/src/plugins/discover/public/application/context/utils/use_context_app_fetch.test.ts index cd7bcd810dc394..0fc8bd99c021db 100644 --- a/src/plugins/discover/public/application/context/utils/use_context_app_fetch.test.ts +++ b/src/plugins/discover/public/application/context/utils/use_context_app_fetch.test.ts @@ -21,6 +21,7 @@ import { import { indexPatternWithTimefieldMock } from '../../../__mocks__/index_pattern_with_timefield'; import { createContextSearchSourceStub } from '../services/_stubs'; import { IndexPattern } from '../../../../../data_views/common'; +import { themeServiceMock } from '../../../../../../core/public/mocks'; const mockFilterManager = createFilterManagerMock(); @@ -60,7 +61,10 @@ const initDefaults = (tieBreakerFields: string[], indexPatternId = 'the-index-pa }, }, toastNotifications: { addDanger: dangerNotification }, - core: { notifications: { toasts: [] } }, + core: { + notifications: { toasts: [] }, + theme: { theme$: themeServiceMock.createStartContract().theme$ }, + }, history: () => {}, filterManager: mockFilterManager, uiSettings: { diff --git a/src/plugins/discover/public/application/context/utils/use_context_app_fetch.tsx b/src/plugins/discover/public/application/context/utils/use_context_app_fetch.tsx index e5ed24d4754975..fc5718abb43f05 100644 --- a/src/plugins/discover/public/application/context/utils/use_context_app_fetch.tsx +++ b/src/plugins/discover/public/application/context/utils/use_context_app_fetch.tsx @@ -11,7 +11,7 @@ import { CONTEXT_TIE_BREAKER_FIELDS_SETTING } from '../../../../common'; import { DiscoverServices } from '../../../build_services'; import { fetchAnchor } from '../services/anchor'; import { fetchSurroundingDocs, SurrDocType } from '../services/context'; -import { MarkdownSimple, toMountPoint } from '../../../../../kibana_react/public'; +import { MarkdownSimple, toMountPoint, wrapWithTheme } from '../../../../../kibana_react/public'; import { IndexPattern, SortDirection } from '../../../../../data/public'; import { ContextFetchState, @@ -42,7 +42,8 @@ export function useContextAppFetch({ useNewFieldsApi, services, }: ContextAppFetchProps) { - const { uiSettings: config, data, toastNotifications, filterManager } = services; + const { uiSettings: config, data, toastNotifications, filterManager, core } = services; + const { theme$ } = core.theme; const searchSource = useMemo(() => { return data.search.searchSource.createEmpty(); @@ -70,11 +71,14 @@ export function useContextAppFetch({ toastNotifications.addDanger({ title: errorTitle, text: toMountPoint( - - {i18n.translate('discover.context.invalidTieBreakerFiledSetting', { - defaultMessage: 'Invalid tie breaker field setting', - })} - + wrapWithTheme( + + {i18n.translate('discover.context.invalidTieBreakerFiledSetting', { + defaultMessage: 'Invalid tie breaker field setting', + })} + , + theme$ + ) ), }); return; @@ -93,7 +97,7 @@ export function useContextAppFetch({ setState(createError('anchorStatus', FailureReason.UNKNOWN, error)); toastNotifications.addDanger({ title: errorTitle, - text: toMountPoint({error.message}), + text: toMountPoint(wrapWithTheme({error.message}, theme$)), }); } }, [ @@ -104,6 +108,7 @@ export function useContextAppFetch({ anchorId, searchSource, useNewFieldsApi, + theme$, ]); const fetchSurroundingRows = useCallback( @@ -135,7 +140,9 @@ export function useContextAppFetch({ setState(createError(statusKey, FailureReason.UNKNOWN, error)); toastNotifications.addDanger({ title: errorTitle, - text: toMountPoint({error.message}), + text: toMountPoint( + wrapWithTheme({error.message}, theme$) + ), }); } }, @@ -148,6 +155,7 @@ export function useContextAppFetch({ indexPattern, toastNotifications, useNewFieldsApi, + theme$, ] ); diff --git a/src/plugins/discover/public/application/index.tsx b/src/plugins/discover/public/application/index.tsx index f6c7d60ed7db8a..55407835c0a4b5 100644 --- a/src/plugins/discover/public/application/index.tsx +++ b/src/plugins/discover/public/application/index.tsx @@ -8,11 +8,11 @@ import { i18n } from '@kbn/i18n'; import { getServices } from '../kibana_services'; import { discoverRouter } from './discover_router'; -import { toMountPoint } from '../../../kibana_react/public'; +import { toMountPoint, wrapWithTheme } from '../../../kibana_react/public'; export const renderApp = (element: HTMLElement) => { const services = getServices(); - const { history: getHistory, capabilities, chrome, data } = services; + const { history: getHistory, capabilities, chrome, data, core } = services; const history = getHistory(); if (!capabilities.discover.save) { @@ -26,7 +26,9 @@ export const renderApp = (element: HTMLElement) => { iconType: 'glasses', }); } - const unmount = toMountPoint(discoverRouter(services, history))(element); + const unmount = toMountPoint(wrapWithTheme(discoverRouter(services, history), core.theme.theme$))( + element + ); return () => { unmount(); diff --git a/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.ts b/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.ts index 4b9d48a92e0f5b..6e93bc40f7d7f1 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.ts +++ b/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.ts @@ -52,6 +52,7 @@ export const getTopNavLinks = ({ openOptionsPopover({ I18nContext: services.core.i18n.Context, anchorElement, + theme$: services.core.theme.theme$, }), testId: 'discoverOptionsButton', }; @@ -95,6 +96,7 @@ export const getTopNavLinks = ({ showOpenSearchPanel({ onOpenSavedSearch, I18nContext: services.core.i18n.Context, + theme$: services.core.theme.theme$, }), }; diff --git a/src/plugins/discover/public/application/main/components/top_nav/open_options_popover.tsx b/src/plugins/discover/public/application/main/components/top_nav/open_options_popover.tsx index 0d359c865220f0..ea0cd804efec08 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/open_options_popover.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/open_options_popover.tsx @@ -8,7 +8,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { I18nStart } from 'kibana/public'; +import { CoreTheme, I18nStart } from 'kibana/public'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { @@ -22,8 +22,10 @@ import { EuiTextAlign, } from '@elastic/eui'; import './open_options_popover.scss'; +import { Observable } from 'rxjs'; import { DOC_TABLE_LEGACY } from '../../../../../common'; import { getServices } from '../../../../kibana_services'; +import { KibanaThemeProvider } from '../../../../../../kibana_react/public'; const container = document.createElement('div'); let isOpen = false; @@ -125,9 +127,11 @@ function onClose() { export function openOptionsPopover({ I18nContext, anchorElement, + theme$, }: { I18nContext: I18nStart['Context']; anchorElement: HTMLElement; + theme$: Observable; }) { if (isOpen) { onClose(); @@ -139,7 +143,9 @@ export function openOptionsPopover({ const element = ( - + + + ); ReactDOM.render(element, container); diff --git a/src/plugins/discover/public/application/main/components/top_nav/show_open_search_panel.tsx b/src/plugins/discover/public/application/main/components/top_nav/show_open_search_panel.tsx index 1a9bfd7e30c570..d506de357675a3 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/show_open_search_panel.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/show_open_search_panel.tsx @@ -8,17 +8,21 @@ import React from 'react'; import ReactDOM from 'react-dom'; -import { I18nStart } from 'kibana/public'; +import { CoreTheme, I18nStart } from 'kibana/public'; +import { Observable } from 'rxjs'; import { OpenSearchPanel } from './open_search_panel'; +import { KibanaThemeProvider } from '../../../../../../kibana_react/public'; let isOpen = false; export function showOpenSearchPanel({ I18nContext, onOpenSavedSearch, + theme$, }: { I18nContext: I18nStart['Context']; onOpenSavedSearch: (id: string) => void; + theme$: Observable; }) { if (isOpen) { return; @@ -35,7 +39,9 @@ export function showOpenSearchPanel({ document.body.appendChild(container); const element = ( - + + + ); ReactDOM.render(element, container); diff --git a/src/plugins/discover/public/application/not_found/not_found_route.tsx b/src/plugins/discover/public/application/not_found/not_found_route.tsx index 80e4e5c8057f68..7b42e855844285 100644 --- a/src/plugins/discover/public/application/not_found/not_found_route.tsx +++ b/src/plugins/discover/public/application/not_found/not_found_route.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { EuiCallOut } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { Redirect } from 'react-router-dom'; -import { toMountPoint } from '../../../../kibana_react/public'; +import { toMountPoint, wrapWithTheme } from '../../../../kibana_react/public'; import { DiscoverServices } from '../../build_services'; import { getUrlTracker } from '../../kibana_services'; @@ -39,17 +39,20 @@ export function NotFoundRoute(props: NotFoundRouteProps) { bannerId = core.overlays.banners.replace( bannerId, toMountPoint( - -

    - -

    -
    + wrapWithTheme( + +

    + +

    +
    , + core.theme.theme$ + ) ) ); @@ -59,7 +62,7 @@ export function NotFoundRoute(props: NotFoundRouteProps) { core.overlays.banners.remove(bannerId); } }, 15000); - }, [core.overlays.banners, history, urlForwarding]); + }, [core.overlays.banners, history, urlForwarding, core.theme.theme$]); return ; } diff --git a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx index 4a7f0b1c36868d..6d7e515e33fa49 100644 --- a/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx +++ b/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx @@ -48,6 +48,7 @@ import { VIEW_MODE } from '../components/view_mode_toggle'; import { updateSearchSource } from './utils/update_search_source'; import { FieldStatsTableSavedSearchEmbeddable } from '../application/main/components/field_stats_table'; import { ElasticSearchHit } from '../types'; +import { KibanaThemeProvider } from '../../../kibana_react/public'; export type SearchProps = Partial & Partial & { @@ -391,15 +392,17 @@ export class SavedSearchEmbeddable Array.isArray(searchProps.columns) ) { ReactDOM.render( - , + + + , domNode ); return; @@ -410,7 +413,14 @@ export class SavedSearchEmbeddable useLegacyTable, refs: domNode, }; - ReactDOM.render(, domNode); + if (searchProps.services) { + ReactDOM.render( + + + , + domNode + ); + } } public reload() { From 1928beade8b18003580ef6264cad9d178d0c8ba7 Mon Sep 17 00:00:00 2001 From: Vitalii Dmyterko <92328789+vitaliidm@users.noreply.github.com> Date: Fri, 3 Dec 2021 10:14:47 +0000 Subject: [PATCH 090/126] [Security Solution][Detections] Adds Rules monitoring table actions (#119644) [Security Solution][Detections] Adds actions for Rules monitoring table: single/bulk enable, disable, duplicate, export, remove (#119644) --- .../detection_rules/prebuilt_rules.spec.ts | 15 + .../cypress/screens/alerts_detection_rules.ts | 2 + .../rules/all_rules_tables/index.test.tsx | 122 ------ .../rules/all_rules_tables/index.tsx | 102 ----- .../rules/use_rule_status.test.tsx | 2 - .../rules/use_rule_status.tsx | 8 +- .../rules/all/columns.test.tsx | 4 - .../detection_engine/rules/all/columns.tsx | 392 ++++++++---------- .../detection_engine/rules/all/index.test.tsx | 2 - .../rules/all/popover_tooltip.tsx | 3 +- .../rules/all/rules_tables.tsx | 75 ++-- .../all/table_header_tooltip_cell.test.tsx | 36 ++ .../rules/all/table_header_tooltip_cell.tsx | 46 ++ 13 files changed, 334 insertions(+), 475 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.tsx create mode 100644 x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.test.tsx create mode 100644 x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.tsx diff --git a/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts b/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts index b259c0f1d9e336..38f5eec836bd6e 100644 --- a/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/detection_rules/prebuilt_rules.spec.ts @@ -13,6 +13,8 @@ import { RULES_EMPTY_PROMPT, RULE_SWITCH, SHOWING_RULES_TEXT, + RULES_MONIROTING_TABLE, + SELECT_ALL_RULES_ON_PAGE_CHECKBOX, } from '../../screens/alerts_detection_rules'; import { goToManageAlertsDetectionRules, waitForAlertsIndexToBeCreated } from '../../tasks/alerts'; @@ -94,6 +96,19 @@ describe('Actions with prebuilt rules', () => { cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'false'); }); + it('Allows to activate all rules on a page and deactivate single one at monitoring table', () => { + cy.get(RULES_MONIROTING_TABLE).click(); + cy.get(SELECT_ALL_RULES_ON_PAGE_CHECKBOX).click(); + activateSelectedRules(); + waitForRuleToChangeStatus(); + cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'true'); + + selectNumberOfRules(1); + cy.get(RULE_SWITCH).first().click(); + waitForRuleToChangeStatus(); + cy.get(RULE_SWITCH).first().should('have.attr', 'aria-checked', 'false'); + }); + it('Allows to delete all rules at once', () => { selectAllRules(); deleteSelectedRules(); diff --git a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts index 39e08e29bdc2a1..2fff4c2e926762 100644 --- a/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts +++ b/x-pack/plugins/security_solution/cypress/screens/alerts_detection_rules.ts @@ -97,3 +97,5 @@ export const RULE_DETAILS_DELETE_BTN = '[data-test-subj="rules-details-delete-ru export const ALERT_DETAILS_CELLS = '[data-test-subj="dataGridRowCell"]'; export const SERVER_SIDE_EVENT_COUNT = '[data-test-subj="server-side-event-count"]'; + +export const SELECT_ALL_RULES_ON_PAGE_CHECKBOX = '[data-test-subj="checkboxSelectAll"]'; diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.test.tsx deleted file mode 100644 index d1dfd6ccfd5657..00000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.test.tsx +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { useRef } from 'react'; -import { shallow } from 'enzyme'; - -import '../../../../common/mock/match_media'; -import { AllRulesTables } from './index'; -import { AllRulesTabs } from '../../../pages/detection_engine/rules/all'; - -describe('AllRulesTables', () => { - it('renders correctly', () => { - const Component = () => { - const ref = useRef(null); - - return ( - - ); - }; - const wrapper = shallow(); - - expect(wrapper.dive().find('[data-test-subj="rules-table"]')).toHaveLength(1); - }); - - it('renders rules tab when "selectedTab" is "rules"', () => { - const Component = () => { - const ref = useRef(null); - - return ( - - ); - }; - const wrapper = shallow(); - - expect(wrapper.dive().find('[data-test-subj="rules-table"]')).toHaveLength(1); - expect(wrapper.dive().find('[data-test-subj="monitoring-table"]')).toHaveLength(0); - }); - - it('renders monitoring tab when "selectedTab" is "monitoring"', () => { - const Component = () => { - const ref = useRef(null); - - return ( - - ); - }; - const wrapper = shallow(); - - expect(wrapper.dive().find('[data-test-subj="rules-table"]')).toHaveLength(0); - expect(wrapper.dive().find('[data-test-subj="monitoring-table"]')).toHaveLength(1); - }); -}); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.tsx deleted file mode 100644 index 82e54b5b86072b..00000000000000 --- a/x-pack/plugins/security_solution/public/detections/components/rules/all_rules_tables/index.tsx +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { - Direction, - EuiBasicTable, - EuiBasicTableColumn, - EuiEmptyPrompt, - EuiTableSelectionType, -} from '@elastic/eui'; - -import React, { memo } from 'react'; -import { Rule, Rules, RulesSortingFields } from '../../../containers/detection_engine/rules/types'; -import { AllRulesTabs } from '../../../pages/detection_engine/rules/all'; -import { - RulesColumns, - RuleStatusRowItemType, -} from '../../../pages/detection_engine/rules/all/columns'; -import * as i18n from '../../../pages/detection_engine/rules/translations'; -import { EuiBasicTableOnChange } from '../../../pages/detection_engine/rules/types'; - -export interface SortingType { - sort: { - field: RulesSortingFields; - direction: Direction; - }; -} - -interface AllRulesTablesProps { - euiBasicTableSelectionProps: EuiTableSelectionType; - hasPermissions: boolean; - monitoringColumns: Array>; - pagination: { - pageIndex: number; - pageSize: number; - totalItemCount: number; - pageSizeOptions: number[]; - }; - rules: Rules; - rulesColumns: RulesColumns[]; - rulesStatuses: RuleStatusRowItemType[]; - sorting: SortingType; - tableOnChangeCallback: ({ page, sort }: EuiBasicTableOnChange) => void; - tableRef?: React.MutableRefObject; - selectedTab: AllRulesTabs; -} - -const emptyPrompt = ( - {i18n.NO_RULES}} titleSize="xs" body={i18n.NO_RULES_BODY} /> -); - -export const AllRulesTablesComponent: React.FC = ({ - euiBasicTableSelectionProps, - hasPermissions, - monitoringColumns, - pagination, - rules, - rulesColumns, - rulesStatuses, - sorting, - tableOnChangeCallback, - tableRef, - selectedTab, -}) => { - return ( - <> - {selectedTab === AllRulesTabs.rules && ( - - )} - {selectedTab === AllRulesTabs.monitoring && ( - - )} - - ); -}; - -export const AllRulesTables = memo(AllRulesTablesComponent); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.test.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.test.tsx index 4d01e2ff00ec18..a5809ea7763226 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.test.tsx @@ -178,8 +178,6 @@ describe('useRuleStatus', () => { }, failures: [], id: '12345678987654321', - activate: true, - name: 'Test rule', }, ], }); diff --git a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.tsx b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.tsx index 4f524886935cd2..d0c75e08ae01bd 100644 --- a/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.tsx +++ b/x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules/use_rule_status.tsx @@ -9,7 +9,7 @@ import { useEffect, useRef, useState } from 'react'; import { isNotFoundError } from '@kbn/securitysolution-t-grid'; import { useAppToasts } from '../../../../common/hooks/use_app_toasts'; -import { RuleStatusRowItemType } from '../../../pages/detection_engine/rules/all/columns'; +import { EnhancedRuleStatus } from '../../../pages/detection_engine/rules/all/columns'; import { getRuleStatusById, getRulesStatusByIds } from './api'; import * as i18n from './translations'; import { RuleStatus, Rules } from './types'; @@ -18,7 +18,7 @@ type Func = (ruleId: string) => void; export type ReturnRuleStatus = [boolean, RuleStatus | null, Func | null]; export interface ReturnRulesStatuses { loading: boolean; - rulesStatuses: RuleStatusRowItemType[]; + rulesStatuses: EnhancedRuleStatus[]; } /** @@ -78,7 +78,7 @@ export const useRuleStatus = (id: string | undefined | null): ReturnRuleStatus = * */ export const useRulesStatuses = (rules: Rules): ReturnRulesStatuses => { - const [rulesStatuses, setRuleStatuses] = useState([]); + const [rulesStatuses, setRuleStatuses] = useState([]); const [loading, setLoading] = useState(false); const { addError } = useAppToasts(); @@ -98,8 +98,6 @@ export const useRulesStatuses = (rules: Rules): ReturnRulesStatuses => { setRuleStatuses( rules.map((rule) => ({ id: rule.id, - activate: rule.enabled, - name: rule.name, ...ruleStatusesResponse[rule.id], })) ); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx index 3920aa40e1f15c..59c09c415f50e1 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.test.tsx @@ -5,7 +5,6 @@ * 2.0. */ -import { scopedHistoryMock } from 'src/core/public/mocks'; import uuid from 'uuid'; import '../../../../../common/mock/match_media'; import { deleteRulesAction, duplicateRulesAction, editRuleAction } from './actions'; @@ -18,7 +17,6 @@ jest.mock('./actions', () => ({ editRuleAction: jest.fn(), })); -const history = scopedHistoryMock.create(); const duplicateRulesActionMock = duplicateRulesAction as jest.Mock; const deleteRulesActionMock = deleteRulesAction as jest.Mock; const editRuleActionMock = editRuleAction as jest.Mock; @@ -45,7 +43,6 @@ describe('AllRulesTable Columns', () => { const duplicateRulesActionObject = getActions( dispatch, dispatchToaster, - history, navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, @@ -62,7 +59,6 @@ describe('AllRulesTable Columns', () => { const deleteRulesActionObject = getActions( dispatch, dispatchToaster, - history, navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx index 235cdd9c740eed..d586f0e4856d4b 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/columns.tsx @@ -10,12 +10,10 @@ import { EuiTableActionsColumnType, EuiText, EuiToolTip, - EuiIcon, EuiLink, EuiBadge, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import * as H from 'history'; import { sum } from 'lodash'; import React, { Dispatch } from 'react'; @@ -40,6 +38,7 @@ import { RulesTableAction } from '../../../../containers/detection_engine/rules/ import { LinkAnchor } from '../../../../../common/components/links'; import { getToolTipContent, canEditRuleWithActions } from '../../../../../common/utils/privileges'; import { PopoverTooltip } from './popover_tooltip'; +import { TableHeaderTooltipCell } from './table_header_tooltip_cell'; import { APP_UI_ID, @@ -48,18 +47,25 @@ import { } from '../../../../../../common/constants'; import { DocLinksStart, NavigateToAppOptions } from '../../../../../../../../../src/core/public'; +type FormatUrl = (path: string) => string; +type HasReadActionsPrivileges = + | boolean + | Readonly<{ + [x: string]: boolean; + }>; + +export type TableItem = Rule & Partial; +export type TableColumn = EuiBasicTableColumn | EuiTableActionsColumnType; + +const extractRuleFromRow = ({ current_status: _, failures, ...rule }: TableItem): Rule => rule; + export const getActions = ( dispatch: React.Dispatch, dispatchToaster: Dispatch, - history: H.History, navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise, reFetchRules: () => Promise, refetchPrePackagedRulesStatus: () => Promise, - actionsPrivileges: - | boolean - | Readonly<{ - [x: string]: boolean; - }> + actionsPrivileges: HasReadActionsPrivileges ) => [ { 'data-test-subj': 'editRuleAction', @@ -72,8 +78,9 @@ export const getActions = ( i18n.EDIT_RULE_SETTINGS ), icon: 'controlsHorizontal', - onClick: (rowItem: Rule) => editRuleAction(rowItem.id, navigateToApp), - enabled: (rowItem: Rule) => canEditRuleWithActions(rowItem, actionsPrivileges), + onClick: (rowItem: TableItem) => editRuleAction(rowItem.id, navigateToApp), + enabled: (rowItem: TableItem) => + canEditRuleWithActions(extractRuleFromRow(rowItem), actionsPrivileges), }, { 'data-test-subj': 'duplicateRuleAction', @@ -86,10 +93,10 @@ export const getActions = ( ) : ( i18n.DUPLICATE_RULE ), - enabled: (rowItem: Rule) => canEditRuleWithActions(rowItem, actionsPrivileges), - onClick: async (rowItem: Rule) => { + enabled: (rowItem: TableItem) => canEditRuleWithActions(rowItem, actionsPrivileges), + onClick: async (rowItem: TableItem) => { const createdRules = await duplicateRulesAction( - [rowItem], + [extractRuleFromRow(rowItem)], [rowItem.id], dispatch, dispatchToaster @@ -120,97 +127,139 @@ export const getActions = ( }, ]; -export type RuleStatusRowItemType = RuleStatus & { - name: string; +export type EnhancedRuleStatus = RuleStatus & { id: string; }; -export type RulesColumns = EuiBasicTableColumn | EuiTableActionsColumnType; -export type RulesStatusesColumns = EuiBasicTableColumn; -type FormatUrl = (path: string) => string; -interface GetColumns { + +interface GetColumnsProps { dispatch: React.Dispatch; - dispatchToaster: Dispatch; formatUrl: FormatUrl; - history: H.History; hasMlPermissions: boolean; hasPermissions: boolean; loadingRuleIds: string[]; navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise; + hasReadActionsPrivileges: HasReadActionsPrivileges; + dispatchToaster: Dispatch; reFetchRules: () => Promise; refetchPrePackagedRulesStatus: () => Promise; - hasReadActionsPrivileges: - | boolean - | Readonly<{ - [x: string]: boolean; - }>; + docLinks: DocLinksStart; } -export const getColumns = ({ - dispatch, - dispatchToaster, - formatUrl, - history, +const getColumnEnabled = ({ hasMlPermissions, + hasReadActionsPrivileges, + dispatch, hasPermissions, loadingRuleIds, +}: GetColumnsProps): TableColumn => ({ + field: 'enabled', + name: i18n.COLUMN_ACTIVATE, + render: (_, rule: TableItem) => ( + + + + ), + width: '95px', + sortable: true, +}); + +const getColumnRuleName = ({ navigateToApp, formatUrl }: GetColumnsProps): TableColumn => ({ + field: 'name', + name: i18n.COLUMN_RULE, + render: (value: Rule['name'], item: TableItem) => ( + + void }) => { + ev.preventDefault(); + navigateToApp(APP_UI_ID, { + deepLinkId: SecurityPageName.rules, + path: getRuleDetailsUrl(item.id), + }); + }} + href={formatUrl(getRuleDetailsUrl(item.id))} + > + {value} + + + ), + width: '38%', + sortable: true, + truncateText: true, +}); + +const getColumnTags = (): TableColumn => ({ + field: 'tags', + name: null, + align: 'center', + render: (tags: Rule['tags']) => { + if (tags.length === 0) { + return null; + } + + const renderItem = (tag: string, i: number) => ( + + {tag} + + ); + return ( + + ); + }, + width: '65px', + truncateText: true, +}); + +const getActionsColumns = ({ + hasPermissions, + hasReadActionsPrivileges, + dispatch, + dispatchToaster, navigateToApp, reFetchRules, refetchPrePackagedRulesStatus, - hasReadActionsPrivileges, -}: GetColumns): RulesColumns[] => { - const cols: RulesColumns[] = [ - { - field: 'name', - name: i18n.COLUMN_RULE, - render: (value: Rule['name'], item: Rule) => ( - - void }) => { - ev.preventDefault(); - navigateToApp(APP_UI_ID, { - deepLinkId: SecurityPageName.rules, - path: getRuleDetailsUrl(item.id), - }); - }} - href={formatUrl(getRuleDetailsUrl(item.id))} - > - {value} - - - ), - width: '38%', - sortable: true, - truncateText: true, - }, - { - field: 'tags', - name: null, - align: 'center', - render: (tags: Rule['tags']) => { - if (tags.length === 0) { - return null; - } +}: GetColumnsProps): TableColumn[] => + hasPermissions + ? [ + { + actions: getActions( + dispatch, + dispatchToaster, + navigateToApp, + reFetchRules, + refetchPrePackagedRulesStatus, + hasReadActionsPrivileges + ), + width: '40px', + } as EuiTableActionsColumnType, + ] + : []; - const renderItem = (tag: string, i: number) => ( - - {tag} - - ); - return ( - - ); - }, - width: '65px', - truncateText: true, - }, +export const getRulesColumns = (columnsProps: GetColumnsProps): TableColumn[] => { + return [ + getColumnRuleName(columnsProps), + getColumnTags(), { field: 'risk_score', name: i18n.COLUMN_RISK_SCORE, @@ -288,112 +337,41 @@ export const getColumns = ({ width: '65px', truncateText: true, }, - { - align: 'center', - field: 'enabled', - name: i18n.COLUMN_ACTIVATE, - render: (value: Rule['enabled'], item: Rule) => ( - - - - ), - sortable: true, - width: '95px', - truncateText: true, - }, - ]; - const actions: RulesColumns[] = [ - { - actions: getActions( - dispatch, - dispatchToaster, - history, - navigateToApp, - reFetchRules, - refetchPrePackagedRulesStatus, - hasReadActionsPrivileges - ), - width: '40px', - } as EuiTableActionsColumnType, + getColumnEnabled(columnsProps), + ...getActionsColumns(columnsProps), ]; - - return hasPermissions ? [...cols, ...actions] : cols; }; -export const getMonitoringColumns = ( - navigateToApp: (appId: string, options?: NavigateToAppOptions | undefined) => Promise, - formatUrl: FormatUrl, - docLinks: DocLinksStart -): RulesStatusesColumns[] => { - const cols: RulesStatusesColumns[] = [ - { - field: 'name', - name: i18n.COLUMN_RULE, - render: (value: RuleStatus['current_status']['status'], item: RuleStatusRowItemType) => { - return ( - - void }) => { - ev.preventDefault(); - navigateToApp(APP_UI_ID, { - deepLinkId: SecurityPageName.rules, - path: getRuleDetailsUrl(item.id), - }); - }} - href={formatUrl(getRuleDetailsUrl(item.id))} - > - {value} - - - ); - }, - width: '28%', - truncateText: true, - }, +export const getMonitoringColumns = (columnsProps: GetColumnsProps): TableColumn[] => { + const { docLinks } = columnsProps; + return [ + { ...getColumnRuleName(columnsProps), width: '28%' }, + getColumnTags(), { field: 'current_status.bulk_create_time_durations', name: ( - <> - {i18n.COLUMN_INDEXING_TIMES} - - - - + ), - render: (value: RuleStatus['current_status']['bulk_create_time_durations']) => ( + render: (value: RuleStatus['current_status']['bulk_create_time_durations'] | undefined) => ( {value?.length ? sum(value.map(Number)).toFixed() : getEmptyTagValue()} ), - width: '14%', + width: '16%', truncateText: true, }, { field: 'current_status.search_after_time_durations', name: ( - <> - {i18n.COLUMN_QUERY_TIMES} - - - - + ), - render: (value: RuleStatus['current_status']['search_after_time_durations']) => ( + render: (value: RuleStatus['current_status']['search_after_time_durations'] | undefined) => ( {value?.length ? sum(value.map(Number)).toFixed() : getEmptyTagValue()} @@ -404,28 +382,32 @@ export const getMonitoringColumns = ( { field: 'current_status.gap', name: ( - <> - {i18n.COLUMN_GAP} - - -

    - - {'see documentation'} - - ), - }} - /> -

    -
    -
    - + + + +

    + + {'see documentation'} + + ), + }} + /> +

    +
    +
    + + } + /> ), - render: (value: RuleStatus['current_status']['gap']) => ( + render: (value: RuleStatus['current_status']['gap'] | undefined) => ( {value ?? getEmptyTagValue()} @@ -436,7 +418,7 @@ export const getMonitoringColumns = ( { field: 'current_status.status', name: i18n.COLUMN_LAST_RESPONSE, - render: (value: RuleStatus['current_status']['status']) => ( + render: (value: RuleStatus['current_status']['status'] | undefined) => ( ), width: '12%', @@ -445,7 +427,7 @@ export const getMonitoringColumns = ( { field: 'current_status.status_date', name: i18n.COLUMN_LAST_COMPLETE_RUN, - render: (value: RuleStatus['current_status']['status_date']) => { + render: (value: RuleStatus['current_status']['status_date'] | undefined) => { return value == null ? ( getEmptyTagValue() ) : ( @@ -457,20 +439,10 @@ export const getMonitoringColumns = ( /> ); }, - width: '18%', + width: '16%', truncateText: true, }, - { - field: 'activate', - name: i18n.COLUMN_ACTIVATE, - render: (value: Rule['enabled']) => ( - - {value ? i18n.ACTIVE : i18n.INACTIVE} - - ), - width: '95px', - }, + getColumnEnabled(columnsProps), + ...getActionsColumns(columnsProps), ]; - - return cols; }; diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx index 200bf0c7193201..487d0862cf4671 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/index.test.tsx @@ -166,8 +166,6 @@ describe('AllRules', () => { }, failures: [], id: '12345678987654321', - activate: true, - name: 'Test rule', }, ], }); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/popover_tooltip.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/popover_tooltip.tsx index 5cf0a0c0b28fc3..22bad4fffade97 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/popover_tooltip.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/popover_tooltip.tsx @@ -31,9 +31,10 @@ const PopoverTooltipComponent = ({ columnName, children }: PopoverTooltipProps) setIsPopoverOpen(!isPopoverOpen)} - size="s" + size="xs" color="primary" iconType="questionInCircle" + style={{ height: 'auto' }} /> } > diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx index bc2172a2576355..54c2500d03b03f 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/rules_tables.tsx @@ -13,6 +13,7 @@ import { EuiProgress, EuiConfirmModal, EuiWindowEvent, + EuiEmptyPrompt, } from '@elastic/eui'; import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { debounce } from 'lodash/fp'; @@ -23,7 +24,6 @@ import { useRulesStatuses, CreatePreBuiltRules, FilterOptions, - Rule, RulesSortingFields, } from '../../../../containers/detection_engine/rules'; @@ -33,12 +33,11 @@ import { useKibana, useUiSetting$ } from '../../../../../common/lib/kibana'; import { useStateToaster } from '../../../../../common/components/toasters'; import { Loader } from '../../../../../common/components/loader'; import { PrePackagedRulesPrompt } from '../../../../components/rules/pre_packaged_rules/load_empty_prompt'; -import { AllRulesTables, SortingType } from '../../../../components/rules/all_rules_tables'; import { getPrePackagedRuleStatus } from '../helpers'; import * as i18n from '../translations'; import { EuiBasicTableOnChange } from '../types'; import { getBatchItems } from './batch_actions'; -import { getColumns, getMonitoringColumns } from './columns'; +import { getRulesColumns, getMonitoringColumns, TableItem } from './columns'; import { showRulesTable } from './helpers'; import { RulesTableFilters } from './rules_table_filters/rules_table_filters'; import { useMlCapabilities } from '../../../../../common/components/ml/hooks/use_ml_capabilities'; @@ -167,7 +166,7 @@ export const RulesTables = React.memo( }, [loadingRuleIds, loadingRulesAction]); const sorting = useMemo( - (): SortingType => ({ + () => ({ sort: { field: filterOptions.sortField, direction: filterOptions.sortOrder, @@ -265,12 +264,10 @@ export const RulesTables = React.memo( [updateOptions, setLastRefreshDate] ); - const rulesColumns = useMemo(() => { - return getColumns({ + const [rulesColumns, monitoringColumns] = useMemo(() => { + const props = { dispatch, - dispatchToaster, formatUrl, - history, hasMlPermissions, hasPermissions, loadingRuleIds: @@ -279,10 +276,14 @@ export const RulesTables = React.memo( ? loadingRuleIds : [], navigateToApp, + hasReadActionsPrivileges: hasActionsPrivileges, + dispatchToaster, + history, reFetchRules, refetchPrePackagedRulesStatus, - hasReadActionsPrivileges: hasActionsPrivileges, - }); + docLinks, + }; + return [getRulesColumns(props), getMonitoringColumns(props)]; }, [ dispatch, dispatchToaster, @@ -296,13 +297,9 @@ export const RulesTables = React.memo( loadingRulesAction, navigateToApp, reFetchRules, + docLinks, ]); - const monitoringColumns = useMemo( - () => getMonitoringColumns(navigateToApp, formatUrl, docLinks), - [navigateToApp, formatUrl, docLinks] - ); - useEffect(() => { setRefreshRulesData(reFetchRules); }, [reFetchRules, setRefreshRulesData]); @@ -332,8 +329,8 @@ export const RulesTables = React.memo( const euiBasicTableSelectionProps = useMemo( () => ({ - selectable: (item: Rule) => !loadingRuleIds.includes(item.id), - onSelectionChange: (selected: Rule[]) => { + selectable: (item: TableItem) => !loadingRuleIds.includes(item.id), + onSelectionChange: (selected: TableItem[]) => { /** * EuiBasicTable doesn't provide declarative API to control selected rows. * This limitation requires us to synchronize selection state manually using setSelection(). @@ -447,6 +444,25 @@ export const RulesTables = React.memo( [initLoading, prePackagedRuleStatus, rulesCustomInstalled] ); + const items = useMemo(() => { + const rulesStatusesMap = new Map(rulesStatuses.map((item) => [item.id, item])); + + return rules.map((rule) => { + return { + ...rule, + ...rulesStatusesMap.get(rule.id), + }; + }); + }, [rulesStatuses, rules]); + + const tableProps = + selectedTab === AllRulesTabs.rules + ? { + 'data-test-subj': 'rules-table', + columns: rulesColumns, + } + : { 'data-test-subj': 'monitoring-table', columns: monitoringColumns }; + return ( <> @@ -535,18 +551,23 @@ export const RulesTables = React.memo( onToggleSelectAll={toggleSelectAll} showBulkActions /> - {i18n.NO_RULES}} + titleSize="xs" + body={i18n.NO_RULES_BODY} + /> + } + onChange={tableOnChangeCallback} pagination={paginationMemo} - rules={rules} - rulesColumns={rulesColumns} - rulesStatuses={rulesStatuses} + ref={tableRef} + selection={euiBasicTableSelectionProps} sorting={sorting} - tableOnChangeCallback={tableOnChangeCallback} - tableRef={tableRef} + {...tableProps} /> )} diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.test.tsx new file mode 100644 index 00000000000000..216dcc98c0e416 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.test.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { TableHeaderTooltipCell } from './table_header_tooltip_cell'; + +import { render, screen, fireEvent } from '@testing-library/react'; + +describe('Component TableHeaderTooltipCell', () => { + it('shoud render text with icon and tooltip', async () => { + render(); + + expect(screen.getByText('test title')).toBeInTheDocument(); + expect(screen.getByTestId('tableHeaderIcon')).toBeInTheDocument(); + + fireEvent.mouseOver(screen.getByTestId('tableHeaderIcon')); + expect(await screen.findByText('test tooltip content')).toBeInTheDocument(); + }); + + it('shoud render test element as custom tooltip', () => { + render( + } + /> + ); + + expect(screen.getByText('test title')).toBeInTheDocument(); + expect(screen.getByTestId('customTestTooltip')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.tsx b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.tsx new file mode 100644 index 00000000000000..3ec474974917bd --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules/all/table_header_tooltip_cell.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; + +import { EuiToolTip, EuiIcon, EuiFlexGrid, EuiFlexItem } from '@elastic/eui'; + +interface Props { + title: string; + tooltipContent?: string; + customTooltip?: React.ReactNode; +} + +/** + * Table header cell component that includes icon(question mark) tooltip with additional details about column + * Icon tooltip will never be truncated and always be visible for user interaction + * @param title string - column header title + * @param tooltipContent string - text content of tooltip + * @param customTooltip React.ReactNode - any custom tooltip + */ +const TableHeaderTooltipCellComponent = ({ title, tooltipContent, customTooltip }: Props) => ( + + + {title} + + {customTooltip ?? ( + + + + )} + +); + +export const TableHeaderTooltipCell = React.memo(TableHeaderTooltipCellComponent); + +TableHeaderTooltipCell.displayName = 'TableHeaderTooltipCell'; From c6e9da28108fa0bd9f14ba85f8ef35fd59b7386b Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Fri, 3 Dec 2021 11:25:11 +0100 Subject: [PATCH 091/126] change ownership of `advanced_settings` to core team (#120331) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c398316e634b92..a64ab63494b351 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -22,7 +22,6 @@ # Vis Editors /x-pack/plugins/lens/ @elastic/kibana-vis-editors -/src/plugins/advanced_settings/ @elastic/kibana-vis-editors /src/plugins/charts/ @elastic/kibana-vis-editors /src/plugins/vis_default_editor/ @elastic/kibana-vis-editors /src/plugins/vis_types/metric/ @elastic/kibana-vis-editors @@ -263,6 +262,7 @@ /src/plugins/home/server/*.ts @elastic/kibana-core /src/plugins/home/server/services/ @elastic/kibana-core /src/plugins/kibana_overview/ @elastic/kibana-core +/src/plugins/advanced_settings/ @elastic/kibana-core /x-pack/plugins/global_search_bar/ @elastic/kibana-core #CC# /src/core/server/csp/ @elastic/kibana-core #CC# /src/plugins/saved_objects/ @elastic/kibana-core From fd741b47e79bea44d8269c27d79d0d59007bc725 Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Fri, 3 Dec 2021 12:01:37 +0100 Subject: [PATCH 092/126] [Watcher] Prevent expensive queries on ES by using PointInTimeFinder to get indexPatterns (#119717) * Use PointInTimeFinder to paginate through indexPatterns in a more performant way * commit using @elastic.co * Start working on tests * Add tests * Add missing types * Fix tests * Update tests responses * Remove unnecessary mocks * Fix type Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../watch_create_threshold.test.tsx | 8 ---- .../client_integration/watch_edit.test.ts | 8 ---- .../watcher/public/application/lib/api.ts | 8 ++-- .../threshold_watch_edit.tsx | 5 +- .../register_get_index_patterns_route.ts | 47 +++++++++++++++++++ .../api/indices/register_indices_routes.ts | 2 + x-pack/test/api_integration/apis/index.ts | 1 + .../api_integration/apis/watcher/index.ts | 14 ++++++ .../api_integration/apis/watcher/watcher.ts | 47 +++++++++++++++++++ 9 files changed, 116 insertions(+), 24 deletions(-) create mode 100644 x-pack/plugins/watcher/server/routes/api/indices/register_get_index_patterns_route.ts create mode 100644 x-pack/test/api_integration/apis/watcher/index.ts create mode 100644 x-pack/test/api_integration/apis/watcher/watcher.ts diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx b/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx index 481f59093d7dc2..52c3a69938d74d 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_create_threshold.test.tsx @@ -50,14 +50,6 @@ jest.mock('../../public/application/lib/api', () => { return { ...original, - loadIndexPatterns: async () => { - const INDEX_PATTERNS = [ - { attributes: { title: 'index1' } }, - { attributes: { title: 'index2' } }, - { attributes: { title: 'index3' } }, - ]; - return await INDEX_PATTERNS; - }, getHttpClient: () => mockHttpClient, }; }); diff --git a/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts b/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts index 1188cc8469a58d..b5fb2aa9d915a5 100644 --- a/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts +++ b/x-pack/plugins/watcher/__jest__/client_integration/watch_edit.test.ts @@ -23,14 +23,6 @@ jest.mock('../../public/application/lib/api', () => { return { ...original, - loadIndexPatterns: async () => { - const INDEX_PATTERNS = [ - { attributes: { title: 'index1' } }, - { attributes: { title: 'index2' } }, - { attributes: { title: 'index3' } }, - ]; - return await INDEX_PATTERNS; - }, getHttpClient: () => mockHttpClient, }; }); diff --git a/x-pack/plugins/watcher/public/application/lib/api.ts b/x-pack/plugins/watcher/public/application/lib/api.ts index 61ea124695cb98..0971371f7949b2 100644 --- a/x-pack/plugins/watcher/public/application/lib/api.ts +++ b/x-pack/plugins/watcher/public/application/lib/api.ts @@ -151,12 +151,10 @@ export const executeWatch = async (executeWatchDetails: ExecutedWatchDetails, wa }; export const loadIndexPatterns = async () => { - const { savedObjects } = await getSavedObjectsClient().find({ - type: 'index-pattern', - fields: ['title'], - perPage: 10000, + return sendRequest({ + path: `${basePath}/indices/index_patterns`, + method: 'get', }); - return savedObjects; }; const getWatchVisualizationDataDeserializer = (data: { visualizeData: any }) => data?.visualizeData; diff --git a/x-pack/plugins/watcher/public/application/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx b/x-pack/plugins/watcher/public/application/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx index a4c19827c902a6..a885c86bc88177 100644 --- a/x-pack/plugins/watcher/public/application/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx +++ b/x-pack/plugins/watcher/public/application/sections/watch_edit/components/threshold_watch_edit/threshold_watch_edit.tsx @@ -182,9 +182,8 @@ export const ThresholdWatchEdit = ({ pageTitle }: { pageTitle: string }) => { useEffect(() => { const getIndexPatterns = async () => { - const indexPatternObjects = await loadIndexPatterns(); - const titles = indexPatternObjects.map((indexPattern: any) => indexPattern.attributes.title); - setIndexPatterns(titles); + const { data: indexPatternTitles } = await loadIndexPatterns(); + setIndexPatterns(indexPatternTitles); }; const loadData = async () => { diff --git a/x-pack/plugins/watcher/server/routes/api/indices/register_get_index_patterns_route.ts b/x-pack/plugins/watcher/server/routes/api/indices/register_get_index_patterns_route.ts new file mode 100644 index 00000000000000..237f6dac6a254b --- /dev/null +++ b/x-pack/plugins/watcher/server/routes/api/indices/register_get_index_patterns_route.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SavedObjectsFindResult } from 'src/core/server'; +import { RouteDependencies } from '../../../types'; + +export function registerGetIndexPatternsRoute({ + router, + license, + lib: { handleEsError }, +}: RouteDependencies) { + router.get( + { + path: '/api/watcher/indices/index_patterns', + validate: false, + }, + license.guardApiRoute(async ({ core: { savedObjects } }, request, response) => { + try { + const finder = savedObjects.client.createPointInTimeFinder({ + type: 'index-pattern', + fields: ['title'], + perPage: 1000, + }); + + const responses: string[] = []; + + for await (const result of finder.find()) { + responses.push( + ...result.saved_objects.map( + (indexPattern: SavedObjectsFindResult) => indexPattern.attributes.title + ) + ); + } + + await finder.close(); + + return response.ok({ body: responses }); + } catch (error) { + return handleEsError({ error, response }); + } + }) + ); +} diff --git a/x-pack/plugins/watcher/server/routes/api/indices/register_indices_routes.ts b/x-pack/plugins/watcher/server/routes/api/indices/register_indices_routes.ts index 041457aadf8eba..6e7003f1cafed0 100644 --- a/x-pack/plugins/watcher/server/routes/api/indices/register_indices_routes.ts +++ b/x-pack/plugins/watcher/server/routes/api/indices/register_indices_routes.ts @@ -6,8 +6,10 @@ */ import { registerGetRoute } from './register_get_route'; +import { registerGetIndexPatternsRoute } from './register_get_index_patterns_route'; import { RouteDependencies } from '../../../types'; export function registerIndicesRoutes(deps: RouteDependencies) { registerGetRoute(deps); + registerGetIndexPatternsRoute(deps); } diff --git a/x-pack/test/api_integration/apis/index.ts b/x-pack/test/api_integration/apis/index.ts index 56b2042dc48545..b37d88a5dc426b 100644 --- a/x-pack/test/api_integration/apis/index.ts +++ b/x-pack/test/api_integration/apis/index.ts @@ -34,5 +34,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./painless_lab')); loadTestFile(require.resolve('./file_upload')); loadTestFile(require.resolve('./ml')); + loadTestFile(require.resolve('./watcher')); }); } diff --git a/x-pack/test/api_integration/apis/watcher/index.ts b/x-pack/test/api_integration/apis/watcher/index.ts new file mode 100644 index 00000000000000..964b7fa0099af3 --- /dev/null +++ b/x-pack/test/api_integration/apis/watcher/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Watcher', () => { + loadTestFile(require.resolve('./watcher')); + }); +} diff --git a/x-pack/test/api_integration/apis/watcher/watcher.ts b/x-pack/test/api_integration/apis/watcher/watcher.ts new file mode 100644 index 00000000000000..734b6c8c6212da --- /dev/null +++ b/x-pack/test/api_integration/apis/watcher/watcher.ts @@ -0,0 +1,47 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const log = getService('log'); + const supertest = getService('supertest'); + const transform = getService('transform'); + + describe('watcher', () => { + before(async () => { + try { + await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + } catch (error) { + log.debug('[Setup error] Error creating index pattern'); + throw error; + } + }); + + after(async () => { + try { + await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + } catch (error) { + log.debug('[Cleanup error] Error deleting index pattern'); + throw error; + } + }); + + describe('POST /api/watcher/indices/index_patterns', () => { + it('returns list of index patterns', async () => { + const response = await supertest + .get('/api/watcher/indices/index_patterns') + .set('kbn-xsrf', 'kibana') + .expect(200); + + expect(response.body).to.contain('ft_ecommerce'); + }); + }); + }); +} From bfa8b3c9b6f3e7d58335cbfe991de519e2f087ec Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 3 Dec 2021 13:34:00 +0200 Subject: [PATCH 093/126] [Canvas] Added KibanaThemeProvider to expression_repeat_image. (#120089) * Added kibanaThemeProvider to expression_repeat_image. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../expression_repeat_image/kibana.json | 2 +- .../components/repeat_image_component.tsx | 4 +- .../repeat_image_renderer.stories.tsx | 4 +- .../public/expression_renderers/index.ts | 6 +- .../repeat_image_renderer.tsx | 74 +++++++++++-------- .../expression_repeat_image/public/index.ts | 5 +- .../expression_repeat_image/public/plugin.ts | 4 +- .../canvas_plugin_src/renderers/external.ts | 4 +- .../shareable_runtime/supported_renderers.js | 4 +- 9 files changed, 59 insertions(+), 48 deletions(-) diff --git a/src/plugins/expression_repeat_image/kibana.json b/src/plugins/expression_repeat_image/kibana.json index 5694e0160042ca..0df2eb9842312a 100755 --- a/src/plugins/expression_repeat_image/kibana.json +++ b/src/plugins/expression_repeat_image/kibana.json @@ -11,5 +11,5 @@ "ui": true, "requiredPlugins": ["expressions", "presentationUtil"], "optionalPlugins": [], - "requiredBundles": [] + "requiredBundles": ["kibanaReact"] } diff --git a/src/plugins/expression_repeat_image/public/components/repeat_image_component.tsx b/src/plugins/expression_repeat_image/public/components/repeat_image_component.tsx index 7a136b470e9439..7da6735c6ce861 100644 --- a/src/plugins/expression_repeat_image/public/components/repeat_image_component.tsx +++ b/src/plugins/expression_repeat_image/public/components/repeat_image_component.tsx @@ -46,7 +46,9 @@ function setImageSize(img: HTMLImageElement, size: number) { } function createImageJSX(img: HTMLImageElement | null) { - if (!img) return null; + if (!img) { + return null; + } const params = img.width > img.height ? { heigth: img.height } : { width: img.width }; return ; } diff --git a/src/plugins/expression_repeat_image/public/expression_renderers/__stories__/repeat_image_renderer.stories.tsx b/src/plugins/expression_repeat_image/public/expression_renderers/__stories__/repeat_image_renderer.stories.tsx index 42f008b2570ea9..c727ca9562fadc 100644 --- a/src/plugins/expression_repeat_image/public/expression_renderers/__stories__/repeat_image_renderer.stories.tsx +++ b/src/plugins/expression_repeat_image/public/expression_renderers/__stories__/repeat_image_renderer.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; import { Render } from '../../../../presentation_util/public/__stories__'; -import { repeatImageRenderer } from '../repeat_image_renderer'; +import { getRepeatImageRenderer } from '../repeat_image_renderer'; import { getElasticLogo, getElasticOutline, @@ -31,7 +31,7 @@ const Renderer = ({ emptyImage: elasticOutline, }; - return ; + return ; }; storiesOf('enderers/repeatImage', module).add( diff --git a/src/plugins/expression_repeat_image/public/expression_renderers/index.ts b/src/plugins/expression_repeat_image/public/expression_renderers/index.ts index 5c5625f8c7730a..eb161e6e0f2a39 100644 --- a/src/plugins/expression_repeat_image/public/expression_renderers/index.ts +++ b/src/plugins/expression_repeat_image/public/expression_renderers/index.ts @@ -6,8 +6,4 @@ * Side Public License, v 1. */ -import { repeatImageRenderer } from './repeat_image_renderer'; - -export const renderers = [repeatImageRenderer]; - -export { repeatImageRenderer }; +export { getRepeatImageRenderer, repeatImageRendererFactory } from './repeat_image_renderer'; diff --git a/src/plugins/expression_repeat_image/public/expression_renderers/repeat_image_renderer.tsx b/src/plugins/expression_repeat_image/public/expression_renderers/repeat_image_renderer.tsx index 330bf16e038fa0..5e5bc04f317d24 100644 --- a/src/plugins/expression_repeat_image/public/expression_renderers/repeat_image_renderer.tsx +++ b/src/plugins/expression_repeat_image/public/expression_renderers/repeat_image_renderer.tsx @@ -7,10 +7,19 @@ */ import React, { lazy } from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import { I18nProvider } from '@kbn/i18n-react'; +import { Observable } from 'rxjs'; +import { CoreTheme } from 'kibana/public'; import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; import { i18n } from '@kbn/i18n'; -import { getElasticOutline, isValidUrl, withSuspense } from '../../../presentation_util/public'; +import { I18nProvider } from '@kbn/i18n-react'; +import { KibanaThemeProvider } from '../../../kibana_react/public'; +import { CoreSetup } from '../../../../core/public'; +import { + defaultTheme$, + getElasticOutline, + isValidUrl, + withSuspense, +} from '../../../presentation_util/public'; import { RepeatImageRendererConfig } from '../../common/types'; const strings = { @@ -27,32 +36,39 @@ const strings = { const LazyRepeatImageComponent = lazy(() => import('../components/repeat_image_component')); const RepeatImageComponent = withSuspense(LazyRepeatImageComponent, null); -export const repeatImageRenderer = (): ExpressionRenderDefinition => ({ - name: 'repeatImage', - displayName: strings.getDisplayName(), - help: strings.getHelpDescription(), - reuseDomNode: true, - render: async ( - domNode: HTMLElement, - config: RepeatImageRendererConfig, - handlers: IInterpreterRenderHandlers - ) => { - const { elasticOutline } = await getElasticOutline(); - const settings = { - ...config, - image: isValidUrl(config.image) ? config.image : elasticOutline, - emptyImage: config.emptyImage || '', - }; +export const getRepeatImageRenderer = + (theme$: Observable = defaultTheme$) => + (): ExpressionRenderDefinition => ({ + name: 'repeatImage', + displayName: strings.getDisplayName(), + help: strings.getHelpDescription(), + reuseDomNode: true, + render: async ( + domNode: HTMLElement, + config: RepeatImageRendererConfig, + handlers: IInterpreterRenderHandlers + ) => { + const { elasticOutline } = await getElasticOutline(); + const settings = { + ...config, + image: isValidUrl(config.image) ? config.image : elasticOutline, + emptyImage: config.emptyImage || '', + }; + + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); - handlers.onDestroy(() => { - unmountComponentAtNode(domNode); - }); + render( + + + + + , + domNode + ); + }, + }); - render( - - - , - domNode - ); - }, -}); +export const repeatImageRendererFactory = (core: CoreSetup) => + getRepeatImageRenderer(core.theme.theme$); diff --git a/src/plugins/expression_repeat_image/public/index.ts b/src/plugins/expression_repeat_image/public/index.ts index 21e8f449dcc701..4080ad4f1359f2 100755 --- a/src/plugins/expression_repeat_image/public/index.ts +++ b/src/plugins/expression_repeat_image/public/index.ts @@ -6,9 +6,6 @@ * Side Public License, v 1. */ -// TODO: https://github.com/elastic/kibana/issues/110893 -/* eslint-disable @kbn/eslint/no_export_all */ - import { ExpressionRepeatImagePlugin } from './plugin'; export type { ExpressionRepeatImagePluginSetup, ExpressionRepeatImagePluginStart } from './plugin'; @@ -17,4 +14,4 @@ export function plugin() { return new ExpressionRepeatImagePlugin(); } -export * from './expression_renderers'; +export { getRepeatImageRenderer, repeatImageRendererFactory } from './expression_renderers'; diff --git a/src/plugins/expression_repeat_image/public/plugin.ts b/src/plugins/expression_repeat_image/public/plugin.ts index d71ce99eb1bd14..2f275f9218d504 100755 --- a/src/plugins/expression_repeat_image/public/plugin.ts +++ b/src/plugins/expression_repeat_image/public/plugin.ts @@ -9,7 +9,7 @@ import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { ExpressionsStart, ExpressionsSetup } from '../../expressions/public'; import { repeatImageFunction } from '../common/expression_functions'; -import { repeatImageRenderer } from './expression_renderers'; +import { repeatImageRendererFactory } from './expression_renderers'; interface SetupDeps { expressions: ExpressionsSetup; @@ -33,7 +33,7 @@ export class ExpressionRepeatImagePlugin { public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRepeatImagePluginSetup { expressions.registerFunction(repeatImageFunction); - expressions.registerRenderer(repeatImageRenderer); + expressions.registerRenderer(repeatImageRendererFactory(core)); } public start(core: CoreStart): ExpressionRepeatImagePluginStart {} diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts index f97ac6e5385756..9e2a51065eb6c6 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts @@ -11,7 +11,7 @@ import { errorRendererFactory, debugRendererFactory, } from '../../../../../src/plugins/expression_error/public'; -import { repeatImageRenderer } from '../../../../../src/plugins/expression_repeat_image/public'; +import { repeatImageRendererFactory } from '../../../../../src/plugins/expression_repeat_image/public'; import { revealImageRenderer } from '../../../../../src/plugins/expression_reveal_image/public'; import { shapeRenderer, @@ -22,12 +22,12 @@ export const renderFunctions = [ imageRenderer, revealImageRenderer, shapeRenderer, - repeatImageRenderer, progressRenderer, ]; export const renderFunctionFactories = [ debugRendererFactory, errorRendererFactory, + repeatImageRendererFactory, metricRendererFactory, ]; diff --git a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js index b71e60e5ef0be6..84150a6a9e82e8 100644 --- a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js +++ b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js @@ -15,7 +15,7 @@ import { getErrorRenderer, getDebugRenderer, } from '../../../../src/plugins/expression_error/public'; -import { repeatImageRenderer as repeatImage } from '../../../../src/plugins/expression_repeat_image/public'; +import { getRepeatImageRenderer } from '../../../../src/plugins/expression_repeat_image/public'; import { revealImageRenderer as revealImage } from '../../../../src/plugins/expression_reveal_image/public'; import { shapeRenderer as shape, @@ -31,6 +31,7 @@ const renderFunctionsFactories = [ getTableRenderer, getErrorRenderer, getDebugRenderer, + getRepeatImageRenderer, getMetricRenderer, ]; @@ -41,7 +42,6 @@ const renderFunctionsFactories = [ */ export const renderFunctions = [ image, - repeatImage, revealImage, pie, plot, From 5bfaf51816c733df0dba4a6d61e7e8237d10ec57 Mon Sep 17 00:00:00 2001 From: Claudio Procida Date: Fri, 3 Dec 2021 13:09:47 +0100 Subject: [PATCH 094/126] [RAC] Fixes terminology and splits tests to new case (#120335) * Includes errors in the total number of rules * Fixes terminology and splits tests to new case * Removes unused vars * Review feedback --- .../containers/alerts_page/alerts_page.tsx | 11 +- .../services/observability/alerts/common.ts | 4 +- .../apps/observability/alerts/index.ts | 75 +----------- .../apps/observability/alerts/rule_stats.ts | 107 ++++++++++++++++++ .../apps/observability/helpers.ts | 12 ++ .../apps/observability/index.ts | 13 ++- 6 files changed, 133 insertions(+), 89 deletions(-) create mode 100644 x-pack/test/observability_functional/apps/observability/alerts/rule_stats.ts create mode 100644 x-pack/test/observability_functional/apps/observability/helpers.ts diff --git a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx index 06040d9a186fff..4462daa1cbf288 100644 --- a/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/containers/alerts_page/alerts_page.tsx @@ -107,15 +107,10 @@ function AlertsPage() { // Note that the API uses the semantics of 'alerts' instead of 'rules' const { alertExecutionStatus, ruleMutedStatus, ruleEnabledStatus } = response; if (alertExecutionStatus && ruleMutedStatus && ruleEnabledStatus) { - const total = Object.entries(alertExecutionStatus).reduce((acc, [key, value]) => { - if (key !== 'error') { - acc = acc + value; - } - return acc; - }, 0); - const { error } = alertExecutionStatus; - const { muted } = ruleMutedStatus; + const total = Object.values(alertExecutionStatus).reduce((acc, value) => acc + value, 0); const { disabled } = ruleEnabledStatus; + const { muted } = ruleMutedStatus; + const { error } = alertExecutionStatus; setRuleStats({ ...ruleStats, total, diff --git a/x-pack/test/functional/services/observability/alerts/common.ts b/x-pack/test/functional/services/observability/alerts/common.ts index 2f888d3d733c09..270ab84f01d7ae 100644 --- a/x-pack/test/functional/services/observability/alerts/common.ts +++ b/x-pack/test/functional/services/observability/alerts/common.ts @@ -271,7 +271,7 @@ export function ObservabilityAlertsCommonProvider({ return actionsOverflowButtons[index] || null; }; - const getAlertStatValue = async (testSubj: string) => { + const getRuleStatValue = async (testSubj: string) => { const stat = await testSubjects.find(testSubj); const title = await stat.findByCssSelector('.euiStat__title'); const count = await title.getVisibleText(); @@ -317,6 +317,6 @@ export function ObservabilityAlertsCommonProvider({ viewRuleDetailsButtonClick, viewRuleDetailsLinkClick, getAlertsFlyoutViewRuleDetailsLinkOrFail, - getAlertStatValue, + getRuleStatValue, }; } diff --git a/x-pack/test/observability_functional/apps/observability/alerts/index.ts b/x-pack/test/observability_functional/apps/observability/alerts/index.ts index 12a83f19ca2580..40c4e53ba869b2 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/index.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/index.ts @@ -7,19 +7,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { ObjectRemover } from '../../../../functional_with_es_ssl/lib/object_remover'; -import { - createAlert, - disableAlert, - muteAlert, -} from '../../../../functional_with_es_ssl/lib/alert_api_actions'; -import { generateUniqueKey } from '../../../../functional_with_es_ssl/lib/get_test_data'; - -async function asyncForEach(array: T[], callback: (item: T, index: number) => void) { - for (let index = 0; index < array.length; index++) { - await callback(array[index], index); - } -} +import { asyncForEach } from '../helpers'; const ACTIVE_ALERTS_CELL_COUNT = 78; const RECOVERED_ALERTS_CELL_COUNT = 120; @@ -28,8 +16,6 @@ const TOTAL_ALERTS_CELL_COUNT = 165; export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const find = getService('find'); - const supertest = getService('supertest'); - const objectRemover = new ObjectRemover(supertest); describe('Observability alerts', function () { this.tags('includeFirefox'); @@ -245,65 +231,6 @@ export default ({ getService }: FtrProviderContext) => { expect(await find.existsByCssSelector('[title="Rules and Connectors"]')).to.eql(true); }); }); - - describe('Stat counters', () => { - beforeEach(async () => { - const uniqueKey = generateUniqueKey(); - - const alertToDisable = await createAlert({ - supertest, - objectRemover, - overwrites: { name: 'b', tags: [uniqueKey] }, - }); - await createAlert({ - supertest, - objectRemover, - overwrites: { name: 'c', tags: [uniqueKey] }, - }); - await createAlert({ - supertest, - objectRemover, - overwrites: { name: 'a', tags: [uniqueKey] }, - }); - await createAlert({ - supertest, - objectRemover, - overwrites: { name: 'd', tags: [uniqueKey] }, - }); - await createAlert({ - supertest, - objectRemover, - overwrites: { name: 'e', tags: [uniqueKey] }, - }); - const alertToMute = await createAlert({ - supertest, - objectRemover, - overwrites: { name: 'f', tags: [uniqueKey] }, - }); - - await disableAlert({ supertest, alertId: alertToDisable.id }); - await muteAlert({ supertest, alertId: alertToMute.id }); - - await observability.alerts.common.navigateToTimeWithData(); - }); - - afterEach(async () => { - await objectRemover.removeAll(); - }); - - it('Exist and display expected values', async () => { - const subjToValueMap: { [key: string]: number } = { - statRuleCount: 6, - statDisabled: 1, - statMuted: 1, - statErrors: 0, - }; - await asyncForEach(Object.keys(subjToValueMap), async (subject: string) => { - const value = await observability.alerts.common.getAlertStatValue(subject); - expect(value).to.be(subjToValueMap[subject]); - }); - }); - }); }); }); }; diff --git a/x-pack/test/observability_functional/apps/observability/alerts/rule_stats.ts b/x-pack/test/observability_functional/apps/observability/alerts/rule_stats.ts new file mode 100644 index 00000000000000..41ff88be079d4f --- /dev/null +++ b/x-pack/test/observability_functional/apps/observability/alerts/rule_stats.ts @@ -0,0 +1,107 @@ +/* + * Copyright 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 { ObjectRemover } from '../../../../functional_with_es_ssl/lib/object_remover'; +import { + createAlert as createRule, + disableAlert as disableRule, + muteAlert as muteRule, +} from '../../../../functional_with_es_ssl/lib/alert_api_actions'; +import { generateUniqueKey } from '../../../../functional_with_es_ssl/lib/get_test_data'; +import { asyncForEach } from '../helpers'; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertest'); + const objectRemover = new ObjectRemover(supertest); + + describe('Observability rules', function () { + this.tags('includeFirefox'); + + const observability = getService('observability'); + + before(async () => { + await esArchiver.load('x-pack/test/functional/es_archives/observability/alerts'); + const setup = async () => { + await observability.alerts.common.setKibanaTimeZoneToUTC(); + await observability.alerts.common.navigateToTimeWithData(); + }; + await setup(); + }); + + after(async () => { + await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); + }); + + describe('With no data', () => { + it('Shows the no data screen', async () => { + await observability.alerts.common.getNoDataPageOrFail(); + }); + }); + + describe('Stat counters', () => { + beforeEach(async () => { + const uniqueKey = generateUniqueKey(); + + const ruleToDisable = await createRule({ + supertest, + objectRemover, + overwrites: { name: 'b', tags: [uniqueKey] }, + }); + await createRule({ + supertest, + objectRemover, + overwrites: { name: 'c', tags: [uniqueKey] }, + }); + await createRule({ + supertest, + objectRemover, + overwrites: { name: 'a', tags: [uniqueKey] }, + }); + await createRule({ + supertest, + objectRemover, + overwrites: { name: 'd', tags: [uniqueKey] }, + }); + await createRule({ + supertest, + objectRemover, + overwrites: { name: 'e', tags: [uniqueKey] }, + }); + const ruleToMute = await createRule({ + supertest, + objectRemover, + overwrites: { name: 'f', tags: [uniqueKey] }, + }); + + await disableRule({ supertest, alertId: ruleToDisable.id }); + await muteRule({ supertest, alertId: ruleToMute.id }); + + await observability.alerts.common.navigateToTimeWithData(); + }); + + afterEach(async () => { + await objectRemover.removeAll(); + }); + + it('Exist and display expected values', async () => { + const subjToValueMap: { [key: string]: number } = { + statRuleCount: 6, + statDisabled: 1, + statMuted: 1, + statErrors: 0, + }; + await asyncForEach(Object.keys(subjToValueMap), async (subject: string) => { + const value = await observability.alerts.common.getRuleStatValue(subject); + expect(value).to.be(subjToValueMap[subject]); + }); + }); + }); + }); +}; diff --git a/x-pack/test/observability_functional/apps/observability/helpers.ts b/x-pack/test/observability_functional/apps/observability/helpers.ts new file mode 100644 index 00000000000000..72a91881ab97aa --- /dev/null +++ b/x-pack/test/observability_functional/apps/observability/helpers.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export async function asyncForEach(array: T[], callback: (item: T, index: number) => void) { + for (let index = 0; index < array.length; index++) { + await callback(array[index], index); + } +} diff --git a/x-pack/test/observability_functional/apps/observability/index.ts b/x-pack/test/observability_functional/apps/observability/index.ts index bc78fa138c39b2..de681d5c17f2c2 100644 --- a/x-pack/test/observability_functional/apps/observability/index.ts +++ b/x-pack/test/observability_functional/apps/observability/index.ts @@ -10,15 +10,18 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('ObservabilityApp', function () { this.tags('ciGroup6'); - loadTestFile(require.resolve('./feature_controls')); - loadTestFile(require.resolve('./exploratory_view')); + loadTestFile(require.resolve('./alerts')); + loadTestFile(require.resolve('./alerts/add_to_case')); loadTestFile(require.resolve('./alerts/alert_disclaimer')); - loadTestFile(require.resolve('./alerts/workflow_status')); + loadTestFile(require.resolve('./alerts/bulk_actions')); loadTestFile(require.resolve('./alerts/pagination')); - loadTestFile(require.resolve('./alerts/add_to_case')); + loadTestFile(require.resolve('./alerts/rule_stats')); loadTestFile(require.resolve('./alerts/state_synchronization')); - loadTestFile(require.resolve('./alerts/bulk_actions')); loadTestFile(require.resolve('./alerts/table_storage')); + loadTestFile(require.resolve('./alerts/workflow_status')); + + loadTestFile(require.resolve('./exploratory_view')); + loadTestFile(require.resolve('./feature_controls')); }); } From 4436b267b74193e397bc7d3907638248af03b6b4 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Fri, 3 Dec 2021 14:31:43 +0100 Subject: [PATCH 095/126] Fix globalsearchg functional tests (#120333) --- .../integration_tests/get_searchable_types.test.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts b/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts index b8224d9a30d086..e3b237bffaf952 100644 --- a/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts +++ b/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts @@ -14,8 +14,7 @@ import { registerInternalSearchableTypesRoute } from '../get_searchable_types'; type SetupServerReturn = UnwrapPromise>; const pluginId = Symbol('globalSearch'); -// FAILING: https://github.com/elastic/kibana/issues/120268 -describe.skip('GET /internal/global_search/searchable_types', () => { +describe('GET /internal/global_search/searchable_types', () => { let server: SetupServerReturn['server']; let httpSetup: SetupServerReturn['httpSetup']; let globalSearchHandlerContext: ReturnType< @@ -47,7 +46,7 @@ describe.skip('GET /internal/global_search/searchable_types', () => { it('calls the handler context with correct parameters', async () => { await supertest(httpSetup.server.listener) - .post('/internal/global_search/searchable_types') + .get('/internal/global_search/searchable_types') .expect(200); expect(globalSearchHandlerContext.getSearchableTypes).toHaveBeenCalledTimes(1); @@ -57,7 +56,7 @@ describe.skip('GET /internal/global_search/searchable_types', () => { globalSearchHandlerContext.getSearchableTypes.mockResolvedValue(['type-a', 'type-b']); const response = await supertest(httpSetup.server.listener) - .post('/internal/global_search/searchable_types') + .get('/internal/global_search/searchable_types') .expect(200); expect(response.body).toEqual({ @@ -69,8 +68,8 @@ describe.skip('GET /internal/global_search/searchable_types', () => { globalSearchHandlerContext.getSearchableTypes.mockRejectedValue(new Error()); const response = await supertest(httpSetup.server.listener) - .post('/internal/global_search/searchable_types') - .expect(200); + .get('/internal/global_search/searchable_types') + .expect(500); expect(response.body).toEqual( expect.objectContaining({ From 265c8dcd434369dbc47fe844a29855ce79e2e398 Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Fri, 3 Dec 2021 08:33:09 -0500 Subject: [PATCH 096/126] [Fleet] Configure fleet default output on prem with ES host and CA fingerprint (#120276) --- .../server/kibana_config_writer.test.ts | 27 ++++++++++ .../server/kibana_config_writer.ts | 52 ++++++++++++++++++- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/plugins/interactive_setup/server/kibana_config_writer.test.ts b/src/plugins/interactive_setup/server/kibana_config_writer.test.ts index 005e280fcc7447..82d02882698d47 100644 --- a/src/plugins/interactive_setup/server/kibana_config_writer.test.ts +++ b/src/plugins/interactive_setup/server/kibana_config_writer.test.ts @@ -7,6 +7,7 @@ */ jest.mock('fs/promises'); +jest.mock('crypto'); import { constants } from 'fs'; import { loggingSystemMock } from 'src/core/server/mocks'; @@ -28,6 +29,16 @@ describe('KibanaConfigWriter', () => { mockReadFile.mockResolvedValue(''); + const mockCrypto = jest.requireMock('crypto'); + mockCrypto.X509Certificate = function (cert: string) { + if (cert === 'invalid-cert') { + throw new Error('Invalid certificate'); + } + return { + fingerprint256: 'fingerprint256', + }; + }; + kibanaConfigWriter = new KibanaConfigWriter( '/some/path/kibana.yml', '/data', @@ -120,6 +131,7 @@ describe('KibanaConfigWriter', () => { elasticsearch.hosts: [some-host] elasticsearch.serviceAccountToken: some-value elasticsearch.ssl.certificateAuthorities: [/data/ca_1234.crt] + xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [some-host], ca_sha256: fingerprint256}] ", ], @@ -186,6 +198,7 @@ describe('KibanaConfigWriter', () => { elasticsearch.username: username elasticsearch.password: password elasticsearch.ssl.certificateAuthorities: [/data/ca_1234.crt] + xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [some-host], ca_sha256: fingerprint256}] ", ], @@ -193,6 +206,18 @@ describe('KibanaConfigWriter', () => { `); }); + it('throws if it cannot parse CA certificate', async () => { + await expect( + kibanaConfigWriter.writeConfig({ + caCert: 'invalid-cert', + host: 'some-host', + serviceAccountToken: { name: 'some-token', value: 'some-value' }, + }) + ).rejects.toMatchInlineSnapshot(`[Error: Invalid certificate]`); + + expect(mockWriteFile).not.toHaveBeenCalled(); + }); + it('can successfully write elasticsearch config without CA certificate', async () => { await expect( kibanaConfigWriter.writeConfig({ @@ -250,6 +275,7 @@ describe('KibanaConfigWriter', () => { elasticsearch.hosts: [some-host] elasticsearch.serviceAccountToken: some-value elasticsearch.ssl.certificateAuthorities: [/data/ca_1234.crt] + xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [some-host], ca_sha256: fingerprint256}] ", ], @@ -303,6 +329,7 @@ describe('KibanaConfigWriter', () => { monitoring.ui.container.elasticsearch.enabled: true elasticsearch.serviceAccountToken: some-value elasticsearch.ssl.certificateAuthorities: [/data/ca_1234.crt] + xpack.fleet.outputs: [{id: fleet-default-output, name: default, is_default: true, is_default_monitoring: true, type: elasticsearch, hosts: [some-host], ca_sha256: fingerprint256}] ", ], diff --git a/src/plugins/interactive_setup/server/kibana_config_writer.ts b/src/plugins/interactive_setup/server/kibana_config_writer.ts index 949bc25ddd2538..af177fee33bcea 100644 --- a/src/plugins/interactive_setup/server/kibana_config_writer.ts +++ b/src/plugins/interactive_setup/server/kibana_config_writer.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { X509Certificate } from 'crypto'; import { constants } from 'fs'; import fs from 'fs/promises'; import yaml from 'js-yaml'; @@ -30,6 +31,16 @@ export type WriteConfigParameters = { | {} ); +interface FleetOutputConfig { + id: string; + name: string; + is_default: boolean; + is_default_monitoring: boolean; + type: 'elasticsearch'; + hosts: string[]; + ca_sha256: string; +} + export class KibanaConfigWriter { constructor( private readonly configPath: string, @@ -61,7 +72,9 @@ export class KibanaConfigWriter { */ public async writeConfig(params: WriteConfigParameters) { const caPath = path.join(this.dataDirectoryPath, `ca_${Date.now()}.crt`); - const config: Record = { 'elasticsearch.hosts': [params.host] }; + const config: Record = { + 'elasticsearch.hosts': [params.host], + }; if ('serviceAccountToken' in params && params.serviceAccountToken) { config['elasticsearch.serviceAccountToken'] = params.serviceAccountToken.value; } else if ('username' in params && params.username) { @@ -72,6 +85,21 @@ export class KibanaConfigWriter { config['elasticsearch.ssl.certificateAuthorities'] = [caPath]; } + // If a certificate is passed configure Fleet default output + if (params.caCert) { + try { + config['xpack.fleet.outputs'] = KibanaConfigWriter.getFleetDefaultOutputConfig( + params.caCert, + params.host + ); + } catch (err) { + this.logger.error( + `Failed to generate Fleet default output: ${getDetailedErrorMessage(err)}.` + ); + throw err; + } + } + // Load and parse existing configuration file to check if it already has values for the config // entries we want to write. const existingConfig = await this.loadAndParseKibanaConfig(); @@ -152,6 +180,28 @@ export class KibanaConfigWriter { return { raw: rawConfig, parsed: parsedConfig }; } + /** + * Build config for Fleet outputs + * @param caCert + * @param host + */ + private static getFleetDefaultOutputConfig(caCert: string, host: string): FleetOutputConfig[] { + const cert = new X509Certificate(caCert); + const certFingerprint = cert.fingerprint256; + + return [ + { + id: 'fleet-default-output', + name: 'default', + is_default: true, + is_default_monitoring: true, + type: 'elasticsearch', + hosts: [host], + ca_sha256: certFingerprint, + }, + ]; + } + /** * Comments out all non-commented entries in the Kibana configuration file. * @param rawConfig Content of the Kibana configuration file. From 89b1f9056c29ac9c35e29fde14d5a7e27b7d731f Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Fri, 3 Dec 2021 08:42:54 -0500 Subject: [PATCH 097/126] Prevent endless loop for saved object migrations (#120146) --- dev_docs/tutorials/saved_objects.mdx | 2 + .../core/saved-objects-service.asciidoc | 3 ++ .../migrations/core/document_migrator.test.ts | 45 +++---------------- .../migrations/core/document_migrator.ts | 16 +------ .../service/lib/repository.test.ts | 23 ++++++++-- .../saved_objects/service/lib/repository.ts | 3 ++ 6 files changed, 35 insertions(+), 57 deletions(-) diff --git a/dev_docs/tutorials/saved_objects.mdx b/dev_docs/tutorials/saved_objects.mdx index 9583e195d1c828..a9d8cd7c6ec1c4 100644 --- a/dev_docs/tutorials/saved_objects.mdx +++ b/dev_docs/tutorials/saved_objects.mdx @@ -252,6 +252,8 @@ Having said that, if a document is encountered that is not in the expected shape fail an upgrade than to silently ignore a corrupt document which can cause unexpected behaviour at some future point in time. When such a scenario is encountered, the error should be verbose and informative so that the corrupt document can be corrected, if possible. +**WARNING:** Do not attempt to change the `migrationVersion`, `id`, or `type` fields within a migration function, this is not supported. + ### Testing Migrations Bugs in a migration function cause downtime for our users and therefore have a very high impact. Follow the . diff --git a/docs/developer/architecture/core/saved-objects-service.asciidoc b/docs/developer/architecture/core/saved-objects-service.asciidoc index a7ce86ea463593..54a5c319c62220 100644 --- a/docs/developer/architecture/core/saved-objects-service.asciidoc +++ b/docs/developer/architecture/core/saved-objects-service.asciidoc @@ -259,6 +259,9 @@ upgrade. In most scenarios, it is better to fail an upgrade than to silently ignore a corrupt document which can cause unexpected behaviour at some future point in time. +WARNING: Do not attempt to change the `migrationVersion`, `id`, or `type` fields +within a migration function, this is not supported. + It is critical that you have extensive tests to ensure that migrations behave as expected with all possible input documents. Given how simple it is to test all the branch conditions in a migration function and the high impact of a bug diff --git a/src/core/server/saved_objects/migrations/core/document_migrator.test.ts b/src/core/server/saved_objects/migrations/core/document_migrator.test.ts index 64c1c4ce2fa9fb..f92d505c058edd 100644 --- a/src/core/server/saved_objects/migrations/core/document_migrator.test.ts +++ b/src/core/server/saved_objects/migrations/core/document_migrator.test.ts @@ -664,39 +664,6 @@ describe('DocumentMigrator', () => { ); }); - it('allows updating a migrationVersion prop to a later version', () => { - const migrator = new DocumentMigrator({ - ...testOpts(), - typeRegistry: createRegistry({ - name: 'cat', - migrations: { - '1.0.0': setAttr('migrationVersion.cat', '2.9.1'), - '2.0.0': () => { - throw new Error('POW!'); - }, - '2.9.1': () => { - throw new Error('BANG!'); - }, - '3.0.0': setAttr('attributes.name', 'Shiny'), - }, - }), - }); - migrator.prepareMigrations(); - const actual = migrator.migrate({ - id: 'smelly', - type: 'cat', - attributes: { name: 'Boo' }, - migrationVersion: { cat: '0.5.6' }, - }); - expect(actual).toEqual({ - id: 'smelly', - type: 'cat', - attributes: { name: 'Shiny' }, - migrationVersion: { cat: '3.0.0' }, - coreMigrationVersion: kibanaVersion, - }); - }); - it('allows adding props to migrationVersion', () => { const migrator = new DocumentMigrator({ ...testOpts(), @@ -1072,7 +1039,8 @@ describe('DocumentMigrator', () => { name: 'dog', namespaceType: 'single', migrations: { - '1.0.0': setAttr('migrationVersion.dog', '2.0.0'), + '1.1.0': setAttr('attributes.age', '12'), + '1.5.0': setAttr('attributes.color', 'tri-color'), '2.0.0': (doc) => doc, // noop }, }, @@ -1083,9 +1051,10 @@ describe('DocumentMigrator', () => { const obj = { id: 'sleepy', type: 'dog', - attributes: { name: 'Patches' }, - migrationVersion: {}, + attributes: { name: 'Patches', age: '11' }, + migrationVersion: { dog: '1.1.0' }, // skip the first migration transform, only apply the second and third references: [{ id: 'favorite', type: 'toy', name: 'BALL!' }], + coreMigrationVersion: undefined, // this is intentional }; it('in the default space', () => { @@ -1095,7 +1064,7 @@ describe('DocumentMigrator', () => { { id: 'sleepy', type: 'dog', - attributes: { name: 'Patches' }, + attributes: { name: 'Patches', age: '11', color: 'tri-color' }, migrationVersion: { dog: '2.0.0' }, references: [{ id: 'favorite', type: 'toy', name: 'BALL!' }], // no change coreMigrationVersion: kibanaVersion, @@ -1111,7 +1080,7 @@ describe('DocumentMigrator', () => { { id: 'sleepy', type: 'dog', - attributes: { name: 'Patches' }, + attributes: { name: 'Patches', age: '11', color: 'tri-color' }, migrationVersion: { dog: '2.0.0' }, references: [{ id: 'uuidv5', type: 'toy', name: 'BALL!' }], // changed coreMigrationVersion: kibanaVersion, diff --git a/src/core/server/saved_objects/migrations/core/document_migrator.ts b/src/core/server/saved_objects/migrations/core/document_migrator.ts index da16dbc5e69e8d..5f2870fb6e244e 100644 --- a/src/core/server/saved_objects/migrations/core/document_migrator.ts +++ b/src/core/server/saved_objects/migrations/core/document_migrator.ts @@ -27,15 +27,7 @@ * handle property addition / deletion / renaming. * * A caveat is that this means we must restrict what a migration can do to the doc's - * migrationVersion itself. We allow only these kinds of changes: - * - * - Add a new property to migrationVersion - * - Move a migrationVersion property forward to a later version - * - * Migrations *cannot* move a migrationVersion property backwards (e.g. from 2.0.0 to 1.0.0), and they - * cannot clear a migrationVersion property, as allowing either of these could produce infinite loops. - * However, we do wish to allow migrations to modify migrationVersion if they wish, so that - * they could transform a type from "foo 1.0.0" to "bar 3.0.0". + * migrationVersion itself. Migrations should *not* make any changes to the migrationVersion property. * * One last gotcha is that any docs which have no migrationVersion are assumed to be up-to-date. * This is because Kibana UI and other clients really can't be expected build the migrationVersion @@ -753,12 +745,6 @@ function migrateProp( let additionalDocs: SavedObjectUnsanitizedDoc[] = []; for (const { version, transform, transformType } of applicableTransforms(migrations, doc, prop)) { - const currentVersion = propVersion(doc, prop); - if (currentVersion && Semver.gt(currentVersion, version)) { - // the previous transform function increased the object's migrationVersion; break out of the loop - break; - } - if (convertNamespaceTypes || (transformType !== 'convert' && transformType !== 'reference')) { // migrate transforms are always applied, but conversion transforms and reference transforms are only applied during index migrations const result = transform(doc); diff --git a/src/core/server/saved_objects/service/lib/repository.test.ts b/src/core/server/saved_objects/service/lib/repository.test.ts index 46a532cdefef4c..ab692b146e7f67 100644 --- a/src/core/server/saved_objects/service/lib/repository.test.ts +++ b/src/core/server/saved_objects/service/lib/repository.test.ts @@ -976,8 +976,9 @@ describe('SavedObjectsRepository', () => { describe('migration', () => { it(`migrates the docs and serializes the migrated docs`, async () => { migrator.migrateDocument.mockImplementation(mockMigrateDocument); - await bulkCreateSuccess([obj1, obj2]); - const docs = [obj1, obj2].map((x) => ({ ...x, ...mockTimestampFields })); + const modifiedObj1 = { ...obj1, coreMigrationVersion: '8.0.0' }; + await bulkCreateSuccess([modifiedObj1, obj2]); + const docs = [modifiedObj1, obj2].map((x) => ({ ...x, ...mockTimestampFields })); expectMigrationArgs(docs[0], true, 1); expectMigrationArgs(docs[1], true, 2); @@ -2556,8 +2557,22 @@ describe('SavedObjectsRepository', () => { it(`migrates a document and serializes the migrated doc`, async () => { const migrationVersion = mockMigrationVersion; - await createSuccess(type, attributes, { id, references, migrationVersion }); - const doc = { type, id, attributes, references, migrationVersion, ...mockTimestampFields }; + const coreMigrationVersion = '8.0.0'; + await createSuccess(type, attributes, { + id, + references, + migrationVersion, + coreMigrationVersion, + }); + const doc = { + type, + id, + attributes, + references, + migrationVersion, + coreMigrationVersion, + ...mockTimestampFields, + }; expectMigrationArgs(doc); const migratedDoc = migrator.migrateDocument(doc); diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index 9be58f1b718613..0d175250160435 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -305,6 +305,7 @@ export class SavedObjectsRepository { const { id = SavedObjectsUtils.generateId(), migrationVersion, + coreMigrationVersion, overwrite = false, references = [], refresh = DEFAULT_REFRESH_SETTING, @@ -359,6 +360,7 @@ export class SavedObjectsRepository { originId, attributes, migrationVersion, + coreMigrationVersion, updated_at: time, ...(Array.isArray(references) && { references }), }); @@ -523,6 +525,7 @@ export class SavedObjectsRepository { type: object.type, attributes: object.attributes, migrationVersion: object.migrationVersion, + coreMigrationVersion: object.coreMigrationVersion, ...(savedObjectNamespace && { namespace: savedObjectNamespace }), ...(savedObjectNamespaces && { namespaces: savedObjectNamespaces }), updated_at: time, From 6640357eb6e2a4b5db39e468dc315bce74109259 Mon Sep 17 00:00:00 2001 From: Khristinin Nikita Date: Fri, 3 Dec 2021 14:54:44 +0100 Subject: [PATCH 098/126] [CTI] Threat Intel Card on Overview page needs to accommodate Fleet TI integrations (#115940) * Add support integrations * Fix types * fix unit tests * Fix tests and types * fix eslint * fix file case * add cy tests * Revert test * Add tests * Add support of installed integrations * Fix types * Add isntalled ingtegration case for cypress tests * Fix cypress tests * Fix comments * Fix capital naming * Fix again capital naming * Add dynamic dashboard for a new integrations packages * intermidiate changes, to keep it remote * Big refactoring * Tests and refactoring * Remove unused constanrs * Fix e2e tests * PR comments fix * fix ts * Fix translations * Remove stubs * Rename isSomeIntegrationsDisabled -> allIntegrationsInstalled * Add buildQuery tests * Fix type * Add tests for Enable Source button * Remove copied file * Move api call to api.ts * Rename fetchFleetIntegrations * Remove __mocks__ Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../security_solution/common/cti/constants.ts | 13 +- .../security_solution/cti/index.ts | 37 +++- .../security_solution/index.ts | 7 + .../overview/cti_link_panel.spec.ts | 13 +- .../cypress/screens/overview.ts | 4 +- .../overview/components/link_panel/helpers.ts | 7 - .../overview/components/link_panel/index.ts | 1 - .../components/link_panel/link_panel.tsx | 20 +- .../overview/components/link_panel/types.ts | 1 + .../cti_disabled_module.tsx | 11 +- .../cti_enabled_module.test.tsx | 49 +---- .../overview_cti_links/cti_enabled_module.tsx | 49 ++--- .../overview_cti_links/cti_no_events.test.tsx | 70 ------- .../overview_cti_links/cti_no_events.tsx | 42 ----- .../cti_with_events.test.tsx | 57 ------ .../overview_cti_links/cti_with_events.tsx | 49 ----- .../overview_cti_links/index.test.tsx | 38 ++-- .../components/overview_cti_links/index.tsx | 36 ++-- .../components/overview_cti_links/mock.ts | 13 +- .../threat_intel_panel_view.tsx | 62 +++---- .../overview_cti_links/translations.ts | 21 ++- .../use_integrations_page_link.tsx | 11 ++ .../containers/overview_cti_links/api.ts | 28 +++ .../containers/overview_cti_links/helpers.ts | 60 ------ .../containers/overview_cti_links/index.tsx | 116 +++++------- .../use_all_ti_data_sources.ts | 22 +++ .../use_cti_event_counts.ts | 64 ------- .../use_is_threat_intel_module_enabled.ts | 32 ---- .../use_request_event_counts.ts | 54 ------ .../overview_cti_links/use_ti_data_sources.ts | 174 ++++++++++++++++++ .../overview_cti_links/use_ti_integrations.ts | 55 ++++++ .../public/overview/pages/overview.test.tsx | 28 ++- .../public/overview/pages/overview.tsx | 25 ++- .../security_solution/factory/cti/index.ts | 2 + .../factory/cti/threat_intel_source/index.ts | 33 ++++ .../query.threat_intel_source.dsl.test.ts | 71 +++++++ .../query.threat_intel_source.dsl.ts | 59 ++++++ .../translations/translations/ja-JP.json | 2 - .../translations/translations/zh-CN.json | 2 - .../es_archives/threat_indicator/data.json | 5 +- .../threat_indicator/mappings.json | 8 + 41 files changed, 731 insertions(+), 720 deletions(-) delete mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx create mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts create mode 100644 x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts create mode 100644 x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts create mode 100644 x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts diff --git a/x-pack/plugins/security_solution/common/cti/constants.ts b/x-pack/plugins/security_solution/common/cti/constants.ts index b33541c5057d8e..7a88b065d8701f 100644 --- a/x-pack/plugins/security_solution/common/cti/constants.ts +++ b/x-pack/plugins/security_solution/common/cti/constants.ts @@ -58,14 +58,5 @@ export const EVENT_ENRICHMENT_INDICATOR_FIELD_MAP = { export const DEFAULT_EVENT_ENRICHMENT_FROM = 'now-30d'; export const DEFAULT_EVENT_ENRICHMENT_TO = 'now'; -export const CTI_DATASET_KEY_MAP: { [key: string]: string } = { - 'AbuseCH URL': 'ti_abusech.url', - 'AbuseCH Malware': 'ti_abusech.malware', - 'AbuseCH MalwareBazaar': 'ti_abusech.malwarebazaar', - 'AlienVault OTX': 'ti_otx.threat', - 'Anomali Limo': 'ti_anomali.limo', - 'Anomali Threatstream': 'ti_anomali.threatstream', - MISP: 'ti_misp.threat', - ThreatQuotient: 'ti_threatq.threat', - Cybersixgill: 'ti_cybersixgill.threat', -}; +export const TI_INTEGRATION_PREFIX = 'ti'; +export const OTHER_TI_DATASET_KEY = '_others_ti_'; diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts index 26bf4ce6740a98..a6e7eef88724bd 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts @@ -5,13 +5,16 @@ * 2.0. */ -import type { IEsSearchResponse } from 'src/plugins/data/public'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { IEsSearchResponse, IEsSearchRequest } from 'src/plugins/data/public'; +import { FactoryQueryTypes } from '../..'; import { EVENT_ENRICHMENT_INDICATOR_FIELD_MAP } from '../../../cti/constants'; -import { Inspect } from '../../common'; +import { Inspect, Maybe, TimerangeInput } from '../../common'; import { RequestBasicOptions } from '..'; export enum CtiQueries { eventEnrichment = 'eventEnrichment', + dataSource = 'dataSource', } export interface CtiEventEnrichmentRequestOptions extends RequestBasicOptions { @@ -40,3 +43,33 @@ export const validEventFields = Object.keys(EVENT_ENRICHMENT_INDICATOR_FIELD_MAP export const isValidEventField = (field: string): field is EventField => validEventFields.includes(field as EventField); + +export interface CtiDataSourceRequestOptions extends IEsSearchRequest { + defaultIndex: string[]; + factoryQueryType?: FactoryQueryTypes; + timerange?: TimerangeInput; +} + +export interface BucketItem { + key: string; + doc_count: number; +} +export interface Bucket { + buckets: Array; +} + +export type DatasetBucket = { + name?: Bucket; + dashboard?: Bucket; +} & BucketItem; + +export interface CtiDataSourceStrategyResponse extends Omit { + inspect?: Maybe; + rawResponse: { + aggregations?: Record & { + dataset?: { + buckets: DatasetBucket[]; + }; + }; + }; +} diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts index 00cbdb941c11be..340093995b297c 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts @@ -72,6 +72,8 @@ import { CtiEventEnrichmentRequestOptions, CtiEventEnrichmentStrategyResponse, CtiQueries, + CtiDataSourceRequestOptions, + CtiDataSourceStrategyResponse, } from './cti'; import { HostRulesRequestOptions, @@ -85,6 +87,7 @@ import { UserRulesStrategyResponse, } from './ueba'; +export * from './cti'; export * from './hosts'; export * from './matrix_histogram'; export * from './network'; @@ -178,6 +181,8 @@ export type StrategyResponseType = T extends HostsQ ? MatrixHistogramStrategyResponse : T extends CtiQueries.eventEnrichment ? CtiEventEnrichmentStrategyResponse + : T extends CtiQueries.dataSource + ? CtiDataSourceStrategyResponse : never; export type StrategyRequestType = T extends HostsQueries.hosts @@ -238,6 +243,8 @@ export type StrategyRequestType = T extends HostsQu ? MatrixHistogramRequestOptions : T extends CtiQueries.eventEnrichment ? CtiEventEnrichmentRequestOptions + : T extends CtiQueries.dataSource + ? CtiDataSourceRequestOptions : never; export interface DocValueFieldsInput { diff --git a/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts b/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts index 095401ff314226..75ff13b66b29cf 100644 --- a/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts @@ -10,9 +10,8 @@ import { OVERVIEW_CTI_LINKS, OVERVIEW_CTI_LINKS_ERROR_INNER_PANEL, OVERVIEW_CTI_LINKS_INFO_INNER_PANEL, - OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL, OVERVIEW_CTI_TOTAL_EVENT_COUNT, - OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON, + OVERVIEW_CTI_ENABLE_INTEGRATIONS_BUTTON, } from '../../screens/overview'; import { loginAndWaitForPage } from '../../tasks/login'; @@ -28,12 +27,11 @@ describe('CTI Link Panel', () => { it('renders disabled threat intel module as expected', () => { loginAndWaitForPage(OVERVIEW_URL); cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_ERROR_INNER_PANEL}`).should('exist'); - cy.get(`${OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON}`).should('be.disabled'); cy.get(`${OVERVIEW_CTI_TOTAL_EVENT_COUNT}`).should('have.text', 'Showing: 0 indicators'); cy.get(`${OVERVIEW_CTI_ENABLE_MODULE_BUTTON}`).should('exist'); cy.get(`${OVERVIEW_CTI_ENABLE_MODULE_BUTTON}`) .should('have.attr', 'href') - .and('match', /filebeat-module-threatintel.html/); + .and('match', /app\/integrations\/browse\?q=threat%20intelligence/); }); describe('enabled threat intel module', () => { @@ -49,17 +47,16 @@ describe('CTI Link Panel', () => { loginAndWaitForPage( `${OVERVIEW_URL}?sourcerer=(timerange:(from:%272021-07-08T04:00:00.000Z%27,kind:absolute,to:%272021-07-09T03:59:59.999Z%27))` ); - cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL}`).should('exist'); cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_INFO_INNER_PANEL}`).should('exist'); - cy.get(`${OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON}`).should('be.disabled'); cy.get(`${OVERVIEW_CTI_TOTAL_EVENT_COUNT}`).should('have.text', 'Showing: 0 indicators'); }); it('renders dashboard module as expected when there are events in the selected time period', () => { loginAndWaitForPage(OVERVIEW_URL); - cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL}`).should('not.exist'); cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_INFO_INNER_PANEL}`).should('exist'); - cy.get(`${OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON}`).should('be.disabled'); + cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_ENABLE_INTEGRATIONS_BUTTON}`).should('exist'); + cy.get(OVERVIEW_CTI_LINKS).should('not.contain.text', 'Anomali'); + cy.get(OVERVIEW_CTI_LINKS).should('contain.text', 'AbuseCH malware'); cy.get(`${OVERVIEW_CTI_TOTAL_EVENT_COUNT}`).should('have.text', 'Showing: 1 indicator'); }); }); diff --git a/x-pack/plugins/security_solution/cypress/screens/overview.ts b/x-pack/plugins/security_solution/cypress/screens/overview.ts index 1945b7e3ce3e7f..bc335ff6680ee1 100644 --- a/x-pack/plugins/security_solution/cypress/screens/overview.ts +++ b/x-pack/plugins/security_solution/cypress/screens/overview.ts @@ -150,9 +150,9 @@ export const OVERVIEW_REVENT_TIMELINES = '[data-test-subj="overview-recent-timel export const OVERVIEW_CTI_LINKS = '[data-test-subj="cti-dashboard-links"]'; export const OVERVIEW_CTI_LINKS_ERROR_INNER_PANEL = '[data-test-subj="cti-inner-panel-danger"]'; -export const OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL = '[data-test-subj="cti-inner-panel-warning"]'; export const OVERVIEW_CTI_LINKS_INFO_INNER_PANEL = '[data-test-subj="cti-inner-panel-info"]'; -export const OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON = '[data-test-subj="cti-view-dashboard-button"]'; +export const OVERVIEW_CTI_ENABLE_INTEGRATIONS_BUTTON = + '[data-test-subj="cti-enable-integrations-button"]'; export const OVERVIEW_CTI_TOTAL_EVENT_COUNT = `${OVERVIEW_CTI_LINKS} [data-test-subj="header-panel-subtitle"]`; export const OVERVIEW_CTI_ENABLE_MODULE_BUTTON = '[data-test-subj="cti-enable-module-button"]'; diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts b/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts index 45d26d9269f6e3..e2adaaae35547d 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts @@ -5,13 +5,6 @@ * 2.0. */ -import { LinkPanelListItem } from '.'; - -export const isLinkPanelListItem = ( - item: LinkPanelListItem | Partial -): item is LinkPanelListItem => - typeof item.title === 'string' && typeof item.path === 'string' && typeof item.count === 'number'; - export interface EventCounts { [key: string]: number; } diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts b/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts index 9d404abcf2223c..9a827b137ae78d 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts @@ -6,6 +6,5 @@ */ export { InnerLinkPanel } from './inner_link_panel'; -export { isLinkPanelListItem } from './helpers'; export { LinkPanel } from './link_panel'; export type { LinkPanelListItem } from './types'; diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx b/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx index ed67fdb1c96f67..00a225635fb8b5 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx @@ -71,7 +71,7 @@ const LinkPanelComponent = ({ splitPanel, subtitle, }: { - button: React.ReactNode; + button?: React.ReactNode; columns: Array>; dataTestSubj: string; defaultSortField?: string; @@ -134,14 +134,16 @@ const LinkPanelComponent = ({ {splitPanel} {infoPanel} - + {chunkedItems.length > 0 && ( + + )} diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts b/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts index f6c0fb6f3837f4..1b8836fc2438df 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts @@ -21,4 +21,5 @@ export interface LinkPanelViewProps { listItems: LinkPanelListItem[]; splitPanel?: JSX.Element; totalCount?: number; + allIntegrationsInstalled?: boolean; } diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx index 2697e4a571ad89..36f386e49c5c7d 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx @@ -6,24 +6,21 @@ */ import React from 'react'; -import { EMPTY_LIST_ITEMS } from '../../containers/overview_cti_links/helpers'; -import { useKibana } from '../../../common/lib/kibana'; import * as i18n from './translations'; import { DisabledLinkPanel } from '../link_panel/disabled_link_panel'; import { ThreatIntelPanelView } from './threat_intel_panel_view'; +import { useIntegrationsPageLink } from './use_integrations_page_link'; export const CtiDisabledModuleComponent = () => { - const threatIntelDocLink = `${ - useKibana().services.docLinks.links.filebeat.base - }/filebeat-module-threatintel.html`; + const integrationsLink = useIntegrationsPageLink(); return ( diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx index db83d9e1bcfe52..fc36a0c4337cf7 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx @@ -19,20 +19,15 @@ import { mockGlobalState, SUB_PLUGINS_REDUCER, } from '../../../common/mock'; -import { mockTheme, mockProps, mockCtiEventCountsResponse, mockCtiLinksResponse } from './mock'; -import { useCtiEventCounts } from '../../containers/overview_cti_links/use_cti_event_counts'; +import { mockTheme, mockProps, mockTiDataSources, mockCtiLinksResponse } from './mock'; import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; -import { useRequestEventCounts } from '../../containers/overview_cti_links/use_request_event_counts'; +import { useTiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; jest.mock('../../../common/lib/kibana'); -jest.mock('../../containers/overview_cti_links/use_cti_event_counts'); -const useCTIEventCountsMock = useCtiEventCounts as jest.Mock; -useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse); - -jest.mock('../../containers/overview_cti_links/use_request_event_counts'); -const useRequestEventCountsMock = useRequestEventCounts as jest.Mock; -useRequestEventCountsMock.mockReturnValue([true, {}]); +jest.mock('../../containers/overview_cti_links/use_ti_data_sources'); +const useTiDataSourcesMock = useTiDataSources as jest.Mock; +useTiDataSourcesMock.mockReturnValue(mockTiDataSources); jest.mock('../../containers/overview_cti_links'); const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; @@ -54,42 +49,12 @@ describe('CtiEnabledModule', () => { - - - - - ); - - expect(screen.getByTestId('cti-with-events')).toBeInTheDocument(); - }); - - it('renders CtiWithNoEvents when there are no events', () => { - useCTIEventCountsMock.mockReturnValueOnce({ totalCount: 0 }); - render( - - - - - - - - ); - - expect(screen.getByTestId('cti-with-no-events')).toBeInTheDocument(); - }); - - it('renders null while event counts are loading', () => { - useCTIEventCountsMock.mockReturnValueOnce({ totalCount: -1 }); - const { container } = render( - - - - + ); - expect(container.firstChild).toBeNull(); + expect(screen.getByText('Showing: 5 indicators')).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx index 5a40c79d6e5ecd..a339676ac361f0 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx @@ -7,37 +7,28 @@ import React from 'react'; import { ThreatIntelLinkPanelProps } from '.'; -import { useCtiEventCounts } from '../../containers/overview_cti_links/use_cti_event_counts'; -import { CtiNoEvents } from './cti_no_events'; -import { CtiWithEvents } from './cti_with_events'; +import { useTiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; +import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; +import { ThreatIntelPanelView } from './threat_intel_panel_view'; -export type CtiEnabledModuleProps = Omit; +export const CtiEnabledModuleComponent: React.FC = (props) => { + const { to, from, allIntegrationsInstalled, allTiDataSources, setQuery, deleteQuery } = props; + const { tiDataSources, totalCount } = useTiDataSources({ + to, + from, + allTiDataSources, + setQuery, + deleteQuery, + }); + const { listItems } = useCtiDashboardLinks({ to, from, tiDataSources }); -export const CtiEnabledModuleComponent: React.FC = (props) => { - const { eventCountsByDataset, totalCount } = useCtiEventCounts(props); - const { to, from } = props; - - switch (totalCount) { - case -1: - return null; - case 0: - return ( -
    - -
    - ); - default: - return ( -
    - -
    - ); - } + return ( + + ); }; export const CtiEnabledModule = React.memo(CtiEnabledModuleComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx deleted file mode 100644 index 8f624dabd64d16..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { Provider } from 'react-redux'; -import { cloneDeep } from 'lodash/fp'; -import { render, screen } from '@testing-library/react'; -import { I18nProvider } from '@kbn/i18n-react'; -import { CtiNoEvents } from './cti_no_events'; -import { ThemeProvider } from 'styled-components'; -import { createStore, State } from '../../../common/store'; -import { - createSecuritySolutionStorageMock, - kibanaObservable, - mockGlobalState, - SUB_PLUGINS_REDUCER, -} from '../../../common/mock'; -import { mockEmptyCtiLinksResponse, mockTheme, mockProps } from './mock'; -import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; - -jest.mock('../../../common/lib/kibana'); - -jest.mock('../../containers/overview_cti_links'); -const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; -useCtiDashboardLinksMock.mockReturnValue(mockEmptyCtiLinksResponse); - -describe('CtiNoEvents', () => { - const state: State = mockGlobalState; - - const { storage } = createSecuritySolutionStorageMock(); - let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); - - beforeEach(() => { - const myState = cloneDeep(state); - store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); - }); - - it('renders warning inner panel', () => { - render( - - - - - - - - ); - - expect(screen.getByTestId('cti-dashboard-links')).toBeInTheDocument(); - expect(screen.getByTestId('cti-inner-panel-warning')).toBeInTheDocument(); - }); - - it('renders event counts as 0', () => { - render( - - - - - - - - ); - - expect(screen.getByText('Showing: 0 indicators')).toBeInTheDocument(); - }); -}); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx deleted file mode 100644 index fa7ac50c087658..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; -import { ThreatIntelPanelView } from './threat_intel_panel_view'; -import { InnerLinkPanel } from '../link_panel'; -import * as i18n from './translations'; -import { emptyEventCountsByDataset } from '../../containers/overview_cti_links/helpers'; - -const warning = ( - -); - -export const CtiNoEventsComponent = ({ to, from }: { to: string; from: string }) => { - const { buttonHref, listItems, isPluginDisabled } = useCtiDashboardLinks( - emptyEventCountsByDataset, - to, - from - ); - - return ( - - ); -}; - -export const CtiNoEvents = React.memo(CtiNoEventsComponent); -CtiNoEvents.displayName = 'CtiNoEvents'; diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx deleted file mode 100644 index a50e3e91ab9e52..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { Provider } from 'react-redux'; -import { cloneDeep } from 'lodash/fp'; -import { mount } from 'enzyme'; -import { I18nProvider } from '@kbn/i18n-react'; -import { CtiWithEvents } from './cti_with_events'; -import { ThemeProvider } from 'styled-components'; -import { createStore, State } from '../../../common/store'; -import { - createSecuritySolutionStorageMock, - kibanaObservable, - mockGlobalState, - SUB_PLUGINS_REDUCER, -} from '../../../common/mock'; -import { mockCtiLinksResponse, mockTheme, mockCtiWithEventsProps } from './mock'; -import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; - -jest.mock('../../../common/lib/kibana'); - -jest.mock('../../containers/overview_cti_links'); -const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; -useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse); - -describe('CtiWithEvents', () => { - const state: State = mockGlobalState; - - const { storage } = createSecuritySolutionStorageMock(); - let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); - - beforeEach(() => { - const myState = cloneDeep(state); - store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); - }); - - it('renders total event count as expected', () => { - const wrapper = mount( - - - - - - - - ); - - expect(wrapper.find('[data-test-subj="cti-total-event-count"]').text()).toEqual( - `Showing: ${mockCtiWithEventsProps.totalCount} indicators` - ); - }); -}); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx deleted file mode 100644 index f78451e205b1ea..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { isEqual } from 'lodash'; -import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; -import { ThreatIntelPanelView } from './threat_intel_panel_view'; - -export const CtiWithEventsComponent = ({ - eventCountsByDataset, - from, - to, - totalCount, -}: { - eventCountsByDataset: { [key: string]: number }; - from: string; - to: string; - totalCount: number; -}) => { - const { buttonHref, isPluginDisabled, listItems } = useCtiDashboardLinks( - eventCountsByDataset, - to, - from - ); - - return ( - - ); -}; - -CtiWithEventsComponent.displayName = 'CtiWithEvents'; - -export const CtiWithEvents = React.memo( - CtiWithEventsComponent, - (prevProps, nextProps) => - prevProps.to === nextProps.to && - prevProps.from === nextProps.from && - prevProps.totalCount === nextProps.totalCount && - isEqual(prevProps.eventCountsByDataset, nextProps.eventCountsByDataset) -); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx index dfd9c6c9a7fcd4..71d6d5eb0c5831 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx @@ -19,19 +19,19 @@ import { mockGlobalState, SUB_PLUGINS_REDUCER, } from '../../../common/mock'; -import { mockTheme, mockProps, mockCtiEventCountsResponse } from './mock'; -import { useRequestEventCounts } from '../../containers/overview_cti_links/use_request_event_counts'; -import { useCtiEventCounts } from '../../containers/overview_cti_links/use_cti_event_counts'; +import { mockTheme, mockProps, mockTiDataSources, mockCtiLinksResponse } from './mock'; +import { useTiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; +import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; jest.mock('../../../common/lib/kibana'); -jest.mock('../../containers/overview_cti_links/use_request_event_counts'); -const useRequestEventCountsMock = useRequestEventCounts as jest.Mock; -useRequestEventCountsMock.mockReturnValue([true, {}]); +jest.mock('../../containers/overview_cti_links/use_ti_data_sources'); +const useTiDataSourcesMock = useTiDataSources as jest.Mock; +useTiDataSourcesMock.mockReturnValue(mockTiDataSources); -jest.mock('../../containers/overview_cti_links/use_cti_event_counts'); -const useCTIEventCountsMock = useCtiEventCounts as jest.Mock; -useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse); +jest.mock('../../containers/overview_cti_links'); +const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; +useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse); describe('ThreatIntelLinkPanel', () => { const state: State = mockGlobalState; @@ -49,40 +49,44 @@ describe('ThreatIntelLinkPanel', () => { - + ); expect(wrapper.find('[data-test-subj="cti-enabled-module"]').length).toEqual(1); + expect(wrapper.find('[data-test-subj="cti-enable-integrations-button"]').length).toEqual(0); }); - it('renders CtiDisabledModule when Threat Intel module is disabled', () => { + it('renders Enable source buttons when not all integrations installed', () => { const wrapper = mount( - + ); - - expect(wrapper.find('[data-test-subj="cti-disabled-module"]').length).toEqual(1); + expect(wrapper.find('[data-test-subj="cti-enable-integrations-button"]').length).not.toBe(0); }); - it('renders null while Threat Intel module state is loading', () => { + it('renders CtiDisabledModule when Threat Intel module is disabled', () => { const wrapper = mount( - + ); - expect(wrapper.html()).toEqual(''); + expect(wrapper.find('[data-test-subj="cti-disabled-module"]').length).toEqual(1); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx index 5348c12fb6c8ef..c89199c2cb0c58 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { GlobalTimeArgs } from '../../../common/containers/use_global_time'; +import { TiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; import { CtiEnabledModule } from './cti_enabled_module'; import { CtiDisabledModule } from './cti_disabled_module'; @@ -15,27 +16,26 @@ export type ThreatIntelLinkPanelProps = Pick< GlobalTimeArgs, 'from' | 'to' | 'deleteQuery' | 'setQuery' > & { - isThreatIntelModuleEnabled: boolean | undefined; + allIntegrationsInstalled: boolean | undefined; + allTiDataSources: TiDataSources[]; }; const ThreatIntelLinkPanelComponent: React.FC = (props) => { - switch (props.isThreatIntelModuleEnabled) { - case true: - return ( -
    - -
    - ); - case false: - return ( -
    - -
    - ); - case undefined: - default: - return null; - } + const { allIntegrationsInstalled, allTiDataSources } = props; + const isThreatIntelModuleEnabled = allTiDataSources.length > 0; + return isThreatIntelModuleEnabled ? ( +
    + +
    + ) : ( +
    + +
    + ); }; export const ThreatIntelLinkPanel = React.memo(ThreatIntelLinkPanelComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts index 1d02acaf65f486..c4cf876cbdc7de 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts @@ -15,6 +15,13 @@ export const mockTheme = getMockTheme({ }, }); +export const mockTiDataSources = { + totalCount: 5, + tiDataSources: [ + { dataset: 'ti_abusech', name: 'AbuseCH', count: 5, path: '/dashboard_path_abuseurl' }, + ], +}; + export const mockEventCountsByDataset = { abuseurl: 1, abusemalware: 1, @@ -31,8 +38,6 @@ export const mockCtiEventCountsResponse = { }; export const mockCtiLinksResponse = { - isPluginDisabled: false, - buttonHref: '/button', listItems: [ { title: 'abuseurl', count: 1, path: '/dashboard_path_abuseurl' }, { title: 'abusemalware', count: 2, path: '/dashboard_path_abusemalware' }, @@ -63,6 +68,10 @@ export const mockProps = { from: '2020-01-21T20:49:57.080Z', setQuery: jest.fn(), deleteQuery: jest.fn(), + allIntegrationsInstalled: true, + allTiDataSources: [ + { dataset: 'ti_abusech', name: 'AbuseCH', count: 5, path: '/dashboard_path_abuseurl' }, + ], }; export const mockCtiWithEventsProps = { diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx index 189f230c02c8de..3697d27015fdc8 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx @@ -9,14 +9,14 @@ import React, { useMemo } from 'react'; import { EuiButton, EuiTableFieldDataColumnType } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useKibana } from '../../../common/lib/kibana'; import * as i18n from './translations'; import { LinkPanel, InnerLinkPanel, LinkPanelListItem } from '../link_panel'; import { LinkPanelViewProps } from '../link_panel/types'; import { shortenCountIntoString } from '../../../common/utils/shorten_count_into_string'; import { Link } from '../link_panel/link'; -import { ID as CTIEventCountQueryId } from '../../containers/overview_cti_links/use_cti_event_counts'; +import { ID as CTIEventCountQueryId } from '../../containers/overview_cti_links/use_ti_data_sources'; import { LINK_COPY } from '../overview_risky_host_links/translations'; +import { useIntegrationsPageLink } from './use_integrations_page_link'; const columns: Array> = [ { name: 'Name', field: 'title', sortable: true, truncateText: true, width: '100%' }, @@ -39,51 +39,43 @@ const columns: Array> = [ ]; export const ThreatIntelPanelView: React.FC = ({ - buttonHref = '', - isPluginDisabled, isInspectEnabled = true, listItems, splitPanel, totalCount = 0, + allIntegrationsInstalled, }) => { - const threatIntelDashboardDocLink = `${ - useKibana().services.docLinks.links.filebeat.base - }/load-kibana-dashboards.html`; + const integrationsLink = useIntegrationsPageLink(); return ( ( - - {i18n.VIEW_DASHBOARD} - - ), - [buttonHref] - ), columns, dataTestSubj: 'cti-dashboard-links', infoPanel: useMemo( - () => - isPluginDisabled ? ( - - {i18n.INFO_BUTTON} - - } - /> - ) : null, - [isPluginDisabled, threatIntelDashboardDocLink] + () => ( + <> + {allIntegrationsInstalled === false ? ( + + {i18n.DANGER_BUTTON} + + } + /> + ) : null} + + ), + [allIntegrationsInstalled, integrationsLink] ), inspectQueryId: isInspectEnabled ? CTIEventCountQueryId : undefined, listItems, diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts index 4a64462b27ad5a..e112942b097492 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts @@ -53,15 +53,14 @@ export const DANGER_TITLE = i18n.translate( export const DANGER_BODY = i18n.translate( 'xpack.securitySolution.overview.ctiDashboardEnableThreatIntel', { - defaultMessage: - 'You need to enable the filebeat threatintel module in order to view data from different sources.', + defaultMessage: 'You need to enable threat intel sources in order to view data.', } ); export const DANGER_BUTTON = i18n.translate( - 'xpack.securitySolution.overview.ctiDashboardDangerPanelButton', + 'xpack.securitySolution.overview.ctiDashboardDangerButton', { - defaultMessage: 'Enable Module', + defaultMessage: 'Enable sources', } ); @@ -72,3 +71,17 @@ export const PANEL_TITLE = i18n.translate('xpack.securitySolution.overview.ctiDa export const VIEW_DASHBOARD = i18n.translate('xpack.securitySolution.overview.ctiViewDasboard', { defaultMessage: 'View dashboard', }); + +export const SOME_MODULES_DISABLE_TITLE = i18n.translate( + 'xpack.securitySolution.overview.ctiDashboardSomeModulesDisabledTItle', + { + defaultMessage: 'Some threat intel sources are disabled', + } +); + +export const OTHER_DATA_SOURCE_TITLE = i18n.translate( + 'xpack.securitySolution.overview.ctiDashboardOtherDatasourceTitle', + { + defaultMessage: 'Others', + } +); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx new file mode 100644 index 00000000000000..de710c2f1b17cb --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useBasePath } from '../../../common/lib/kibana'; + +export const useIntegrationsPageLink = () => + `${useBasePath()}/app/integrations/browse?q=threat%20intelligence`; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts new file mode 100644 index 00000000000000..ad737ac410e3b1 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { KibanaServices } from '../../../common/lib/kibana'; +import { EPM_API_ROUTES } from '../../../../../fleet/common'; + +export interface IntegrationResponse { + id: string; + status: string; + savedObject?: { + attributes?: { + installed_kibana: Array<{ + type: string; + id: string; + }>; + }; + }; +} + +export const fetchFleetIntegrations = () => + KibanaServices.get().http.fetch<{ + response: IntegrationResponse[]; + }>(EPM_API_ROUTES.LIST_PATTERN, { + method: 'GET', + }); diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts deleted file mode 100644 index 9ac61cc9487ee0..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { SavedObjectAttributes } from '@kbn/securitysolution-io-ts-alerting-types'; -import { CTI_DATASET_KEY_MAP } from '../../../../common/cti/constants'; -import { LinkPanelListItem } from '../../components/link_panel'; -import { EventCounts } from '../../components/link_panel/helpers'; - -export const ctiTitles = Object.keys(CTI_DATASET_KEY_MAP) as string[]; - -export const EMPTY_LIST_ITEMS: LinkPanelListItem[] = ctiTitles.map((title) => ({ - title, - count: 0, - path: '', -})); - -const TAG_REQUEST_BODY_SEARCH = 'threat intel'; -export const TAG_REQUEST_BODY = { - type: 'tag', - search: TAG_REQUEST_BODY_SEARCH, - searchFields: ['name'], -}; - -export const DASHBOARD_SO_TITLE_PREFIX = '[Filebeat Threat Intel] '; -export const OVERVIEW_DASHBOARD_LINK_TITLE = 'Overview'; - -export const getCtiListItemsWithoutLinks = (eventCounts: EventCounts): LinkPanelListItem[] => { - return EMPTY_LIST_ITEMS.map((item) => ({ - ...item, - count: eventCounts[CTI_DATASET_KEY_MAP[item.title]] ?? 0, - })); -}; - -export const isOverviewItem = (item: { path?: string; title?: string }) => - item.title === OVERVIEW_DASHBOARD_LINK_TITLE; - -export const createLinkFromDashboardSO = ( - dashboardSO: { attributes?: SavedObjectAttributes }, - eventCountsByDataset: EventCounts, - path: string -) => { - const title = - typeof dashboardSO.attributes?.title === 'string' - ? dashboardSO.attributes.title.replace(DASHBOARD_SO_TITLE_PREFIX, '') - : undefined; - return { - title, - count: typeof title === 'string' ? eventCountsByDataset[CTI_DATASET_KEY_MAP[title]] : undefined, - path, - }; -}; - -export const emptyEventCountsByDataset = Object.values(CTI_DATASET_KEY_MAP).reduce((acc, id) => { - acc[id] = 0; - return acc; -}, {} as { [key: string]: number }); diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx index a546d20e495838..b1310e363eef03 100644 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx @@ -6,34 +6,29 @@ */ import { useState, useEffect, useCallback } from 'react'; import { SavedObjectAttributes } from '@kbn/securitysolution-io-ts-alerting-types'; +import { TiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; +import { LinkPanelListItem } from '../../components/link_panel'; import { useKibana } from '../../../common/lib/kibana'; -import { - TAG_REQUEST_BODY, - createLinkFromDashboardSO, - getCtiListItemsWithoutLinks, - isOverviewItem, - EMPTY_LIST_ITEMS, -} from './helpers'; -import { LinkPanelListItem, isLinkPanelListItem } from '../../components/link_panel'; -export const useCtiDashboardLinks = ( - eventCountsByDataset: { [key: string]: number }, - to: string, - from: string -) => { - const createDashboardUrl = useKibana().services.dashboard?.dashboardUrlGenerator?.createUrl; - const savedObjectsClient = useKibana().services.savedObjects.client; - - const [buttonHref, setButtonHref] = useState(); - const [listItems, setListItems] = useState(EMPTY_LIST_ITEMS); +const TAG_REQUEST_BODY_SEARCH = 'threat intel'; +export const TAG_REQUEST_BODY = { + type: 'tag', + search: TAG_REQUEST_BODY_SEARCH, + searchFields: ['name'], +}; - const [isPluginDisabled, setIsDashboardPluginDisabled] = useState(false); - const handleDisabledPlugin = useCallback(() => { - if (!isPluginDisabled) { - setIsDashboardPluginDisabled(true); - } - setListItems(getCtiListItemsWithoutLinks(eventCountsByDataset)); - }, [setIsDashboardPluginDisabled, setListItems, eventCountsByDataset, isPluginDisabled]); +export const useCtiDashboardLinks = ({ + to, + from, + tiDataSources = [], +}: { + to: string; + from: string; + tiDataSources?: TiDataSources[]; +}) => { + const [installedDashboardIds, setInstalledDashboardIds] = useState([]); + const dashboardLocator = useKibana().services.dashboard?.locator; + const savedObjectsClient = useKibana().services.savedObjects.client; const handleTagsReceived = useCallback( (TagsSO?) => { @@ -49,9 +44,7 @@ export const useCtiDashboardLinks = ( ); useEffect(() => { - if (!createDashboardUrl || !savedObjectsClient) { - handleDisabledPlugin(); - } else { + if (savedObjectsClient) { savedObjectsClient .find(TAG_REQUEST_BODY) .then(handleTagsReceived) @@ -63,53 +56,40 @@ export const useCtiDashboardLinks = ( }>; }) => { if (DashboardsSO?.savedObjects?.length) { - const dashboardUrls = await Promise.all( - DashboardsSO.savedObjects.map((SO) => - createDashboardUrl({ - dashboardId: SO.id, - timeRange: { - to, - from, - }, - }) - ) + setInstalledDashboardIds( + DashboardsSO.savedObjects.map((SO) => SO.id ?? '').filter(Boolean) ); - const items = DashboardsSO.savedObjects - ?.reduce((acc: LinkPanelListItem[], dashboardSO, i) => { - const item = createLinkFromDashboardSO( - dashboardSO, - eventCountsByDataset, - dashboardUrls[i] - ); - if (isOverviewItem(item)) { - setButtonHref(item.path); - } else if (isLinkPanelListItem(item)) { - acc.push(item); - } - return acc; - }, []) - .sort((a, b) => (a.title > b.title ? 1 : -1)); - setListItems(items); - } else { - handleDisabledPlugin(); } } ); } - }, [ - createDashboardUrl, - eventCountsByDataset, - from, - handleDisabledPlugin, - handleTagsReceived, - isPluginDisabled, - savedObjectsClient, - to, - ]); + }, [handleTagsReceived, savedObjectsClient]); + + const listItems = tiDataSources.map((tiDataSource) => { + const listItem: LinkPanelListItem = { + title: tiDataSource.name, + count: tiDataSource.count, + path: '', + }; + + if ( + tiDataSource.dashboardId && + installedDashboardIds.includes(tiDataSource.dashboardId) && + dashboardLocator + ) { + listItem.path = dashboardLocator.getRedirectUrl({ + dashboardId: tiDataSource.dashboardId, + timeRange: { + to, + from, + }, + }); + } + + return listItem; + }); return { - buttonHref, - isPluginDisabled, listItems, }; }; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts new file mode 100644 index 00000000000000..5686be269121a3 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { useMemo } from 'react'; +import { useTiDataSources } from './use_ti_data_sources'; + +export const useAllTiDataSources = () => { + const { to, from } = useMemo( + () => ({ + to: new Date().toISOString(), + from: new Date(0).toISOString(), + }), + [] + ); + + const { tiDataSources, isInitiallyLoaded } = useTiDataSources({ to, from }); + + return { tiDataSources, isInitiallyLoaded }; +}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts deleted file mode 100644 index c8076ab6a4484e..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useEffect, useState, useMemo } from 'react'; -import { useRequestEventCounts } from './use_request_event_counts'; -import { emptyEventCountsByDataset } from './helpers'; -import { CtiEnabledModuleProps } from '../../components/overview_cti_links/cti_enabled_module'; - -export const ID = 'ctiEventCountQuery'; - -export const useCtiEventCounts = ({ deleteQuery, from, setQuery, to }: CtiEnabledModuleProps) => { - const [isInitialLoading, setIsInitialLoading] = useState(true); - - const [loading, { data, inspect, totalCount, refetch }] = useRequestEventCounts(to, from); - - const eventCountsByDataset = useMemo( - () => - data.reduce( - (acc, item) => { - if (item.y && item.g) { - const id = item.g; - acc[id] += item.y; - } - return acc; - }, - { ...emptyEventCountsByDataset } as { [key: string]: number } - ), - [data] - ); - - useEffect(() => { - if (isInitialLoading && data) { - setIsInitialLoading(false); - } - }, [isInitialLoading, data]); - - useEffect(() => { - if (!loading && !isInitialLoading) { - setQuery({ id: ID, inspect, loading, refetch }); - } - }, [setQuery, inspect, loading, refetch, isInitialLoading, setIsInitialLoading]); - - useEffect(() => { - return () => { - if (deleteQuery) { - deleteQuery({ id: ID }); - } - }; - }, [deleteQuery]); - - useEffect(() => { - refetch(); - }, [to, from, refetch]); - - return { - eventCountsByDataset, - loading, - totalCount, - }; -}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts deleted file mode 100644 index 0dc0e8a3fe1f28..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { useState, useEffect, useMemo } from 'react'; -import { useRequestEventCounts } from './use_request_event_counts'; - -export const useIsThreatIntelModuleEnabled = () => { - const [isThreatIntelModuleEnabled, setIsThreatIntelModuleEnabled] = useState< - boolean | undefined - >(); - - const { to, from } = useMemo( - () => ({ - to: new Date().toISOString(), - from: new Date(0).toISOString(), - }), - [] - ); - - const [, { totalCount }] = useRequestEventCounts(to, from); - - useEffect(() => { - if (totalCount !== -1) { - setIsThreatIntelModuleEnabled(totalCount > 0); - } - }, [totalCount]); - - return isThreatIntelModuleEnabled; -}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts deleted file mode 100644 index a1bf4d9d35f65c..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { useMemo } from 'react'; -import { i18n } from '@kbn/i18n'; -import { convertToBuildEsQuery } from '../../../common/lib/keury'; -import { getEsQueryConfig } from '../../../../../../../src/plugins/data/common'; -import { MatrixHistogramType } from '../../../../common/search_strategy'; -import { EVENT_DATASET } from '../../../../common/cti/constants'; -import { useMatrixHistogram } from '../../../common/containers/matrix_histogram'; -import { useKibana } from '../../../common/lib/kibana'; -import { DEFAULT_THREAT_INDEX_KEY } from '../../../../common/constants'; - -export const useRequestEventCounts = (to: string, from: string) => { - const { uiSettings } = useKibana().services; - const defaultThreatIndices = uiSettings.get(DEFAULT_THREAT_INDEX_KEY); - - const [filterQuery] = convertToBuildEsQuery({ - config: getEsQueryConfig(uiSettings), - indexPattern: { - fields: [ - { - name: 'event.kind', - type: 'string', - }, - ], - title: defaultThreatIndices.toString(), - }, - queries: [{ query: 'event.type:indicator', language: 'kuery' }], - filters: [], - }); - - const matrixHistogramRequest = useMemo(() => { - return { - endDate: to, - errorMessage: i18n.translate('xpack.securitySolution.overview.errorFetchingEvents', { - defaultMessage: 'Error fetching events', - }), - filterQuery, - histogramType: MatrixHistogramType.events, - indexNames: defaultThreatIndices, - stackByField: EVENT_DATASET, - startDate: from, - size: 0, - }; - }, [to, from, filterQuery, defaultThreatIndices]); - - const results = useMatrixHistogram(matrixHistogramRequest); - - return results; -}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts new file mode 100644 index 00000000000000..865af2266f2e0a --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts @@ -0,0 +1,174 @@ +/* + * Copyright 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 { Observable } from 'rxjs'; +import { filter } from 'rxjs/operators'; +import { useEffect, useState } from 'react'; +import { useObservable, withOptionalSignal } from '@kbn/securitysolution-hook-utils'; +import { useKibana } from '../../../common/lib/kibana'; +import { + DataPublicPluginStart, + isCompleteResponse, + isErrorResponse, +} from '../../../../../../../src/plugins/data/public'; +import { + Bucket, + CtiQueries, + CtiDataSourceStrategyResponse, + CtiDataSourceRequestOptions, +} from '../../../../common'; +import { DEFAULT_THREAT_INDEX_KEY } from '../../../../common/constants'; +import { GlobalTimeArgs } from '../../../common/containers/use_global_time'; +import { OTHER_DATA_SOURCE_TITLE } from '../../components/overview_cti_links/translations'; +import { OTHER_TI_DATASET_KEY } from '../../../../common/cti/constants'; + +type GetThreatIntelSourcProps = CtiDataSourceRequestOptions & { + data: DataPublicPluginStart; + signal: AbortSignal; +}; +export const ID = 'ctiEventCountQuery'; + +export const getTiDataSources = ({ + data, + defaultIndex, + timerange, + signal, +}: GetThreatIntelSourcProps): Observable => + data.search.search( + { + defaultIndex, + factoryQueryType: CtiQueries.dataSource, + timerange, + }, + { + strategy: 'securitySolutionSearchStrategy', + abortSignal: signal, + } + ); + +export const getTiDataSourcesComplete = ( + props: GetThreatIntelSourcProps +): Observable => { + return getTiDataSources(props).pipe( + filter((response) => { + return isErrorResponse(response) || isCompleteResponse(response); + }) + ); +}; + +const getTiDataSourcesWithOptionalSignal = withOptionalSignal(getTiDataSourcesComplete); + +export const useTiDataSourcesComplete = () => useObservable(getTiDataSourcesWithOptionalSignal); + +export interface TiDataSources { + dataset: string; + name: string; + count: number; + dashboardId?: string; +} +interface TiDataSourcesProps extends Partial { + allTiDataSources?: TiDataSources[]; +} + +export const useTiDataSources = ({ + to, + from, + allTiDataSources, + setQuery, + deleteQuery, +}: TiDataSourcesProps) => { + const [tiDataSources, setTiDataSources] = useState([]); + const [isInitiallyLoaded, setIsInitiallyLoaded] = useState(false); + const { data, uiSettings } = useKibana().services; + const defaultThreatIndices = uiSettings.get(DEFAULT_THREAT_INDEX_KEY); + const { result, start, loading } = useTiDataSourcesComplete(); + + useEffect(() => { + start({ + data, + timerange: to && from ? { to, from, interval: '' } : undefined, + defaultIndex: defaultThreatIndices, + }); + }, [to, from, start, data, defaultThreatIndices]); + + useEffect(() => { + if (!loading && result?.rawResponse && result?.inspect && setQuery) { + setQuery({ + id: ID, + inspect: { + dsl: result?.inspect?.dsl ?? [], + response: [JSON.stringify(result.rawResponse, null, 2)], + }, + loading, + refetch: () => {}, + }); + } + }, [setQuery, loading, result]); + + useEffect(() => { + return () => { + if (deleteQuery) { + deleteQuery({ id: ID }); + } + }; + }, [deleteQuery]); + + useEffect(() => { + if (result && !isInitiallyLoaded) { + setIsInitiallyLoaded(true); + } + }, [isInitiallyLoaded, result]); + + useEffect(() => { + if (!loading && result) { + const datasets = result?.rawResponse?.aggregations?.dataset?.buckets ?? []; + const getChildAggregationValue = (aggregation?: Bucket) => aggregation?.buckets?.[0]?.key; + + const integrationMap = datasets.reduce((acc: Record, dataset) => { + const datasetName = getChildAggregationValue(dataset?.name); + if (datasetName) { + return { + ...acc, + [dataset.key]: { + dataset: dataset?.key, + name: datasetName, + dashboardId: getChildAggregationValue(dataset?.dashboard), + count: dataset?.doc_count, + }, + }; + } else { + const otherTiDatasetKey = OTHER_TI_DATASET_KEY; + const otherDatasetCount = acc[otherTiDatasetKey]?.count ?? 0; + return { + ...acc, + [otherTiDatasetKey]: { + dataset: otherTiDatasetKey, + name: OTHER_DATA_SOURCE_TITLE, + count: otherDatasetCount + (dataset?.doc_count ?? 0), + }, + }; + } + }, {}); + + if (Array.isArray(allTiDataSources)) { + allTiDataSources.forEach((integration) => { + if (!integrationMap[integration.dataset]) { + integrationMap[integration.dataset] = { + ...integration, + count: 0, + }; + } + }); + } + + setTiDataSources(Object.values(integrationMap)); + } + }, [result, loading, allTiDataSources]); + + const totalCount = tiDataSources.reduce((acc, val) => acc + val.count, 0); + + return { tiDataSources, totalCount, isInitiallyLoaded }; +}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts new file mode 100644 index 00000000000000..24bdc191b3d66d --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.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 { useEffect, useState } from 'react'; + +import { installationStatuses } from '../../../../../fleet/common'; +import { TI_INTEGRATION_PREFIX } from '../../../../common/cti/constants'; +import { fetchFleetIntegrations, IntegrationResponse } from './api'; + +export interface Integration { + id: string; + dashboardIds: string[]; +} + +interface TiIntegrationStatus { + allIntegrationsInstalled: boolean; +} + +export const useTiIntegrations = () => { + const [tiIntegrationsStatus, setTiIntegrationsStatus] = useState( + null + ); + + useEffect(() => { + const getPackages = async () => { + try { + const { response: integrations } = await fetchFleetIntegrations(); + const tiIntegrations = integrations.filter((integration: IntegrationResponse) => + integration.id.startsWith(TI_INTEGRATION_PREFIX) + ); + + const allIntegrationsInstalled = tiIntegrations.every( + (integration: IntegrationResponse) => + integration.status === installationStatuses.Installed + ); + + setTiIntegrationsStatus({ + allIntegrationsInstalled, + }); + } catch (e) { + setTiIntegrationsStatus({ + allIntegrationsInstalled: false, + }); + } + }; + + getPackages(); + }, []); + + return tiIntegrationsStatus; +}; diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index 2539490be16fb5..b38072464c6530 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -23,12 +23,9 @@ import { } from '../../common/components/user_privileges'; import { useSourcererDataView } from '../../common/containers/sourcerer'; import { useFetchIndex } from '../../common/containers/source'; -import { useIsThreatIntelModuleEnabled } from '../containers/overview_cti_links/use_is_threat_intel_module_enabled'; -import { useCtiEventCounts } from '../containers/overview_cti_links/use_cti_event_counts'; -import { - mockCtiEventCountsResponse, - mockCtiLinksResponse, -} from '../components/overview_cti_links/mock'; +import { useAllTiDataSources } from '../containers/overview_cti_links/use_all_ti_data_sources'; +import { useTiIntegrations } from '../containers/overview_cti_links/use_ti_integrations'; +import { mockCtiLinksResponse, mockTiDataSources } from '../components/overview_cti_links/mock'; import { useCtiDashboardLinks } from '../containers/overview_cti_links'; import { EndpointPrivileges } from '../../common/components/user_privileges/endpoint/use_endpoint_privileges'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; @@ -73,18 +70,17 @@ jest.mock('../../common/components/user_privileges', () => { jest.mock('../../common/containers/local_storage/use_messages_storage'); jest.mock('../containers/overview_cti_links'); -jest.mock('../containers/overview_cti_links/use_cti_event_counts'); const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse); -jest.mock('../containers/overview_cti_links/use_cti_event_counts'); -const useCTIEventCountsMock = useCtiEventCounts as jest.Mock; -useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse); +jest.mock('../containers/overview_cti_links/use_all_ti_data_sources'); +const useAllTiDataSourcesMock = useAllTiDataSources as jest.Mock; +useAllTiDataSourcesMock.mockReturnValue(mockTiDataSources); -jest.mock('../containers/overview_cti_links/use_is_threat_intel_module_enabled'); -const useIsThreatIntelModuleEnabledMock = useIsThreatIntelModuleEnabled as jest.Mock; -useIsThreatIntelModuleEnabledMock.mockReturnValue(true); +jest.mock('../containers/overview_cti_links/use_ti_integrations'); +const useTiIntegrationsMock = useTiIntegrations as jest.Mock; +useTiIntegrationsMock.mockReturnValue({}); jest.mock('../containers/overview_risky_host_links/use_hosts_risk_score'); const useHostsRiskScoreMock = useHostsRiskScore as jest.Mock; @@ -303,8 +299,8 @@ describe('Overview', () => { }); describe('Threat Intel Dashboard Links', () => { - it('invokes useIsThreatIntelModuleEnabled hook only once', () => { - useIsThreatIntelModuleEnabledMock.mockClear(); + it('invokes useAllTiDataSourcesMock hook only once', () => { + useAllTiDataSourcesMock.mockClear(); mount( @@ -312,7 +308,7 @@ describe('Overview', () => { ); - expect(useIsThreatIntelModuleEnabledMock).toHaveBeenCalledTimes(1); + expect(useAllTiDataSourcesMock).toHaveBeenCalledTimes(1); }); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx index 67ee6c55ac06f8..1df49fed073589 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx @@ -30,7 +30,8 @@ import { ENDPOINT_METADATA_INDEX } from '../../../common/constants'; import { useSourcererDataView } from '../../common/containers/sourcerer'; import { useDeepEqualSelector } from '../../common/hooks/use_selector'; import { ThreatIntelLinkPanel } from '../components/overview_cti_links'; -import { useIsThreatIntelModuleEnabled } from '../containers/overview_cti_links/use_is_threat_intel_module_enabled'; +import { useAllTiDataSources } from '../containers/overview_cti_links/use_all_ti_data_sources'; +import { useTiIntegrations } from '../containers/overview_cti_links/use_ti_integrations'; import { useUserPrivileges } from '../../common/components/user_privileges'; import { RiskyHostLinks } from '../components/overview_risky_host_links'; import { useAlertsPrivileges } from '../../detections/containers/detection_engine/alerts/use_alerts_privileges'; @@ -75,7 +76,10 @@ const OverviewComponent = () => { endpointPrivileges: { canAccessFleet }, } = useUserPrivileges(); const { hasIndexRead, hasKibanaREAD } = useAlertsPrivileges(); - const isThreatIntelModuleEnabled = useIsThreatIntelModuleEnabled(); + const { tiDataSources: allTiDataSources, isInitiallyLoaded: allTiDataSourcesLoaded } = + useAllTiDataSources(); + const tiIntegrationStatus = useTiIntegrations(); + const isTiLoaded = tiIntegrationStatus && allTiDataSourcesLoaded; const riskyHostsEnabled = useIsExperimentalFeatureEnabled('riskyHostsEnabled'); @@ -150,13 +154,16 @@ const OverviewComponent = () => { - + {isTiLoaded && ( + + )} {riskyHostsEnabled && ( diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts index 5857a0417239c8..e43af97e84af05 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts @@ -9,7 +9,9 @@ import type { FactoryQueryTypes } from '../../../../../common/search_strategy/se import { CtiQueries } from '../../../../../common/search_strategy/security_solution/cti'; import type { SecuritySolutionFactory } from '../types'; import { eventEnrichment } from './event_enrichment'; +import { dataSource } from './threat_intel_source'; export const ctiFactoryTypes: Record> = { [CtiQueries.eventEnrichment]: eventEnrichment, + [CtiQueries.dataSource]: dataSource, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts new file mode 100644 index 00000000000000..0951503b04cd41 --- /dev/null +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SecuritySolutionFactory } from '../../types'; +import { + CtiDataSourceStrategyResponse, + CtiQueries, + CtiDataSourceRequestOptions, +} from '../../../../../../common'; +import { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; +import { inspectStringifyObject } from '../../../../../utils/build_query'; +import { buildTiDataSourceQuery } from './query.threat_intel_source.dsl'; + +export const dataSource: SecuritySolutionFactory = { + buildDsl: (options: CtiDataSourceRequestOptions) => buildTiDataSourceQuery(options), + parse: async ( + options: CtiDataSourceRequestOptions, + response: IEsSearchResponse + ): Promise => { + const inspect = { + dsl: [inspectStringifyObject(buildTiDataSourceQuery(options))], + }; + + return { + ...response, + inspect, + }; + }, +}; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts new file mode 100644 index 00000000000000..832006930a326f --- /dev/null +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts @@ -0,0 +1,71 @@ +/* + * Copyright 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 { buildTiDataSourceQuery } from './query.threat_intel_source.dsl'; +import { CtiQueries } from '../../../../../../common'; + +export const mockOptions = { + defaultIndex: ['logs-ti_*', 'filebeat-8*'], + docValueFields: [], + factoryQueryType: CtiQueries.dataSource, + filterQuery: '', + timerange: { + interval: '12h', + from: '2020-09-06T15:23:52.757Z', + to: '2020-09-07T15:23:52.757Z', + }, +}; + +export const expectedDsl = { + body: { + aggs: { + dataset: { + terms: { + field: 'event.dataset', + }, + aggs: { + name: { + terms: { + field: 'threat.feed.name', + }, + }, + dashboard: { + terms: { + field: 'threat.feed.dashboard_id', + }, + }, + }, + }, + }, + query: { + bool: { + filter: [ + { + range: { + '@timestamp': { + gte: '2020-09-06T15:23:52.757Z', + lte: '2020-09-07T15:23:52.757Z', + format: 'strict_date_optional_time', + }, + }, + }, + ], + }, + }, + }, + ignore_unavailable: true, + index: ['logs-ti_*', 'filebeat-8*'], + size: 0, + track_total_hits: true, + allow_no_indices: true, +}; + +describe('buildbuildTiDataSourceQueryQuery', () => { + test('build query from options correctly', () => { + expect(buildTiDataSourceQuery(mockOptions)).toEqual(expectedDsl); + }); +}); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts new file mode 100644 index 00000000000000..08463146a683ee --- /dev/null +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CtiDataSourceRequestOptions } from '../../../../../../common'; + +export const buildTiDataSourceQuery = ({ + timerange, + defaultIndex, +}: CtiDataSourceRequestOptions) => { + const filter = []; + + if (timerange) { + filter.push({ + range: { + '@timestamp': { + gte: timerange.from, + lte: timerange.to, + format: 'strict_date_optional_time', + }, + }, + }); + } + + const dslQuery = { + size: 0, + index: defaultIndex, + allow_no_indices: true, + ignore_unavailable: true, + track_total_hits: true, + body: { + aggs: { + dataset: { + terms: { field: 'event.dataset' }, + aggs: { + name: { + terms: { field: 'threat.feed.name' }, + }, + dashboard: { + terms: { + field: 'threat.feed.dashboard_id', + }, + }, + }, + }, + }, + query: { + bool: { + filter, + }, + }, + }, + }; + + return dslQuery; +}; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 76d3f07facf05b..58d04788e98eb3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -23438,7 +23438,6 @@ "xpack.securitySolution.overview.auditBeatProcessTitle": "プロセス", "xpack.securitySolution.overview.auditBeatSocketTitle": "ソケット", "xpack.securitySolution.overview.auditBeatUserTitle": "ユーザー", - "xpack.securitySolution.overview.ctiDashboardDangerPanelButton": "モジュールを有効にする", "xpack.securitySolution.overview.ctiDashboardDangerPanelTitle": "表示する脅威インテリジェンスデータがありません", "xpack.securitySolution.overview.ctiDashboardEnableThreatIntel": "別のソースからデータを表示するには、filebeat脅威インテリジェンスモジュールを有効にする必要があります。", "xpack.securitySolution.overview.ctiDashboardInfoPanelBody": "このガイドに従い、ダッシュボードを有効にして、ビジュアライゼーションにソースを表示できるようにしてください。", @@ -23460,7 +23459,6 @@ "xpack.securitySolution.overview.endpointNotice.message": "脅威防御、検出、深いセキュリティデータの可視化を実現し、ホストを保護します。", "xpack.securitySolution.overview.endpointNotice.title": "Endpoint Security", "xpack.securitySolution.overview.endpointNotice.tryButton": "Endpoint Securityを試す", - "xpack.securitySolution.overview.errorFetchingEvents": "イベントの取得エラー", "xpack.securitySolution.overview.eventsTitle": "イベント数", "xpack.securitySolution.overview.filebeatCiscoTitle": "Cisco", "xpack.securitySolution.overview.filebeatNetflowTitle": "Netflow", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 01997e32f243e6..da71c1796066f6 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -23828,7 +23828,6 @@ "xpack.securitySolution.overview.auditBeatProcessTitle": "进程", "xpack.securitySolution.overview.auditBeatSocketTitle": "套接字", "xpack.securitySolution.overview.auditBeatUserTitle": "用户", - "xpack.securitySolution.overview.ctiDashboardDangerPanelButton": "启用模块", "xpack.securitySolution.overview.ctiDashboardDangerPanelTitle": "没有可显示的威胁情报数据", "xpack.securitySolution.overview.ctiDashboardEnableThreatIntel": "您需要启用 filebeat threatintel 模块,以便查看不同源的数据。", "xpack.securitySolution.overview.ctiDashboardInfoPanelBody": "按照此指南启用您的仪表板,以便可以在可视化中查看您的源。", @@ -23851,7 +23850,6 @@ "xpack.securitySolution.overview.endpointNotice.message": "使用威胁防御、检测和深度安全数据可见性功能保护您的主机。", "xpack.securitySolution.overview.endpointNotice.title": "Endpoint Security", "xpack.securitySolution.overview.endpointNotice.tryButton": "试用 Endpoint Security", - "xpack.securitySolution.overview.errorFetchingEvents": "提取事件时出错", "xpack.securitySolution.overview.eventsTitle": "事件计数", "xpack.securitySolution.overview.filebeatCiscoTitle": "Cisco", "xpack.securitySolution.overview.filebeatNetflowTitle": "NetFlow", diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json index a2e0c2d2921dc8..ec5e2aae6e2e2d 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json @@ -31,6 +31,9 @@ } }, "type": "file" + }, + "feed": { + "name": "AbuseCH malware" } }, "abusemalware": { @@ -72,4 +75,4 @@ } } } -} +} \ No newline at end of file diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json index 8840cd4bee0dd8..bc5f6e3db91690 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json @@ -796,6 +796,14 @@ "type": "keyword" } } + }, + "feed":{ + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } } } } From 4ad3044daedb66319d2231d4b62b332880fb54d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=A1nchez?= Date: Fri, 3 Dec 2021 15:35:36 +0100 Subject: [PATCH 099/126] [Security solution] [Endpoint] Adds missing parenthesis to fix trusted apps query (#120326) * Initial commit to add search bar for trusted apps in policy view page * Retrieve all assigned trusted apps to ensure if there are something assigned without the search filters or not. Also fixes unit tests * remove useless if condition * Adds more unit tests and fixes some pr suggestions * Fix weird bug when loading empty state * Fix ts errors due changes in api mocks * Fixes unit test * Remove grid loader to use paginated results one. Fix selectors and tests * Remove unused imports due ts errors * remove unused import * Adds parenthesis to fix a query error. Also fixes related unit test Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../policy_details/middleware/policy_trusted_apps_middleware.ts | 2 +- .../trusted_apps/layout/policy_trusted_apps_layout.test.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/middleware/policy_trusted_apps_middleware.ts b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/middleware/policy_trusted_apps_middleware.ts index e9cbda1f487cbe..1630d63aee5c67 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/middleware/policy_trusted_apps_middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/policy/store/policy_details/middleware/policy_trusted_apps_middleware.ts @@ -157,7 +157,7 @@ const checkIfPolicyHasTrustedAppsAssigned = async ( } try { const policyId = policyIdFromParams(state); - const kuery = `exception-list-agnostic.attributes.tags:"policy:${policyId}" OR exception-list-agnostic.attributes.tags:"policy:all"`; + const kuery = `(exception-list-agnostic.attributes.tags:"policy:${policyId}" OR exception-list-agnostic.attributes.tags:"policy:all")`; const trustedApps = await trustedAppsService.getTrustedAppsList({ page: 1, per_page: 100, diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.test.tsx index 40997de054c7f4..089bbd4bcb4e8b 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.test.tsx @@ -136,7 +136,7 @@ describe('Policy trusted apps layout', () => { mockedApis.responseProvider.trustedAppsList.mockImplementation( (options: HttpFetchOptionsWithPath) => { const hasAnyQuery = - 'exception-list-agnostic.attributes.tags:"policy:1234" OR exception-list-agnostic.attributes.tags:"policy:all"'; + '(exception-list-agnostic.attributes.tags:"policy:1234" OR exception-list-agnostic.attributes.tags:"policy:all")'; if (options.query?.filter === hasAnyQuery) { const exceptionsGenerator = new ExceptionsListItemGenerator('seed'); return { From 3b516b6dd1e1fc38ca931f7c04b44e39fa679d24 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Fri, 3 Dec 2021 15:39:48 +0100 Subject: [PATCH 100/126] :bug: Keep the behindText color flag for treemap (#120228) --- .../plugins/lens/public/pie_visualization/render_function.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx index 539d69207f5f92..3b9fdaf094822e 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx @@ -186,7 +186,7 @@ export function PieComponent( const outputColor = paletteService.get(palette.name).getCategoricalColor( seriesLayers, { - behindText: categoryDisplay !== 'hide', + behindText: categoryDisplay !== 'hide' || isTreemapOrMosaicShape(shape), maxDepth: bucketColumns.length, totalSeries: totalSeriesCount, syncColors, From a0db43e07bfe611bc7d89a234c8511a2a49769fd Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Fri, 3 Dec 2021 10:50:17 -0500 Subject: [PATCH 101/126] Revert " [CTI] Threat Intel Card on Overview page needs to accommodate Fleet TI integrations (#115940)" This reverts commit 6640357eb6e2a4b5db39e468dc315bce74109259. --- .../security_solution/common/cti/constants.ts | 13 +- .../security_solution/cti/index.ts | 37 +--- .../security_solution/index.ts | 7 - .../overview/cti_link_panel.spec.ts | 13 +- .../cypress/screens/overview.ts | 4 +- .../overview/components/link_panel/helpers.ts | 7 + .../overview/components/link_panel/index.ts | 1 + .../components/link_panel/link_panel.tsx | 20 +- .../overview/components/link_panel/types.ts | 1 - .../cti_disabled_module.tsx | 11 +- .../cti_enabled_module.test.tsx | 49 ++++- .../overview_cti_links/cti_enabled_module.tsx | 49 +++-- .../overview_cti_links/cti_no_events.test.tsx | 70 +++++++ .../overview_cti_links/cti_no_events.tsx | 42 +++++ .../cti_with_events.test.tsx | 57 ++++++ .../overview_cti_links/cti_with_events.tsx | 49 +++++ .../overview_cti_links/index.test.tsx | 38 ++-- .../components/overview_cti_links/index.tsx | 36 ++-- .../components/overview_cti_links/mock.ts | 13 +- .../threat_intel_panel_view.tsx | 62 ++++--- .../overview_cti_links/translations.ts | 21 +-- .../use_integrations_page_link.tsx | 11 -- .../containers/overview_cti_links/api.ts | 28 --- .../containers/overview_cti_links/helpers.ts | 60 ++++++ .../containers/overview_cti_links/index.tsx | 116 +++++++----- .../use_all_ti_data_sources.ts | 22 --- .../use_cti_event_counts.ts | 64 +++++++ .../use_is_threat_intel_module_enabled.ts | 32 ++++ .../use_request_event_counts.ts | 54 ++++++ .../overview_cti_links/use_ti_data_sources.ts | 174 ------------------ .../overview_cti_links/use_ti_integrations.ts | 55 ------ .../public/overview/pages/overview.test.tsx | 28 +-- .../public/overview/pages/overview.tsx | 25 +-- .../security_solution/factory/cti/index.ts | 2 - .../factory/cti/threat_intel_source/index.ts | 33 ---- .../query.threat_intel_source.dsl.test.ts | 71 ------- .../query.threat_intel_source.dsl.ts | 59 ------ .../translations/translations/ja-JP.json | 2 + .../translations/translations/zh-CN.json | 2 + .../es_archives/threat_indicator/data.json | 5 +- .../threat_indicator/mappings.json | 8 - 41 files changed, 720 insertions(+), 731 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx create mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx create mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx create mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts create mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts delete mode 100644 x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts delete mode 100644 x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts delete mode 100644 x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts delete mode 100644 x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts diff --git a/x-pack/plugins/security_solution/common/cti/constants.ts b/x-pack/plugins/security_solution/common/cti/constants.ts index 7a88b065d8701f..b33541c5057d8e 100644 --- a/x-pack/plugins/security_solution/common/cti/constants.ts +++ b/x-pack/plugins/security_solution/common/cti/constants.ts @@ -58,5 +58,14 @@ export const EVENT_ENRICHMENT_INDICATOR_FIELD_MAP = { export const DEFAULT_EVENT_ENRICHMENT_FROM = 'now-30d'; export const DEFAULT_EVENT_ENRICHMENT_TO = 'now'; -export const TI_INTEGRATION_PREFIX = 'ti'; -export const OTHER_TI_DATASET_KEY = '_others_ti_'; +export const CTI_DATASET_KEY_MAP: { [key: string]: string } = { + 'AbuseCH URL': 'ti_abusech.url', + 'AbuseCH Malware': 'ti_abusech.malware', + 'AbuseCH MalwareBazaar': 'ti_abusech.malwarebazaar', + 'AlienVault OTX': 'ti_otx.threat', + 'Anomali Limo': 'ti_anomali.limo', + 'Anomali Threatstream': 'ti_anomali.threatstream', + MISP: 'ti_misp.threat', + ThreatQuotient: 'ti_threatq.threat', + Cybersixgill: 'ti_cybersixgill.threat', +}; diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts index a6e7eef88724bd..26bf4ce6740a98 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/cti/index.ts @@ -5,16 +5,13 @@ * 2.0. */ -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { IEsSearchResponse, IEsSearchRequest } from 'src/plugins/data/public'; -import { FactoryQueryTypes } from '../..'; +import type { IEsSearchResponse } from 'src/plugins/data/public'; import { EVENT_ENRICHMENT_INDICATOR_FIELD_MAP } from '../../../cti/constants'; -import { Inspect, Maybe, TimerangeInput } from '../../common'; +import { Inspect } from '../../common'; import { RequestBasicOptions } from '..'; export enum CtiQueries { eventEnrichment = 'eventEnrichment', - dataSource = 'dataSource', } export interface CtiEventEnrichmentRequestOptions extends RequestBasicOptions { @@ -43,33 +40,3 @@ export const validEventFields = Object.keys(EVENT_ENRICHMENT_INDICATOR_FIELD_MAP export const isValidEventField = (field: string): field is EventField => validEventFields.includes(field as EventField); - -export interface CtiDataSourceRequestOptions extends IEsSearchRequest { - defaultIndex: string[]; - factoryQueryType?: FactoryQueryTypes; - timerange?: TimerangeInput; -} - -export interface BucketItem { - key: string; - doc_count: number; -} -export interface Bucket { - buckets: Array; -} - -export type DatasetBucket = { - name?: Bucket; - dashboard?: Bucket; -} & BucketItem; - -export interface CtiDataSourceStrategyResponse extends Omit { - inspect?: Maybe; - rawResponse: { - aggregations?: Record & { - dataset?: { - buckets: DatasetBucket[]; - }; - }; - }; -} diff --git a/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts b/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts index 340093995b297c..00cbdb941c11be 100644 --- a/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts +++ b/x-pack/plugins/security_solution/common/search_strategy/security_solution/index.ts @@ -72,8 +72,6 @@ import { CtiEventEnrichmentRequestOptions, CtiEventEnrichmentStrategyResponse, CtiQueries, - CtiDataSourceRequestOptions, - CtiDataSourceStrategyResponse, } from './cti'; import { HostRulesRequestOptions, @@ -87,7 +85,6 @@ import { UserRulesStrategyResponse, } from './ueba'; -export * from './cti'; export * from './hosts'; export * from './matrix_histogram'; export * from './network'; @@ -181,8 +178,6 @@ export type StrategyResponseType = T extends HostsQ ? MatrixHistogramStrategyResponse : T extends CtiQueries.eventEnrichment ? CtiEventEnrichmentStrategyResponse - : T extends CtiQueries.dataSource - ? CtiDataSourceStrategyResponse : never; export type StrategyRequestType = T extends HostsQueries.hosts @@ -243,8 +238,6 @@ export type StrategyRequestType = T extends HostsQu ? MatrixHistogramRequestOptions : T extends CtiQueries.eventEnrichment ? CtiEventEnrichmentRequestOptions - : T extends CtiQueries.dataSource - ? CtiDataSourceRequestOptions : never; export interface DocValueFieldsInput { diff --git a/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts b/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts index 75ff13b66b29cf..095401ff314226 100644 --- a/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts +++ b/x-pack/plugins/security_solution/cypress/integration/overview/cti_link_panel.spec.ts @@ -10,8 +10,9 @@ import { OVERVIEW_CTI_LINKS, OVERVIEW_CTI_LINKS_ERROR_INNER_PANEL, OVERVIEW_CTI_LINKS_INFO_INNER_PANEL, + OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL, OVERVIEW_CTI_TOTAL_EVENT_COUNT, - OVERVIEW_CTI_ENABLE_INTEGRATIONS_BUTTON, + OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON, } from '../../screens/overview'; import { loginAndWaitForPage } from '../../tasks/login'; @@ -27,11 +28,12 @@ describe('CTI Link Panel', () => { it('renders disabled threat intel module as expected', () => { loginAndWaitForPage(OVERVIEW_URL); cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_ERROR_INNER_PANEL}`).should('exist'); + cy.get(`${OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON}`).should('be.disabled'); cy.get(`${OVERVIEW_CTI_TOTAL_EVENT_COUNT}`).should('have.text', 'Showing: 0 indicators'); cy.get(`${OVERVIEW_CTI_ENABLE_MODULE_BUTTON}`).should('exist'); cy.get(`${OVERVIEW_CTI_ENABLE_MODULE_BUTTON}`) .should('have.attr', 'href') - .and('match', /app\/integrations\/browse\?q=threat%20intelligence/); + .and('match', /filebeat-module-threatintel.html/); }); describe('enabled threat intel module', () => { @@ -47,16 +49,17 @@ describe('CTI Link Panel', () => { loginAndWaitForPage( `${OVERVIEW_URL}?sourcerer=(timerange:(from:%272021-07-08T04:00:00.000Z%27,kind:absolute,to:%272021-07-09T03:59:59.999Z%27))` ); + cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL}`).should('exist'); cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_INFO_INNER_PANEL}`).should('exist'); + cy.get(`${OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON}`).should('be.disabled'); cy.get(`${OVERVIEW_CTI_TOTAL_EVENT_COUNT}`).should('have.text', 'Showing: 0 indicators'); }); it('renders dashboard module as expected when there are events in the selected time period', () => { loginAndWaitForPage(OVERVIEW_URL); + cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL}`).should('not.exist'); cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_LINKS_INFO_INNER_PANEL}`).should('exist'); - cy.get(`${OVERVIEW_CTI_LINKS} ${OVERVIEW_CTI_ENABLE_INTEGRATIONS_BUTTON}`).should('exist'); - cy.get(OVERVIEW_CTI_LINKS).should('not.contain.text', 'Anomali'); - cy.get(OVERVIEW_CTI_LINKS).should('contain.text', 'AbuseCH malware'); + cy.get(`${OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON}`).should('be.disabled'); cy.get(`${OVERVIEW_CTI_TOTAL_EVENT_COUNT}`).should('have.text', 'Showing: 1 indicator'); }); }); diff --git a/x-pack/plugins/security_solution/cypress/screens/overview.ts b/x-pack/plugins/security_solution/cypress/screens/overview.ts index bc335ff6680ee1..1945b7e3ce3e7f 100644 --- a/x-pack/plugins/security_solution/cypress/screens/overview.ts +++ b/x-pack/plugins/security_solution/cypress/screens/overview.ts @@ -150,9 +150,9 @@ export const OVERVIEW_REVENT_TIMELINES = '[data-test-subj="overview-recent-timel export const OVERVIEW_CTI_LINKS = '[data-test-subj="cti-dashboard-links"]'; export const OVERVIEW_CTI_LINKS_ERROR_INNER_PANEL = '[data-test-subj="cti-inner-panel-danger"]'; +export const OVERVIEW_CTI_LINKS_WARNING_INNER_PANEL = '[data-test-subj="cti-inner-panel-warning"]'; export const OVERVIEW_CTI_LINKS_INFO_INNER_PANEL = '[data-test-subj="cti-inner-panel-info"]'; -export const OVERVIEW_CTI_ENABLE_INTEGRATIONS_BUTTON = - '[data-test-subj="cti-enable-integrations-button"]'; +export const OVERVIEW_CTI_VIEW_DASHBOARD_BUTTON = '[data-test-subj="cti-view-dashboard-button"]'; export const OVERVIEW_CTI_TOTAL_EVENT_COUNT = `${OVERVIEW_CTI_LINKS} [data-test-subj="header-panel-subtitle"]`; export const OVERVIEW_CTI_ENABLE_MODULE_BUTTON = '[data-test-subj="cti-enable-module-button"]'; diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts b/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts index e2adaaae35547d..45d26d9269f6e3 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/helpers.ts @@ -5,6 +5,13 @@ * 2.0. */ +import { LinkPanelListItem } from '.'; + +export const isLinkPanelListItem = ( + item: LinkPanelListItem | Partial +): item is LinkPanelListItem => + typeof item.title === 'string' && typeof item.path === 'string' && typeof item.count === 'number'; + export interface EventCounts { [key: string]: number; } diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts b/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts index 9a827b137ae78d..9d404abcf2223c 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/index.ts @@ -6,5 +6,6 @@ */ export { InnerLinkPanel } from './inner_link_panel'; +export { isLinkPanelListItem } from './helpers'; export { LinkPanel } from './link_panel'; export type { LinkPanelListItem } from './types'; diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx b/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx index 00a225635fb8b5..ed67fdb1c96f67 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/link_panel.tsx @@ -71,7 +71,7 @@ const LinkPanelComponent = ({ splitPanel, subtitle, }: { - button?: React.ReactNode; + button: React.ReactNode; columns: Array>; dataTestSubj: string; defaultSortField?: string; @@ -134,16 +134,14 @@ const LinkPanelComponent = ({ {splitPanel} {infoPanel} - {chunkedItems.length > 0 && ( - - )} + diff --git a/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts b/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts index 1b8836fc2438df..f6c0fb6f3837f4 100644 --- a/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts +++ b/x-pack/plugins/security_solution/public/overview/components/link_panel/types.ts @@ -21,5 +21,4 @@ export interface LinkPanelViewProps { listItems: LinkPanelListItem[]; splitPanel?: JSX.Element; totalCount?: number; - allIntegrationsInstalled?: boolean; } diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx index 36f386e49c5c7d..2697e4a571ad89 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_disabled_module.tsx @@ -6,21 +6,24 @@ */ import React from 'react'; +import { EMPTY_LIST_ITEMS } from '../../containers/overview_cti_links/helpers'; +import { useKibana } from '../../../common/lib/kibana'; import * as i18n from './translations'; import { DisabledLinkPanel } from '../link_panel/disabled_link_panel'; import { ThreatIntelPanelView } from './threat_intel_panel_view'; -import { useIntegrationsPageLink } from './use_integrations_page_link'; export const CtiDisabledModuleComponent = () => { - const integrationsLink = useIntegrationsPageLink(); + const threatIntelDocLink = `${ + useKibana().services.docLinks.links.filebeat.base + }/filebeat-module-threatintel.html`; return ( diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx index fc36a0c4337cf7..db83d9e1bcfe52 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.test.tsx @@ -19,15 +19,20 @@ import { mockGlobalState, SUB_PLUGINS_REDUCER, } from '../../../common/mock'; -import { mockTheme, mockProps, mockTiDataSources, mockCtiLinksResponse } from './mock'; +import { mockTheme, mockProps, mockCtiEventCountsResponse, mockCtiLinksResponse } from './mock'; +import { useCtiEventCounts } from '../../containers/overview_cti_links/use_cti_event_counts'; import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; -import { useTiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; +import { useRequestEventCounts } from '../../containers/overview_cti_links/use_request_event_counts'; jest.mock('../../../common/lib/kibana'); -jest.mock('../../containers/overview_cti_links/use_ti_data_sources'); -const useTiDataSourcesMock = useTiDataSources as jest.Mock; -useTiDataSourcesMock.mockReturnValue(mockTiDataSources); +jest.mock('../../containers/overview_cti_links/use_cti_event_counts'); +const useCTIEventCountsMock = useCtiEventCounts as jest.Mock; +useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse); + +jest.mock('../../containers/overview_cti_links/use_request_event_counts'); +const useRequestEventCountsMock = useRequestEventCounts as jest.Mock; +useRequestEventCountsMock.mockReturnValue([true, {}]); jest.mock('../../containers/overview_cti_links'); const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; @@ -49,12 +54,42 @@ describe('CtiEnabledModule', () => { - + + + + + ); + + expect(screen.getByTestId('cti-with-events')).toBeInTheDocument(); + }); + + it('renders CtiWithNoEvents when there are no events', () => { + useCTIEventCountsMock.mockReturnValueOnce({ totalCount: 0 }); + render( + + + + + + + + ); + + expect(screen.getByTestId('cti-with-no-events')).toBeInTheDocument(); + }); + + it('renders null while event counts are loading', () => { + useCTIEventCountsMock.mockReturnValueOnce({ totalCount: -1 }); + const { container } = render( + + + + ); - expect(screen.getByText('Showing: 5 indicators')).toBeInTheDocument(); + expect(container.firstChild).toBeNull(); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx index a339676ac361f0..5a40c79d6e5ecd 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_enabled_module.tsx @@ -7,28 +7,37 @@ import React from 'react'; import { ThreatIntelLinkPanelProps } from '.'; -import { useTiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; -import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; -import { ThreatIntelPanelView } from './threat_intel_panel_view'; +import { useCtiEventCounts } from '../../containers/overview_cti_links/use_cti_event_counts'; +import { CtiNoEvents } from './cti_no_events'; +import { CtiWithEvents } from './cti_with_events'; -export const CtiEnabledModuleComponent: React.FC = (props) => { - const { to, from, allIntegrationsInstalled, allTiDataSources, setQuery, deleteQuery } = props; - const { tiDataSources, totalCount } = useTiDataSources({ - to, - from, - allTiDataSources, - setQuery, - deleteQuery, - }); - const { listItems } = useCtiDashboardLinks({ to, from, tiDataSources }); +export type CtiEnabledModuleProps = Omit; - return ( - - ); +export const CtiEnabledModuleComponent: React.FC = (props) => { + const { eventCountsByDataset, totalCount } = useCtiEventCounts(props); + const { to, from } = props; + + switch (totalCount) { + case -1: + return null; + case 0: + return ( +
    + +
    + ); + default: + return ( +
    + +
    + ); + } }; export const CtiEnabledModule = React.memo(CtiEnabledModuleComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx new file mode 100644 index 00000000000000..8f624dabd64d16 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.test.tsx @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { Provider } from 'react-redux'; +import { cloneDeep } from 'lodash/fp'; +import { render, screen } from '@testing-library/react'; +import { I18nProvider } from '@kbn/i18n-react'; +import { CtiNoEvents } from './cti_no_events'; +import { ThemeProvider } from 'styled-components'; +import { createStore, State } from '../../../common/store'; +import { + createSecuritySolutionStorageMock, + kibanaObservable, + mockGlobalState, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { mockEmptyCtiLinksResponse, mockTheme, mockProps } from './mock'; +import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; + +jest.mock('../../../common/lib/kibana'); + +jest.mock('../../containers/overview_cti_links'); +const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; +useCtiDashboardLinksMock.mockReturnValue(mockEmptyCtiLinksResponse); + +describe('CtiNoEvents', () => { + const state: State = mockGlobalState; + + const { storage } = createSecuritySolutionStorageMock(); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + + beforeEach(() => { + const myState = cloneDeep(state); + store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + }); + + it('renders warning inner panel', () => { + render( + + + + + + + + ); + + expect(screen.getByTestId('cti-dashboard-links')).toBeInTheDocument(); + expect(screen.getByTestId('cti-inner-panel-warning')).toBeInTheDocument(); + }); + + it('renders event counts as 0', () => { + render( + + + + + + + + ); + + expect(screen.getByText('Showing: 0 indicators')).toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx new file mode 100644 index 00000000000000..fa7ac50c087658 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_no_events.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; +import { ThreatIntelPanelView } from './threat_intel_panel_view'; +import { InnerLinkPanel } from '../link_panel'; +import * as i18n from './translations'; +import { emptyEventCountsByDataset } from '../../containers/overview_cti_links/helpers'; + +const warning = ( + +); + +export const CtiNoEventsComponent = ({ to, from }: { to: string; from: string }) => { + const { buttonHref, listItems, isPluginDisabled } = useCtiDashboardLinks( + emptyEventCountsByDataset, + to, + from + ); + + return ( + + ); +}; + +export const CtiNoEvents = React.memo(CtiNoEventsComponent); +CtiNoEvents.displayName = 'CtiNoEvents'; diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.tsx new file mode 100644 index 00000000000000..a50e3e91ab9e52 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.test.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 React from 'react'; +import { Provider } from 'react-redux'; +import { cloneDeep } from 'lodash/fp'; +import { mount } from 'enzyme'; +import { I18nProvider } from '@kbn/i18n-react'; +import { CtiWithEvents } from './cti_with_events'; +import { ThemeProvider } from 'styled-components'; +import { createStore, State } from '../../../common/store'; +import { + createSecuritySolutionStorageMock, + kibanaObservable, + mockGlobalState, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { mockCtiLinksResponse, mockTheme, mockCtiWithEventsProps } from './mock'; +import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; + +jest.mock('../../../common/lib/kibana'); + +jest.mock('../../containers/overview_cti_links'); +const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; +useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse); + +describe('CtiWithEvents', () => { + const state: State = mockGlobalState; + + const { storage } = createSecuritySolutionStorageMock(); + let store = createStore(state, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + + beforeEach(() => { + const myState = cloneDeep(state); + store = createStore(myState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + }); + + it('renders total event count as expected', () => { + const wrapper = mount( + + + + + + + + ); + + expect(wrapper.find('[data-test-subj="cti-total-event-count"]').text()).toEqual( + `Showing: ${mockCtiWithEventsProps.totalCount} indicators` + ); + }); +}); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx new file mode 100644 index 00000000000000..f78451e205b1ea --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/cti_with_events.tsx @@ -0,0 +1,49 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { isEqual } from 'lodash'; +import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; +import { ThreatIntelPanelView } from './threat_intel_panel_view'; + +export const CtiWithEventsComponent = ({ + eventCountsByDataset, + from, + to, + totalCount, +}: { + eventCountsByDataset: { [key: string]: number }; + from: string; + to: string; + totalCount: number; +}) => { + const { buttonHref, isPluginDisabled, listItems } = useCtiDashboardLinks( + eventCountsByDataset, + to, + from + ); + + return ( + + ); +}; + +CtiWithEventsComponent.displayName = 'CtiWithEvents'; + +export const CtiWithEvents = React.memo( + CtiWithEventsComponent, + (prevProps, nextProps) => + prevProps.to === nextProps.to && + prevProps.from === nextProps.from && + prevProps.totalCount === nextProps.totalCount && + isEqual(prevProps.eventCountsByDataset, nextProps.eventCountsByDataset) +); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx index 71d6d5eb0c5831..dfd9c6c9a7fcd4 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.test.tsx @@ -19,19 +19,19 @@ import { mockGlobalState, SUB_PLUGINS_REDUCER, } from '../../../common/mock'; -import { mockTheme, mockProps, mockTiDataSources, mockCtiLinksResponse } from './mock'; -import { useTiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; -import { useCtiDashboardLinks } from '../../containers/overview_cti_links'; +import { mockTheme, mockProps, mockCtiEventCountsResponse } from './mock'; +import { useRequestEventCounts } from '../../containers/overview_cti_links/use_request_event_counts'; +import { useCtiEventCounts } from '../../containers/overview_cti_links/use_cti_event_counts'; jest.mock('../../../common/lib/kibana'); -jest.mock('../../containers/overview_cti_links/use_ti_data_sources'); -const useTiDataSourcesMock = useTiDataSources as jest.Mock; -useTiDataSourcesMock.mockReturnValue(mockTiDataSources); +jest.mock('../../containers/overview_cti_links/use_request_event_counts'); +const useRequestEventCountsMock = useRequestEventCounts as jest.Mock; +useRequestEventCountsMock.mockReturnValue([true, {}]); -jest.mock('../../containers/overview_cti_links'); -const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; -useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse); +jest.mock('../../containers/overview_cti_links/use_cti_event_counts'); +const useCTIEventCountsMock = useCtiEventCounts as jest.Mock; +useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse); describe('ThreatIntelLinkPanel', () => { const state: State = mockGlobalState; @@ -49,44 +49,40 @@ describe('ThreatIntelLinkPanel', () => { - + ); expect(wrapper.find('[data-test-subj="cti-enabled-module"]').length).toEqual(1); - expect(wrapper.find('[data-test-subj="cti-enable-integrations-button"]').length).toEqual(0); }); - it('renders Enable source buttons when not all integrations installed', () => { + it('renders CtiDisabledModule when Threat Intel module is disabled', () => { const wrapper = mount( - + ); - expect(wrapper.find('[data-test-subj="cti-enable-integrations-button"]').length).not.toBe(0); + + expect(wrapper.find('[data-test-subj="cti-disabled-module"]').length).toEqual(1); }); - it('renders CtiDisabledModule when Threat Intel module is disabled', () => { + it('renders null while Threat Intel module state is loading', () => { const wrapper = mount( - + ); - expect(wrapper.find('[data-test-subj="cti-disabled-module"]').length).toEqual(1); + expect(wrapper.html()).toEqual(''); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx index c89199c2cb0c58..5348c12fb6c8ef 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/index.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { GlobalTimeArgs } from '../../../common/containers/use_global_time'; -import { TiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; import { CtiEnabledModule } from './cti_enabled_module'; import { CtiDisabledModule } from './cti_disabled_module'; @@ -16,26 +15,27 @@ export type ThreatIntelLinkPanelProps = Pick< GlobalTimeArgs, 'from' | 'to' | 'deleteQuery' | 'setQuery' > & { - allIntegrationsInstalled: boolean | undefined; - allTiDataSources: TiDataSources[]; + isThreatIntelModuleEnabled: boolean | undefined; }; const ThreatIntelLinkPanelComponent: React.FC = (props) => { - const { allIntegrationsInstalled, allTiDataSources } = props; - const isThreatIntelModuleEnabled = allTiDataSources.length > 0; - return isThreatIntelModuleEnabled ? ( -
    - -
    - ) : ( -
    - -
    - ); + switch (props.isThreatIntelModuleEnabled) { + case true: + return ( +
    + +
    + ); + case false: + return ( +
    + +
    + ); + case undefined: + default: + return null; + } }; export const ThreatIntelLinkPanel = React.memo(ThreatIntelLinkPanelComponent); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts index c4cf876cbdc7de..1d02acaf65f486 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/mock.ts @@ -15,13 +15,6 @@ export const mockTheme = getMockTheme({ }, }); -export const mockTiDataSources = { - totalCount: 5, - tiDataSources: [ - { dataset: 'ti_abusech', name: 'AbuseCH', count: 5, path: '/dashboard_path_abuseurl' }, - ], -}; - export const mockEventCountsByDataset = { abuseurl: 1, abusemalware: 1, @@ -38,6 +31,8 @@ export const mockCtiEventCountsResponse = { }; export const mockCtiLinksResponse = { + isPluginDisabled: false, + buttonHref: '/button', listItems: [ { title: 'abuseurl', count: 1, path: '/dashboard_path_abuseurl' }, { title: 'abusemalware', count: 2, path: '/dashboard_path_abusemalware' }, @@ -68,10 +63,6 @@ export const mockProps = { from: '2020-01-21T20:49:57.080Z', setQuery: jest.fn(), deleteQuery: jest.fn(), - allIntegrationsInstalled: true, - allTiDataSources: [ - { dataset: 'ti_abusech', name: 'AbuseCH', count: 5, path: '/dashboard_path_abuseurl' }, - ], }; export const mockCtiWithEventsProps = { diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx index 3697d27015fdc8..189f230c02c8de 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/threat_intel_panel_view.tsx @@ -9,14 +9,14 @@ import React, { useMemo } from 'react'; import { EuiButton, EuiTableFieldDataColumnType } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useKibana } from '../../../common/lib/kibana'; import * as i18n from './translations'; import { LinkPanel, InnerLinkPanel, LinkPanelListItem } from '../link_panel'; import { LinkPanelViewProps } from '../link_panel/types'; import { shortenCountIntoString } from '../../../common/utils/shorten_count_into_string'; import { Link } from '../link_panel/link'; -import { ID as CTIEventCountQueryId } from '../../containers/overview_cti_links/use_ti_data_sources'; +import { ID as CTIEventCountQueryId } from '../../containers/overview_cti_links/use_cti_event_counts'; import { LINK_COPY } from '../overview_risky_host_links/translations'; -import { useIntegrationsPageLink } from './use_integrations_page_link'; const columns: Array> = [ { name: 'Name', field: 'title', sortable: true, truncateText: true, width: '100%' }, @@ -39,43 +39,51 @@ const columns: Array> = [ ]; export const ThreatIntelPanelView: React.FC = ({ + buttonHref = '', + isPluginDisabled, isInspectEnabled = true, listItems, splitPanel, totalCount = 0, - allIntegrationsInstalled, }) => { - const integrationsLink = useIntegrationsPageLink(); + const threatIntelDashboardDocLink = `${ + useKibana().services.docLinks.links.filebeat.base + }/load-kibana-dashboards.html`; return ( ( + + {i18n.VIEW_DASHBOARD} + + ), + [buttonHref] + ), columns, dataTestSubj: 'cti-dashboard-links', infoPanel: useMemo( - () => ( - <> - {allIntegrationsInstalled === false ? ( - - {i18n.DANGER_BUTTON} - - } - /> - ) : null} - - ), - [allIntegrationsInstalled, integrationsLink] + () => + isPluginDisabled ? ( + + {i18n.INFO_BUTTON} + + } + /> + ) : null, + [isPluginDisabled, threatIntelDashboardDocLink] ), inspectQueryId: isInspectEnabled ? CTIEventCountQueryId : undefined, listItems, diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts index e112942b097492..4a64462b27ad5a 100644 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts +++ b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/translations.ts @@ -53,14 +53,15 @@ export const DANGER_TITLE = i18n.translate( export const DANGER_BODY = i18n.translate( 'xpack.securitySolution.overview.ctiDashboardEnableThreatIntel', { - defaultMessage: 'You need to enable threat intel sources in order to view data.', + defaultMessage: + 'You need to enable the filebeat threatintel module in order to view data from different sources.', } ); export const DANGER_BUTTON = i18n.translate( - 'xpack.securitySolution.overview.ctiDashboardDangerButton', + 'xpack.securitySolution.overview.ctiDashboardDangerPanelButton', { - defaultMessage: 'Enable sources', + defaultMessage: 'Enable Module', } ); @@ -71,17 +72,3 @@ export const PANEL_TITLE = i18n.translate('xpack.securitySolution.overview.ctiDa export const VIEW_DASHBOARD = i18n.translate('xpack.securitySolution.overview.ctiViewDasboard', { defaultMessage: 'View dashboard', }); - -export const SOME_MODULES_DISABLE_TITLE = i18n.translate( - 'xpack.securitySolution.overview.ctiDashboardSomeModulesDisabledTItle', - { - defaultMessage: 'Some threat intel sources are disabled', - } -); - -export const OTHER_DATA_SOURCE_TITLE = i18n.translate( - 'xpack.securitySolution.overview.ctiDashboardOtherDatasourceTitle', - { - defaultMessage: 'Others', - } -); diff --git a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx b/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx deleted file mode 100644 index de710c2f1b17cb..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/components/overview_cti_links/use_integrations_page_link.tsx +++ /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; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useBasePath } from '../../../common/lib/kibana'; - -export const useIntegrationsPageLink = () => - `${useBasePath()}/app/integrations/browse?q=threat%20intelligence`; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts deleted file mode 100644 index ad737ac410e3b1..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/api.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { KibanaServices } from '../../../common/lib/kibana'; -import { EPM_API_ROUTES } from '../../../../../fleet/common'; - -export interface IntegrationResponse { - id: string; - status: string; - savedObject?: { - attributes?: { - installed_kibana: Array<{ - type: string; - id: string; - }>; - }; - }; -} - -export const fetchFleetIntegrations = () => - KibanaServices.get().http.fetch<{ - response: IntegrationResponse[]; - }>(EPM_API_ROUTES.LIST_PATTERN, { - method: 'GET', - }); diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts new file mode 100644 index 00000000000000..9ac61cc9487ee0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/helpers.ts @@ -0,0 +1,60 @@ +/* + * Copyright 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 { SavedObjectAttributes } from '@kbn/securitysolution-io-ts-alerting-types'; +import { CTI_DATASET_KEY_MAP } from '../../../../common/cti/constants'; +import { LinkPanelListItem } from '../../components/link_panel'; +import { EventCounts } from '../../components/link_panel/helpers'; + +export const ctiTitles = Object.keys(CTI_DATASET_KEY_MAP) as string[]; + +export const EMPTY_LIST_ITEMS: LinkPanelListItem[] = ctiTitles.map((title) => ({ + title, + count: 0, + path: '', +})); + +const TAG_REQUEST_BODY_SEARCH = 'threat intel'; +export const TAG_REQUEST_BODY = { + type: 'tag', + search: TAG_REQUEST_BODY_SEARCH, + searchFields: ['name'], +}; + +export const DASHBOARD_SO_TITLE_PREFIX = '[Filebeat Threat Intel] '; +export const OVERVIEW_DASHBOARD_LINK_TITLE = 'Overview'; + +export const getCtiListItemsWithoutLinks = (eventCounts: EventCounts): LinkPanelListItem[] => { + return EMPTY_LIST_ITEMS.map((item) => ({ + ...item, + count: eventCounts[CTI_DATASET_KEY_MAP[item.title]] ?? 0, + })); +}; + +export const isOverviewItem = (item: { path?: string; title?: string }) => + item.title === OVERVIEW_DASHBOARD_LINK_TITLE; + +export const createLinkFromDashboardSO = ( + dashboardSO: { attributes?: SavedObjectAttributes }, + eventCountsByDataset: EventCounts, + path: string +) => { + const title = + typeof dashboardSO.attributes?.title === 'string' + ? dashboardSO.attributes.title.replace(DASHBOARD_SO_TITLE_PREFIX, '') + : undefined; + return { + title, + count: typeof title === 'string' ? eventCountsByDataset[CTI_DATASET_KEY_MAP[title]] : undefined, + path, + }; +}; + +export const emptyEventCountsByDataset = Object.values(CTI_DATASET_KEY_MAP).reduce((acc, id) => { + acc[id] = 0; + return acc; +}, {} as { [key: string]: number }); diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx index b1310e363eef03..a546d20e495838 100644 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx @@ -6,30 +6,35 @@ */ import { useState, useEffect, useCallback } from 'react'; import { SavedObjectAttributes } from '@kbn/securitysolution-io-ts-alerting-types'; -import { TiDataSources } from '../../containers/overview_cti_links/use_ti_data_sources'; -import { LinkPanelListItem } from '../../components/link_panel'; import { useKibana } from '../../../common/lib/kibana'; +import { + TAG_REQUEST_BODY, + createLinkFromDashboardSO, + getCtiListItemsWithoutLinks, + isOverviewItem, + EMPTY_LIST_ITEMS, +} from './helpers'; +import { LinkPanelListItem, isLinkPanelListItem } from '../../components/link_panel'; -const TAG_REQUEST_BODY_SEARCH = 'threat intel'; -export const TAG_REQUEST_BODY = { - type: 'tag', - search: TAG_REQUEST_BODY_SEARCH, - searchFields: ['name'], -}; - -export const useCtiDashboardLinks = ({ - to, - from, - tiDataSources = [], -}: { - to: string; - from: string; - tiDataSources?: TiDataSources[]; -}) => { - const [installedDashboardIds, setInstalledDashboardIds] = useState([]); - const dashboardLocator = useKibana().services.dashboard?.locator; +export const useCtiDashboardLinks = ( + eventCountsByDataset: { [key: string]: number }, + to: string, + from: string +) => { + const createDashboardUrl = useKibana().services.dashboard?.dashboardUrlGenerator?.createUrl; const savedObjectsClient = useKibana().services.savedObjects.client; + const [buttonHref, setButtonHref] = useState(); + const [listItems, setListItems] = useState(EMPTY_LIST_ITEMS); + + const [isPluginDisabled, setIsDashboardPluginDisabled] = useState(false); + const handleDisabledPlugin = useCallback(() => { + if (!isPluginDisabled) { + setIsDashboardPluginDisabled(true); + } + setListItems(getCtiListItemsWithoutLinks(eventCountsByDataset)); + }, [setIsDashboardPluginDisabled, setListItems, eventCountsByDataset, isPluginDisabled]); + const handleTagsReceived = useCallback( (TagsSO?) => { if (TagsSO?.savedObjects?.length) { @@ -44,7 +49,9 @@ export const useCtiDashboardLinks = ({ ); useEffect(() => { - if (savedObjectsClient) { + if (!createDashboardUrl || !savedObjectsClient) { + handleDisabledPlugin(); + } else { savedObjectsClient .find(TAG_REQUEST_BODY) .then(handleTagsReceived) @@ -56,40 +63,53 @@ export const useCtiDashboardLinks = ({ }>; }) => { if (DashboardsSO?.savedObjects?.length) { - setInstalledDashboardIds( - DashboardsSO.savedObjects.map((SO) => SO.id ?? '').filter(Boolean) + const dashboardUrls = await Promise.all( + DashboardsSO.savedObjects.map((SO) => + createDashboardUrl({ + dashboardId: SO.id, + timeRange: { + to, + from, + }, + }) + ) ); + const items = DashboardsSO.savedObjects + ?.reduce((acc: LinkPanelListItem[], dashboardSO, i) => { + const item = createLinkFromDashboardSO( + dashboardSO, + eventCountsByDataset, + dashboardUrls[i] + ); + if (isOverviewItem(item)) { + setButtonHref(item.path); + } else if (isLinkPanelListItem(item)) { + acc.push(item); + } + return acc; + }, []) + .sort((a, b) => (a.title > b.title ? 1 : -1)); + setListItems(items); + } else { + handleDisabledPlugin(); } } ); } - }, [handleTagsReceived, savedObjectsClient]); - - const listItems = tiDataSources.map((tiDataSource) => { - const listItem: LinkPanelListItem = { - title: tiDataSource.name, - count: tiDataSource.count, - path: '', - }; - - if ( - tiDataSource.dashboardId && - installedDashboardIds.includes(tiDataSource.dashboardId) && - dashboardLocator - ) { - listItem.path = dashboardLocator.getRedirectUrl({ - dashboardId: tiDataSource.dashboardId, - timeRange: { - to, - from, - }, - }); - } - - return listItem; - }); + }, [ + createDashboardUrl, + eventCountsByDataset, + from, + handleDisabledPlugin, + handleTagsReceived, + isPluginDisabled, + savedObjectsClient, + to, + ]); return { + buttonHref, + isPluginDisabled, listItems, }; }; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts deleted file mode 100644 index 5686be269121a3..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_all_ti_data_sources.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { useMemo } from 'react'; -import { useTiDataSources } from './use_ti_data_sources'; - -export const useAllTiDataSources = () => { - const { to, from } = useMemo( - () => ({ - to: new Date().toISOString(), - from: new Date(0).toISOString(), - }), - [] - ); - - const { tiDataSources, isInitiallyLoaded } = useTiDataSources({ to, from }); - - return { tiDataSources, isInitiallyLoaded }; -}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts new file mode 100644 index 00000000000000..c8076ab6a4484e --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_cti_event_counts.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useState, useMemo } from 'react'; +import { useRequestEventCounts } from './use_request_event_counts'; +import { emptyEventCountsByDataset } from './helpers'; +import { CtiEnabledModuleProps } from '../../components/overview_cti_links/cti_enabled_module'; + +export const ID = 'ctiEventCountQuery'; + +export const useCtiEventCounts = ({ deleteQuery, from, setQuery, to }: CtiEnabledModuleProps) => { + const [isInitialLoading, setIsInitialLoading] = useState(true); + + const [loading, { data, inspect, totalCount, refetch }] = useRequestEventCounts(to, from); + + const eventCountsByDataset = useMemo( + () => + data.reduce( + (acc, item) => { + if (item.y && item.g) { + const id = item.g; + acc[id] += item.y; + } + return acc; + }, + { ...emptyEventCountsByDataset } as { [key: string]: number } + ), + [data] + ); + + useEffect(() => { + if (isInitialLoading && data) { + setIsInitialLoading(false); + } + }, [isInitialLoading, data]); + + useEffect(() => { + if (!loading && !isInitialLoading) { + setQuery({ id: ID, inspect, loading, refetch }); + } + }, [setQuery, inspect, loading, refetch, isInitialLoading, setIsInitialLoading]); + + useEffect(() => { + return () => { + if (deleteQuery) { + deleteQuery({ id: ID }); + } + }; + }, [deleteQuery]); + + useEffect(() => { + refetch(); + }, [to, from, refetch]); + + return { + eventCountsByDataset, + loading, + totalCount, + }; +}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts new file mode 100644 index 00000000000000..0dc0e8a3fe1f28 --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_is_threat_intel_module_enabled.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { useState, useEffect, useMemo } from 'react'; +import { useRequestEventCounts } from './use_request_event_counts'; + +export const useIsThreatIntelModuleEnabled = () => { + const [isThreatIntelModuleEnabled, setIsThreatIntelModuleEnabled] = useState< + boolean | undefined + >(); + + const { to, from } = useMemo( + () => ({ + to: new Date().toISOString(), + from: new Date(0).toISOString(), + }), + [] + ); + + const [, { totalCount }] = useRequestEventCounts(to, from); + + useEffect(() => { + if (totalCount !== -1) { + setIsThreatIntelModuleEnabled(totalCount > 0); + } + }, [totalCount]); + + return isThreatIntelModuleEnabled; +}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts new file mode 100644 index 00000000000000..a1bf4d9d35f65c --- /dev/null +++ b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_request_event_counts.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { convertToBuildEsQuery } from '../../../common/lib/keury'; +import { getEsQueryConfig } from '../../../../../../../src/plugins/data/common'; +import { MatrixHistogramType } from '../../../../common/search_strategy'; +import { EVENT_DATASET } from '../../../../common/cti/constants'; +import { useMatrixHistogram } from '../../../common/containers/matrix_histogram'; +import { useKibana } from '../../../common/lib/kibana'; +import { DEFAULT_THREAT_INDEX_KEY } from '../../../../common/constants'; + +export const useRequestEventCounts = (to: string, from: string) => { + const { uiSettings } = useKibana().services; + const defaultThreatIndices = uiSettings.get(DEFAULT_THREAT_INDEX_KEY); + + const [filterQuery] = convertToBuildEsQuery({ + config: getEsQueryConfig(uiSettings), + indexPattern: { + fields: [ + { + name: 'event.kind', + type: 'string', + }, + ], + title: defaultThreatIndices.toString(), + }, + queries: [{ query: 'event.type:indicator', language: 'kuery' }], + filters: [], + }); + + const matrixHistogramRequest = useMemo(() => { + return { + endDate: to, + errorMessage: i18n.translate('xpack.securitySolution.overview.errorFetchingEvents', { + defaultMessage: 'Error fetching events', + }), + filterQuery, + histogramType: MatrixHistogramType.events, + indexNames: defaultThreatIndices, + stackByField: EVENT_DATASET, + startDate: from, + size: 0, + }; + }, [to, from, filterQuery, defaultThreatIndices]); + + const results = useMatrixHistogram(matrixHistogramRequest); + + return results; +}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts deleted file mode 100644 index 865af2266f2e0a..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_data_sources.ts +++ /dev/null @@ -1,174 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { Observable } from 'rxjs'; -import { filter } from 'rxjs/operators'; -import { useEffect, useState } from 'react'; -import { useObservable, withOptionalSignal } from '@kbn/securitysolution-hook-utils'; -import { useKibana } from '../../../common/lib/kibana'; -import { - DataPublicPluginStart, - isCompleteResponse, - isErrorResponse, -} from '../../../../../../../src/plugins/data/public'; -import { - Bucket, - CtiQueries, - CtiDataSourceStrategyResponse, - CtiDataSourceRequestOptions, -} from '../../../../common'; -import { DEFAULT_THREAT_INDEX_KEY } from '../../../../common/constants'; -import { GlobalTimeArgs } from '../../../common/containers/use_global_time'; -import { OTHER_DATA_SOURCE_TITLE } from '../../components/overview_cti_links/translations'; -import { OTHER_TI_DATASET_KEY } from '../../../../common/cti/constants'; - -type GetThreatIntelSourcProps = CtiDataSourceRequestOptions & { - data: DataPublicPluginStart; - signal: AbortSignal; -}; -export const ID = 'ctiEventCountQuery'; - -export const getTiDataSources = ({ - data, - defaultIndex, - timerange, - signal, -}: GetThreatIntelSourcProps): Observable => - data.search.search( - { - defaultIndex, - factoryQueryType: CtiQueries.dataSource, - timerange, - }, - { - strategy: 'securitySolutionSearchStrategy', - abortSignal: signal, - } - ); - -export const getTiDataSourcesComplete = ( - props: GetThreatIntelSourcProps -): Observable => { - return getTiDataSources(props).pipe( - filter((response) => { - return isErrorResponse(response) || isCompleteResponse(response); - }) - ); -}; - -const getTiDataSourcesWithOptionalSignal = withOptionalSignal(getTiDataSourcesComplete); - -export const useTiDataSourcesComplete = () => useObservable(getTiDataSourcesWithOptionalSignal); - -export interface TiDataSources { - dataset: string; - name: string; - count: number; - dashboardId?: string; -} -interface TiDataSourcesProps extends Partial { - allTiDataSources?: TiDataSources[]; -} - -export const useTiDataSources = ({ - to, - from, - allTiDataSources, - setQuery, - deleteQuery, -}: TiDataSourcesProps) => { - const [tiDataSources, setTiDataSources] = useState([]); - const [isInitiallyLoaded, setIsInitiallyLoaded] = useState(false); - const { data, uiSettings } = useKibana().services; - const defaultThreatIndices = uiSettings.get(DEFAULT_THREAT_INDEX_KEY); - const { result, start, loading } = useTiDataSourcesComplete(); - - useEffect(() => { - start({ - data, - timerange: to && from ? { to, from, interval: '' } : undefined, - defaultIndex: defaultThreatIndices, - }); - }, [to, from, start, data, defaultThreatIndices]); - - useEffect(() => { - if (!loading && result?.rawResponse && result?.inspect && setQuery) { - setQuery({ - id: ID, - inspect: { - dsl: result?.inspect?.dsl ?? [], - response: [JSON.stringify(result.rawResponse, null, 2)], - }, - loading, - refetch: () => {}, - }); - } - }, [setQuery, loading, result]); - - useEffect(() => { - return () => { - if (deleteQuery) { - deleteQuery({ id: ID }); - } - }; - }, [deleteQuery]); - - useEffect(() => { - if (result && !isInitiallyLoaded) { - setIsInitiallyLoaded(true); - } - }, [isInitiallyLoaded, result]); - - useEffect(() => { - if (!loading && result) { - const datasets = result?.rawResponse?.aggregations?.dataset?.buckets ?? []; - const getChildAggregationValue = (aggregation?: Bucket) => aggregation?.buckets?.[0]?.key; - - const integrationMap = datasets.reduce((acc: Record, dataset) => { - const datasetName = getChildAggregationValue(dataset?.name); - if (datasetName) { - return { - ...acc, - [dataset.key]: { - dataset: dataset?.key, - name: datasetName, - dashboardId: getChildAggregationValue(dataset?.dashboard), - count: dataset?.doc_count, - }, - }; - } else { - const otherTiDatasetKey = OTHER_TI_DATASET_KEY; - const otherDatasetCount = acc[otherTiDatasetKey]?.count ?? 0; - return { - ...acc, - [otherTiDatasetKey]: { - dataset: otherTiDatasetKey, - name: OTHER_DATA_SOURCE_TITLE, - count: otherDatasetCount + (dataset?.doc_count ?? 0), - }, - }; - } - }, {}); - - if (Array.isArray(allTiDataSources)) { - allTiDataSources.forEach((integration) => { - if (!integrationMap[integration.dataset]) { - integrationMap[integration.dataset] = { - ...integration, - count: 0, - }; - } - }); - } - - setTiDataSources(Object.values(integrationMap)); - } - }, [result, loading, allTiDataSources]); - - const totalCount = tiDataSources.reduce((acc, val) => acc + val.count, 0); - - return { tiDataSources, totalCount, isInitiallyLoaded }; -}; diff --git a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts b/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts deleted file mode 100644 index 24bdc191b3d66d..00000000000000 --- a/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/use_ti_integrations.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useEffect, useState } from 'react'; - -import { installationStatuses } from '../../../../../fleet/common'; -import { TI_INTEGRATION_PREFIX } from '../../../../common/cti/constants'; -import { fetchFleetIntegrations, IntegrationResponse } from './api'; - -export interface Integration { - id: string; - dashboardIds: string[]; -} - -interface TiIntegrationStatus { - allIntegrationsInstalled: boolean; -} - -export const useTiIntegrations = () => { - const [tiIntegrationsStatus, setTiIntegrationsStatus] = useState( - null - ); - - useEffect(() => { - const getPackages = async () => { - try { - const { response: integrations } = await fetchFleetIntegrations(); - const tiIntegrations = integrations.filter((integration: IntegrationResponse) => - integration.id.startsWith(TI_INTEGRATION_PREFIX) - ); - - const allIntegrationsInstalled = tiIntegrations.every( - (integration: IntegrationResponse) => - integration.status === installationStatuses.Installed - ); - - setTiIntegrationsStatus({ - allIntegrationsInstalled, - }); - } catch (e) { - setTiIntegrationsStatus({ - allIntegrationsInstalled: false, - }); - } - }; - - getPackages(); - }, []); - - return tiIntegrationsStatus; -}; diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index b38072464c6530..2539490be16fb5 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -23,9 +23,12 @@ import { } from '../../common/components/user_privileges'; import { useSourcererDataView } from '../../common/containers/sourcerer'; import { useFetchIndex } from '../../common/containers/source'; -import { useAllTiDataSources } from '../containers/overview_cti_links/use_all_ti_data_sources'; -import { useTiIntegrations } from '../containers/overview_cti_links/use_ti_integrations'; -import { mockCtiLinksResponse, mockTiDataSources } from '../components/overview_cti_links/mock'; +import { useIsThreatIntelModuleEnabled } from '../containers/overview_cti_links/use_is_threat_intel_module_enabled'; +import { useCtiEventCounts } from '../containers/overview_cti_links/use_cti_event_counts'; +import { + mockCtiEventCountsResponse, + mockCtiLinksResponse, +} from '../components/overview_cti_links/mock'; import { useCtiDashboardLinks } from '../containers/overview_cti_links'; import { EndpointPrivileges } from '../../common/components/user_privileges/endpoint/use_endpoint_privileges'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; @@ -70,17 +73,18 @@ jest.mock('../../common/components/user_privileges', () => { jest.mock('../../common/containers/local_storage/use_messages_storage'); jest.mock('../containers/overview_cti_links'); +jest.mock('../containers/overview_cti_links/use_cti_event_counts'); const useCtiDashboardLinksMock = useCtiDashboardLinks as jest.Mock; useCtiDashboardLinksMock.mockReturnValue(mockCtiLinksResponse); -jest.mock('../containers/overview_cti_links/use_all_ti_data_sources'); -const useAllTiDataSourcesMock = useAllTiDataSources as jest.Mock; -useAllTiDataSourcesMock.mockReturnValue(mockTiDataSources); +jest.mock('../containers/overview_cti_links/use_cti_event_counts'); +const useCTIEventCountsMock = useCtiEventCounts as jest.Mock; +useCTIEventCountsMock.mockReturnValue(mockCtiEventCountsResponse); -jest.mock('../containers/overview_cti_links/use_ti_integrations'); -const useTiIntegrationsMock = useTiIntegrations as jest.Mock; -useTiIntegrationsMock.mockReturnValue({}); +jest.mock('../containers/overview_cti_links/use_is_threat_intel_module_enabled'); +const useIsThreatIntelModuleEnabledMock = useIsThreatIntelModuleEnabled as jest.Mock; +useIsThreatIntelModuleEnabledMock.mockReturnValue(true); jest.mock('../containers/overview_risky_host_links/use_hosts_risk_score'); const useHostsRiskScoreMock = useHostsRiskScore as jest.Mock; @@ -299,8 +303,8 @@ describe('Overview', () => { }); describe('Threat Intel Dashboard Links', () => { - it('invokes useAllTiDataSourcesMock hook only once', () => { - useAllTiDataSourcesMock.mockClear(); + it('invokes useIsThreatIntelModuleEnabled hook only once', () => { + useIsThreatIntelModuleEnabledMock.mockClear(); mount( @@ -308,7 +312,7 @@ describe('Overview', () => { ); - expect(useAllTiDataSourcesMock).toHaveBeenCalledTimes(1); + expect(useIsThreatIntelModuleEnabledMock).toHaveBeenCalledTimes(1); }); }); }); diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx index 1df49fed073589..67ee6c55ac06f8 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.tsx @@ -30,8 +30,7 @@ import { ENDPOINT_METADATA_INDEX } from '../../../common/constants'; import { useSourcererDataView } from '../../common/containers/sourcerer'; import { useDeepEqualSelector } from '../../common/hooks/use_selector'; import { ThreatIntelLinkPanel } from '../components/overview_cti_links'; -import { useAllTiDataSources } from '../containers/overview_cti_links/use_all_ti_data_sources'; -import { useTiIntegrations } from '../containers/overview_cti_links/use_ti_integrations'; +import { useIsThreatIntelModuleEnabled } from '../containers/overview_cti_links/use_is_threat_intel_module_enabled'; import { useUserPrivileges } from '../../common/components/user_privileges'; import { RiskyHostLinks } from '../components/overview_risky_host_links'; import { useAlertsPrivileges } from '../../detections/containers/detection_engine/alerts/use_alerts_privileges'; @@ -76,10 +75,7 @@ const OverviewComponent = () => { endpointPrivileges: { canAccessFleet }, } = useUserPrivileges(); const { hasIndexRead, hasKibanaREAD } = useAlertsPrivileges(); - const { tiDataSources: allTiDataSources, isInitiallyLoaded: allTiDataSourcesLoaded } = - useAllTiDataSources(); - const tiIntegrationStatus = useTiIntegrations(); - const isTiLoaded = tiIntegrationStatus && allTiDataSourcesLoaded; + const isThreatIntelModuleEnabled = useIsThreatIntelModuleEnabled(); const riskyHostsEnabled = useIsExperimentalFeatureEnabled('riskyHostsEnabled'); @@ -154,16 +150,13 @@ const OverviewComponent = () => { - {isTiLoaded && ( - - )} + {riskyHostsEnabled && ( diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts index e43af97e84af05..5857a0417239c8 100644 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts +++ b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/index.ts @@ -9,9 +9,7 @@ import type { FactoryQueryTypes } from '../../../../../common/search_strategy/se import { CtiQueries } from '../../../../../common/search_strategy/security_solution/cti'; import type { SecuritySolutionFactory } from '../types'; import { eventEnrichment } from './event_enrichment'; -import { dataSource } from './threat_intel_source'; export const ctiFactoryTypes: Record> = { [CtiQueries.eventEnrichment]: eventEnrichment, - [CtiQueries.dataSource]: dataSource, }; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts deleted file mode 100644 index 0951503b04cd41..00000000000000 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/index.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { SecuritySolutionFactory } from '../../types'; -import { - CtiDataSourceStrategyResponse, - CtiQueries, - CtiDataSourceRequestOptions, -} from '../../../../../../common'; -import { IEsSearchResponse } from '../../../../../../../../../src/plugins/data/common'; -import { inspectStringifyObject } from '../../../../../utils/build_query'; -import { buildTiDataSourceQuery } from './query.threat_intel_source.dsl'; - -export const dataSource: SecuritySolutionFactory = { - buildDsl: (options: CtiDataSourceRequestOptions) => buildTiDataSourceQuery(options), - parse: async ( - options: CtiDataSourceRequestOptions, - response: IEsSearchResponse - ): Promise => { - const inspect = { - dsl: [inspectStringifyObject(buildTiDataSourceQuery(options))], - }; - - return { - ...response, - inspect, - }; - }, -}; diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts deleted file mode 100644 index 832006930a326f..00000000000000 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.test.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { buildTiDataSourceQuery } from './query.threat_intel_source.dsl'; -import { CtiQueries } from '../../../../../../common'; - -export const mockOptions = { - defaultIndex: ['logs-ti_*', 'filebeat-8*'], - docValueFields: [], - factoryQueryType: CtiQueries.dataSource, - filterQuery: '', - timerange: { - interval: '12h', - from: '2020-09-06T15:23:52.757Z', - to: '2020-09-07T15:23:52.757Z', - }, -}; - -export const expectedDsl = { - body: { - aggs: { - dataset: { - terms: { - field: 'event.dataset', - }, - aggs: { - name: { - terms: { - field: 'threat.feed.name', - }, - }, - dashboard: { - terms: { - field: 'threat.feed.dashboard_id', - }, - }, - }, - }, - }, - query: { - bool: { - filter: [ - { - range: { - '@timestamp': { - gte: '2020-09-06T15:23:52.757Z', - lte: '2020-09-07T15:23:52.757Z', - format: 'strict_date_optional_time', - }, - }, - }, - ], - }, - }, - }, - ignore_unavailable: true, - index: ['logs-ti_*', 'filebeat-8*'], - size: 0, - track_total_hits: true, - allow_no_indices: true, -}; - -describe('buildbuildTiDataSourceQueryQuery', () => { - test('build query from options correctly', () => { - expect(buildTiDataSourceQuery(mockOptions)).toEqual(expectedDsl); - }); -}); diff --git a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts b/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts deleted file mode 100644 index 08463146a683ee..00000000000000 --- a/x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/cti/threat_intel_source/query.threat_intel_source.dsl.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { CtiDataSourceRequestOptions } from '../../../../../../common'; - -export const buildTiDataSourceQuery = ({ - timerange, - defaultIndex, -}: CtiDataSourceRequestOptions) => { - const filter = []; - - if (timerange) { - filter.push({ - range: { - '@timestamp': { - gte: timerange.from, - lte: timerange.to, - format: 'strict_date_optional_time', - }, - }, - }); - } - - const dslQuery = { - size: 0, - index: defaultIndex, - allow_no_indices: true, - ignore_unavailable: true, - track_total_hits: true, - body: { - aggs: { - dataset: { - terms: { field: 'event.dataset' }, - aggs: { - name: { - terms: { field: 'threat.feed.name' }, - }, - dashboard: { - terms: { - field: 'threat.feed.dashboard_id', - }, - }, - }, - }, - }, - query: { - bool: { - filter, - }, - }, - }, - }; - - return dslQuery; -}; diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 58d04788e98eb3..76d3f07facf05b 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -23438,6 +23438,7 @@ "xpack.securitySolution.overview.auditBeatProcessTitle": "プロセス", "xpack.securitySolution.overview.auditBeatSocketTitle": "ソケット", "xpack.securitySolution.overview.auditBeatUserTitle": "ユーザー", + "xpack.securitySolution.overview.ctiDashboardDangerPanelButton": "モジュールを有効にする", "xpack.securitySolution.overview.ctiDashboardDangerPanelTitle": "表示する脅威インテリジェンスデータがありません", "xpack.securitySolution.overview.ctiDashboardEnableThreatIntel": "別のソースからデータを表示するには、filebeat脅威インテリジェンスモジュールを有効にする必要があります。", "xpack.securitySolution.overview.ctiDashboardInfoPanelBody": "このガイドに従い、ダッシュボードを有効にして、ビジュアライゼーションにソースを表示できるようにしてください。", @@ -23459,6 +23460,7 @@ "xpack.securitySolution.overview.endpointNotice.message": "脅威防御、検出、深いセキュリティデータの可視化を実現し、ホストを保護します。", "xpack.securitySolution.overview.endpointNotice.title": "Endpoint Security", "xpack.securitySolution.overview.endpointNotice.tryButton": "Endpoint Securityを試す", + "xpack.securitySolution.overview.errorFetchingEvents": "イベントの取得エラー", "xpack.securitySolution.overview.eventsTitle": "イベント数", "xpack.securitySolution.overview.filebeatCiscoTitle": "Cisco", "xpack.securitySolution.overview.filebeatNetflowTitle": "Netflow", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index da71c1796066f6..01997e32f243e6 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -23828,6 +23828,7 @@ "xpack.securitySolution.overview.auditBeatProcessTitle": "进程", "xpack.securitySolution.overview.auditBeatSocketTitle": "套接字", "xpack.securitySolution.overview.auditBeatUserTitle": "用户", + "xpack.securitySolution.overview.ctiDashboardDangerPanelButton": "启用模块", "xpack.securitySolution.overview.ctiDashboardDangerPanelTitle": "没有可显示的威胁情报数据", "xpack.securitySolution.overview.ctiDashboardEnableThreatIntel": "您需要启用 filebeat threatintel 模块,以便查看不同源的数据。", "xpack.securitySolution.overview.ctiDashboardInfoPanelBody": "按照此指南启用您的仪表板,以便可以在可视化中查看您的源。", @@ -23850,6 +23851,7 @@ "xpack.securitySolution.overview.endpointNotice.message": "使用威胁防御、检测和深度安全数据可见性功能保护您的主机。", "xpack.securitySolution.overview.endpointNotice.title": "Endpoint Security", "xpack.securitySolution.overview.endpointNotice.tryButton": "试用 Endpoint Security", + "xpack.securitySolution.overview.errorFetchingEvents": "提取事件时出错", "xpack.securitySolution.overview.eventsTitle": "事件计数", "xpack.securitySolution.overview.filebeatCiscoTitle": "Cisco", "xpack.securitySolution.overview.filebeatNetflowTitle": "NetFlow", diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json index ec5e2aae6e2e2d..a2e0c2d2921dc8 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/data.json @@ -31,9 +31,6 @@ } }, "type": "file" - }, - "feed": { - "name": "AbuseCH malware" } }, "abusemalware": { @@ -75,4 +72,4 @@ } } } -} \ No newline at end of file +} diff --git a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json index bc5f6e3db91690..8840cd4bee0dd8 100644 --- a/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json +++ b/x-pack/test/security_solution_cypress/es_archives/threat_indicator/mappings.json @@ -796,14 +796,6 @@ "type": "keyword" } } - }, - "feed":{ - "properties": { - "name": { - "ignore_above": 1024, - "type": "keyword" - } - } } } } From 2c4b1ff37130af73093f304bc83c556150cb2ebe Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 3 Dec 2021 15:59:02 +0000 Subject: [PATCH 102/126] fix(NA): @kbn/utils build on windows native environment (#120317) * fix(NA): @kbn/utils build on windows native environment * chore(NA): remove circular dep from @kbn/utils --- packages/kbn-utils/src/path/index.test.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/kbn-utils/src/path/index.test.ts b/packages/kbn-utils/src/path/index.test.ts index 307d47af9ac50f..e4c80a0783b5d8 100644 --- a/packages/kbn-utils/src/path/index.test.ts +++ b/packages/kbn-utils/src/path/index.test.ts @@ -7,10 +7,17 @@ */ import { accessSync, constants } from 'fs'; -import { createAbsolutePathSerializer } from '@kbn/dev-utils'; import { getConfigPath, getDataPath, getLogsPath, getConfigDirectory } from './'; - -expect.addSnapshotSerializer(createAbsolutePathSerializer()); +import { REPO_ROOT } from '../repo_root'; + +expect.addSnapshotSerializer( + ((rootPath: string = REPO_ROOT, replacement = '') => { + return { + test: (value: any) => typeof value === 'string' && value.startsWith(rootPath), + serialize: (value: string) => value.replace(rootPath, replacement).replace(/\\/g, '/'), + }; + })() +); describe('Default path finder', () => { it('should expose a path to the config directory', () => { From 7ba6e7f68811aed560cf1211e384dc2d57c0c43c Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Fri, 3 Dec 2021 16:11:57 +0000 Subject: [PATCH 103/126] [ML] Fixing job selector time range charts (#120343) --- .../public/application/components/job_selector/job_selector.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx index f67a9df4a4a856..4b0d8cdc550946 100644 --- a/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/job_selector/job_selector.tsx @@ -10,6 +10,8 @@ import React, { useState, useEffect, useCallback } from 'react'; import { EuiButtonEmpty, EuiFlexItem, EuiFlexGroup, EuiFlyout } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import './_index.scss'; + import { Dictionary } from '../../../../common/types/common'; import { useUrlState } from '../../util/url_state'; // @ts-ignore From 63bbc45ec24a7441b4cac4441a75147e10cee6a8 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:16:52 -0500 Subject: [PATCH 104/126] [Security Solution][Endpoint] Remove checks for `superuser` role and instead look at fleet kibana privileges (#120027) * Change endpoint privileges to use fleet authz instead of checking for superuser * split user privileges react context component from hook in order to better support mocking * remove `isPlatinumPlus` from endpoint privileges and refactor to use `useUserPrivileges()` hook instead * add `endpointAuthz` to the Server API route handler context * moved fleet's `createFleetAuthzMock` to `fleet/common` --- x-pack/plugins/fleet/common/index.ts | 1 + x-pack/plugins/fleet/common/mocks.ts | 27 ++++- x-pack/plugins/fleet/server/mocks/index.ts | 30 +----- .../server/routes/setup/handlers.test.ts | 4 +- .../endpoint/service/authz/authz.test.ts | 75 +++++++++++++ .../common/endpoint/service/authz/authz.ts | 43 ++++++++ .../common/endpoint/service/authz/index.ts | 9 ++ .../common/endpoint/service/authz/mocks.ts | 29 +++++ .../common/endpoint/types/authz.ts | 27 +++++ .../common/endpoint/types/index.ts | 2 + .../security_solution/public/app/app.tsx | 2 +- .../user_privileges/__mocks__/index.ts | 18 ++++ .../user_privileges/endpoint/index.ts | 2 +- .../user_privileges/endpoint/mocks.ts | 24 ++--- .../endpoint/use_endpoint_privileges.test.ts | 100 ++++-------------- .../endpoint/use_endpoint_privileges.ts | 79 ++++++-------- .../user_privileges/endpoint/utils.ts | 9 +- .../components/user_privileges/index.ts | 13 +++ ...{index.tsx => user_privileges_context.tsx} | 22 ++-- .../public/common/mock/test_providers.tsx | 2 +- .../components/user_info/index.test.tsx | 2 +- .../search_exceptions.test.tsx | 42 ++++---- .../search_exceptions/search_exceptions.tsx | 6 +- .../host_isolation_exceptions_list.test.tsx | 24 ++++- .../view/host_isolation_exceptions_list.tsx | 4 +- .../policy_trusted_apps_empty_unassigned.tsx | 6 +- .../policy_trusted_apps_layout.test.tsx | 4 +- .../layout/policy_trusted_apps_layout.tsx | 10 +- .../list/policy_trusted_apps_list.test.tsx | 28 ++--- .../list/policy_trusted_apps_list.tsx | 15 ++- .../public/overview/pages/overview.test.tsx | 8 +- .../server/endpoint/mocks.ts | 7 +- .../endpoint/routes/actions/isolation.test.ts | 46 +++++--- .../endpoint/routes/actions/isolation.ts | 20 ++-- .../routes/__mocks__/request_context.ts | 2 + .../server/request_context_factory.ts | 37 ++++++- .../plugins/security_solution/server/types.ts | 2 + 37 files changed, 490 insertions(+), 291 deletions(-) create mode 100644 x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts create mode 100644 x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts create mode 100644 x-pack/plugins/security_solution/common/endpoint/service/authz/index.ts create mode 100644 x-pack/plugins/security_solution/common/endpoint/service/authz/mocks.ts create mode 100644 x-pack/plugins/security_solution/common/endpoint/types/authz.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/user_privileges/__mocks__/index.ts create mode 100644 x-pack/plugins/security_solution/public/common/components/user_privileges/index.ts rename x-pack/plugins/security_solution/public/common/components/user_privileges/{index.tsx => user_privileges_context.tsx} (81%) diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index 611e150323855a..46a8e2d01fc967 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -13,3 +13,4 @@ export * from './services'; export * from './types'; export type { FleetAuthz } from './authz'; export { calculateAuthz } from './authz'; +export { createFleetAuthzMock } from './mocks'; diff --git a/x-pack/plugins/fleet/common/mocks.ts b/x-pack/plugins/fleet/common/mocks.ts index eb81ea2d6a0ac3..5b71e9b15860ee 100644 --- a/x-pack/plugins/fleet/common/mocks.ts +++ b/x-pack/plugins/fleet/common/mocks.ts @@ -5,7 +5,8 @@ * 2.0. */ -import type { NewPackagePolicy, PackagePolicy, DeletePackagePoliciesResponse } from './types'; +import type { DeletePackagePoliciesResponse, NewPackagePolicy, PackagePolicy } from './types'; +import type { FleetAuthz } from './authz'; export const createNewPackagePolicyMock = (): NewPackagePolicy => { return { @@ -56,3 +57,27 @@ export const deletePackagePolicyMock = (): DeletePackagePoliciesResponse => { }, ]; }; + +/** + * Creates mock `authz` object + */ +export const createFleetAuthzMock = (): FleetAuthz => { + return { + fleet: { + all: true, + setup: true, + readEnrollmentTokens: true, + }, + integrations: { + readPackageInfo: true, + readInstalledPackages: true, + installPackages: true, + upgradePackages: true, + removePackages: true, + readPackageSettings: true, + writePackageSettings: true, + readIntegrationPolicies: true, + writeIntegrationPolicies: true, + }, + }; +}; diff --git a/x-pack/plugins/fleet/server/mocks/index.ts b/x-pack/plugins/fleet/server/mocks/index.ts index 90a0addfae4904..90c9181b5007a0 100644 --- a/x-pack/plugins/fleet/server/mocks/index.ts +++ b/x-pack/plugins/fleet/server/mocks/index.ts @@ -7,11 +7,11 @@ import { of } from 'rxjs'; import { + coreMock, elasticsearchServiceMock, loggingSystemMock, - savedObjectsServiceMock, - coreMock, savedObjectsClientMock, + savedObjectsServiceMock, } from '../../../../../src/core/server/mocks'; import { dataPluginMock } from '../../../../../src/plugins/data/server/mocks'; import { licensingMock } from '../../../../plugins/licensing/server/mocks'; @@ -21,7 +21,7 @@ import type { PackagePolicyServiceInterface } from '../services/package_policy'; import type { AgentPolicyServiceInterface, PackageService } from '../services'; import type { FleetAppContext } from '../plugin'; import { createMockTelemetryEventsSender } from '../telemetry/__mocks__'; -import type { FleetAuthz } from '../../common'; +import { createFleetAuthzMock } from '../../common'; import { agentServiceMock } from '../services/agents/agent_service.mock'; import type { FleetRequestHandlerContext } from '../types'; @@ -145,27 +145,3 @@ export const createMockPackageService = (): PackageService => { ensureInstalledPackage: jest.fn(), }; }; - -/** - * Creates mock `authz` object - */ -export const createFleetAuthzMock = (): FleetAuthz => { - return { - fleet: { - all: true, - setup: true, - readEnrollmentTokens: true, - }, - integrations: { - readPackageInfo: true, - readInstalledPackages: true, - installPackages: true, - upgradePackages: true, - removePackages: true, - readPackageSettings: true, - writePackageSettings: true, - readIntegrationPolicies: true, - writeIntegrationPolicies: true, - }, - }; -}; diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts index d48d80add24358..035659185955d1 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.test.ts @@ -9,12 +9,14 @@ import { httpServerMock, savedObjectsClientMock } from 'src/core/server/mocks'; import type { PostFleetSetupResponse } from '../../../common'; import { RegistryError } from '../../errors'; -import { createAppContextStartContractMock, xpackMocks, createFleetAuthzMock } from '../../mocks'; +import { createAppContextStartContractMock, xpackMocks } from '../../mocks'; import { agentServiceMock } from '../../services/agents/agent_service.mock'; import { appContextService } from '../../services/app_context'; import { setupFleet } from '../../services/setup'; import type { FleetRequestHandlerContext } from '../../types'; +import { createFleetAuthzMock } from '../../../common'; + import { fleetSetupHandler } from './handlers'; jest.mock('../../services/setup', () => { diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts new file mode 100644 index 00000000000000..588366036932f9 --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.test.ts @@ -0,0 +1,75 @@ +/* + * Copyright 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 { calculateEndpointAuthz, getEndpointAuthzInitialState } from './authz'; +import { createFleetAuthzMock, FleetAuthz } from '../../../../../fleet/common'; +import { createLicenseServiceMock } from '../../../license/mocks'; +import type { EndpointAuthz } from '../../types/authz'; + +describe('Endpoint Authz service', () => { + let licenseService: ReturnType; + let fleetAuthz: FleetAuthz; + + beforeEach(() => { + licenseService = createLicenseServiceMock(); + fleetAuthz = createFleetAuthzMock(); + }); + + describe('calculateEndpointAuthz()', () => { + describe('and `fleet.all` access is true', () => { + it.each>([ + ['canAccessFleet'], + ['canAccessEndpointManagement'], + ['canIsolateHost'], + ])('should set `%s` to `true`', (authProperty) => { + expect(calculateEndpointAuthz(licenseService, fleetAuthz)[authProperty]).toBe(true); + }); + + it('should set `canIsolateHost` to false if not proper license', () => { + licenseService.isPlatinumPlus.mockReturnValue(false); + + expect(calculateEndpointAuthz(licenseService, fleetAuthz).canIsolateHost).toBe(false); + }); + + it('should set `canUnIsolateHost` to true even if not proper license', () => { + licenseService.isPlatinumPlus.mockReturnValue(false); + + expect(calculateEndpointAuthz(licenseService, fleetAuthz).canUnIsolateHost).toBe(true); + }); + }); + + describe('and `fleet.all` access is false', () => { + beforeEach(() => (fleetAuthz.fleet.all = false)); + + it.each>([ + ['canAccessFleet'], + ['canAccessEndpointManagement'], + ['canIsolateHost'], + ])('should set `%s` to `false`', (authProperty) => { + expect(calculateEndpointAuthz(licenseService, fleetAuthz)[authProperty]).toBe(false); + }); + + it('should set `canUnIsolateHost` to true even if not proper license', () => { + licenseService.isPlatinumPlus.mockReturnValue(false); + + expect(calculateEndpointAuthz(licenseService, fleetAuthz).canUnIsolateHost).toBe(true); + }); + }); + }); + + describe('getEndpointAuthzInitialState()', () => { + it('returns expected initial state', () => { + expect(getEndpointAuthzInitialState()).toEqual({ + canAccessFleet: false, + canAccessEndpointManagement: false, + canIsolateHost: false, + canUnIsolateHost: true, + canCreateArtifactsByPolicy: false, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts new file mode 100644 index 00000000000000..766843311cfdcf --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/authz.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LicenseService } from '../../../license'; +import { FleetAuthz } from '../../../../../fleet/common'; +import { EndpointAuthz } from '../../types/authz'; + +/** + * Used by both the server and the UI to generate the Authorization for access to Endpoint related + * functionality + * + * @param licenseService + * @param fleetAuthz + */ +export const calculateEndpointAuthz = ( + licenseService: LicenseService, + fleetAuthz: FleetAuthz +): EndpointAuthz => { + const isPlatinumPlusLicense = licenseService.isPlatinumPlus(); + const hasAllAccessToFleet = fleetAuthz.fleet.all; + + return { + canAccessFleet: hasAllAccessToFleet, + canAccessEndpointManagement: hasAllAccessToFleet, + canCreateArtifactsByPolicy: isPlatinumPlusLicense, + canIsolateHost: isPlatinumPlusLicense && hasAllAccessToFleet, + canUnIsolateHost: true, + }; +}; + +export const getEndpointAuthzInitialState = (): EndpointAuthz => { + return { + canAccessFleet: false, + canAccessEndpointManagement: false, + canCreateArtifactsByPolicy: false, + canIsolateHost: false, + canUnIsolateHost: true, + }; +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/index.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/index.ts new file mode 100644 index 00000000000000..975d28eb9dcbfe --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { getEndpointAuthzInitialState, calculateEndpointAuthz } from './authz'; +export { getEndpointAuthzInitialStateMock } from './mocks'; diff --git a/x-pack/plugins/security_solution/common/endpoint/service/authz/mocks.ts b/x-pack/plugins/security_solution/common/endpoint/service/authz/mocks.ts new file mode 100644 index 00000000000000..7f1a6f969272be --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/service/authz/mocks.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EndpointAuthz } from '../../types/authz'; +import { getEndpointAuthzInitialState } from './authz'; + +export const getEndpointAuthzInitialStateMock = ( + overrides: Partial = {} +): EndpointAuthz => { + const authz: EndpointAuthz = { + ...( + Object.entries(getEndpointAuthzInitialState()) as Array<[keyof EndpointAuthz, boolean]> + ).reduce((mockPrivileges, [key, value]) => { + // Invert the initial values (from `false` to `true`) so that everything is authorized + mockPrivileges[key] = !value; + + return mockPrivileges; + }, {} as EndpointAuthz), + // this one is currently treated special in that everyone can un-isolate + canUnIsolateHost: true, + ...overrides, + }; + + return authz; +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/types/authz.ts b/x-pack/plugins/security_solution/common/endpoint/types/authz.ts new file mode 100644 index 00000000000000..da0a372db8aa2a --- /dev/null +++ b/x-pack/plugins/security_solution/common/endpoint/types/authz.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Set of Endpoint Specific privileges that control application authorization. This interface is + * used both on the client and server for consistency + */ +export interface EndpointAuthz { + /** If user has permissions to access Fleet */ + canAccessFleet: boolean; + /** If user has permissions to access Endpoint management (includes check to ensure they also have access to fleet) */ + canAccessEndpointManagement: boolean; + /** if user has permissions to create Artifacts by Policy */ + canCreateArtifactsByPolicy: boolean; + /** If user has permissions to isolate hosts */ + canIsolateHost: boolean; + /** If user has permissions to un-isolate (release) hosts */ + canUnIsolateHost: boolean; +} + +export interface EndpointPrivileges extends EndpointAuthz { + loading: boolean; +} diff --git a/x-pack/plugins/security_solution/common/endpoint/types/index.ts b/x-pack/plugins/security_solution/common/endpoint/types/index.ts index c869c9c780bd98..1fce6f17bdea6b 100644 --- a/x-pack/plugins/security_solution/common/endpoint/types/index.ts +++ b/x-pack/plugins/security_solution/common/endpoint/types/index.ts @@ -1246,3 +1246,5 @@ interface BaseListResponse { * Returned by the server via GET /api/endpoint/metadata */ export type MetadataListResponse = BaseListResponse; + +export type { EndpointPrivileges } from './authz'; diff --git a/x-pack/plugins/security_solution/public/app/app.tsx b/x-pack/plugins/security_solution/public/app/app.tsx index 78a340d6bbca05..6d5f81b076560b 100644 --- a/x-pack/plugins/security_solution/public/app/app.tsx +++ b/x-pack/plugins/security_solution/public/app/app.tsx @@ -25,7 +25,7 @@ import { State } from '../common/store'; import { StartServices } from '../types'; import { PageRouter } from './routes'; import { EuiThemeProvider } from '../../../../../src/plugins/kibana_react/common'; -import { UserPrivilegesProvider } from '../common/components/user_privileges'; +import { UserPrivilegesProvider } from '../common/components/user_privileges/user_privileges_context'; interface StartAppComponent { children: React.ReactNode; diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/__mocks__/index.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/__mocks__/index.ts new file mode 100644 index 00000000000000..dc77a6b9eea8d7 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/__mocks__/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { initialUserPrivilegesState, UserPrivilegesState } from '../user_privileges_context'; +import { getEndpointPrivilegesInitialStateMock } from '../endpoint/mocks'; + +export const useUserPrivileges = jest.fn(() => { + const mockedPrivileges: UserPrivilegesState = { + ...initialUserPrivilegesState(), + endpointPrivileges: getEndpointPrivilegesInitialStateMock(), + }; + + return mockedPrivileges; +}); diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/index.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/index.ts index adea89ce1a0511..83443dc20b9b8c 100644 --- a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/index.ts @@ -5,5 +5,5 @@ * 2.0. */ -export * from './use_endpoint_privileges'; +export { useEndpointPrivileges } from './use_endpoint_privileges'; export { getEndpointPrivilegesInitialState } from './utils'; diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/mocks.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/mocks.ts index 2851c92816ceaf..2348fdf017c866 100644 --- a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/mocks.ts +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/mocks.ts @@ -5,24 +5,16 @@ * 2.0. */ -import type { EndpointPrivileges } from './use_endpoint_privileges'; -import { getEndpointPrivilegesInitialState } from './utils'; +import { EndpointPrivileges } from '../../../../../common/endpoint/types'; +import { getEndpointAuthzInitialStateMock } from '../../../../../common/endpoint/service/authz/mocks'; -export const getEndpointPrivilegesInitialStateMock = ( - overrides: Partial = {} -): EndpointPrivileges => { - // Get the initial state and set all permissions to `true` (enabled) for testing +export const getEndpointPrivilegesInitialStateMock = ({ + loading = false, + ...overrides +}: Partial = {}): EndpointPrivileges => { const endpointPrivilegesMock: EndpointPrivileges = { - ...( - Object.entries(getEndpointPrivilegesInitialState()) as Array< - [keyof EndpointPrivileges, boolean] - > - ).reduce((mockPrivileges, [key, value]) => { - mockPrivileges[key] = !value; - - return mockPrivileges; - }, {} as EndpointPrivileges), - ...overrides, + ...getEndpointAuthzInitialStateMock(overrides), + loading, }; return endpointPrivilegesMock; diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.test.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.test.ts index d4ba29a4ef950c..4daef6cca45bdf 100644 --- a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.test.ts +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.test.ts @@ -6,14 +6,14 @@ */ import { act, renderHook, RenderHookResult, RenderResult } from '@testing-library/react-hooks'; -import { useHttp, useCurrentUser } from '../../../lib/kibana'; -import { EndpointPrivileges, useEndpointPrivileges } from './use_endpoint_privileges'; +import { useCurrentUser, useKibana } from '../../../lib/kibana'; +import { useEndpointPrivileges } from './use_endpoint_privileges'; import { securityMock } from '../../../../../../security/public/mocks'; -import { appRoutesService } from '../../../../../../fleet/common'; import { AuthenticatedUser } from '../../../../../../security/common'; import { licenseService } from '../../../hooks/use_license'; -import { fleetGetCheckPermissionsHttpMock } from '../../../../management/pages/mocks'; import { getEndpointPrivilegesInitialStateMock } from './mocks'; +import { EndpointPrivileges } from '../../../../../common/endpoint/types'; +import { getEndpointPrivilegesInitialState } from './utils'; jest.mock('../../../lib/kibana'); jest.mock('../../../hooks/use_license', () => { @@ -32,10 +32,9 @@ const licenseServiceMock = licenseService as jest.Mocked; describe('When using useEndpointPrivileges hook', () => { let authenticatedUser: AuthenticatedUser; - let fleetApiMock: ReturnType; let result: RenderResult; let unmount: ReturnType['unmount']; - let waitForNextUpdate: ReturnType['waitForNextUpdate']; + let releaseFleetAuthz: () => void; let render: () => RenderHookResult; beforeEach(() => { @@ -45,14 +44,19 @@ describe('When using useEndpointPrivileges hook', () => { (useCurrentUser as jest.Mock).mockReturnValue(authenticatedUser); - fleetApiMock = fleetGetCheckPermissionsHttpMock( - useHttp() as Parameters[0] - ); licenseServiceMock.isPlatinumPlus.mockReturnValue(true); + // Add a daly to fleet service that provides authz information + const fleetAuthz = useKibana().services.fleet!.authz; + + // Add a delay to the fleet Authz promise to test out the `loading` property + useKibana().services.fleet!.authz = new Promise((resolve) => { + releaseFleetAuthz = () => resolve(fleetAuthz); + }); + render = () => { const hookRenderResponse = renderHook(() => useEndpointPrivileges()); - ({ result, unmount, waitForNextUpdate } = hookRenderResponse); + ({ result, unmount } = hookRenderResponse); return hookRenderResponse; }; }); @@ -62,88 +66,22 @@ describe('When using useEndpointPrivileges hook', () => { }); it('should return `loading: true` while retrieving privileges', async () => { - // Add a daly to the API response that we can control from the test - let releaseApiResponse: () => void; - fleetApiMock.responseProvider.checkPermissions.mockDelay.mockReturnValue( - new Promise((resolve) => { - releaseApiResponse = () => resolve(); - }) - ); (useCurrentUser as jest.Mock).mockReturnValue(null); const { rerender } = render(); - expect(result.current).toEqual( - getEndpointPrivilegesInitialStateMock({ - canAccessEndpointManagement: false, - canAccessFleet: false, - loading: true, - }) - ); + expect(result.current).toEqual(getEndpointPrivilegesInitialState()); // Make user service available (useCurrentUser as jest.Mock).mockReturnValue(authenticatedUser); rerender(); - expect(result.current).toEqual( - getEndpointPrivilegesInitialStateMock({ - canAccessEndpointManagement: false, - canAccessFleet: false, - loading: true, - }) - ); + expect(result.current).toEqual(getEndpointPrivilegesInitialState()); // Release the API response await act(async () => { - fleetApiMock.waitForApi(); - releaseApiResponse!(); + releaseFleetAuthz(); + await useKibana().services.fleet!.authz; }); - expect(result.current).toEqual(getEndpointPrivilegesInitialStateMock()); - }); - - it('should call Fleet permissions api to determine user privilege to fleet', async () => { - render(); - await waitForNextUpdate(); - await fleetApiMock.waitForApi(); - expect(useHttp().get as jest.Mock).toHaveBeenCalledWith( - appRoutesService.getCheckPermissionsPath() - ); - }); - it('should set privileges to false if user does not have superuser role', async () => { - authenticatedUser.roles = []; - render(); - await waitForNextUpdate(); - await fleetApiMock.waitForApi(); - expect(result.current).toEqual( - getEndpointPrivilegesInitialStateMock({ - canAccessEndpointManagement: false, - }) - ); - }); - - it('should set privileges to false if fleet api check returns failure', async () => { - fleetApiMock.responseProvider.checkPermissions.mockReturnValue({ - error: 'MISSING_SECURITY', - success: false, - }); - - render(); - await waitForNextUpdate(); - await fleetApiMock.waitForApi(); - expect(result.current).toEqual( - getEndpointPrivilegesInitialStateMock({ - canAccessEndpointManagement: false, - canAccessFleet: false, - }) - ); + expect(result.current).toEqual(getEndpointPrivilegesInitialStateMock()); }); - - it.each([['canIsolateHost'], ['canCreateArtifactsByPolicy']])( - 'should set %s to false if license is not PlatinumPlus', - async (privilege) => { - licenseServiceMock.isPlatinumPlus.mockReturnValue(false); - render(); - await waitForNextUpdate(); - expect(result.current).toEqual(expect.objectContaining({ [privilege]: false })); - } - ); }); diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.ts index 448cb215941deb..6fa0c51f500da0 100644 --- a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.ts +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/use_endpoint_privileges.ts @@ -6,24 +6,14 @@ */ import { useEffect, useMemo, useRef, useState } from 'react'; -import { useCurrentUser, useHttp } from '../../../lib/kibana'; -import { appRoutesService, CheckPermissionsResponse } from '../../../../../../fleet/common'; +import { useCurrentUser, useKibana } from '../../../lib/kibana'; import { useLicense } from '../../../hooks/use_license'; -import { Immutable } from '../../../../../common/endpoint/types'; - -export interface EndpointPrivileges { - loading: boolean; - /** If user has permissions to access Fleet */ - canAccessFleet: boolean; - /** If user has permissions to access Endpoint management (includes check to ensure they also have access to fleet) */ - canAccessEndpointManagement: boolean; - /** if user has permissions to create Artifacts by Policy */ - canCreateArtifactsByPolicy: boolean; - /** If user has permissions to use the Host isolation feature */ - canIsolateHost: boolean; - /** @deprecated do not use. instead, use one of the other privileges defined */ - isPlatinumPlus: boolean; -} +import { EndpointPrivileges, Immutable } from '../../../../../common/endpoint/types'; +import { + calculateEndpointAuthz, + getEndpointAuthzInitialState, +} from '../../../../../common/endpoint/service/authz'; +import { FleetAuthz } from '../../../../../../fleet/common'; /** * Retrieve the endpoint privileges for the current user. @@ -32,23 +22,39 @@ export interface EndpointPrivileges { * to keep API calls to a minimum. */ export const useEndpointPrivileges = (): Immutable => { - const http = useHttp(); const user = useCurrentUser(); + const fleetServices = useKibana().services.fleet; const isMounted = useRef(true); - const isPlatinumPlusLicense = useLicense().isPlatinumPlus(); - const [canAccessFleet, setCanAccessFleet] = useState(false); + const licenseService = useLicense(); const [fleetCheckDone, setFleetCheckDone] = useState(false); + const [fleetAuthz, setFleetAuthz] = useState(null); + + const privileges = useMemo(() => { + const privilegeList: EndpointPrivileges = Object.freeze({ + loading: !fleetCheckDone || !user, + ...(fleetAuthz + ? calculateEndpointAuthz(licenseService, fleetAuthz) + : getEndpointAuthzInitialState()), + }); + + return privilegeList; + }, [fleetCheckDone, user, fleetAuthz, licenseService]); // Check if user can access fleet useEffect(() => { + if (!fleetServices) { + setFleetCheckDone(true); + return; + } + + setFleetCheckDone(false); + (async () => { try { - const fleetPermissionsResponse = await http.get( - appRoutesService.getCheckPermissionsPath() - ); + const fleetAuthzForCurrentUser = await fleetServices.authz; if (isMounted.current) { - setCanAccessFleet(fleetPermissionsResponse.success); + setFleetAuthz(fleetAuthzForCurrentUser); } } finally { if (isMounted.current) { @@ -56,30 +62,7 @@ export const useEndpointPrivileges = (): Immutable => { } } })(); - }, [http]); - - // Check if user has `superuser` role - const isSuperUser = useMemo(() => { - if (user?.roles) { - return user.roles.includes('superuser'); - } - return false; - }, [user?.roles]); - - const privileges = useMemo(() => { - const privilegeList: EndpointPrivileges = Object.freeze({ - loading: !fleetCheckDone || !user, - canAccessFleet, - canAccessEndpointManagement: canAccessFleet && isSuperUser, - canCreateArtifactsByPolicy: isPlatinumPlusLicense, - canIsolateHost: isPlatinumPlusLicense, - // FIXME: Remove usages of the property below - /** @deprecated */ - isPlatinumPlus: isPlatinumPlusLicense, - }); - - return privilegeList; - }, [canAccessFleet, fleetCheckDone, isSuperUser, user, isPlatinumPlusLicense]); + }, [fleetServices]); // Capture if component is unmounted useEffect( diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/utils.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/utils.ts index df91314479f189..0c314ba5573c84 100644 --- a/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/utils.ts +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/endpoint/utils.ts @@ -5,15 +5,12 @@ * 2.0. */ -import { EndpointPrivileges } from './use_endpoint_privileges'; +import { EndpointPrivileges } from '../../../../../common/endpoint/types'; +import { getEndpointAuthzInitialState } from '../../../../../common/endpoint/service/authz'; export const getEndpointPrivilegesInitialState = (): EndpointPrivileges => { return { loading: true, - canAccessFleet: false, - canAccessEndpointManagement: false, - canIsolateHost: false, - canCreateArtifactsByPolicy: false, - isPlatinumPlus: false, + ...getEndpointAuthzInitialState(), }; }; diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/index.ts b/x-pack/plugins/security_solution/public/common/components/user_privileges/index.ts new file mode 100644 index 00000000000000..3a5d942d3b5328 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useContext } from 'react'; +import { DeepReadonly } from 'utility-types'; +import { UserPrivilegesContext, UserPrivilegesState } from './user_privileges_context'; + +export const useUserPrivileges = (): DeepReadonly => + useContext(UserPrivilegesContext); diff --git a/x-pack/plugins/security_solution/public/common/components/user_privileges/index.tsx b/x-pack/plugins/security_solution/public/common/components/user_privileges/user_privileges_context.tsx similarity index 81% rename from x-pack/plugins/security_solution/public/common/components/user_privileges/index.tsx rename to x-pack/plugins/security_solution/public/common/components/user_privileges/user_privileges_context.tsx index 05ccadeaf67ace..5c681e5dbbaecc 100644 --- a/x-pack/plugins/security_solution/public/common/components/user_privileges/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/user_privileges/user_privileges_context.tsx @@ -5,16 +5,14 @@ * 2.0. */ -import React, { createContext, useContext, useEffect, useState } from 'react'; -import { DeepReadonly } from 'utility-types'; - -import { Capabilities } from '../../../../../../../src/core/public'; -import { useFetchDetectionEnginePrivileges } from '../../../detections/components/user_privileges/use_fetch_detection_engine_privileges'; +import React, { createContext, useEffect, useState } from 'react'; +import { Capabilities } from '../../../../../../../src/core/types'; +import { SERVER_APP_ID } from '../../../../common/constants'; import { useFetchListPrivileges } from '../../../detections/components/user_privileges/use_fetch_list_privileges'; -import { EndpointPrivileges, useEndpointPrivileges } from './endpoint'; +import { useFetchDetectionEnginePrivileges } from '../../../detections/components/user_privileges/use_fetch_detection_engine_privileges'; +import { getEndpointPrivilegesInitialState, useEndpointPrivileges } from './endpoint'; +import { EndpointPrivileges } from '../../../../common/endpoint/types'; -import { SERVER_APP_ID } from '../../../../common/constants'; -import { getEndpointPrivilegesInitialState } from './endpoint/utils'; export interface UserPrivilegesState { listPrivileges: ReturnType; detectionEnginePrivileges: ReturnType; @@ -28,8 +26,9 @@ export const initialUserPrivilegesState = (): UserPrivilegesState => ({ endpointPrivileges: getEndpointPrivilegesInitialState(), kibanaSecuritySolutionsPrivileges: { crud: false, read: false }, }); - -const UserPrivilegesContext = createContext(initialUserPrivilegesState()); +export const UserPrivilegesContext = createContext( + initialUserPrivilegesState() +); interface UserPrivilegesProviderProps { kibanaCapabilities: Capabilities; @@ -73,6 +72,3 @@ export const UserPrivilegesProvider = ({ ); }; - -export const useUserPrivileges = (): DeepReadonly => - useContext(UserPrivilegesContext); diff --git a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx index 528592051ccce9..9ad5abc1c7ed23 100644 --- a/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/security_solution/public/common/mock/test_providers.tsx @@ -25,8 +25,8 @@ import { import { FieldHook } from '../../shared_imports'; import { SUB_PLUGINS_REDUCER } from './utils'; import { createSecuritySolutionStorageMock, localStorageMock } from './mock_local_storage'; -import { UserPrivilegesProvider } from '../components/user_privileges'; import { CASES_FEATURE_ID } from '../../../common/constants'; +import { UserPrivilegesProvider } from '../components/user_privileges/user_privileges_context'; const state: State = mockGlobalState; diff --git a/x-pack/plugins/security_solution/public/detections/components/user_info/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/user_info/index.test.tsx index 0447130e1bd144..32911a2c8e4ab6 100644 --- a/x-pack/plugins/security_solution/public/detections/components/user_info/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/user_info/index.test.tsx @@ -13,7 +13,7 @@ import { Capabilities } from 'src/core/public'; import { useKibana } from '../../../common/lib/kibana'; import * as api from '../../containers/detection_engine/alerts/api'; import { TestProviders } from '../../../common/mock/test_providers'; -import { UserPrivilegesProvider } from '../../../common/components/user_privileges'; +import { UserPrivilegesProvider } from '../../../common/components/user_privileges/user_privileges_context'; jest.mock('../../../common/lib/kibana'); jest.mock('../../containers/detection_engine/alerts/api'); diff --git a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx index 3b987a72114114..493b41bc0165c5 100644 --- a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx +++ b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.test.tsx @@ -8,18 +8,21 @@ import React from 'react'; import { act, fireEvent } from '@testing-library/react'; import { AppContextTestRender, createAppRootMockRenderer } from '../../../common/mock/endpoint'; -import { - EndpointPrivileges, - useEndpointPrivileges, -} from '../../../common/components/user_privileges/endpoint/use_endpoint_privileges'; import { EndpointDocGenerator } from '../../../../common/endpoint/generate_data'; +import { useUserPrivileges } from '../../../common/components/user_privileges'; import { SearchExceptions, SearchExceptionsProps } from '.'; import { getEndpointPrivilegesInitialStateMock } from '../../../common/components/user_privileges/endpoint/mocks'; -jest.mock('../../../common/components/user_privileges/endpoint/use_endpoint_privileges'); +import { + initialUserPrivilegesState, + UserPrivilegesState, +} from '../../../common/components/user_privileges/user_privileges_context'; +import { EndpointPrivileges } from '../../../../common/endpoint/types'; + +jest.mock('../../../common/components/user_privileges'); let onSearchMock: jest.Mock; -const mockUseEndpointPrivileges = useEndpointPrivileges as jest.Mock; +const mockUseUserPrivileges = useUserPrivileges as jest.Mock; describe('Search exceptions', () => { let appTestContext: AppContextTestRender; @@ -28,13 +31,16 @@ describe('Search exceptions', () => { props?: Partial ) => ReturnType; - const loadedUserEndpointPrivilegesState = ( + const loadedUserPrivilegesState = ( endpointOverrides: Partial = {} - ): EndpointPrivileges => - getEndpointPrivilegesInitialStateMock({ - isPlatinumPlus: false, - ...endpointOverrides, - }); + ): UserPrivilegesState => { + return { + ...initialUserPrivilegesState(), + endpointPrivileges: getEndpointPrivilegesInitialStateMock({ + ...endpointOverrides, + }), + }; + }; beforeEach(() => { onSearchMock = jest.fn(); @@ -51,11 +57,11 @@ describe('Search exceptions', () => { return renderResult; }; - mockUseEndpointPrivileges.mockReturnValue(loadedUserEndpointPrivilegesState()); + mockUseUserPrivileges.mockReturnValue(loadedUserPrivilegesState()); }); afterAll(() => { - mockUseEndpointPrivileges.mockReset(); + mockUseUserPrivileges.mockReset(); }); it('should have a default value', () => { @@ -102,8 +108,8 @@ describe('Search exceptions', () => { it('should hide policies selector when no license', () => { const generator = new EndpointDocGenerator('policy-list'); const policy = generator.generatePolicyPackagePolicy(); - mockUseEndpointPrivileges.mockReturnValue( - loadedUserEndpointPrivilegesState({ isPlatinumPlus: false }) + mockUseUserPrivileges.mockReturnValue( + loadedUserPrivilegesState({ canCreateArtifactsByPolicy: false }) ); const element = render({ policyList: [policy], hasPolicyFilter: true }); @@ -113,8 +119,8 @@ describe('Search exceptions', () => { it('should display policies selector when right license', () => { const generator = new EndpointDocGenerator('policy-list'); const policy = generator.generatePolicyPackagePolicy(); - mockUseEndpointPrivileges.mockReturnValue( - loadedUserEndpointPrivilegesState({ isPlatinumPlus: true }) + mockUseUserPrivileges.mockReturnValue( + loadedUserPrivilegesState({ canCreateArtifactsByPolicy: true }) ); const element = render({ policyList: [policy], hasPolicyFilter: true }); diff --git a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx index 569916ac203156..5489f7a394c993 100644 --- a/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx +++ b/x-pack/plugins/security_solution/public/management/components/search_exceptions/search_exceptions.tsx @@ -10,7 +10,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiFieldSearch, EuiButton } from '@elastic/e import { i18n } from '@kbn/i18n'; import { PolicySelectionItem, PoliciesSelector } from '../policies_selector'; import { ImmutableArray, PolicyData } from '../../../../common/endpoint/types'; -import { useEndpointPrivileges } from '../../../common/components/user_privileges/endpoint/use_endpoint_privileges'; +import { useUserPrivileges } from '../../../common/components/user_privileges'; export interface SearchExceptionsProps { defaultValue?: string; @@ -34,7 +34,7 @@ export const SearchExceptions = memo( defaultExcludedPolicies, hideRefreshButton = false, }) => { - const { isPlatinumPlus } = useEndpointPrivileges(); + const { canCreateArtifactsByPolicy } = useUserPrivileges().endpointPrivileges; const [query, setQuery] = useState(defaultValue); const [includedPolicies, setIncludedPolicies] = useState(defaultIncludedPolicies || ''); const [excludedPolicies, setExcludedPolicies] = useState(defaultExcludedPolicies || ''); @@ -92,7 +92,7 @@ export const SearchExceptions = memo( data-test-subj="searchField" /> - {isPlatinumPlus && hasPolicyFilter && policyList ? ( + {canCreateArtifactsByPolicy && hasPolicyFilter && policyList ? ( { let history: AppContextTestRender['history']; let mockedContext: AppContextTestRender; - const useEndpointPrivilegesMock = useEndpointPrivileges as jest.Mock; + const useUserPrivilegesMock = _useUserPrivileges as jest.Mock; + + const setEndpointPrivileges = (overrides: Partial = {}) => { + const newPrivileges = _useUserPrivileges(); + + useUserPrivilegesMock.mockReturnValue({ + ...newPrivileges, + endpointPrivileges: { + ...newPrivileges.endpointPrivileges, + ...overrides, + }, + }); + }; + const waitForApiCall = () => { return waitFor(() => expect(getHostIsolationExceptionItemsMock).toHaveBeenCalled()); }; @@ -162,7 +176,7 @@ describe('When on the host isolation exceptions page', () => { describe('has canIsolateHost privileges', () => { beforeEach(async () => { - useEndpointPrivilegesMock.mockReturnValue({ canIsolateHost: true }); + setEndpointPrivileges({ canIsolateHost: true }); getHostIsolationExceptionItemsMock.mockImplementation(getFoundExceptionListItemSchemaMock); }); @@ -185,7 +199,7 @@ describe('When on the host isolation exceptions page', () => { describe('does not have canIsolateHost privileges', () => { beforeEach(() => { - useEndpointPrivilegesMock.mockReturnValue({ canIsolateHost: false }); + setEndpointPrivileges({ canIsolateHost: false }); }); it('should not show the create flyout if the user navigates to the create url', () => { diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx index a9da5c6d135a34..816aef5ca2dce5 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.tsx @@ -31,11 +31,11 @@ import { EDIT_HOST_ISOLATION_EXCEPTION_LABEL, } from './components/translations'; import { getEndpointListPath } from '../../../common/routing'; -import { useEndpointPrivileges } from '../../../../common/components/user_privileges/endpoint'; import { MANAGEMENT_DEFAULT_PAGE_SIZE, MANAGEMENT_PAGE_SIZE_OPTIONS, } from '../../../common/constants'; +import { useUserPrivileges } from '../../../../common/components/user_privileges'; type HostIsolationExceptionPaginatedContent = PaginatedContentProps< Immutable, @@ -44,7 +44,7 @@ type HostIsolationExceptionPaginatedContent = PaginatedContentProps< export const HostIsolationExceptionsList = () => { const history = useHistory(); - const privileges = useEndpointPrivileges(); + const privileges = useUserPrivileges().endpointPrivileges; const location = useHostIsolationExceptionsSelector(getCurrentLocation); const navigateCallback = useHostIsolationExceptionsNavigateCallback(); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/empty/policy_trusted_apps_empty_unassigned.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/empty/policy_trusted_apps_empty_unassigned.tsx index 3252c5a27d85dc..3a7308fef75f15 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/empty/policy_trusted_apps_empty_unassigned.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/empty/policy_trusted_apps_empty_unassigned.tsx @@ -10,7 +10,7 @@ import { EuiEmptyPrompt, EuiButton, EuiPageTemplate, EuiLink } from '@elastic/eu import { FormattedMessage } from '@kbn/i18n-react'; import { usePolicyDetailsNavigateCallback } from '../../policy_hooks'; import { useGetLinkTo } from './use_policy_trusted_apps_empty_hooks'; -import { useEndpointPrivileges } from '../../../../../../common/components/user_privileges/endpoint/use_endpoint_privileges'; +import { useUserPrivileges } from '../../../../../../common/components/user_privileges'; interface CommonProps { policyId: string; @@ -18,7 +18,7 @@ interface CommonProps { } export const PolicyTrustedAppsEmptyUnassigned = memo(({ policyId, policyName }) => { - const { isPlatinumPlus } = useEndpointPrivileges(); + const { canCreateArtifactsByPolicy } = useUserPrivileges().endpointPrivileges; const navigateCallback = usePolicyDetailsNavigateCallback(); const { onClickHandler, toRouteUrl } = useGetLinkTo(policyId, policyName); const onClickPrimaryButtonHandler = useCallback( @@ -49,7 +49,7 @@ export const PolicyTrustedAppsEmptyUnassigned = memo(({ policyId, p /> } actions={[ - ...(isPlatinumPlus + ...(canCreateArtifactsByPolicy ? [ { it('should hide assign button on empty state with unassigned policies when downgraded to a gold or below license', async () => { mockUseEndpointPrivileges.mockReturnValue( getEndpointPrivilegesInitialStateMock({ - isPlatinumPlus: false, + canCreateArtifactsByPolicy: false, }) ); const component = render(); @@ -184,7 +184,7 @@ describe('Policy trusted apps layout', () => { it('should hide the `Assign trusted applications` button when there is data and the license is downgraded to gold or below', async () => { mockUseEndpointPrivileges.mockReturnValue( getEndpointPrivilegesInitialStateMock({ - isPlatinumPlus: false, + canCreateArtifactsByPolicy: false, }) ); const component = render(); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.tsx index f39b080e56e300..3cf8e60c5e1688 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/layout/policy_trusted_apps_layout.tsx @@ -32,10 +32,10 @@ import { import { usePolicyDetailsNavigateCallback, usePolicyDetailsSelector } from '../../policy_hooks'; import { PolicyTrustedAppsFlyout } from '../flyout'; import { PolicyTrustedAppsList } from '../list/policy_trusted_apps_list'; -import { useEndpointPrivileges } from '../../../../../../common/components/user_privileges/endpoint/use_endpoint_privileges'; import { useAppUrl } from '../../../../../../common/lib/kibana'; import { APP_UI_ID } from '../../../../../../../common/constants'; import { getTrustedAppsListPath } from '../../../../../common/routing'; +import { useUserPrivileges } from '../../../../../../common/components/user_privileges'; export const PolicyTrustedAppsLayout = React.memo(() => { const { getAppUrl } = useAppUrl(); @@ -44,7 +44,7 @@ export const PolicyTrustedAppsLayout = React.memo(() => { const isDoesTrustedAppExistsLoading = usePolicyDetailsSelector(doesTrustedAppExistsLoading); const policyItem = usePolicyDetailsSelector(policyDetails); const navigateCallback = usePolicyDetailsNavigateCallback(); - const { isPlatinumPlus } = useEndpointPrivileges(); + const { canCreateArtifactsByPolicy } = useUserPrivileges().endpointPrivileges; const totalAssignedCount = usePolicyDetailsSelector(getTotalPolicyTrustedAppsListPagination); const hasTrustedApps = usePolicyDetailsSelector(getHasTrustedApps); const isLoadedHasTrustedApps = usePolicyDetailsSelector(getIsLoadedHasTrustedApps); @@ -138,7 +138,9 @@ export const PolicyTrustedAppsLayout = React.memo(() => { - {isPlatinumPlus && assignTrustedAppButton} + + {canCreateArtifactsByPolicy && assignTrustedAppButton} + @@ -169,7 +171,7 @@ export const PolicyTrustedAppsLayout = React.memo(() => { )} - {isPlatinumPlus && showListFlyout ? : null} + {canCreateArtifactsByPolicy && showListFlyout ? : null} ) : null; }); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.test.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.test.tsx index 7410dd20d92863..32568ec2b48ee3 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.test.tsx @@ -16,14 +16,12 @@ import { policyDetailsPageAllApiHttpMocks } from '../../../test_utils'; import { isFailedResourceState, isLoadedResourceState } from '../../../../../state'; import { fireEvent, within, act, waitFor } from '@testing-library/react'; import { APP_UI_ID } from '../../../../../../../common/constants'; -import { - EndpointPrivileges, - useEndpointPrivileges, -} from '../../../../../../common/components/user_privileges/endpoint/use_endpoint_privileges'; +import { useUserPrivileges } from '../../../../../../common/components/user_privileges'; import { getEndpointPrivilegesInitialStateMock } from '../../../../../../common/components/user_privileges/endpoint/mocks'; +import { EndpointPrivileges } from '../../../../../../../common/endpoint/types'; -jest.mock('../../../../../../common/components/user_privileges/endpoint/use_endpoint_privileges'); -const mockUseEndpointPrivileges = useEndpointPrivileges as jest.Mock; +jest.mock('../../../../../../common/components/user_privileges'); +const mockUseUserPrivileges = useUserPrivileges as jest.Mock; describe('when rendering the PolicyTrustedAppsList', () => { // The index (zero based) of the card created by the generator that is policy specific @@ -78,11 +76,14 @@ describe('when rendering the PolicyTrustedAppsList', () => { }; afterAll(() => { - mockUseEndpointPrivileges.mockReset(); + mockUseUserPrivileges.mockReset(); }); beforeEach(() => { appTestContext = createAppRootMockRenderer(); - mockUseEndpointPrivileges.mockReturnValue(loadedUserEndpointPrivilegesState()); + mockUseUserPrivileges.mockReturnValue({ + ...mockUseUserPrivileges(), + endpointPrivileges: loadedUserEndpointPrivilegesState(), + }); mockedApis = policyDetailsPageAllApiHttpMocks(appTestContext.coreStart.http); appTestContext.setExperimentalFlag({ trustedAppsByPolicyEnabled: true }); @@ -317,11 +318,12 @@ describe('when rendering the PolicyTrustedAppsList', () => { }); it('does not show remove option in actions menu if license is downgraded to gold or below', async () => { - mockUseEndpointPrivileges.mockReturnValue( - loadedUserEndpointPrivilegesState({ - isPlatinumPlus: false, - }) - ); + mockUseUserPrivileges.mockReturnValue({ + ...mockUseUserPrivileges(), + endpointPrivileges: loadedUserEndpointPrivilegesState({ + canCreateArtifactsByPolicy: false, + }), + }); await render(); await toggleCardActionMenu(POLICY_SPECIFIC_CARD_INDEX); diff --git a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.tsx b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.tsx index 3453bc529b272c..fa4d4e40b3e52f 100644 --- a/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/policy/view/trusted_apps/list/policy_trusted_apps_list.tsx @@ -38,7 +38,7 @@ import { ContextMenuItemNavByRouterProps } from '../../../../../components/conte import { ArtifactEntryCollapsibleCardProps } from '../../../../../components/artifact_entry_card'; import { useTestIdGenerator } from '../../../../../components/hooks/use_test_id_generator'; import { RemoveTrustedAppFromPolicyModal } from './remove_trusted_app_from_policy_modal'; -import { useEndpointPrivileges } from '../../../../../../common/components/user_privileges/endpoint/use_endpoint_privileges'; +import { useUserPrivileges } from '../../../../../../common/components/user_privileges'; const DATA_TEST_SUBJ = 'policyTrustedAppsGrid'; @@ -52,7 +52,7 @@ export const PolicyTrustedAppsList = memo( const toasts = useToasts(); const history = useHistory(); const { getAppUrl } = useAppUrl(); - const { isPlatinumPlus } = useEndpointPrivileges(); + const { canCreateArtifactsByPolicy } = useUserPrivileges().endpointPrivileges; const policyId = usePolicyDetailsSelector(policyIdFromParams); const isLoading = usePolicyDetailsSelector(isPolicyTrustedAppListLoading); const defaultFilter = usePolicyDetailsSelector(getCurrentPolicyArtifactsFilter); @@ -158,7 +158,7 @@ export const PolicyTrustedAppsList = memo( ]; const thisTrustedAppCardProps: ArtifactCardGridCardComponentProps = { expanded: Boolean(isCardExpanded[trustedApp.id]), - actions: isPlatinumPlus + actions: canCreateArtifactsByPolicy ? [ ...fullDetailsAction, { @@ -194,7 +194,14 @@ export const PolicyTrustedAppsList = memo( } return newCardProps; - }, [allPoliciesById, getAppUrl, getTestId, isCardExpanded, trustedAppItems, isPlatinumPlus]); + }, [ + allPoliciesById, + getAppUrl, + getTestId, + isCardExpanded, + trustedAppItems, + canCreateArtifactsByPolicy, + ]); const provideCardProps = useCallback['cardComponentProps']>( (item) => { diff --git a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx index 2539490be16fb5..33fd1918dad595 100644 --- a/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx +++ b/x-pack/plugins/security_solution/public/overview/pages/overview.test.tsx @@ -17,10 +17,7 @@ import { UseMessagesStorage, } from '../../common/containers/local_storage/use_messages_storage'; import { Overview } from './index'; -import { - initialUserPrivilegesState, - useUserPrivileges, -} from '../../common/components/user_privileges'; +import { useUserPrivileges } from '../../common/components/user_privileges'; import { useSourcererDataView } from '../../common/containers/sourcerer'; import { useFetchIndex } from '../../common/containers/source'; import { useIsThreatIntelModuleEnabled } from '../containers/overview_cti_links/use_is_threat_intel_module_enabled'; @@ -30,9 +27,10 @@ import { mockCtiLinksResponse, } from '../components/overview_cti_links/mock'; import { useCtiDashboardLinks } from '../containers/overview_cti_links'; -import { EndpointPrivileges } from '../../common/components/user_privileges/endpoint/use_endpoint_privileges'; import { useIsExperimentalFeatureEnabled } from '../../common/hooks/use_experimental_features'; import { useHostsRiskScore } from '../containers/overview_risky_host_links/use_hosts_risk_score'; +import { initialUserPrivilegesState } from '../../common/components/user_privileges/user_privileges_context'; +import { EndpointPrivileges } from '../../../common/endpoint/types'; jest.mock('../../common/lib/kibana'); jest.mock('../../common/containers/source'); diff --git a/x-pack/plugins/security_solution/server/endpoint/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/mocks.ts index 9b9d72805425a0..dce08e2522beb0 100644 --- a/x-pack/plugins/security_solution/server/endpoint/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/mocks.ts @@ -17,9 +17,8 @@ import { createMockAgentPolicyService, createMockAgentService, createArtifactsClientMock, - createFleetAuthzMock, } from '../../../fleet/server/mocks'; -import { createMockConfig } from '../lib/detection_engine/routes/__mocks__'; +import { createMockConfig, requestContextMock } from '../lib/detection_engine/routes/__mocks__'; import { EndpointAppContextService, EndpointAppContextServiceSetupContract, @@ -40,6 +39,7 @@ import { parseExperimentalConfigValue } from '../../common/experimental_features import { createCasesClientMock } from '../../../cases/server/client/mocks'; import { requestContextFactoryMock } from '../request_context_factory.mock'; import { EndpointMetadataService } from './services/metadata'; +import { createFleetAuthzMock } from '../../../fleet/common'; /** * Creates a mocked EndpointAppContext. @@ -183,8 +183,7 @@ export function createRouteHandlerContext( dataClient: jest.Mocked, savedObjectsClient: jest.Mocked ) { - const context = - xpackMocks.createRequestHandlerContext() as unknown as jest.Mocked; + const context = requestContextMock.create() as jest.Mocked; context.core.elasticsearch.client = dataClient; context.core.savedObjects.client = savedObjectsClient; return context; diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts index 29a4e5ce0b2996..bd72c5a4044ee1 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.test.ts @@ -48,6 +48,7 @@ import { EndpointDocGenerator } from '../../../../common/endpoint/generate_data' import { legacyMetadataSearchResponseMock } from '../metadata/support/test_support'; import { AGENT_ACTIONS_INDEX, ElasticsearchAssetType } from '../../../../../fleet/common'; import { CasesClientMock } from '../../../../../cases/server/client/mocks'; +import { EndpointAuthz } from '../../../../common/endpoint/types/authz'; interface CallRouteInterface { body?: HostIsolationRequestBody; @@ -55,6 +56,7 @@ interface CallRouteInterface { searchResponse?: HostMetadata; mockUser?: any; license?: License; + authz?: Partial; } const Platinum = licenseMock.createLicense({ license: { type: 'platinum', mode: 'platinum' } }); @@ -182,7 +184,7 @@ describe('Host Isolation', () => { // it returns the requestContext mock used in the call, to assert internal calls (e.g. the indexed document) callRoute = async ( routePrefix: string, - { body, idxResponse, searchResponse, mockUser, license }: CallRouteInterface, + { body, idxResponse, searchResponse, mockUser, license, authz = {} }: CallRouteInterface, indexExists?: { endpointDsExists: boolean } ): Promise> => { const asUser = mockUser ? mockUser : superUser; @@ -191,6 +193,12 @@ describe('Host Isolation', () => { ); const ctx = createRouteHandlerContext(mockScopedClient, mockSavedObjectClient); + + ctx.securitySolution.endpointAuthz = { + ...ctx.securitySolution.endpointAuthz, + ...authz, + }; + // mock _index_template ctx.core.elasticsearch.client.asInternalUser.indices.existsIndexTemplate = jest .fn() @@ -206,6 +214,7 @@ describe('Host Isolation', () => { statusCode: 404, }); }); + const withIdxResp = idxResponse ? idxResponse : { statusCode: 201 }; const mockIndexResponse = jest.fn().mockImplementation(() => Promise.resolve(withIdxResp)); const mockSearchResponse = jest @@ -213,19 +222,25 @@ describe('Host Isolation', () => { .mockImplementation(() => Promise.resolve({ body: legacyMetadataSearchResponseMock(searchResponse) }) ); + if (indexExists) { ctx.core.elasticsearch.client.asInternalUser.index = mockIndexResponse; } + ctx.core.elasticsearch.client.asCurrentUser.index = mockIndexResponse; ctx.core.elasticsearch.client.asCurrentUser.search = mockSearchResponse; + const withLicense = license ? license : Platinum; licenseEmitter.next(withLicense); + const mockRequest = httpServerMock.createKibanaRequest({ body }); const [, routeHandler]: [ RouteConfig, RequestHandler ] = routerMock.post.mock.calls.find(([{ path }]) => path.startsWith(routePrefix))!; + await routeHandler(ctx, mockRequest, mockResponse); + return ctx as unknown as jest.Mocked; }; }); @@ -424,14 +439,17 @@ describe('Host Isolation', () => { }); expect(mockResponse.ok).toBeCalled(); }); - it('prohibits license levels less than platinum from isolating hosts', async () => { - licenseEmitter.next(Gold); + + it('prohibits isolating hosts if no authz for it', async () => { await callRoute(ISOLATE_HOST_ROUTE, { body: { endpoint_ids: ['XYZ'] }, + authz: { canIsolateHost: false }, license: Gold, }); + expect(mockResponse.forbidden).toBeCalled(); }); + it('allows any license level to unisolate', async () => { licenseEmitter.next(Gold); await callRoute(UNISOLATE_HOST_ROUTE, { @@ -442,37 +460,33 @@ describe('Host Isolation', () => { }); }); - describe('User Level', () => { - it('allows superuser to perform isolation', async () => { - const superU = { username: 'foo', roles: ['superuser'] }; + describe('User Authorization Level', () => { + it('allows user to perform isolation when canIsolateHost is true', async () => { await callRoute(ISOLATE_HOST_ROUTE, { body: { endpoint_ids: ['XYZ'] }, - mockUser: superU, }); expect(mockResponse.ok).toBeCalled(); }); - it('allows superuser to perform unisolation', async () => { - const superU = { username: 'foo', roles: ['superuser'] }; + + it('allows user to perform unisolation when canUnIsolateHost is true', async () => { await callRoute(UNISOLATE_HOST_ROUTE, { body: { endpoint_ids: ['XYZ'] }, - mockUser: superU, }); expect(mockResponse.ok).toBeCalled(); }); - it('prohibits non-admin user from performing isolation', async () => { - const superU = { username: 'foo', roles: ['user'] }; + it('prohibits user from performing isolation if canIsolateHost is false', async () => { await callRoute(ISOLATE_HOST_ROUTE, { body: { endpoint_ids: ['XYZ'] }, - mockUser: superU, + authz: { canIsolateHost: false }, }); expect(mockResponse.forbidden).toBeCalled(); }); - it('prohibits non-admin user from performing unisolation', async () => { - const superU = { username: 'foo', roles: ['user'] }; + + it('prohibits user from performing un-isolation if canUnIsolateHost is false', async () => { await callRoute(UNISOLATE_HOST_ROUTE, { body: { endpoint_ids: ['XYZ'] }, - mockUser: superU, + authz: { canUnIsolateHost: false }, }); expect(mockResponse.forbidden).toBeCalled(); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts index 02f0cb4867646a..51f88730eb6fd1 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/isolation.ts @@ -33,7 +33,6 @@ import { import { getMetadataForEndpoints } from '../../services'; import { EndpointAppContext } from '../../types'; import { APP_ID } from '../../../../common/constants'; -import { userCanIsolate } from '../../../../common/endpoint/actions'; import { doLogsEndpointActionDsExists } from '../../utils'; /** @@ -100,25 +99,20 @@ export const isolationRequestHandler = function ( SecuritySolutionRequestHandlerContext > { return async (context, req, res) => { - // only allow admin users - const user = endpointContext.service.security?.authc.getCurrentUser(req); - if (!userCanIsolate(user?.roles)) { - return res.forbidden({ - body: { - message: 'You do not have permission to perform this action', - }, - }); - } + const { canIsolateHost, canUnIsolateHost } = context.securitySolution.endpointAuthz; - // isolation requires plat+ - if (isolate && !endpointContext.service.getLicenseService()?.isPlatinumPlus()) { + // Ensure user has authorization to use this api + if ((!canIsolateHost && isolate) || (!canUnIsolateHost && !isolate)) { return res.forbidden({ body: { - message: 'Your license level does not allow for this action', + message: + 'You do not have permission to perform this action or license level does not allow for this action', }, }); } + const user = endpointContext.service.security?.authc.getCurrentUser(req); + // fetch the Agent IDs to send the commands to const endpointIDs = [...new Set(req.body.endpoint_ids)]; // dedupe const endpointData = await getMetadataForEndpoints(endpointIDs, context); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts index 86bba696991951..8abe054daeaf56 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts @@ -30,6 +30,7 @@ import type { SecuritySolutionApiRequestHandlerContext, SecuritySolutionRequestHandlerContext, } from '../../../../types'; +import { getEndpointAuthzInitialStateMock } from '../../../../../common/endpoint/service/authz'; const createMockClients = () => { const core = coreMock.createRequestHandlerContext(); @@ -93,6 +94,7 @@ const createSecuritySolutionRequestContextMock = ( return { core, + endpointAuthz: getEndpointAuthzInitialStateMock(), getConfig: jest.fn(() => clients.config), getFrameworkRequest: jest.fn(() => { return { diff --git a/x-pack/plugins/security_solution/server/request_context_factory.ts b/x-pack/plugins/security_solution/server/request_context_factory.ts index f6c1d6b44eca62..d4adf55004389f 100644 --- a/x-pack/plugins/security_solution/server/request_context_factory.ts +++ b/x-pack/plugins/security_solution/server/request_context_factory.ts @@ -17,7 +17,18 @@ import { SecuritySolutionPluginCoreSetupDependencies, SecuritySolutionPluginSetupDependencies, } from './plugin_contract'; -import { SecuritySolutionApiRequestHandlerContext } from './types'; +import { + SecuritySolutionApiRequestHandlerContext, + SecuritySolutionRequestHandlerContext, +} from './types'; +import { Immutable } from '../common/endpoint/types'; +import { EndpointAuthz } from '../common/endpoint/types/authz'; +import { + calculateEndpointAuthz, + getEndpointAuthzInitialState, +} from '../common/endpoint/service/authz'; +import { licenseService } from './lib/license'; +import { FleetAuthz } from '../../fleet/common'; export interface IRequestContextFactory { create( @@ -41,7 +52,7 @@ export class RequestContextFactory implements IRequestContextFactory { } public async create( - context: RequestHandlerContext, + context: Omit, request: KibanaRequest ): Promise { const { options, appClientFactory } = this; @@ -55,9 +66,31 @@ export class RequestContextFactory implements IRequestContextFactory { config, }); + let endpointAuthz: Immutable; + let fleetAuthz: FleetAuthz; + + // If Fleet is enabled, then get its Authz + if (startPlugins.fleet) { + fleetAuthz = context.fleet?.authz ?? (await startPlugins.fleet?.authz.fromRequest(request)); + } + return { core: context.core, + get endpointAuthz(): Immutable { + // Lazy getter of endpoint Authz. No point in defining it if it is never used. + if (!endpointAuthz) { + // If no fleet (fleet plugin is optional in the configuration), then just turn off all permissions + if (!startPlugins.fleet) { + endpointAuthz = getEndpointAuthzInitialState(); + } else { + endpointAuthz = calculateEndpointAuthz(licenseService, fleetAuthz); + } + } + + return endpointAuthz; + }, + getConfig: () => config, getFrameworkRequest: () => frameworkRequest, diff --git a/x-pack/plugins/security_solution/server/types.ts b/x-pack/plugins/security_solution/server/types.ts index 82616aa36d27e9..75686d78340702 100644 --- a/x-pack/plugins/security_solution/server/types.ts +++ b/x-pack/plugins/security_solution/server/types.ts @@ -17,10 +17,12 @@ import { AppClient } from './client'; import { ConfigType } from './config'; import { IRuleExecutionLogClient } from './lib/detection_engine/rule_execution_log/types'; import { FrameworkRequest } from './lib/framework'; +import { EndpointAuthz } from '../common/endpoint/types/authz'; export { AppClient }; export interface SecuritySolutionApiRequestHandlerContext extends RequestHandlerContext { + endpointAuthz: EndpointAuthz; getConfig: () => ConfigType; getFrameworkRequest: () => FrameworkRequest; getAppClient: () => AppClient; From 7fb9dee206e045520a1f271f48f498b010340639 Mon Sep 17 00:00:00 2001 From: Miriam <31922082+MiriamAparicio@users.noreply.github.com> Date: Fri, 3 Dec 2021 16:24:16 +0000 Subject: [PATCH 105/126] Rename error rate to failed transactions rate (#120255) * Rename error rate to failed transactions rate * Fix conflict --- ..._error_rate.ts => get_failed_transaction_rate.ts} | 12 ++++++++---- .../service_map/get_service_map_service_node_info.ts | 4 ++-- .../plugins/apm/server/routes/transactions/route.ts | 4 ++-- 3 files changed, 12 insertions(+), 8 deletions(-) rename x-pack/plugins/apm/server/lib/transaction_groups/{get_error_rate.ts => get_failed_transaction_rate.ts} (94%) diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts b/x-pack/plugins/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts similarity index 94% rename from x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts rename to x-pack/plugins/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts index e1dde61bfc3ffa..b4f2c4b4bee118 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/get_error_rate.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/get_failed_transaction_rate.ts @@ -32,7 +32,7 @@ import { getFailedTransactionRateTimeSeries, } from '../helpers/transaction_error_rate'; -export async function getErrorRate({ +export async function getFailedTransactionRate({ environment, kuery, serviceName, @@ -122,7 +122,7 @@ export async function getErrorRate({ return { timeseries, average }; } -export async function getErrorRatePeriods({ +export async function getFailedTransactionRatePeriods({ environment, kuery, serviceName, @@ -157,11 +157,15 @@ export async function getErrorRatePeriods({ searchAggregatedTransactions, }; - const currentPeriodPromise = getErrorRate({ ...commonProps, start, end }); + const currentPeriodPromise = getFailedTransactionRate({ + ...commonProps, + start, + end, + }); const previousPeriodPromise = comparisonStart && comparisonEnd - ? getErrorRate({ + ? getFailedTransactionRate({ ...commonProps, start: comparisonStart, end: comparisonEnd, diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts index ad2ab74098c228..545fb4dbc46060 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_map_service_node_info.ts @@ -29,7 +29,7 @@ import { getDurationFieldForTransactions, getProcessorEventForTransactions, } from '../../lib/helpers/transactions'; -import { getErrorRate } from '../../lib/transaction_groups/get_error_rate'; +import { getFailedTransactionRate } from '../../lib/transaction_groups/get_failed_transaction_rate'; import { withApmSpan } from '../../utils/with_apm_span'; import { percentCgroupMemoryUsedScript, @@ -123,7 +123,7 @@ async function getFailedTransactionsRateStats({ numBuckets, }: TaskParameters): Promise { return withApmSpan('get_error_rate_for_service_map_node', async () => { - const { average, timeseries } = await getErrorRate({ + const { average, timeseries } = await getFailedTransactionRate({ environment, setup, serviceName, diff --git a/x-pack/plugins/apm/server/routes/transactions/route.ts b/x-pack/plugins/apm/server/routes/transactions/route.ts index fb73fe1555965b..b9db2762bce934 100644 --- a/x-pack/plugins/apm/server/routes/transactions/route.ts +++ b/x-pack/plugins/apm/server/routes/transactions/route.ts @@ -19,7 +19,7 @@ import { getServiceTransactionGroupDetailedStatisticsPeriods } from '../services import { getTransactionBreakdown } from './breakdown'; import { getTransactionTraceSamples } from './trace_samples'; import { getLatencyPeriods } from './get_latency_charts'; -import { getErrorRatePeriods } from '../../lib/transaction_groups/get_error_rate'; +import { getFailedTransactionRatePeriods } from '../../lib/transaction_groups/get_failed_transaction_rate'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; import { createApmServerRouteRepository } from '../apm_routes/create_apm_server_route_repository'; import { @@ -349,7 +349,7 @@ const transactionChartsErrorRateRoute = createApmServerRoute({ end, }); - return getErrorRatePeriods({ + return getFailedTransactionRatePeriods({ environment, kuery, serviceName, From 80660f168676604791870f91fe8eaf691ed75808 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Fri, 3 Dec 2021 08:27:41 -0800 Subject: [PATCH 106/126] [Fleet] Renable skipped test for limited packages (#120293) * Renable skipped test for limited packages * Try with newer endpoint package version. Test pass locally... --- .../fleet_api_integration/apis/package_policy/create.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/create.ts b/x-pack/test/fleet_api_integration/apis/package_policy/create.ts index d568e7224fd200..1815ab91b53165 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/create.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/create.ts @@ -199,8 +199,7 @@ export default function (providerContext: FtrProviderContext) { .expect(400); }); - // https://github.com/elastic/kibana/issues/118257 - it.skip('should not allow multiple limited packages on the same agent policy', async function () { + it('should not allow multiple limited packages on the same agent policy', async function () { await supertest .post(`/api/fleet/package_policies`) .set('kbn-xsrf', 'xxxx') @@ -215,7 +214,7 @@ export default function (providerContext: FtrProviderContext) { package: { name: 'endpoint', title: 'Endpoint', - version: '0.13.0', + version: '1.3.0-dev.0', }, }) .expect(200); @@ -233,7 +232,7 @@ export default function (providerContext: FtrProviderContext) { package: { name: 'endpoint', title: 'Endpoint', - version: '0.13.0', + version: '1.3.0-dev.0', }, }) .expect(400); From c7a06cdcbf844cdfecdbf9856c891915e124f3e3 Mon Sep 17 00:00:00 2001 From: Kyle Pollich Date: Fri, 3 Dec 2021 11:58:56 -0500 Subject: [PATCH 107/126] [Fleet] Wire Fleet setup status to core Kibana status API (#120020) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Wire Fleet setup status to core Kibana status API * Remove fake error from testing 🙃 * Apply suggestion for PR review Co-authored-by: Josh Dover <1813008+joshdover@users.noreply.github.com> * Add error message to meta upon Fleet setup failure * Mark fleet as available if setup fails - for now * Fix failing API key tests Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Josh Dover <1813008+joshdover@users.noreply.github.com> --- x-pack/plugins/fleet/server/plugin.ts | 37 ++++++++++++++++++- .../functional/apps/api_keys/home_page.ts | 3 ++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 4b45cf645201c1..1e421fefce835d 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -6,6 +6,7 @@ */ import type { Observable } from 'rxjs'; +import { BehaviorSubject } from 'rxjs'; import type { CoreSetup, CoreStart, @@ -16,13 +17,18 @@ import type { SavedObjectsServiceStart, HttpServiceSetup, KibanaRequest, + ServiceStatus, ElasticsearchClient, } from 'kibana/server'; import type { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import type { TelemetryPluginSetup, TelemetryPluginStart } from 'src/plugins/telemetry/server'; -import { DEFAULT_APP_CATEGORIES, SavedObjectsClient } from '../../../../src/core/server'; +import { + DEFAULT_APP_CATEGORIES, + SavedObjectsClient, + ServiceStatusLevels, +} from '../../../../src/core/server'; import type { PluginStart as DataPluginStart } from '../../../../src/plugins/data/server'; import type { LicensingPluginSetup, ILicense } from '../../licensing/server'; import type { @@ -182,6 +188,7 @@ export class FleetPlugin private securitySetup?: SecurityPluginSetup; private encryptedSavedObjectsSetup?: EncryptedSavedObjectsPluginSetup; private readonly telemetryEventsSender: TelemetryEventsSender; + private readonly fleetStatus$: BehaviorSubject; private agentService?: AgentService; @@ -193,6 +200,11 @@ export class FleetPlugin this.logger = this.initializerContext.logger.get(); this.configInitialValue = this.initializerContext.config.get(); this.telemetryEventsSender = new TelemetryEventsSender(this.logger.get('telemetry_events')); + + this.fleetStatus$ = new BehaviorSubject({ + level: ServiceStatusLevels.unavailable, + summary: 'Fleet is unavailable', + }); } public setup(core: CoreSetup, deps: FleetSetupDeps) { @@ -203,6 +215,8 @@ export class FleetPlugin this.securitySetup = deps.security; const config = this.configInitialValue; + core.status.set(this.fleetStatus$.asObservable()); + registerSavedObjects(core.savedObjects, deps.encryptedSavedObjects); registerEncryptedSavedObjects(deps.encryptedSavedObjects); @@ -357,13 +371,33 @@ export class FleetPlugin const fleetSetupPromise = (async () => { try { + this.fleetStatus$.next({ + level: ServiceStatusLevels.degraded, + summary: 'Fleet is setting up', + }); + await setupFleet( new SavedObjectsClient(core.savedObjects.createInternalRepository()), core.elasticsearch.client.asInternalUser ); + + this.fleetStatus$.next({ + level: ServiceStatusLevels.available, + summary: 'Fleet is available', + }); } catch (error) { logger.warn('Fleet setup failed'); logger.warn(error); + + this.fleetStatus$.next({ + // As long as Fleet has a dependency on EPR, we can't reliably set Kibana status to `unavailable` here. + // See https://github.com/elastic/kibana/issues/120237 + level: ServiceStatusLevels.available, + summary: 'Fleet setup failed', + meta: { + error: error.message, + }, + }); } })(); @@ -400,6 +434,7 @@ export class FleetPlugin appContextService.stop(); licenseService.stop(); this.telemetryEventsSender.stop(); + this.fleetStatus$.complete(); } private setupAgentService(internalEsClient: ElasticsearchClient): AgentService { diff --git a/x-pack/test/functional/apps/api_keys/home_page.ts b/x-pack/test/functional/apps/api_keys/home_page.ts index 59072475275850..c2dbcc1046f54a 100644 --- a/x-pack/test/functional/apps/api_keys/home_page.ts +++ b/x-pack/test/functional/apps/api_keys/home_page.ts @@ -42,6 +42,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await security.testUser.setRoles(['kibana_admin']); await security.testUser.setRoles(['test_api_keys']); await pageObjects.common.navigateToApp('apiKeys'); + + // Delete any API keys created outside of these tests + await pageObjects.apiKeys.bulkDeleteApiKeys(); }); afterEach(async () => { From ffbe19cf4658ad64f274bd913a43465162da70a5 Mon Sep 17 00:00:00 2001 From: Yaroslav Kuznietsov Date: Fri, 3 Dec 2021 19:26:03 +0200 Subject: [PATCH 108/126] [Canvas] Added KibanaThemeProvider to expression_reveal_image. (#120094) * Added kibanaThemeProvider to expression_reveal_image. Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../expression_reveal_image/kibana.json | 2 +- .../reveal_image_renderer.stories.tsx | 4 +- .../public/expression_renderers/index.ts | 6 +- .../reveal_image_renderer.tsx | 55 +++++++++++-------- .../expression_reveal_image/public/index.ts | 5 +- .../expression_reveal_image/public/plugin.ts | 4 +- .../canvas_plugin_src/renderers/external.ts | 10 +--- .../shareable_runtime/supported_renderers.js | 4 +- 8 files changed, 45 insertions(+), 45 deletions(-) diff --git a/src/plugins/expression_reveal_image/kibana.json b/src/plugins/expression_reveal_image/kibana.json index dad7fdfe2bc5f8..5fb13ce31247b7 100755 --- a/src/plugins/expression_reveal_image/kibana.json +++ b/src/plugins/expression_reveal_image/kibana.json @@ -11,5 +11,5 @@ "ui": true, "requiredPlugins": ["expressions", "presentationUtil"], "optionalPlugins": [], - "requiredBundles": [] + "requiredBundles": ["kibanaReact"] } diff --git a/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx b/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx index 863d8d1000f385..22dd2ef4156df7 100644 --- a/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx +++ b/src/plugins/expression_reveal_image/public/expression_renderers/__stories__/reveal_image_renderer.stories.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { storiesOf } from '@storybook/react'; -import { revealImageRenderer } from '../'; +import { getRevealImageRenderer } from '../'; import { getElasticOutline, getElasticLogo } from '../../../../presentation_util/public'; import { Render, waitFor } from '../../../../presentation_util/public/__stories__'; import { Origin } from '../../../common/types/expression_functions'; @@ -26,7 +26,7 @@ const Renderer = ({ origin: Origin.LEFT, percent: 0.45, }; - return ; + return ; }; storiesOf('renderers/revealImage', module).add( diff --git a/src/plugins/expression_reveal_image/public/expression_renderers/index.ts b/src/plugins/expression_reveal_image/public/expression_renderers/index.ts index 433a81884f157e..959a630b08b515 100644 --- a/src/plugins/expression_reveal_image/public/expression_renderers/index.ts +++ b/src/plugins/expression_reveal_image/public/expression_renderers/index.ts @@ -6,8 +6,4 @@ * Side Public License, v 1. */ -import { revealImageRenderer } from './reveal_image_renderer'; - -export const renderers = [revealImageRenderer]; - -export { revealImageRenderer }; +export { revealImageRendererFactory, getRevealImageRenderer } from './reveal_image_renderer'; diff --git a/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx b/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx index d4dec3a8a58257..6bdd0142964199 100644 --- a/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx +++ b/src/plugins/expression_reveal_image/public/expression_renderers/reveal_image_renderer.tsx @@ -7,10 +7,14 @@ */ import React, { lazy } from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; +import { Observable } from 'rxjs'; +import { CoreTheme } from 'kibana/public'; import { I18nProvider } from '@kbn/i18n-react'; import { ExpressionRenderDefinition, IInterpreterRenderHandlers } from 'src/plugins/expressions'; import { i18n } from '@kbn/i18n'; -import { withSuspense } from '../../../presentation_util/public'; +import { CoreSetup } from '../../../../core/public'; +import { KibanaThemeProvider } from '../../../kibana_react/public'; +import { withSuspense, defaultTheme$ } from '../../../presentation_util/public'; import { RevealImageRendererConfig } from '../../common/types'; export const strings = { @@ -27,25 +31,32 @@ export const strings = { const LazyRevealImageComponent = lazy(() => import('../components/reveal_image_component')); const RevealImageComponent = withSuspense(LazyRevealImageComponent, null); -export const revealImageRenderer = (): ExpressionRenderDefinition => ({ - name: 'revealImage', - displayName: strings.getDisplayName(), - help: strings.getHelpDescription(), - reuseDomNode: true, - render: ( - domNode: HTMLElement, - config: RevealImageRendererConfig, - handlers: IInterpreterRenderHandlers - ) => { - handlers.onDestroy(() => { - unmountComponentAtNode(domNode); - }); +export const getRevealImageRenderer = + (theme$: Observable = defaultTheme$) => + (): ExpressionRenderDefinition => ({ + name: 'revealImage', + displayName: strings.getDisplayName(), + help: strings.getHelpDescription(), + reuseDomNode: true, + render: ( + domNode: HTMLElement, + config: RevealImageRendererConfig, + handlers: IInterpreterRenderHandlers + ) => { + handlers.onDestroy(() => { + unmountComponentAtNode(domNode); + }); - render( - - - , - domNode - ); - }, -}); + render( + + + + + , + domNode + ); + }, + }); + +export const revealImageRendererFactory = (core: CoreSetup) => + getRevealImageRenderer(core.theme.theme$); diff --git a/src/plugins/expression_reveal_image/public/index.ts b/src/plugins/expression_reveal_image/public/index.ts index 66512a1126b062..736e062475e6a3 100755 --- a/src/plugins/expression_reveal_image/public/index.ts +++ b/src/plugins/expression_reveal_image/public/index.ts @@ -6,9 +6,6 @@ * Side Public License, v 1. */ -// TODO: https://github.com/elastic/kibana/issues/110893 -/* eslint-disable @kbn/eslint/no_export_all */ - import { ExpressionRevealImagePlugin } from './plugin'; export type { ExpressionRevealImagePluginSetup, ExpressionRevealImagePluginStart } from './plugin'; @@ -17,4 +14,4 @@ export function plugin() { return new ExpressionRevealImagePlugin(); } -export * from './expression_renderers'; +export { revealImageRendererFactory, getRevealImageRenderer } from './expression_renderers'; diff --git a/src/plugins/expression_reveal_image/public/plugin.ts b/src/plugins/expression_reveal_image/public/plugin.ts index c5e1b5c8d916f1..17bff3f33e8ac9 100755 --- a/src/plugins/expression_reveal_image/public/plugin.ts +++ b/src/plugins/expression_reveal_image/public/plugin.ts @@ -8,7 +8,7 @@ import { CoreSetup, CoreStart, Plugin } from '../../../core/public'; import { ExpressionsStart, ExpressionsSetup } from '../../expressions/public'; -import { revealImageRenderer } from './expression_renderers'; +import { revealImageRendererFactory } from './expression_renderers'; import { revealImageFunction } from '../common/expression_functions'; interface SetupDeps { @@ -33,7 +33,7 @@ export class ExpressionRevealImagePlugin { public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRevealImagePluginSetup { expressions.registerFunction(revealImageFunction); - expressions.registerRenderer(revealImageRenderer); + expressions.registerRenderer(revealImageRendererFactory(core)); } public start(core: CoreStart): ExpressionRevealImagePluginStart {} diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts index 9e2a51065eb6c6..569669032cb0b1 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/external.ts @@ -11,23 +11,19 @@ import { errorRendererFactory, debugRendererFactory, } from '../../../../../src/plugins/expression_error/public'; +import { revealImageRendererFactory } from '../../../../../src/plugins/expression_reveal_image/public'; import { repeatImageRendererFactory } from '../../../../../src/plugins/expression_repeat_image/public'; -import { revealImageRenderer } from '../../../../../src/plugins/expression_reveal_image/public'; import { shapeRenderer, progressRenderer, } from '../../../../../src/plugins/expression_shape/public'; -export const renderFunctions = [ - imageRenderer, - revealImageRenderer, - shapeRenderer, - progressRenderer, -]; +export const renderFunctions = [imageRenderer, shapeRenderer, progressRenderer]; export const renderFunctionFactories = [ debugRendererFactory, errorRendererFactory, + revealImageRendererFactory, repeatImageRendererFactory, metricRendererFactory, ]; diff --git a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js index 84150a6a9e82e8..01b8cc98ba5ecd 100644 --- a/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js +++ b/x-pack/plugins/canvas/shareable_runtime/supported_renderers.js @@ -15,8 +15,8 @@ import { getErrorRenderer, getDebugRenderer, } from '../../../../src/plugins/expression_error/public'; +import { getRevealImageRenderer } from '../../../../src/plugins/expression_reveal_image/public'; import { getRepeatImageRenderer } from '../../../../src/plugins/expression_repeat_image/public'; -import { revealImageRenderer as revealImage } from '../../../../src/plugins/expression_reveal_image/public'; import { shapeRenderer as shape, progressRenderer as progress, @@ -31,6 +31,7 @@ const renderFunctionsFactories = [ getTableRenderer, getErrorRenderer, getDebugRenderer, + getRevealImageRenderer, getRepeatImageRenderer, getMetricRenderer, ]; @@ -42,7 +43,6 @@ const renderFunctionsFactories = [ */ export const renderFunctions = [ image, - revealImage, pie, plot, progress, From 72765c9de4247161e2672abae4e4bfc0282cb5aa Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Fri, 3 Dec 2021 11:33:28 -0700 Subject: [PATCH 109/126] [maps] rename layer types provide more distinguishable names that better reflect layer (#118617) * [maps] rename layer types provide more distinguishable names that better refect layer * fix migration rename * revert extends change for EmsVectorTileLayer * tsling * fix regression and jest test * extend from Abstract instead of RasterTile * better fix * fix tests * more test fixes * update path for newly merged code Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../__mocks__/regions_layer.mock.ts | 4 +- .../VisitorBreakdownMap/useLayerList.ts | 4 +- .../choropleth_map.tsx | 2 +- x-pack/plugins/maps/common/constants.ts | 8 +- .../layer_descriptor_types.ts | 2 +- .../migrations/add_field_meta_options.js | 5 +- .../migrations/add_field_meta_options.test.js | 6 +- .../migrations/add_type_to_termjoin.test.ts | 4 +- .../ems_raster_tile_to_ems_vector_tile.js | 8 +- .../common/migrations/join_agg_key.test.ts | 3 +- .../maps/common/migrations/join_agg_key.ts | 3 +- .../migrate_symbol_style_descriptor.js | 5 +- .../migrate_symbol_style_descriptor.test.js | 8 +- .../migrations/rename_layer_types.test.ts | 83 +++++++++++++++++++ .../common/migrations/rename_layer_types.ts | 49 +++++++++++ .../public/actions/data_request_actions.ts | 2 +- .../create_basemap_layer_descriptor.test.ts | 4 +- .../layers/create_basemap_layer_descriptor.ts | 8 +- .../ems_vector_tile_layer.test.ts | 53 ++++++++++++ .../ems_vector_tile_layer.tsx} | 43 ++++++++-- .../raster_tile_layer.test.ts} | 12 ++- .../raster_tile_layer.ts} | 18 ++-- .../geojson_vector_layer.tsx | 2 +- .../mvt_vector_layer/mvt_vector_layer.tsx | 2 +- .../layers/vector_layer/vector_layer.tsx | 2 +- .../vector_tile_layer.test.ts | 75 ----------------- .../create_layer_descriptor.test.ts | 4 +- .../security/create_layer_descriptors.test.ts | 18 ++-- .../ems_base_map_layer_wizard.tsx | 6 +- .../update_source_editor.test.tsx | 2 +- .../update_source_editor.tsx | 8 +- .../es_search_source/util/scaling_form.tsx | 4 +- .../kibana_base_map_layer_wizard.tsx | 4 +- .../sources/wms_source/wms_layer_wizard.tsx | 4 +- .../sources/xyz_tms_source/layer_wizard.tsx | 4 +- .../edit_layer_panel.test.tsx | 2 +- .../connected_components/mb_map/utils.ts | 2 +- x-pack/plugins/maps/public/locators.test.ts | 4 +- .../public/selectors/map_selectors.test.ts | 4 +- .../maps/public/selectors/map_selectors.ts | 18 ++-- .../visualize_geo_field_action.ts | 2 +- .../maps/server/embeddable_migrations.ts | 13 +++ .../maps_telemetry/maps_telemetry.test.js | 2 +- .../server/maps_telemetry/maps_telemetry.ts | 2 +- .../sample_map_saved_objects.json | 8 +- .../maps/server/maps_telemetry/util.ts | 2 +- .../saved_objects/saved_object_migrations.js | 14 ++++ .../application/explorer/anomalies_map.tsx | 2 +- .../api_integration/apis/maps/migrations.js | 4 +- 49 files changed, 359 insertions(+), 189 deletions(-) create mode 100644 x-pack/plugins/maps/common/migrations/rename_layer_types.test.ts create mode 100644 x-pack/plugins/maps/common/migrations/rename_layer_types.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.test.ts rename x-pack/plugins/maps/public/classes/layers/{vector_tile_layer/vector_tile_layer.tsx => ems_vector_tile_layer/ems_vector_tile_layer.tsx} (93%) rename x-pack/plugins/maps/public/classes/layers/{tile_layer/tile_layer.test.ts => raster_tile_layer/raster_tile_layer.test.ts} (88%) rename x-pack/plugins/maps/public/classes/layers/{tile_layer/tile_layer.ts => raster_tile_layer/raster_tile_layer.ts} (92%) delete mode 100644 x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.test.ts diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts index 52bd024d8116b8..81b0a71e8d9436 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts @@ -79,7 +79,7 @@ export const mockLayerList = [ maxZoom: 24, alpha: 0.75, visible: true, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', }, { joins: [ @@ -148,6 +148,6 @@ export const mockLayerList = [ maxZoom: 24, alpha: 0.75, visible: true, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', }, ]; diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/useLayerList.ts b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/useLayerList.ts index 7f81e9d1051867..f573a2641b8641 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/useLayerList.ts +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/useLayerList.ts @@ -155,7 +155,7 @@ export function useLayerList() { maxZoom: 24, alpha: 0.75, visible: true, - type: LAYER_TYPE.VECTOR, + type: LAYER_TYPE.GEOJSON_VECTOR, }; ES_TERM_SOURCE_REGION.whereQuery = getWhereQuery(serviceName!); @@ -179,7 +179,7 @@ export function useLayerList() { maxZoom: 24, alpha: 0.75, visible: true, - type: LAYER_TYPE.VECTOR, + type: LAYER_TYPE.GEOJSON_VECTOR, }; return [ diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx index 507bfc36d47f04..bf767c7e652077 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx @@ -87,7 +87,7 @@ export const getChoroplethTopValuesLayer = ( }, isTimeAware: true, }, - type: LAYER_TYPE.VECTOR, + type: LAYER_TYPE.GEOJSON_VECTOR, }; }; diff --git a/x-pack/plugins/maps/common/constants.ts b/x-pack/plugins/maps/common/constants.ts index 0f2ce2c9177384..43cca5f0c6a075 100644 --- a/x-pack/plugins/maps/common/constants.ts +++ b/x-pack/plugins/maps/common/constants.ts @@ -49,12 +49,12 @@ export function getEditPath(id: string | undefined) { } export enum LAYER_TYPE { - TILE = 'TILE', - VECTOR = 'VECTOR', - VECTOR_TILE = 'VECTOR_TILE', // for static display of mvt vector tiles with a mapbox stylesheet. Does not support any ad-hoc configurations. Used for consuming EMS vector tiles. + RASTER_TILE = 'RASTER_TILE', + GEOJSON_VECTOR = 'GEOJSON_VECTOR', + EMS_VECTOR_TILE = 'EMS_VECTOR_TILE', HEATMAP = 'HEATMAP', BLENDED_VECTOR = 'BLENDED_VECTOR', - TILED_VECTOR = 'TILED_VECTOR', // similar to a regular vector-layer, but it consumes the data as .mvt tilea iso GeoJson. It supports similar ad-hoc configurations like a regular vector layer (E.g. using IVectorStyle), although there is some loss of functionality e.g. does not support term joining + MVT_VECTOR = 'MVT_VECTOR', } export enum SOURCE_TYPES { diff --git a/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts b/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts index 4d687969308bbe..044678b918fde3 100644 --- a/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts +++ b/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts @@ -66,7 +66,7 @@ export type LayerDescriptor = { }; export type VectorLayerDescriptor = LayerDescriptor & { - type: LAYER_TYPE.VECTOR | LAYER_TYPE.TILED_VECTOR | LAYER_TYPE.BLENDED_VECTOR; + type: LAYER_TYPE.GEOJSON_VECTOR | LAYER_TYPE.MVT_VECTOR | LAYER_TYPE.BLENDED_VECTOR; joins?: JoinDescriptor[]; style: VectorStyleDescriptor; }; diff --git a/x-pack/plugins/maps/common/migrations/add_field_meta_options.js b/x-pack/plugins/maps/common/migrations/add_field_meta_options.js index 33a98c7dbf33ce..736fd30bfbcbbe 100644 --- a/x-pack/plugins/maps/common/migrations/add_field_meta_options.js +++ b/x-pack/plugins/maps/common/migrations/add_field_meta_options.js @@ -6,11 +6,12 @@ */ import _ from 'lodash'; -import { LAYER_TYPE, STYLE_TYPE } from '../constants'; +import { STYLE_TYPE } from '../constants'; function isVectorLayer(layerDescriptor) { const layerType = _.get(layerDescriptor, 'type'); - return layerType === LAYER_TYPE.VECTOR; + // can not use LAYER_TYPE because LAYER_TYPE.VECTOR does not exist >8.1 + return layerType === 'VECTOR'; } export function addFieldMetaOptions({ attributes }) { diff --git a/x-pack/plugins/maps/common/migrations/add_field_meta_options.test.js b/x-pack/plugins/maps/common/migrations/add_field_meta_options.test.js index 31300707d147d5..60587e56bdbae1 100644 --- a/x-pack/plugins/maps/common/migrations/add_field_meta_options.test.js +++ b/x-pack/plugins/maps/common/migrations/add_field_meta_options.test.js @@ -41,7 +41,7 @@ describe('addFieldMetaOptions', () => { test('Should ignore static style properties', () => { const layerListJSON = JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { type: 'VECTOR', properties: { @@ -68,7 +68,7 @@ describe('addFieldMetaOptions', () => { test('Should add field meta options to dynamic style properties', () => { const layerListJSON = JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { type: 'VECTOR', properties: { @@ -94,7 +94,7 @@ describe('addFieldMetaOptions', () => { title: 'my map', layerListJSON: JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { type: 'VECTOR', properties: { diff --git a/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.test.ts b/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.test.ts index d795e63bf81d1d..5229380ac55f4e 100644 --- a/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.test.ts +++ b/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.test.ts @@ -6,14 +6,14 @@ */ import { addTypeToTermJoin } from './add_type_to_termjoin'; -import { LAYER_TYPE, SOURCE_TYPES } from '../constants'; +import { SOURCE_TYPES } from '../constants'; import { LayerDescriptor } from '../descriptor_types'; describe('addTypeToTermJoin', () => { test('Should handle missing type attribute', () => { const layerListJSON = JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', joins: [ { right: {}, diff --git a/x-pack/plugins/maps/common/migrations/ems_raster_tile_to_ems_vector_tile.js b/x-pack/plugins/maps/common/migrations/ems_raster_tile_to_ems_vector_tile.js index 2945b9efed958d..4cf5407d796912 100644 --- a/x-pack/plugins/maps/common/migrations/ems_raster_tile_to_ems_vector_tile.js +++ b/x-pack/plugins/maps/common/migrations/ems_raster_tile_to_ems_vector_tile.js @@ -6,7 +6,7 @@ */ import _ from 'lodash'; -import { SOURCE_TYPES, LAYER_TYPE } from '../constants'; +import { SOURCE_TYPES } from '../constants'; function isEmsTileSource(layerDescriptor) { const sourceType = _.get(layerDescriptor, 'sourceDescriptor.type'); @@ -15,7 +15,8 @@ function isEmsTileSource(layerDescriptor) { function isTileLayer(layerDescriptor) { const layerType = _.get(layerDescriptor, 'type'); - return layerType === LAYER_TYPE.TILE; + // can not use LAYER_TYPE because LAYER_TYPE.TILE does not exist >8.1 + return layerType === 'TILE'; } export function emsRasterTileToEmsVectorTile({ attributes }) { @@ -33,7 +34,8 @@ export function emsRasterTileToEmsVectorTile({ attributes }) { layerList.forEach((layer) => { if (isTileLayer(layer) && isEmsTileSource(layer)) { // Just need to switch layer type to migrate TILE layer to VECTOR_TILE layer - layer.type = LAYER_TYPE.VECTOR_TILE; + // can not use LAYER_TYPE because LAYER_TYPE.VECTOR_TILE does not exist >8.1 + layer.type = 'VECTOR_TILE'; } }); diff --git a/x-pack/plugins/maps/common/migrations/join_agg_key.test.ts b/x-pack/plugins/maps/common/migrations/join_agg_key.test.ts index 96d60e2f92385a..3926c017a95027 100644 --- a/x-pack/plugins/maps/common/migrations/join_agg_key.test.ts +++ b/x-pack/plugins/maps/common/migrations/join_agg_key.test.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { LAYER_TYPE } from '../constants'; import { migrateJoinAggKey } from './join_agg_key'; describe('migrateJoinAggKey', () => { @@ -65,7 +64,7 @@ describe('migrateJoinAggKey', () => { test('Should migrate vector styles from legacy join agg key to new join agg key', () => { const layerListJSON = JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', joins, style: { properties: { diff --git a/x-pack/plugins/maps/common/migrations/join_agg_key.ts b/x-pack/plugins/maps/common/migrations/join_agg_key.ts index 726855783be63f..ae102f2ed540f3 100644 --- a/x-pack/plugins/maps/common/migrations/join_agg_key.ts +++ b/x-pack/plugins/maps/common/migrations/join_agg_key.ts @@ -71,7 +71,8 @@ export function migrateJoinAggKey({ layerList.forEach((layerDescriptor: LayerDescriptor) => { if ( - layerDescriptor.type === LAYER_TYPE.VECTOR || + // can not use LAYER_TYPE because LAYER_TYPE.VECTOR does not exist >8.1 + layerDescriptor.type === 'VECTOR' || layerDescriptor.type === LAYER_TYPE.BLENDED_VECTOR ) { const vectorLayerDescriptor = layerDescriptor as VectorLayerDescriptor; diff --git a/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.js b/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.js index 6dab8595663ed3..4aa0b741484382 100644 --- a/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.js +++ b/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.js @@ -6,11 +6,12 @@ */ import _ from 'lodash'; -import { DEFAULT_ICON, LAYER_TYPE, STYLE_TYPE, SYMBOLIZE_AS_TYPES } from '../constants'; +import { DEFAULT_ICON, STYLE_TYPE, SYMBOLIZE_AS_TYPES } from '../constants'; function isVectorLayer(layerDescriptor) { const layerType = _.get(layerDescriptor, 'type'); - return layerType === LAYER_TYPE.VECTOR; + // can not use LAYER_TYPE because LAYER_TYPE.VECTOR does not exist >8.1 + return layerType === 'VECTOR'; } export function migrateSymbolStyleDescriptor({ attributes }) { diff --git a/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.test.js b/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.test.js index 89f3c05e621ec0..9932fe1625c9df 100644 --- a/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.test.js +++ b/x-pack/plugins/maps/common/migrations/migrate_symbol_style_descriptor.test.js @@ -41,7 +41,7 @@ describe('migrateSymbolStyleDescriptor', () => { test('Should migrate "symbol" style descriptor', () => { const layerListJSON = JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { properties: { fillColor: { @@ -66,7 +66,7 @@ describe('migrateSymbolStyleDescriptor', () => { title: 'my map', layerListJSON: JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { properties: { fillColor: { @@ -90,7 +90,7 @@ describe('migrateSymbolStyleDescriptor', () => { test('Should migrate style descriptor without "symbol"', () => { const layerListJSON = JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { properties: { fillColor: { @@ -109,7 +109,7 @@ describe('migrateSymbolStyleDescriptor', () => { title: 'my map', layerListJSON: JSON.stringify([ { - type: LAYER_TYPE.VECTOR, + type: 'VECTOR', style: { properties: { fillColor: { diff --git a/x-pack/plugins/maps/common/migrations/rename_layer_types.test.ts b/x-pack/plugins/maps/common/migrations/rename_layer_types.test.ts new file mode 100644 index 00000000000000..2504a2adb31aa7 --- /dev/null +++ b/x-pack/plugins/maps/common/migrations/rename_layer_types.test.ts @@ -0,0 +1,83 @@ +/* + * Copyright 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 { renameLayerTypes } from './rename_layer_types'; + +describe('renameLayerTypes', () => { + test('Should handle missing layerListJSON attribute', () => { + const attributes = { + title: 'my map', + }; + expect(renameLayerTypes({ attributes })).toEqual({ + title: 'my map', + }); + }); + + test('Should rename TILED_VECTOR to MVT_VECTOR', () => { + const layerListJSON = JSON.stringify([ + { + type: 'TILED_VECTOR', + }, + ]); + const attributes = { + title: 'my map', + layerListJSON, + }; + expect(renameLayerTypes({ attributes })).toEqual({ + title: 'my map', + layerListJSON: '[{"type":"MVT_VECTOR"}]', + }); + }); + + test('Should rename VECTOR_TILE to EMS_VECTOR_TILE', () => { + const layerListJSON = JSON.stringify([ + { + type: 'VECTOR_TILE', + }, + ]); + const attributes = { + title: 'my map', + layerListJSON, + }; + expect(renameLayerTypes({ attributes })).toEqual({ + title: 'my map', + layerListJSON: '[{"type":"EMS_VECTOR_TILE"}]', + }); + }); + + test('Should rename VECTOR to GEOJSON_VECTOR', () => { + const layerListJSON = JSON.stringify([ + { + type: 'VECTOR', + }, + ]); + const attributes = { + title: 'my map', + layerListJSON, + }; + expect(renameLayerTypes({ attributes })).toEqual({ + title: 'my map', + layerListJSON: '[{"type":"GEOJSON_VECTOR"}]', + }); + }); + + test('Should rename TILE to RASTER_TILE', () => { + const layerListJSON = JSON.stringify([ + { + type: 'TILE', + }, + ]); + const attributes = { + title: 'my map', + layerListJSON, + }; + expect(renameLayerTypes({ attributes })).toEqual({ + title: 'my map', + layerListJSON: '[{"type":"RASTER_TILE"}]', + }); + }); +}); diff --git a/x-pack/plugins/maps/common/migrations/rename_layer_types.ts b/x-pack/plugins/maps/common/migrations/rename_layer_types.ts new file mode 100644 index 00000000000000..6ba924ff322682 --- /dev/null +++ b/x-pack/plugins/maps/common/migrations/rename_layer_types.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 { LAYER_TYPE } from '../constants'; +import { LayerDescriptor } from '../descriptor_types'; +import { MapSavedObjectAttributes } from '../map_saved_object_type'; + +// LAYER_TYPE constants renamed in 8.1 to provide more distinguishable names that better refect layer. +// TILED_VECTOR replaced with MVT_VECTOR +// VECTOR_TILE replaced with EMS_VECTOR_TILE +// VECTOR replaced with GEOJSON_VECTOR +// TILE replaced with RASTER_TILE +export function renameLayerTypes({ + attributes, +}: { + attributes: MapSavedObjectAttributes; +}): MapSavedObjectAttributes { + if (!attributes || !attributes.layerListJSON) { + return attributes; + } + + let layerList: LayerDescriptor[] = []; + try { + layerList = JSON.parse(attributes.layerListJSON); + } catch (e) { + throw new Error('Unable to parse attribute layerListJSON'); + } + + layerList.forEach((layerDescriptor: LayerDescriptor) => { + if (layerDescriptor.type === 'TILED_VECTOR') { + layerDescriptor.type = LAYER_TYPE.MVT_VECTOR; + } else if (layerDescriptor.type === 'VECTOR_TILE') { + layerDescriptor.type = LAYER_TYPE.EMS_VECTOR_TILE; + } else if (layerDescriptor.type === 'VECTOR') { + layerDescriptor.type = LAYER_TYPE.GEOJSON_VECTOR; + } else if (layerDescriptor.type === 'TILE') { + layerDescriptor.type = LAYER_TYPE.RASTER_TILE; + } + }); + + return { + ...attributes, + layerListJSON: JSON.stringify(layerList), + }; +} diff --git a/x-pack/plugins/maps/public/actions/data_request_actions.ts b/x-pack/plugins/maps/public/actions/data_request_actions.ts index c1a6d05cc05779..730135424a4dda 100644 --- a/x-pack/plugins/maps/public/actions/data_request_actions.ts +++ b/x-pack/plugins/maps/public/actions/data_request_actions.ts @@ -287,7 +287,7 @@ function endDataLoad( const eventHandlers = getEventHandlers(getState()); if (eventHandlers && eventHandlers.onDataLoadEnd) { const resultMeta: ResultMeta = {}; - if (layer && layer.getType() === LAYER_TYPE.VECTOR) { + if (layer && layer.getType() === LAYER_TYPE.GEOJSON_VECTOR) { const featuresWithoutCentroids = features.filter((feature) => { return feature.properties ? !feature.properties[KBN_IS_CENTROID_FEATURE] : true; }); diff --git a/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.test.ts b/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.test.ts index cf3d8705380043..eded70a75e4ac9 100644 --- a/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.test.ts @@ -53,7 +53,7 @@ describe('kibana.yml configured with map.tilemap.url', () => { type: 'KIBANA_TILEMAP', }, style: { type: 'TILE' }, - type: 'TILE', + type: 'RASTER_TILE', visible: true, }); }); @@ -89,7 +89,7 @@ describe('EMS is enabled', () => { type: 'EMS_TMS', }, style: { type: 'TILE' }, - type: 'VECTOR_TILE', + type: 'EMS_VECTOR_TILE', visible: true, }); }); diff --git a/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.ts b/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.ts index d285d3a36f66ae..e104261f908478 100644 --- a/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.ts +++ b/x-pack/plugins/maps/public/classes/layers/create_basemap_layer_descriptor.ts @@ -11,14 +11,14 @@ import { getKibanaTileMap } from '../../util'; import { getEMSSettings } from '../../kibana_services'; // @ts-expect-error import { KibanaTilemapSource } from '../sources/kibana_tilemap_source'; -import { TileLayer } from './tile_layer/tile_layer'; -import { VectorTileLayer } from './vector_tile_layer/vector_tile_layer'; +import { RasterTileLayer } from './raster_tile_layer/raster_tile_layer'; +import { EmsVectorTileLayer } from './ems_vector_tile_layer/ems_vector_tile_layer'; import { EMSTMSSource } from '../sources/ems_tms_source'; export function createBasemapLayerDescriptor(): LayerDescriptor | null { const tilemapSourceFromKibana = getKibanaTileMap(); if (_.get(tilemapSourceFromKibana, 'url')) { - const layerDescriptor = TileLayer.createDescriptor({ + const layerDescriptor = RasterTileLayer.createDescriptor({ sourceDescriptor: KibanaTilemapSource.createDescriptor(), }); return layerDescriptor; @@ -26,7 +26,7 @@ export function createBasemapLayerDescriptor(): LayerDescriptor | null { const isEmsEnabled = getEMSSettings()!.isEMSEnabled(); if (isEmsEnabled) { - const layerDescriptor = VectorTileLayer.createDescriptor({ + const layerDescriptor = EmsVectorTileLayer.createDescriptor({ sourceDescriptor: EMSTMSSource.createDescriptor({ isAutoSelect: true }), }); return layerDescriptor; diff --git a/x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.test.ts new file mode 100644 index 00000000000000..8b27bacff8ecb7 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.test.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { SOURCE_TYPES } from '../../../../common/constants'; +import { DataFilters, XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; +import { ILayer } from '../layer'; +import { EmsVectorTileLayer } from './ems_vector_tile_layer'; +import { DataRequestContext } from '../../../actions'; +import { EMSTMSSource } from '../../sources/ems_tms_source'; + +describe('EmsVectorTileLayer', () => { + it('should correctly inject tileLayerId in meta', async () => { + const layer: ILayer = new EmsVectorTileLayer({ + source: { + getTileLayerId: () => { + return 'myTileLayerId'; + }, + getVectorStyleSheetAndSpriteMeta: () => { + throw new Error('network error'); + }, + } as unknown as EMSTMSSource, + layerDescriptor: { + id: 'layerid', + sourceDescriptor: { + type: SOURCE_TYPES.EMS_XYZ, + urlTemplate: 'https://example.com/{x}/{y}/{z}.png', + id: 'mockSourceId', + } as XYZTMSSourceDescriptor, + }, + }); + + let actualMeta; + let actualErrorMessage; + const mockContext = { + startLoading: (requestId: string, token: string, meta: unknown) => { + actualMeta = meta; + }, + onLoadError: (requestId: string, token: string, message: string) => { + actualErrorMessage = message; + }, + dataFilters: { foo: 'bar' } as unknown as DataFilters, + } as unknown as DataRequestContext; + + await layer.syncData(mockContext); + + expect(actualMeta).toStrictEqual({ tileLayerId: 'myTileLayerId' }); + expect(actualErrorMessage).toStrictEqual('network error'); + }); +}); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.tsx b/x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.tsx similarity index 93% rename from x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.tsx rename to x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.tsx index f6c4e3fd057cf7..8f7471f255a5d9 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/ems_vector_tile_layer/ems_vector_tile_layer.tsx @@ -7,7 +7,7 @@ import type { Map as MbMap, Layer as MbLayer, Style as MbStyle } from '@kbn/mapbox-gl'; import _ from 'lodash'; -import { TileLayer } from '../tile_layer/tile_layer'; +import { AbstractLayer } from '../layer'; import { SOURCE_DATA_REQUEST_ID, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../../../common/constants'; import { LayerDescriptor } from '../../../../common/descriptor_types'; import { DataRequest } from '../../util/data_request'; @@ -18,6 +18,7 @@ import { } from '../../../connected_components/mb_map/utils'; import { DataRequestContext } from '../../../actions'; import { EMSTMSSource } from '../../sources/ems_tms_source'; +import { TileStyle } from '../../styles/tile/tile_style'; interface SourceRequestMeta { tileLayerId: string; @@ -46,22 +47,44 @@ interface SourceRequestData { }; } -// TODO - rename to EmsVectorTileLayer -export class VectorTileLayer extends TileLayer { - static type = LAYER_TYPE.VECTOR_TILE; - +export class EmsVectorTileLayer extends AbstractLayer { static createDescriptor(options: Partial) { const tileLayerDescriptor = super.createDescriptor(options); - tileLayerDescriptor.type = VectorTileLayer.type; + tileLayerDescriptor.type = LAYER_TYPE.EMS_VECTOR_TILE; tileLayerDescriptor.alpha = _.get(options, 'alpha', 1); tileLayerDescriptor.style = { type: LAYER_STYLE_TYPE.TILE }; return tileLayerDescriptor; } + private readonly _style: TileStyle; + + constructor({ + source, + layerDescriptor, + }: { + source: EMSTMSSource; + layerDescriptor: LayerDescriptor; + }) { + super({ source, layerDescriptor }); + this._style = new TileStyle(); + } + getSource(): EMSTMSSource { return super.getSource() as EMSTMSSource; } + getStyleForEditing() { + return this._style; + } + + getStyle() { + return this._style; + } + + getCurrentStyle() { + return this._style; + } + _canSkipSync({ prevDataRequest, nextMeta, @@ -349,4 +372,12 @@ export class VectorTileLayer extends TileLayer { async getLicensedFeatures() { return this._source.getLicensedFeatures(); } + + getLayerTypeIconName() { + return 'grid'; + } + + isBasemap(order: number) { + return order === 0; + } } diff --git a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts similarity index 88% rename from x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts rename to x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts index 43cc69687ffb71..66c5b8da0591c6 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ITileLayerArguments, TileLayer } from './tile_layer'; +import { RasterTileLayer } from './raster_tile_layer'; import { SOURCE_TYPES } from '../../../../common/constants'; import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; import { AbstractSource } from '../../sources/source'; @@ -34,22 +34,20 @@ class MockTileSource extends AbstractSource implements ITMSSource { } } -describe('TileLayer', () => { +describe('RasterTileLayer', () => { it('should use display-label from source', async () => { const source = new MockTileSource(sourceDescriptor); - const args: ITileLayerArguments = { + const layer: ILayer = new RasterTileLayer({ source, layerDescriptor: { id: 'layerid', sourceDescriptor }, - }; - - const layer: ILayer = new TileLayer(args); + }); expect(await source.getDisplayName()).toEqual(await layer.getDisplayName()); }); it('should override with custom display-label if present', async () => { const source = new MockTileSource(sourceDescriptor); - const layer: ILayer = new TileLayer({ + const layer: ILayer = new RasterTileLayer({ source, layerDescriptor: { id: 'layerid', sourceDescriptor, label: 'custom' }, }); diff --git a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.ts b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts similarity index 92% rename from x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.ts rename to x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts index 009b447402f9e2..40a7276bc10d01 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.ts +++ b/x-pack/plugins/maps/public/classes/layers/raster_tile_layer/raster_tile_layer.ts @@ -14,16 +14,10 @@ import { TileStyle } from '../../styles/tile/tile_style'; import { ITMSSource } from '../../sources/tms_source'; import { DataRequestContext } from '../../../actions'; -export interface ITileLayerArguments { - source: ITMSSource; - layerDescriptor: LayerDescriptor; -} - -// TODO - rename to RasterTileLayer -export class TileLayer extends AbstractLayer { +export class RasterTileLayer extends AbstractLayer { static createDescriptor(options: Partial) { const tileLayerDescriptor = super.createDescriptor(options); - tileLayerDescriptor.type = LAYER_TYPE.TILE; + tileLayerDescriptor.type = LAYER_TYPE.RASTER_TILE; tileLayerDescriptor.alpha = _.get(options, 'alpha', 1); tileLayerDescriptor.style = { type: LAYER_STYLE_TYPE.TILE }; return tileLayerDescriptor; @@ -31,7 +25,13 @@ export class TileLayer extends AbstractLayer { private readonly _style: TileStyle; - constructor({ source, layerDescriptor }: ITileLayerArguments) { + constructor({ + source, + layerDescriptor, + }: { + source: ITMSSource; + layerDescriptor: LayerDescriptor; + }) { super({ source, layerDescriptor }); this._style = new TileStyle(); } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx index 3152ac27189b3a..e7fa87435cf092 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx @@ -51,7 +51,7 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { mapColors?: string[] ): VectorLayerDescriptor { const layerDescriptor = super.createDescriptor(options) as VectorLayerDescriptor; - layerDescriptor.type = LAYER_TYPE.VECTOR; + layerDescriptor.type = LAYER_TYPE.GEOJSON_VECTOR; if (!options.style) { const styleProperties = VectorStyle.createDefaultStyleProperties(mapColors ? mapColors : []); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx index e266c729f26fa9..5ac95c9a91f64f 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx @@ -42,7 +42,7 @@ export class MvtVectorLayer extends AbstractVectorLayer { mapColors?: string[] ): VectorLayerDescriptor { const layerDescriptor = super.createDescriptor(descriptor, mapColors); - layerDescriptor.type = LAYER_TYPE.TILED_VECTOR; + layerDescriptor.type = LAYER_TYPE.MVT_VECTOR; if (!layerDescriptor.style) { const styleProperties = VectorStyle.createDefaultStyleProperties(mapColors ? mapColors : []); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx index 71a960fc1919b7..0384517bf98344 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx @@ -113,7 +113,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { mapColors?: string[] ): VectorLayerDescriptor { const layerDescriptor = super.createDescriptor(options) as VectorLayerDescriptor; - layerDescriptor.type = LAYER_TYPE.VECTOR; + layerDescriptor.type = LAYER_TYPE.GEOJSON_VECTOR; if (!options.style) { const styleProperties = VectorStyle.createDefaultStyleProperties(mapColors ? mapColors : []); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.test.ts deleted file mode 100644 index d094e53c59a922..00000000000000 --- a/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.test.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ITileLayerArguments } from '../tile_layer/tile_layer'; -import { SOURCE_TYPES } from '../../../../common/constants'; -import { DataFilters, XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; -import { AbstractSource } from '../../sources/source'; -import { ITMSSource } from '../../sources/tms_source'; -import { ILayer } from '../layer'; -import { VectorTileLayer } from './vector_tile_layer'; -import { DataRequestContext } from '../../../actions'; - -const sourceDescriptor: XYZTMSSourceDescriptor = { - type: SOURCE_TYPES.EMS_XYZ, - urlTemplate: 'https://example.com/{x}/{y}/{z}.png', - id: 'mockSourceId', -}; - -class MockTileSource extends AbstractSource implements ITMSSource { - readonly _descriptor: XYZTMSSourceDescriptor; - constructor(descriptor: XYZTMSSourceDescriptor) { - super(descriptor, {}); - this._descriptor = descriptor; - } - - async getDisplayName(): Promise { - return this._descriptor.urlTemplate; - } - - async getUrlTemplate(): Promise { - return 'template/{x}/{y}/{z}.png'; - } - - getTileLayerId() { - return this._descriptor.id; - } - - getVectorStyleSheetAndSpriteMeta() { - throw new Error('network error'); - } -} - -describe('VectorTileLayer', () => { - it('should correctly inject tileLayerId in meta', async () => { - const source = new MockTileSource(sourceDescriptor); - - const args: ITileLayerArguments = { - source, - layerDescriptor: { id: 'layerid', sourceDescriptor }, - }; - - const layer: ILayer = new VectorTileLayer(args); - - let actualMeta; - let actualErrorMessage; - const mockContext = { - startLoading: (requestId: string, token: string, meta: unknown) => { - actualMeta = meta; - }, - onLoadError: (requestId: string, token: string, message: string) => { - actualErrorMessage = message; - }, - dataFilters: { foo: 'bar' } as unknown as DataFilters, - } as unknown as DataRequestContext; - - await layer.syncData(mockContext); - - expect(actualMeta).toStrictEqual({ tileLayerId: 'mockSourceId' }); - expect(actualErrorMessage).toStrictEqual('network error'); - }); -}); diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/observability/create_layer_descriptor.test.ts b/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/observability/create_layer_descriptor.test.ts index 7c762ac3409f80..9e843c98cb649e 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/observability/create_layer_descriptor.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/observability/create_layer_descriptor.test.ts @@ -165,7 +165,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }); }); @@ -345,7 +345,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }); }); diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/security/create_layer_descriptors.test.ts b/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/security/create_layer_descriptors.test.ts index b5d4edc8cb43ba..b7e07e6f8e2748 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/security/create_layer_descriptors.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/wizards/solution_layers/security/create_layer_descriptors.test.ts @@ -138,7 +138,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, { @@ -248,7 +248,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, { @@ -365,7 +365,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, ]); @@ -480,7 +480,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, { @@ -590,7 +590,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, { @@ -707,7 +707,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, ]); @@ -822,7 +822,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, { @@ -932,7 +932,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, { @@ -1049,7 +1049,7 @@ describe('createLayerDescriptor', () => { }, type: 'VECTOR', }, - type: 'VECTOR', + type: 'GEOJSON_VECTOR', visible: true, }, ]); diff --git a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_base_map_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_base_map_layer_wizard.tsx index 9138b199fd5780..26afa65b9527cb 100644 --- a/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_base_map_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_base_map_layer_wizard.tsx @@ -8,10 +8,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { LayerWizard, RenderWizardArguments } from '../../layers'; -// @ts-ignore import { EMSTMSSource, getSourceTitle } from './ems_tms_source'; -// @ts-ignore -import { VectorTileLayer } from '../../layers/vector_tile_layer/vector_tile_layer'; +import { EmsVectorTileLayer } from '../../layers/ems_vector_tile_layer/ems_vector_tile_layer'; import { EmsTmsSourceConfig } from './tile_service_select'; import { CreateSourceEditor } from './create_source_editor'; import { getEMSSettings } from '../../../kibana_services'; @@ -45,7 +43,7 @@ export const emsBaseMapLayerWizardConfig: LayerWizard = { icon: WorldMapLayerIcon, renderWizard: ({ previewLayers }: RenderWizardArguments) => { const onSourceConfigChange = (sourceConfig: EmsTmsSourceConfig) => { - const layerDescriptor = VectorTileLayer.createDescriptor({ + const layerDescriptor = EmsVectorTileLayer.createDescriptor({ sourceDescriptor: EMSTMSSource.createDescriptor(sourceConfig), }); previewLayers([layerDescriptor]); diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.test.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.test.tsx index 32658447acf2b1..3ddb804cac2131 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.test.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.test.tsx @@ -18,7 +18,7 @@ jest.mock('uuid/v4', () => { }); const defaultProps = { - currentLayerType: LAYER_TYPE.VECTOR, + currentLayerType: LAYER_TYPE.GEOJSON_VECTOR, indexPatternId: 'foobar', onChange: async () => {}, metrics: [], diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx index ba10479a2bd2cf..fb748cdc63aff2 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx @@ -82,11 +82,13 @@ export class UpdateSourceEditor extends Component { _onResolutionChange = async (resolution: GRID_RESOLUTION, metrics: AggDescriptor[]) => { let newLayerType; if ( - this.props.currentLayerType === LAYER_TYPE.VECTOR || - this.props.currentLayerType === LAYER_TYPE.TILED_VECTOR + this.props.currentLayerType === LAYER_TYPE.GEOJSON_VECTOR || + this.props.currentLayerType === LAYER_TYPE.MVT_VECTOR ) { newLayerType = - resolution === GRID_RESOLUTION.SUPER_FINE ? LAYER_TYPE.TILED_VECTOR : LAYER_TYPE.VECTOR; + resolution === GRID_RESOLUTION.SUPER_FINE + ? LAYER_TYPE.MVT_VECTOR + : LAYER_TYPE.GEOJSON_VECTOR; } await this.props.onChange( diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx index ddf727842780de..fcf915618a0b78 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx @@ -86,9 +86,9 @@ export class ScalingForm extends Component { if (optionId === SCALING_TYPES.CLUSTERS) { layerType = LAYER_TYPE.BLENDED_VECTOR; } else if (optionId === SCALING_TYPES.MVT) { - layerType = LAYER_TYPE.TILED_VECTOR; + layerType = LAYER_TYPE.MVT_VECTOR; } else { - layerType = LAYER_TYPE.VECTOR; + layerType = LAYER_TYPE.GEOJSON_VECTOR; } this.props.onChange({ propName: 'scalingType', value: optionId, newLayerType: layerType }); diff --git a/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx index 70f56f8f4e6d24..ec69989a8313d1 100644 --- a/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx @@ -12,7 +12,7 @@ import { LayerWizard, RenderWizardArguments } from '../../layers'; import { CreateSourceEditor } from './create_source_editor'; // @ts-ignore import { KibanaTilemapSource, sourceTitle } from './kibana_tilemap_source'; -import { TileLayer } from '../../layers/tile_layer/tile_layer'; +import { RasterTileLayer } from '../../layers/raster_tile_layer/raster_tile_layer'; import { getKibanaTileMap } from '../../../util'; import { LAYER_WIZARD_CATEGORY } from '../../../../common/constants'; @@ -29,7 +29,7 @@ export const kibanaBasemapLayerWizardConfig: LayerWizard = { icon: 'logoKibana', renderWizard: ({ previewLayers }: RenderWizardArguments) => { const onSourceConfigChange = () => { - const layerDescriptor = TileLayer.createDescriptor({ + const layerDescriptor = RasterTileLayer.createDescriptor({ sourceDescriptor: KibanaTilemapSource.createDescriptor(), }); previewLayers([layerDescriptor]); diff --git a/x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx index adbb23b921d4b9..19f31d481f58ed 100644 --- a/x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx @@ -12,7 +12,7 @@ import { WMSCreateSourceEditor } from './wms_create_source_editor'; // @ts-ignore import { sourceTitle, WMSSource } from './wms_source'; import { LayerWizard, RenderWizardArguments } from '../../layers'; -import { TileLayer } from '../../layers/tile_layer/tile_layer'; +import { RasterTileLayer } from '../../layers/raster_tile_layer/raster_tile_layer'; import { LAYER_WIZARD_CATEGORY } from '../../../../common/constants'; import { WebMapServiceLayerIcon } from '../../layers/wizards/icons/web_map_service_layer_icon'; @@ -29,7 +29,7 @@ export const wmsLayerWizardConfig: LayerWizard = { return; } - const layerDescriptor = TileLayer.createDescriptor({ + const layerDescriptor = RasterTileLayer.createDescriptor({ sourceDescriptor: WMSSource.createDescriptor(sourceConfig), }); previewLayers([layerDescriptor]); diff --git a/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx index 95a2b104c7a1b4..82aab592a13443 100644 --- a/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { XYZTMSEditor, XYZTMSSourceConfig } from './xyz_tms_editor'; import { XYZTMSSource, sourceTitle } from './xyz_tms_source'; import { LayerWizard, RenderWizardArguments } from '../../layers'; -import { TileLayer } from '../../layers/tile_layer/tile_layer'; +import { RasterTileLayer } from '../../layers/raster_tile_layer/raster_tile_layer'; import { LAYER_WIZARD_CATEGORY } from '../../../../common/constants'; import { WorldMapLayerIcon } from '../../layers/wizards/icons/world_map_layer_icon'; @@ -32,7 +32,7 @@ export const tmsLayerWizardConfig: LayerWizard = { return; } - const layerDescriptor = TileLayer.createDescriptor({ + const layerDescriptor = RasterTileLayer.createDescriptor({ sourceDescriptor: XYZTMSSource.createDescriptor(sourceConfig), }); previewLayers([layerDescriptor]); diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx index 82795b8bd93179..ebe0cc6a4178d8 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx @@ -57,7 +57,7 @@ const mockLayer = { return '1'; }, getType: () => { - return LAYER_TYPE.VECTOR; + return LAYER_TYPE.GEOJSON_VECTOR; }, getDisplayName: () => { return 'layer 1'; diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/utils.ts b/x-pack/plugins/maps/public/connected_components/mb_map/utils.ts index 17994bf7994870..f5de99d04c01c3 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/utils.ts +++ b/x-pack/plugins/maps/public/connected_components/mb_map/utils.ts @@ -11,7 +11,7 @@ import { TileMetaFeature } from '../../../common/descriptor_types'; import { RGBAImage } from './image_utils'; import { isGlDrawLayer } from './sort_layers'; import { ILayer } from '../../classes/layers/layer'; -import { EmsSpriteSheet } from '../../classes/layers/vector_tile_layer/vector_tile_layer'; +import { EmsSpriteSheet } from '../../classes/layers/ems_vector_tile_layer/ems_vector_tile_layer'; import { ES_MVT_META_LAYER_NAME } from '../../classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer'; export function removeOrphanedSourcesAndLayers( diff --git a/x-pack/plugins/maps/public/locators.test.ts b/x-pack/plugins/maps/public/locators.test.ts index bfcd34c4ae7107..aabae1a26c1df7 100644 --- a/x-pack/plugins/maps/public/locators.test.ts +++ b/x-pack/plugins/maps/public/locators.test.ts @@ -52,7 +52,7 @@ describe('visualize url generator', () => { { id: LAYER_ID, visible: true, - type: LAYER_TYPE.VECTOR, + type: LAYER_TYPE.GEOJSON_VECTOR, sourceDescriptor: { id: LAYER_ID, type: SOURCE_TYPES.ES_SEARCH, @@ -70,7 +70,7 @@ describe('visualize url generator', () => { expect(location).toMatchObject({ app: 'maps', - path: `/map#/?_g=()&_a=()&initialLayers=(id%3A'13823000-99b9-11ea-9eb6-d9e8adceb647'%2CsourceDescriptor%3A(geoField%3Atest%2Cid%3A'13823000-99b9-11ea-9eb6-d9e8adceb647'%2CindexPatternId%3A'90943e30-9a47-11e8-b64d-95841ca0b247'%2Clabel%3A'Sample%20Data'%2CscalingType%3ALIMIT%2CtooltipProperties%3A!()%2Ctype%3AES_SEARCH)%2Ctype%3AVECTOR%2Cvisible%3A!t)`, + path: `/map#/?_g=()&_a=()&initialLayers=(id%3A'13823000-99b9-11ea-9eb6-d9e8adceb647'%2CsourceDescriptor%3A(geoField%3Atest%2Cid%3A'13823000-99b9-11ea-9eb6-d9e8adceb647'%2CindexPatternId%3A'90943e30-9a47-11e8-b64d-95841ca0b247'%2Clabel%3A'Sample%20Data'%2CscalingType%3ALIMIT%2CtooltipProperties%3A!()%2Ctype%3AES_SEARCH)%2Ctype%3AGEOJSON_VECTOR%2Cvisible%3A!t)`, state: {}, }); }); diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.test.ts b/x-pack/plugins/maps/public/selectors/map_selectors.test.ts index 4f336d9a8ad275..6b903214f8f976 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.test.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.test.ts @@ -8,7 +8,7 @@ import { LAYER_STYLE_TYPE, LAYER_TYPE, SOURCE_TYPES } from '../../common/constants'; jest.mock('../classes/layers/heatmap_layer', () => {}); -jest.mock('../classes/layers/vector_tile_layer/vector_tile_layer', () => {}); +jest.mock('../classes/layers/ems_vector_tile_layer/ems_vector_tile_layer', () => {}); jest.mock('../classes/joins/inner_join', () => {}); jest.mock('../kibana_services', () => ({ getTimeFilter: () => ({ @@ -232,7 +232,7 @@ describe('getQueryableUniqueIndexPatternIds', () => { indexPatternId: string; }) { return { - type: LAYER_TYPE.VECTOR, + type: LAYER_TYPE.GEOJSON_VECTOR, style: { type: LAYER_STYLE_TYPE.VECTOR, }, diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.ts b/x-pack/plugins/maps/public/selectors/map_selectors.ts index f58525ea6f9741..5f308387e9d8b6 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.ts @@ -10,9 +10,8 @@ import { FeatureCollection } from 'geojson'; import _ from 'lodash'; import { Adapters } from 'src/plugins/inspector/public'; import type { Query } from 'src/plugins/data/common'; -import { TileLayer } from '../classes/layers/tile_layer/tile_layer'; -// @ts-ignore -import { VectorTileLayer } from '../classes/layers/vector_tile_layer/vector_tile_layer'; +import { RasterTileLayer } from '../classes/layers/raster_tile_layer/raster_tile_layer'; +import { EmsVectorTileLayer } from '../classes/layers/ems_vector_tile_layer/ems_vector_tile_layer'; import { BlendedVectorLayer, IVectorLayer, @@ -59,6 +58,7 @@ import { ISource } from '../classes/sources/source'; import { ITMSSource } from '../classes/sources/tms_source'; import { IVectorSource } from '../classes/sources/vector_source'; import { ESGeoGridSource } from '../classes/sources/es_geo_grid_source'; +import { EMSTMSSource } from '../classes/sources/ems_tms_source'; import { ILayer } from '../classes/layers/layer'; import { getIsReadOnly } from './ui_selectors'; @@ -70,9 +70,9 @@ export function createLayerInstance( const source: ISource = createSourceInstance(layerDescriptor.sourceDescriptor, inspectorAdapters); switch (layerDescriptor.type) { - case LAYER_TYPE.TILE: - return new TileLayer({ layerDescriptor, source: source as ITMSSource }); - case LAYER_TYPE.VECTOR: + case LAYER_TYPE.RASTER_TILE: + return new RasterTileLayer({ layerDescriptor, source: source as ITMSSource }); + case LAYER_TYPE.GEOJSON_VECTOR: const joins: InnerJoin[] = []; const vectorLayerDescriptor = layerDescriptor as VectorLayerDescriptor; if (vectorLayerDescriptor.joins) { @@ -87,8 +87,8 @@ export function createLayerInstance( joins, chartsPaletteServiceGetColor, }); - case LAYER_TYPE.VECTOR_TILE: - return new VectorTileLayer({ layerDescriptor, source: source as ITMSSource }); + case LAYER_TYPE.EMS_VECTOR_TILE: + return new EmsVectorTileLayer({ layerDescriptor, source: source as EMSTMSSource }); case LAYER_TYPE.HEATMAP: return new HeatmapLayer({ layerDescriptor: layerDescriptor as HeatmapLayerDescriptor, @@ -100,7 +100,7 @@ export function createLayerInstance( source: source as IVectorSource, chartsPaletteServiceGetColor, }); - case LAYER_TYPE.TILED_VECTOR: + case LAYER_TYPE.MVT_VECTOR: return new MvtVectorLayer({ layerDescriptor: layerDescriptor as VectorLayerDescriptor, source: source as IVectorSource, diff --git a/x-pack/plugins/maps/public/trigger_actions/visualize_geo_field_action.ts b/x-pack/plugins/maps/public/trigger_actions/visualize_geo_field_action.ts index 1cbb3e92134b82..1da2ca14bd16f3 100644 --- a/x-pack/plugins/maps/public/trigger_actions/visualize_geo_field_action.ts +++ b/x-pack/plugins/maps/public/trigger_actions/visualize_geo_field_action.ts @@ -61,7 +61,7 @@ const getMapsLink = async (context: VisualizeFieldContext) => { { id: uuid(), visible: true, - type: supportsClustering ? LAYER_TYPE.BLENDED_VECTOR : LAYER_TYPE.VECTOR, + type: supportsClustering ? LAYER_TYPE.BLENDED_VECTOR : LAYER_TYPE.GEOJSON_VECTOR, sourceDescriptor: { id: uuid(), type: SOURCE_TYPES.ES_SEARCH, diff --git a/x-pack/plugins/maps/server/embeddable_migrations.ts b/x-pack/plugins/maps/server/embeddable_migrations.ts index 962f5c4fb0d7af..f5356e5eb29a5b 100644 --- a/x-pack/plugins/maps/server/embeddable_migrations.ts +++ b/x-pack/plugins/maps/server/embeddable_migrations.ts @@ -9,6 +9,7 @@ import type { SerializableRecord } from '@kbn/utility-types'; import { MapSavedObjectAttributes } from '../common/map_saved_object_type'; import { moveAttribution } from '../common/migrations/move_attribution'; import { setEmsTmsDefaultModes } from '../common/migrations/set_ems_tms_default_modes'; +import { renameLayerTypes } from '../common/migrations/rename_layer_types'; /* * Embeddables such as Maps, Lens, and Visualize can be embedded by value or by reference on a dashboard. @@ -42,4 +43,16 @@ export const embeddableMigrations = { return state; } }, + '8.1.0': (state: SerializableRecord) => { + try { + return { + ...state, + attributes: renameLayerTypes(state as { attributes: MapSavedObjectAttributes }), + } as SerializableRecord; + } catch (e) { + // Do not fail migration for invalid layerListJSON + // Maps application can display invalid layerListJSON error when saved object is viewed + return state; + } + }, }; diff --git a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js index a415d181900d7f..796d641f3eff77 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js +++ b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.test.js @@ -202,7 +202,7 @@ describe('buildMapsSavedObjectsTelemetry', () => { max: 1, min: 1, }, - VECTOR: { + GEOJSON_VECTOR: { avg: 1.2, max: 2, min: 1, diff --git a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts index 93a9a118d23bcb..3b257fb812bf9d 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/maps_telemetry.ts @@ -160,7 +160,7 @@ async function isGeoShapeAggLayer(layer: LayerDescriptor): Promise { } if ( - layer.type !== LAYER_TYPE.VECTOR && + layer.type !== LAYER_TYPE.GEOJSON_VECTOR && layer.type !== LAYER_TYPE.BLENDED_VECTOR && layer.type !== LAYER_TYPE.HEATMAP ) { diff --git a/x-pack/plugins/maps/server/maps_telemetry/test_resources/sample_map_saved_objects.json b/x-pack/plugins/maps/server/maps_telemetry/test_resources/sample_map_saved_objects.json index 3adaaaf091e080..e9427a996ad1ef 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/test_resources/sample_map_saved_objects.json +++ b/x-pack/plugins/maps/server/maps_telemetry/test_resources/sample_map_saved_objects.json @@ -6,7 +6,7 @@ "title": "Italy Map", "description": "", "mapStateJSON": "{\"zoom\":4.82,\"center\":{\"lon\":11.41545,\"lat\":42.0865},\"timeFilters\":{\"from\":\"now-15w\",\"to\":\"now\"},\"refreshConfig\":{\"isPaused\":false,\"interval\":0},\"query\":{\"language\":\"lucene\",\"query\":\"\"}}", - "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"italy_provinces\"},\"id\":\"0oye8\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#0c1f70\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"VECTOR\"},{\"sourceDescriptor\":{\"type\":\"ES_GEO_GRID\",\"id\":\"053fe296-f5ae-4cb0-9e73-a5752cb9ba74\",\"indexPatternId\":\"d3d7af60-4c81-11e8-b3d7-01146121b73d\",\"geoField\":\"DestLocation\",\"requestType\":\"point\",\"resolution\":\"COARSE\"},\"id\":\"1gx22\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"color\":\"Greens\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"minSize\":4,\"maxSize\":32}}}},\"type\":\"VECTOR\"}]", + "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"italy_provinces\"},\"id\":\"0oye8\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#0c1f70\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"},{\"sourceDescriptor\":{\"type\":\"ES_GEO_GRID\",\"id\":\"053fe296-f5ae-4cb0-9e73-a5752cb9ba74\",\"indexPatternId\":\"d3d7af60-4c81-11e8-b3d7-01146121b73d\",\"geoField\":\"DestLocation\",\"requestType\":\"point\",\"resolution\":\"COARSE\"},\"id\":\"1gx22\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"color\":\"Greens\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"label\":\"Count\",\"name\":\"doc_count\",\"origin\":\"source\"},\"minSize\":4,\"maxSize\":32}}}},\"type\":\"GEOJSON_VECTOR\"}]", "uiStateJSON": "{}" }, "references": [ @@ -21,7 +21,7 @@ "title": "France Map", "description": "", "mapStateJSON": "{\"zoom\":3.43,\"center\":{\"lon\":-16.30411,\"lat\":42.88411},\"timeFilters\":{\"from\":\"now-15w\",\"to\":\"now\"},\"refreshConfig\":{\"isPaused\":false,\"interval\":0},\"query\":{\"query\":\"\",\"language\":\"lucene\"}}", - "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"france_departments\"},\"id\":\"65xbw\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.25,\"visible\":true,\"joins\":[{\"leftField\":\"iso_3166_2\",\"right\":{\"id\":\"6a263f96-7a96-4f5a-a00e-c89178c1d017\"}}],\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#19c1e6\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"VECTOR\"},{\"sourceDescriptor\":{\"id\":\"240125db-e612-4001-b853-50107e55d984\",\"type\":\"ES_SEARCH\",\"scalingType\":\"LIMIT\",\"indexPatternId\":\"ff959d40-b880-11e8-a6d9-e546fe2bba5f\",\"geoField\":\"geoip.location\",\"limit\":2048,\"filterByMapBounds\":true,\"tooltipProperties\":[]},\"id\":\"mdae9\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#1ce619\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"VECTOR\"}]", + "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"france_departments\"},\"id\":\"65xbw\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.25,\"visible\":true,\"joins\":[{\"leftField\":\"iso_3166_2\",\"right\":{\"id\":\"6a263f96-7a96-4f5a-a00e-c89178c1d017\"}}],\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#19c1e6\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"},{\"sourceDescriptor\":{\"id\":\"240125db-e612-4001-b853-50107e55d984\",\"type\":\"ES_SEARCH\",\"scalingType\":\"LIMIT\",\"indexPatternId\":\"ff959d40-b880-11e8-a6d9-e546fe2bba5f\",\"geoField\":\"geoip.location\",\"limit\":2048,\"filterByMapBounds\":true,\"tooltipProperties\":[]},\"id\":\"mdae9\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#1ce619\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"}]", "uiStateJSON": "{}" }, "references": [ @@ -36,7 +36,7 @@ "title": "Canada Map", "description": "", "mapStateJSON": "{\"zoom\":2.12,\"center\":{\"lon\":-88.67592,\"lat\":34.23257},\"timeFilters\":{\"from\":\"now-15m\",\"to\":\"now\",\"mode\":\"quick\"},\"refreshConfig\":{\"isPaused\":false,\"interval\":0},\"query\":{\"query\":\"\",\"language\":\"lucene\"}}", - "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"canada_provinces\"},\"id\":\"kt086\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#60895e\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"VECTOR\"}]", + "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"canada_provinces\"},\"id\":\"kt086\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#60895e\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"}]", "uiStateJSON": "{}" }, "references": [ @@ -51,7 +51,7 @@ "title": "Single cluster layer with geo_shape field", "description": "", "mapStateJSON": "{\"zoom\":2.12,\"center\":{\"lon\":-88.67592,\"lat\":34.23257},\"timeFilters\":{\"from\":\"now-15m\",\"to\":\"now\",\"mode\":\"quick\"},\"refreshConfig\":{\"isPaused\":false,\"interval\":0},\"query\":{\"query\":\"\",\"language\":\"lucene\"}}", - "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"ES_GEO_GRID\",\"id\":\"51afb7d0-c628-11ea-87d0-0242ac130003\",\"geoField\":\"geometry\",\"metrics\":[{\"type\":\"count\"}],\"requestType\":\"point\",\"resolution\":\"COARSE\",\"indexPatternId\":\"4a7f6010-0aed-11ea-9dd2-95afd7ad44d4\"},\"style\":{\"type\":\"VECTOR\",\"properties\":{\"icon\":{\"type\":\"STATIC\",\"options\":{\"value\":\"marker\"}},\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"color\":\"Blues\",\"colorCategory\":\"palette_0\",\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"},\"fieldMetaOptions\":{\"isEnabled\":true,\"sigma\":3},\"type\":\"ORDINAL\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":0}},\"iconSize\":{\"type\":\"DYNAMIC\",\"options\":{\"minSize\":7,\"maxSize\":32,\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"},\"fieldMetaOptions\":{\"isEnabled\":true,\"sigma\":3}}},\"iconOrientation\":{\"type\":\"STATIC\",\"options\":{\"orientation\":0}},\"labelText\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"}}},\"labelColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#000000\"}},\"labelSize\":{\"type\":\"STATIC\",\"options\":{\"size\":14}},\"labelBorderColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}},\"labelBorderSize\":{\"options\":{\"size\":\"SMALL\"}}},\"isTimeAware\":true},\"id\":\"8d384d5d-6353-468f-b8f8-8eaa487358c4\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":1,\"visible\":true,\"type\":\"VECTOR\",\"joins\":[]}]", + "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"ES_GEO_GRID\",\"id\":\"51afb7d0-c628-11ea-87d0-0242ac130003\",\"geoField\":\"geometry\",\"metrics\":[{\"type\":\"count\"}],\"requestType\":\"point\",\"resolution\":\"COARSE\",\"indexPatternId\":\"4a7f6010-0aed-11ea-9dd2-95afd7ad44d4\"},\"style\":{\"type\":\"VECTOR\",\"properties\":{\"icon\":{\"type\":\"STATIC\",\"options\":{\"value\":\"marker\"}},\"fillColor\":{\"type\":\"DYNAMIC\",\"options\":{\"color\":\"Blues\",\"colorCategory\":\"palette_0\",\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"},\"fieldMetaOptions\":{\"isEnabled\":true,\"sigma\":3},\"type\":\"ORDINAL\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":0}},\"iconSize\":{\"type\":\"DYNAMIC\",\"options\":{\"minSize\":7,\"maxSize\":32,\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"},\"fieldMetaOptions\":{\"isEnabled\":true,\"sigma\":3}}},\"iconOrientation\":{\"type\":\"STATIC\",\"options\":{\"orientation\":0}},\"labelText\":{\"type\":\"DYNAMIC\",\"options\":{\"field\":{\"name\":\"doc_count\",\"origin\":\"source\"}}},\"labelColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#000000\"}},\"labelSize\":{\"type\":\"STATIC\",\"options\":{\"size\":14}},\"labelBorderColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"symbolizeAs\":{\"options\":{\"value\":\"circle\"}},\"labelBorderSize\":{\"options\":{\"size\":\"SMALL\"}}},\"isTimeAware\":true},\"id\":\"8d384d5d-6353-468f-b8f8-8eaa487358c4\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":1,\"visible\":true,\"type\":\"GEOJSON_VECTOR\",\"joins\":[]}]", "uiStateJSON": "{}" }, "references": [ diff --git a/x-pack/plugins/maps/server/maps_telemetry/util.ts b/x-pack/plugins/maps/server/maps_telemetry/util.ts index 27190c9b821420..defc2cb9aa9b36 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/util.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/util.ts @@ -265,7 +265,7 @@ export function getTermJoinsPerCluster( layerLists: LayerDescriptor[][] ): TELEMETRY_TERM_JOIN_COUNTS_PER_CLUSTER { return getCountsByCluster(layerLists, (layerDescriptor: LayerDescriptor) => { - return layerDescriptor.type === LAYER_TYPE.VECTOR && + return layerDescriptor.type === LAYER_TYPE.GEOJSON_VECTOR && (layerDescriptor as VectorLayerDescriptor)?.joins?.length ? TELEMETRY_TERM_JOIN : null; diff --git a/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js b/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js index 6d232468604233..986878e65eb8be 100644 --- a/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js +++ b/x-pack/plugins/maps/server/saved_objects/saved_object_migrations.js @@ -18,6 +18,7 @@ import { setDefaultAutoFitToBounds } from '../../common/migrations/set_default_a import { addTypeToTermJoin } from '../../common/migrations/add_type_to_termjoin'; import { moveAttribution } from '../../common/migrations/move_attribution'; import { setEmsTmsDefaultModes } from '../../common/migrations/set_ems_tms_default_modes'; +import { renameLayerTypes } from '../../common/migrations/rename_layer_types'; function logMigrationWarning(context, errorMsg, doc) { context.log.warning( @@ -172,6 +173,19 @@ export const savedObjectMigrations = { try { const attributes = setEmsTmsDefaultModes(doc); + return { + ...doc, + attributes, + }; + } catch (e) { + logMigrationWarning(context, e.message, doc); + return doc; + } + }, + '8.1.0': (doc, context) => { + try { + const attributes = renameLayerTypes(doc); + return { ...doc, attributes, diff --git a/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx b/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx index 0eb6e356e1397f..cb3651e4a458ab 100644 --- a/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx +++ b/x-pack/plugins/ml/public/application/explorer/anomalies_map.tsx @@ -126,7 +126,7 @@ export const getChoroplethAnomaliesLayer = ( isTimeAware: true, }, visible: false, - type: LAYER_TYPE.VECTOR, + type: LAYER_TYPE.GEOJSON_VECTOR, }; }; diff --git a/x-pack/test/api_integration/apis/maps/migrations.js b/x-pack/test/api_integration/apis/maps/migrations.js index 19f79da9402534..26de152f1473e3 100644 --- a/x-pack/test/api_integration/apis/maps/migrations.js +++ b/x-pack/test/api_integration/apis/maps/migrations.js @@ -44,7 +44,7 @@ export default function ({ getService }) { type: 'index-pattern', }, ]); - expect(resp.body.migrationVersion).to.eql({ map: '8.0.0' }); // migrtionVersion is derived from both "migrations" and "convertToMultiNamespaceVersion" fields when the object is registered + expect(resp.body.migrationVersion).to.eql({ map: '8.1.0' }); // migrtionVersion is derived from both "migrations" and "convertToMultiNamespaceVersion" fields when the object is registered expect(resp.body.attributes.layerListJSON.includes('indexPatternRefName')).to.be(true); }); @@ -90,7 +90,7 @@ export default function ({ getService }) { } expect(panels.length).to.be(1); expect(panels[0].type).to.be('map'); - expect(panels[0].version).to.be('8.0.0'); + expect(panels[0].version).to.be('8.1.0'); }); }); }); From ded75bdb7ba22c8bb3271594c80a5c88f2332a66 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 3 Dec 2021 18:48:25 +0000 Subject: [PATCH 110/126] chore(NA): splits types from code on @kbn/crypto (#120371) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 1 + packages/BUILD.bazel | 1 + packages/kbn-crypto/BUILD.bazel | 26 ++++++++++++++++++---- packages/kbn-crypto/package.json | 3 +-- packages/kbn-server-http-tools/BUILD.bazel | 2 +- yarn.lock | 4 ++++ 6 files changed, 30 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 1e5a135b723ed7..b2299c2391886e 100644 --- a/package.json +++ b/package.json @@ -565,6 +565,7 @@ "@types/kbn__apm-utils": "link:bazel-bin/packages/kbn-apm-utils/npm_module_types", "@types/kbn__cli-dev-mode": "link:bazel-bin/packages/kbn-cli-dev-mode/npm_module_types", "@types/kbn__config": "link:bazel-bin/packages/kbn-config/npm_module_types", + "@types/kbn__crypto": "link:bazel-bin/packages/kbn-crypto/npm_module_types", "@types/kbn__i18n": "link:bazel-bin/packages/kbn-i18n/npm_module_types", "@types/kbn__i18n-react": "link:bazel-bin/packages/kbn-i18n-react/npm_module_types", "@types/license-checker": "15.0.0", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 8208496f7d8000..1cf887290af77c 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -84,6 +84,7 @@ filegroup( "//packages/kbn-apm-utils:build_types", "//packages/kbn-cli-dev-mode:build_types", "//packages/kbn-config:build_types", + "//packages/kbn-crypto:build_types", "//packages/kbn-i18n:build_types", "//packages/kbn-i18n-react:build_types", ], diff --git a/packages/kbn-crypto/BUILD.bazel b/packages/kbn-crypto/BUILD.bazel index 0f35aab4610788..81ee6d770103cd 100644 --- a/packages/kbn-crypto/BUILD.bazel +++ b/packages/kbn-crypto/BUILD.bazel @@ -1,10 +1,11 @@ -load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project") -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") -load("//src/dev/bazel:index.bzl", "jsts_transpiler") +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") PKG_BASE_NAME = "kbn-crypto" PKG_REQUIRE_NAME = "@kbn/crypto" +TYPES_PKG_REQUIRE_NAME = "@types/kbn__crypto" SOURCE_FILES = glob( [ @@ -72,7 +73,7 @@ ts_project( js_library( name = PKG_BASE_NAME, srcs = NPM_MODULE_EXTRA_FILES, - deps = RUNTIME_DEPS + [":target_node", ":tsc_types"], + deps = RUNTIME_DEPS + [":target_node"], package_name = PKG_REQUIRE_NAME, visibility = ["//visibility:public"], ) @@ -91,3 +92,20 @@ filegroup( ], visibility = ["//visibility:public"], ) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = TYPES_PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [ + ":npm_module_types", + ], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-crypto/package.json b/packages/kbn-crypto/package.json index 8fa6cd3c232fad..96bf21906ed4a7 100644 --- a/packages/kbn-crypto/package.json +++ b/packages/kbn-crypto/package.json @@ -3,6 +3,5 @@ "version": "1.0.0", "private": true, "license": "SSPL-1.0 OR Elastic License 2.0", - "main": "./target_node/index.js", - "types": "./target_types/index.d.ts" + "main": "./target_node/index.js" } diff --git a/packages/kbn-server-http-tools/BUILD.bazel b/packages/kbn-server-http-tools/BUILD.bazel index 609fe6d00f173a..b9eae3d022439d 100644 --- a/packages/kbn-server-http-tools/BUILD.bazel +++ b/packages/kbn-server-http-tools/BUILD.bazel @@ -38,7 +38,7 @@ RUNTIME_DEPS = [ TYPES_DEPS = [ "//packages/kbn-config-schema", - "//packages/kbn-crypto", + "//packages/kbn-crypto:npm_module_types", "@npm//@hapi/hapi", "@npm//@hapi/hoek", "@npm//joi", diff --git a/yarn.lock b/yarn.lock index fc670fda132ca1..c4d2a31724d480 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5828,6 +5828,10 @@ version "0.0.0" uid "" +"@types/kbn__crypto@link:bazel-bin/packages/kbn-crypto/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__i18n-react@link:bazel-bin/packages/kbn-i18n-react/npm_module_types": version "0.0.0" uid "" From 3521a928d57adf531ac8331ed1008ac8e5e46ce8 Mon Sep 17 00:00:00 2001 From: Joe Portner <5295965+jportner@users.noreply.github.com> Date: Fri, 3 Dec 2021 14:56:01 -0500 Subject: [PATCH 111/126] More descriptive audit integration test errors (#120354) --- .../security_api_integration/tests/audit/audit_log.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_api_integration/tests/audit/audit_log.ts b/x-pack/test/security_api_integration/tests/audit/audit_log.ts index fd7db8faadd548..bb4c27976c8573 100644 --- a/x-pack/test/security_api_integration/tests/audit/audit_log.ts +++ b/x-pack/test/security_api_integration/tests/audit/audit_log.ts @@ -22,7 +22,14 @@ class FileWrapper { } async readJSON() { const content = await this.read(); - return content.map((l) => JSON.parse(l)); + try { + return content.map((l) => JSON.parse(l)); + } catch (err) { + const contentString = content.join('\n'); + throw new Error( + `Failed to parse audit log JSON, error: "${err.message}", audit.log contents:\n${contentString}` + ); + } } // writing in a file is an async operation. we use this method to make sure logs have been written. async isNotEmpty() { From b5895ec0b441befa5d0a4ada2ac602efd5ffe386 Mon Sep 17 00:00:00 2001 From: ymao1 Date: Fri, 3 Dec 2021 15:05:24 -0500 Subject: [PATCH 112/126] [Alerting] Skip writing alerts when rule execution times out (#114518) * Added cancel() to alerting task runner and writing event log document * Updating rule saved object with timeout execution status * Skip scheduling actions and logging event log for alerts if rule execution is cancelled * Adding config for disabling skipping actions * Fixing types * Adding flag for rule types to opt out of skipping acitons * Passing function into rule executor to determine whether to write AAD * Using task runner uuid to differentiate between task instances * Adding functional test * Fixing types * Updating service function name and adding logic to persistence rule type Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/alerting/server/mocks.ts | 1 + .../server/task_runner/task_runner.ts | 1 + x-pack/plugins/alerting/server/types.ts | 1 + .../server/routes/alerts/test_utils/index.ts | 1 + .../utils/create_lifecycle_executor.test.ts | 27 +++++++++++++++++++ .../server/utils/create_lifecycle_executor.ts | 14 +++++++--- .../utils/create_lifecycle_rule_type.test.ts | 23 +++++++++++++++- .../create_persistence_rule_type_wrapper.ts | 11 +++++++- .../server/utils/rule_executor_test_utils.ts | 3 +++ .../routes/rules/preview_rules_route.ts | 3 +++ .../rule_types/__mocks__/rule_type.ts | 1 + 11 files changed, 81 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/alerting/server/mocks.ts b/x-pack/plugins/alerting/server/mocks.ts index 7fb748a305037a..f23dbf05449adb 100644 --- a/x-pack/plugins/alerting/server/mocks.ts +++ b/x-pack/plugins/alerting/server/mocks.ts @@ -74,6 +74,7 @@ const createAlertServicesMock = < .mockReturnValue(alertInstanceFactoryMock), savedObjectsClient: savedObjectsClientMock.create(), scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), + shouldWriteAlerts: () => true, }; }; export type AlertServicesMock = ReturnType; diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index fb7268ef529dad..0cf52027873926 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -323,6 +323,7 @@ export class TaskRunner< InstanceContext, WithoutReservedActionGroups >(alertInstances), + shouldWriteAlerts: () => this.shouldLogAndScheduleActionsForAlerts(), }, params, state: alertTypeState as State, diff --git a/x-pack/plugins/alerting/server/types.ts b/x-pack/plugins/alerting/server/types.ts index c1645936c06e96..343b717dcb1aa8 100644 --- a/x-pack/plugins/alerting/server/types.ts +++ b/x-pack/plugins/alerting/server/types.ts @@ -75,6 +75,7 @@ export interface AlertServices< alertInstanceFactory: ( id: string ) => PublicAlertInstance; + shouldWriteAlerts: () => boolean; } export interface AlertExecutorOptions< diff --git a/x-pack/plugins/apm/server/routes/alerts/test_utils/index.ts b/x-pack/plugins/apm/server/routes/alerts/test_utils/index.ts index 22649a70104610..a8610bbcc8d37c 100644 --- a/x-pack/plugins/apm/server/routes/alerts/test_utils/index.ts +++ b/x-pack/plugins/apm/server/routes/alerts/test_utils/index.ts @@ -45,6 +45,7 @@ export const createRuleTypeMocks = () => { alertInstanceFactory: jest.fn(() => ({ scheduleActions })), alertWithLifecycle: jest.fn(), logger: loggerMock, + shouldWriteAlerts: () => true, }; return { diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts index fcddcab378bc6b..2c5fe09d80563f 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.test.ts @@ -350,6 +350,33 @@ describe('createLifecycleExecutor', () => { }) ); }); + + it('does not write alert documents when rule execution is cancelled and feature flags indicate to skip', async () => { + const logger = loggerMock.create(); + const ruleDataClientMock = createRuleDataClientMock(); + const executor = createLifecycleExecutor( + logger, + ruleDataClientMock + )<{}, TestRuleState, never, never, never>(async (options) => { + expect(options.state).toEqual(initialRuleState); + + const nextRuleState: TestRuleState = { + aRuleStateKey: 'NEXT_RULE_STATE_VALUE', + }; + + return nextRuleState; + }); + + await executor( + createDefaultAlertExecutorOptions({ + params: {}, + state: { wrapped: initialRuleState, trackedAlerts: {} }, + shouldWriteAlerts: false, + }) + ); + + expect(ruleDataClientMock.getWriter).not.toHaveBeenCalled(); + }); }); type TestRuleState = Record & { diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts index 1acbc0c3f43bdc..c30b1654a3587e 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts @@ -140,7 +140,7 @@ export const createLifecycleExecutor = > ): Promise> => { const { - services: { alertInstanceFactory }, + services: { alertInstanceFactory, shouldWriteAlerts }, state: previousState, } = options; @@ -281,7 +281,15 @@ export const createLifecycleExecutor = const newEventsToIndex = makeEventsDataMapFor(newAlertIds); const allEventsToIndex = [...trackedEventsToIndex, ...newEventsToIndex]; - if (allEventsToIndex.length > 0 && ruleDataClient.isWriteEnabled()) { + // Only write alerts if: + // - writing is enabled + // AND + // - rule execution has not been cancelled due to timeout + // OR + // - if execution has been cancelled due to timeout, if feature flags are configured to write alerts anyway + const writeAlerts = ruleDataClient.isWriteEnabled() && shouldWriteAlerts(); + + if (allEventsToIndex.length > 0 && writeAlerts) { logger.debug(`Preparing to index ${allEventsToIndex.length} alerts.`); await ruleDataClient.getWriter().bulk({ @@ -307,6 +315,6 @@ export const createLifecycleExecutor = return { wrapped: nextWrappedState ?? ({} as State), - trackedAlerts: ruleDataClient.isWriteEnabled() ? nextTrackedAlerts : {}, + trackedAlerts: writeAlerts ? nextTrackedAlerts : {}, }; }; diff --git a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts index 2284ad5e796eec..f0e2412629bb18 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_lifecycle_rule_type.test.ts @@ -21,7 +21,7 @@ import { createLifecycleRuleTypeFactory } from './create_lifecycle_rule_type_fac type RuleTestHelpers = ReturnType; -function createRule() { +function createRule(shouldWriteAlerts: boolean = true) { const ruleDataClientMock = createRuleDataClientMock(); const factory = createLifecycleRuleTypeFactory({ @@ -110,6 +110,7 @@ function createRule() { alertInstanceFactory, savedObjectsClient: {} as any, scopedClusterClient: {} as any, + shouldWriteAlerts: () => shouldWriteAlerts, }, spaceId: 'spaceId', state, @@ -152,6 +153,26 @@ describe('createLifecycleRuleTypeFactory', () => { }); }); + describe('when rule is cancelled due to timeout and config flags indicate to skip actions', () => { + beforeEach(() => { + helpers = createRule(false); + helpers.ruleDataClientMock.isWriteEnabled.mockReturnValue(true); + }); + + it("doesn't persist anything", async () => { + await helpers.alertWithLifecycle([ + { + id: 'opbeans-java', + fields: { + 'service.name': 'opbeans-java', + }, + }, + ]); + + expect(helpers.ruleDataClientMock.getWriter().bulk).toHaveBeenCalledTimes(0); + }); + }); + describe('when alerts are new', () => { beforeEach(async () => { await helpers.alertWithLifecycle([ diff --git a/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts b/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts index afdcf856a872f8..de1193771dd954 100644 --- a/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts +++ b/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts @@ -25,7 +25,16 @@ export const createPersistenceRuleTypeWrapper: CreatePersistenceRuleTypeWrapper const numAlerts = alerts.length; logger.debug(`Found ${numAlerts} alerts.`); - if (ruleDataClient.isWriteEnabled() && numAlerts) { + // Only write alerts if: + // - writing is enabled + // AND + // - rule execution has not been cancelled due to timeout + // OR + // - if execution has been cancelled due to timeout, if feature flags are configured to write alerts anyway + const writeAlerts = + ruleDataClient.isWriteEnabled() && options.services.shouldWriteAlerts(); + + if (writeAlerts && numAlerts) { const commonRuleFields = getCommonAlertFields(options); const CHUNK_SIZE = 10000; diff --git a/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts b/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts index 95a67611523714..288830f4b3804e 100644 --- a/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts +++ b/x-pack/plugins/rule_registry/server/utils/rule_executor_test_utils.ts @@ -31,6 +31,7 @@ export const createDefaultAlertExecutorOptions = < createdAt = new Date(), startedAt = new Date(), updatedAt = new Date(), + shouldWriteAlerts = true, }: { alertId?: string; ruleName?: string; @@ -39,6 +40,7 @@ export const createDefaultAlertExecutorOptions = < createdAt?: Date; startedAt?: Date; updatedAt?: Date; + shouldWriteAlerts?: boolean; }): AlertExecutorOptions => ({ alertId, createdBy: 'CREATED_BY', @@ -69,6 +71,7 @@ export const createDefaultAlertExecutorOptions = < .alertInstanceFactory, savedObjectsClient: savedObjectsClientMock.create(), scopedClusterClient: elasticsearchServiceMock.createScopedClusterClient(), + shouldWriteAlerts: () => shouldWriteAlerts, }, state, updatedBy: null, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts index 882732544dcbb6..3949e715820201 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/preview_rules_route.ts @@ -122,6 +122,7 @@ export const previewRulesRoute = async ( ruleTypeId: string, ruleTypeName: string, params: TParams, + shouldWriteAlerts: () => boolean, alertInstanceFactory: ( id: string ) => Pick< @@ -157,6 +158,7 @@ export const previewRulesRoute = async ( previousStartedAt, rule, services: { + shouldWriteAlerts, alertInstanceFactory, savedObjectsClient: context.core.savedObjects.client, scopedClusterClient: context.core.elasticsearch.client, @@ -191,6 +193,7 @@ export const previewRulesRoute = async ( signalRuleAlertType.id, signalRuleAlertType.name, previewRuleParams, + () => true, alertInstanceFactoryStub ); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts index c6f818f04fc5d2..aaab81a4c66fff 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts @@ -78,6 +78,7 @@ export const createRuleTypeMocks = ( findAlerts: jest.fn(), // TODO: does this stay? alertWithPersistence: jest.fn(), logger: loggerMock, + shouldWriteAlerts: () => true, }; return { From dbde0a75f92303b525d7845735085d08329006a1 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Fri, 3 Dec 2021 15:43:32 -0500 Subject: [PATCH 113/126] Update performance docs to touch on server-side considerations (#120356) * Update performance docs to touch on server-side considerations * update edited date --- dev_docs/key_concepts/performance.mdx | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/dev_docs/key_concepts/performance.mdx b/dev_docs/key_concepts/performance.mdx index 0201c7774f8540..5d955c789ddeb0 100644 --- a/dev_docs/key_concepts/performance.mdx +++ b/dev_docs/key_concepts/performance.mdx @@ -3,11 +3,13 @@ id: kibDevPerformance slug: /kibana-dev-docs/key-concepts/performance title: Performance summary: Performance tips for Kibana development. -date: 2021-09-02 +date: 2021-12-03 tags: ['kibana', 'onboarding', 'dev', 'performance'] --- -## Keep Kibana fast +## Client-side considerations + +### Lazy load code _tl;dr_: Load as much code lazily as possible. Everyone loves snappy applications with a responsive UI and hates spinners. Users deserve the @@ -105,3 +107,15 @@ Many OSS tools allow you to analyze the generated stats file: Webpack authors - [webpack-visualizer](https://chrisbateman.github.io/webpack-visualizer/) - [webpack-bundle-analyzer](https://github.com/webpack-contrib/webpack-bundle-analyzer) + +## Server-side considerations + +### Don't block the event loop + +[Node.js is single threaded](https://nodejs.dev/learn/introduction-to-nodejs) which means a single CPU-intensive server-side, synchronous operation will block any other functionality waiting to execute on the Kibana server. The affects background tasks, like alerts, and search sessions, as well as search requests and page loads. + +**When writing code that will run on the server, [don't block the event loop](https://nodejs.org/en/docs/guides/dont-block-the-event-loop/)**. Instead consider: + +- Writing async code. For example, leverage [setImmediate](https://nodejs.dev/learn/understanding-setimmediate) inside for loops. +- Executing logic on the client instead. This may not be a good option if you require a lot of data going back and forth between the server and the client, as that can also slow down the user's experience, especially over slower bandwidth internet connections. +- Worker threads are also an option if the code doesn't rely on stateful Kibana services. If you are interested in using worker threads, please reach out to a tech-lead before doing so. We will likely want to implement a worker threads pool to ensure worker threads cooperate appropriately. \ No newline at end of file From d21d721bd1104a3e231baa5775fcc6749423aafa Mon Sep 17 00:00:00 2001 From: Clint Andrew Hall Date: Fri, 3 Dec 2021 12:44:50 -0800 Subject: [PATCH 114/126] [presentation] Create Expression Input (#119411) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/plugins/presentation_util/common/index.ts | 6 + src/plugins/presentation_util/kibana.json | 13 +- .../expression_input}/autocomplete.ts | 24 +- .../components/expression_input/constants.ts | 28 ++ .../expression_input.stories.tsx | 94 +++++ .../expression_input/expression_input.tsx | 82 +++++ .../components/expression_input/index.tsx | 16 + .../components/expression_input/language.ts | 23 +- .../components/expression_input/providers.ts | 189 ++++++++++ .../components/expression_input/reference.ts | 24 +- .../public/components/index.tsx | 5 + .../public/components/types.ts | 43 +++ src/plugins/presentation_util/public/index.ts | 19 +- src/plugins/presentation_util/public/mocks.ts | 2 + .../presentation_util/public/plugin.ts | 3 + .../public/services/index.ts | 3 + src/plugins/presentation_util/public/types.ts | 2 + .../presentation_util/storybook/decorator.tsx | 20 +- .../presentation_util/storybook/main.ts | 4 +- .../presentation_util/storybook/manager.ts | 5 + .../canvas/common/lib/autocomplete.test.ts | 198 ---------- x-pack/plugins/canvas/common/lib/index.ts | 1 - x-pack/plugins/canvas/public/application.tsx | 3 - .../components/expression/expression.tsx | 19 +- .../public/components/expression/index.tsx | 7 +- .../expression_input.stories.storyshot | 33 +- .../__stories__/expression_input.stories.tsx | 76 ++-- .../expression_input/expression_input.tsx | 344 ++---------------- x-pack/plugins/canvas/public/plugin.tsx | 5 + .../canvas/storybook/storyshots.test.tsx | 5 + .../translations/translations/ja-JP.json | 12 +- .../translations/translations/zh-CN.json | 12 +- 32 files changed, 663 insertions(+), 657 deletions(-) rename {x-pack/plugins/canvas/common/lib => src/plugins/presentation_util/public/components/expression_input}/autocomplete.ts (98%) create mode 100644 src/plugins/presentation_util/public/components/expression_input/constants.ts create mode 100644 src/plugins/presentation_util/public/components/expression_input/expression_input.stories.tsx create mode 100644 src/plugins/presentation_util/public/components/expression_input/expression_input.tsx create mode 100644 src/plugins/presentation_util/public/components/expression_input/index.tsx rename x-pack/plugins/canvas/public/lib/monaco_language_def.ts => src/plugins/presentation_util/public/components/expression_input/language.ts (74%) create mode 100644 src/plugins/presentation_util/public/components/expression_input/providers.ts rename {x-pack/plugins/canvas => src/plugins/presentation_util}/public/components/expression_input/reference.ts (79%) delete mode 100644 x-pack/plugins/canvas/common/lib/autocomplete.test.ts diff --git a/src/plugins/presentation_util/common/index.ts b/src/plugins/presentation_util/common/index.ts index 4510a0aac5a0b3..a84a78c823a5f3 100644 --- a/src/plugins/presentation_util/common/index.ts +++ b/src/plugins/presentation_util/common/index.ts @@ -12,4 +12,10 @@ export const PLUGIN_ID = 'presentationUtil'; export const PLUGIN_NAME = 'presentationUtil'; +/** + * The unique identifier for the Expressions Language for use in the ExpressionInput + * and CodeEditor components. + */ +export const EXPRESSIONS_LANGUAGE_ID = 'kibana-expressions'; + export * from './labs'; diff --git a/src/plugins/presentation_util/kibana.json b/src/plugins/presentation_util/kibana.json index 210937b335e50b..32460a84551529 100644 --- a/src/plugins/presentation_util/kibana.json +++ b/src/plugins/presentation_util/kibana.json @@ -9,7 +9,16 @@ "kibanaVersion": "kibana", "server": true, "ui": true, - "extraPublicDirs": ["common/lib"], - "requiredPlugins": ["savedObjects", "data", "dataViews", "embeddable", "kibanaReact"], + "extraPublicDirs": [ + "common/lib" + ], + "requiredPlugins": [ + "savedObjects", + "data", + "dataViews", + "embeddable", + "kibanaReact", + "expressions" + ], "optionalPlugins": [] } diff --git a/x-pack/plugins/canvas/common/lib/autocomplete.ts b/src/plugins/presentation_util/public/components/expression_input/autocomplete.ts similarity index 98% rename from x-pack/plugins/canvas/common/lib/autocomplete.ts rename to src/plugins/presentation_util/public/components/expression_input/autocomplete.ts index 88fb6b052b9572..5f0c9cab6215c6 100644 --- a/x-pack/plugins/canvas/common/lib/autocomplete.ts +++ b/src/plugins/presentation_util/public/components/expression_input/autocomplete.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { uniq } from 'lodash'; @@ -15,9 +16,9 @@ import { ExpressionFunction, ExpressionFunctionParameter, getByAlias, -} from '../../../../../src/plugins/expressions/common'; +} from '../../../../expressions/common'; -const MARKER = 'CANVAS_SUGGESTION_MARKER'; +const MARKER = 'EXPRESSIONS_SUGGESTION_MARKER'; interface BaseSuggestion { text: string; @@ -25,11 +26,6 @@ interface BaseSuggestion { end: number; } -export interface FunctionSuggestion extends BaseSuggestion { - type: 'function'; - fnDef: ExpressionFunction; -} - interface ArgSuggestionValue extends Omit { name: string; } @@ -43,8 +39,6 @@ interface ValueSuggestion extends BaseSuggestion { type: 'value'; } -export type AutocompleteSuggestion = FunctionSuggestion | ArgSuggestion | ValueSuggestion; - interface FnArgAtPosition { ast: ExpressionASTWithMeta; fnIndex: number; @@ -57,6 +51,7 @@ interface FnArgAtPosition { // If this function is a sub-expression function, we need the parent function and argument // name to determine the return type of the function parentFn?: string; + // If this function is a sub-expression function, the context could either be local or it // could be the parent's previous function. contextFn?: string | null; @@ -101,6 +96,13 @@ type ExpressionASTWithMeta = ASTMetaInformation< > >; +export interface FunctionSuggestion extends BaseSuggestion { + type: 'function'; + fnDef: ExpressionFunction; +} + +export type AutocompleteSuggestion = FunctionSuggestion | ArgSuggestion | ValueSuggestion; + // Typeguard for checking if ExpressionArg is a new expression function isExpression( maybeExpression: ExpressionArgASTWithMeta diff --git a/src/plugins/presentation_util/public/components/expression_input/constants.ts b/src/plugins/presentation_util/public/components/expression_input/constants.ts new file mode 100644 index 00000000000000..f937d55cbf9bb5 --- /dev/null +++ b/src/plugins/presentation_util/public/components/expression_input/constants.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { CodeEditorProps } from '../../../../kibana_react/public'; + +export const LANGUAGE_CONFIGURATION = { + autoClosingPairs: [ + { + open: '{', + close: '}', + }, + ], +}; + +export const CODE_EDITOR_OPTIONS: CodeEditorProps['options'] = { + scrollBeyondLastLine: false, + quickSuggestions: true, + minimap: { + enabled: false, + }, + wordWrap: 'on', + wrappingIndent: 'indent', +}; diff --git a/src/plugins/presentation_util/public/components/expression_input/expression_input.stories.tsx b/src/plugins/presentation_util/public/components/expression_input/expression_input.stories.tsx new file mode 100644 index 00000000000000..648171959791f8 --- /dev/null +++ b/src/plugins/presentation_util/public/components/expression_input/expression_input.stories.tsx @@ -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 React from 'react'; +import { action } from '@storybook/addon-actions'; +import { Meta } from '@storybook/react'; + +import { ExpressionFunction, ExpressionFunctionParameter, Style } from 'src/plugins/expressions'; +import { ExpressionInput } from '../expression_input'; +import { registerExpressionsLanguage } from './language'; + +const content: ExpressionFunctionParameter<'string'> = { + name: 'content', + required: false, + help: 'A string of text that contains Markdown. To concatenate, pass the `string` function multiple times.', + types: ['string'], + default: '', + aliases: ['_', 'expression'], + multi: true, + resolve: false, + options: [], + accepts: () => true, +}; + +const font: ExpressionFunctionParameter

    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%0A2B?K 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'&rQ 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 z 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 diff --git a/docs/management/connectors/images/servicenow-sir-update-connector.png b/docs/management/connectors/images/servicenow-sir-update-connector.png new file mode 100644 index 0000000000000000000000000000000000000000..5a12ad971f62fb6ed060810726501d2d37889da2 GIT binary patch literal 250246 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

    @@ -70,7 +75,7 @@ export const CrawlDetailsFlyout: React.FC = () => { <> {selectedTab === 'preview' && } {selectedTab === 'json' && ( - + {JSON.stringify(crawlRequestFromServer, null, 2)} )} diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.test.tsx index d7c69e54451675..646c611901c7ff 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.test.tsx @@ -4,17 +4,77 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { setMockValues } from '../../../../../__mocks__/kea_logic'; import React from 'react'; -import { shallow } from 'enzyme'; +import { shallow, ShallowWrapper } from 'enzyme'; +import { CrawlDetailValues } from '../../crawl_detail_logic'; +import { CrawlerStatus, CrawlType } from '../../types'; + +import { AccordionList } from './accordion_list'; import { CrawlDetailsPreview } from './crawl_details_preview'; +const MOCK_VALUES: Partial = { + crawlRequest: { + id: '507f1f77bcf86cd799439011', + status: CrawlerStatus.Pending, + createdAt: 'Mon, 31 Aug 2020 17:00:00 +0000', + beganAt: null, + completedAt: null, + type: CrawlType.Full, + crawlConfig: { + domainAllowlist: ['https://www.elastic.co', 'https://www.swiftype.com'], + seedUrls: ['https://www.elastic.co/docs', 'https://www.swiftype.com/documentation'], + sitemapUrls: ['https://www.elastic.co/sitemap.xml', 'https://www.swiftype.com/sitemap.xml'], + }, + }, +}; + describe('CrawlDetailsPreview', () => { - it('is empty', () => { - const wrapper = shallow(); + it('is empty when a crawl request has not been loaded', () => { + setMockValues({ + crawlRequest: null, + }); + const wrapper = shallow(); expect(wrapper.isEmptyRender()).toBe(true); }); + + describe('when a crawl request has been loaded', () => { + let wrapper: ShallowWrapper; + + beforeAll(() => { + setMockValues(MOCK_VALUES); + wrapper = shallow(); + }); + + it('contains a list of domains', () => { + const domainList = wrapper.find(AccordionList).at(0); + + expect(domainList.prop('items')).toEqual([ + 'https://www.elastic.co', + 'https://www.swiftype.com', + ]); + }); + + it('contains a list of seed urls', () => { + const seedUrlList = wrapper.find(AccordionList).at(1); + + expect(seedUrlList.prop('items')).toEqual([ + 'https://www.elastic.co/docs', + 'https://www.swiftype.com/documentation', + ]); + }); + + it('contains a list of sitemap urls', () => { + const sitemapUrlList = wrapper.find(AccordionList).at(2); + + expect(sitemapUrlList.prop('items')).toEqual([ + 'https://www.elastic.co/sitemap.xml', + 'https://www.swiftype.com/sitemap.xml', + ]); + }); + }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.tsx index 7fa95d920c17bc..6f837d1db26e22 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_details_flyout/crawl_details_preview.tsx @@ -7,4 +7,62 @@ import React from 'react'; -export const CrawlDetailsPreview: React.FC = () => null; +import { useValues } from 'kea'; + +import { EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { CrawlDetailLogic } from '../../crawl_detail_logic'; + +import { AccordionList } from './accordion_list'; + +export const CrawlDetailsPreview: React.FC = () => { + const { crawlRequest } = useValues(CrawlDetailLogic); + + if (crawlRequest === null) { + return null; + } + + return ( + <> + 0} + title={i18n.translate( + 'xpack.enterpriseSearch.appSearch.crawler.crawlDetailsPreview.domainsTitle', + { + defaultMessage: 'Domains', + } + )} + iconType="globe" + items={crawlRequest.crawlConfig.domainAllowlist} + /> + + 0} + title={i18n.translate( + 'xpack.enterpriseSearch.appSearch.crawler.crawlDetailsPreview.seedUrlsTitle', + { + defaultMessage: 'Seed URLs', + } + )} + iconType="crosshairs" + items={crawlRequest.crawlConfig.seedUrls} + /> + + 0} + title={i18n.translate( + 'xpack.enterpriseSearch.appSearch.crawler.crawlDetailsPreview.sitemapUrlsTitle', + { + defaultMessage: 'Sitemap URLs', + } + )} + iconType="visMapRegion" + items={crawlRequest.crawlConfig.sitemapUrls} + /> + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_event_type_badge.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_event_type_badge.test.tsx index b0ff75e73e86c6..fd1f03c586f120 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_event_type_badge.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_event_type_badge.test.tsx @@ -29,6 +29,8 @@ const MOCK_EVENT: CrawlEvent = { type: CrawlType.Full, crawlConfig: { domainAllowlist: ['https://www.elastic.co'], + seedUrls: [], + sitemapUrls: [], }, }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx index bc5f8bf87e100c..e11661e4a942eb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/crawl_requests_table.test.tsx @@ -33,6 +33,8 @@ const values: { events: CrawlEvent[] } = { type: CrawlType.Full, crawlConfig: { domainAllowlist: ['https://www.elastic.co'], + seedUrls: [], + sitemapUrls: [], }, }, { @@ -45,6 +47,8 @@ const values: { events: CrawlEvent[] } = { type: CrawlType.Full, crawlConfig: { domainAllowlist: ['https://www.elastic.co'], + seedUrls: [], + sitemapUrls: [], }, }, ], diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawl_detail_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawl_detail_logic.test.ts index 57816db01b58cf..a7d795c93e0a7d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawl_detail_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawl_detail_logic.test.ts @@ -33,6 +33,8 @@ const crawlRequestResponse: CrawlRequestWithDetailsFromServer = { type: CrawlType.Full, crawl_config: { domain_allowlist: [], + seed_urls: [], + sitemap_urls: [], }, }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_logic.test.ts index f1e8dc6a6efa4f..5af9b1652c8895 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_logic.test.ts @@ -136,6 +136,8 @@ describe('CrawlerLogic', () => { type: CrawlType.Full, crawlConfig: { domainAllowlist: ['elastic.co'], + seedUrls: [], + sitemapUrls: [], }, }, ], diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_overview.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_overview.test.tsx index 7c5510519d2028..0d2c2e60abfa92 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_overview.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/crawler_overview.test.tsx @@ -78,6 +78,8 @@ const events: CrawlEventFromServer[] = [ type: CrawlType.Full, crawl_config: { domain_allowlist: ['moviedatabase.com', 'swiftype.com'], + seed_urls: [], + sitemap_urls: [], }, }, { @@ -90,6 +92,8 @@ const events: CrawlEventFromServer[] = [ type: CrawlType.Partial, crawl_config: { domain_allowlist: ['swiftype.com'], + seed_urls: [], + sitemap_urls: [], }, }, ]; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/types.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/types.ts index 6cdccfdc786332..85ebb0032971d1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/types.ts @@ -201,10 +201,14 @@ export interface CrawlRequest { export interface CrawlConfig { domainAllowlist: string[]; + seedUrls: string[]; + sitemapUrls: string[]; } export interface CrawlConfigFromServer { domain_allowlist: string[]; + seed_urls: string[]; + sitemap_urls: string[]; } export type CrawlRequestWithDetailsFromServer = CrawlRequestFromServer & { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.test.ts index c104312f19edc4..0df1f57eaefa08 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.test.ts @@ -139,6 +139,8 @@ describe('crawlRequestWithDetailsServerToClient', () => { type: CrawlType.Full, crawl_config: { domain_allowlist: [], + seed_urls: [], + sitemap_urls: [], }, }; @@ -151,6 +153,8 @@ describe('crawlRequestWithDetailsServerToClient', () => { type: CrawlType.Full, crawlConfig: { domainAllowlist: [], + seedUrls: [], + sitemapUrls: [], }, }; @@ -185,6 +189,8 @@ describe('crawlEventServerToClient', () => { type: CrawlType.Full, crawl_config: { domain_allowlist: [], + seed_urls: [], + sitemap_urls: [], }, stage: 'crawl', }; @@ -198,6 +204,8 @@ describe('crawlEventServerToClient', () => { type: CrawlType.Full, crawlConfig: { domainAllowlist: [], + seedUrls: [], + sitemapUrls: [], }, stage: 'crawl', }; @@ -264,6 +272,8 @@ describe('crawlerDataServerToClient', () => { type: CrawlType.Full, crawl_config: { domain_allowlist: ['https://www.elastic.co'], + seed_urls: [], + sitemap_urls: [], }, }, ], @@ -317,6 +327,8 @@ describe('crawlerDataServerToClient', () => { type: 'full', crawlConfig: { domainAllowlist: ['https://www.elastic.co'], + seedUrls: [], + sitemapUrls: [], }, }, ]); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.ts index 16e3dad5f46e92..d1203e19c02085 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/utils.ts @@ -85,10 +85,16 @@ export function crawlRequestServerToClient(crawlRequest: CrawlRequestFromServer) } export function crawlConfigServerToClient(crawlConfig: CrawlConfigFromServer): CrawlConfig { - const { domain_allowlist: domainAllowlist } = crawlConfig; + const { + domain_allowlist: domainAllowlist, + seed_urls: seedUrls, + sitemap_urls: sitemapUrls, + } = crawlConfig; return { domainAllowlist, + seedUrls, + sitemapUrls, }; } From 9f302fc62d9633bc0097993f4c403a8c6bfc6d95 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Wed, 1 Dec 2021 14:57:33 -0500 Subject: [PATCH 034/126] [Dashboard] Move Sharing Saved Object Props into Meta Object (#119913) Co-authored-by: Anton Dosov Co-authored-by: Marta Bondyra --- .../public/book/book_embeddable.tsx | 2 +- .../public/book/book_embeddable_factory.tsx | 6 ++- .../application/lib/diff_dashboard_state.ts | 15 +++--- .../attribute_service.mock.tsx | 9 ++-- .../attribute_service.test.ts | 25 ++++++--- .../attribute_service/attribute_service.tsx | 49 +++++++++++------ src/plugins/embeddable/public/plugin.tsx | 7 +-- .../lens/public/app_plugin/app.test.tsx | 18 ++++--- .../public/embeddable/embeddable.test.tsx | 49 ++++++++++------- .../lens/public/embeddable/embeddable.tsx | 24 +++++---- .../lens/public/lens_attribute_service.ts | 29 ++++++---- .../lens/public/mocks/services_mock.tsx | 12 +++-- .../__snapshots__/load_initial.test.tsx.snap | 54 ++++++++++--------- .../init_middleware/load_initial.ts | 3 +- .../state_management/load_initial.test.tsx | 36 +++++++------ .../maps/public/map_attribute_service.ts | 37 +++++++++---- .../routes/map_page/saved_map/saved_map.ts | 10 ++-- 17 files changed, 237 insertions(+), 148 deletions(-) diff --git a/examples/embeddable_examples/public/book/book_embeddable.tsx b/examples/embeddable_examples/public/book/book_embeddable.tsx index faf0cb8ab272c1..0f25d564e5580b 100644 --- a/examples/embeddable_examples/public/book/book_embeddable.tsx +++ b/examples/embeddable_examples/public/book/book_embeddable.tsx @@ -113,7 +113,7 @@ export class BookEmbeddable } public async reload() { - this.attributes = await this.attributeService.unwrapAttributes(this.input); + this.attributes = (await this.attributeService.unwrapAttributes(this.input)).attributes; this.updateOutput({ attributes: this.attributes, diff --git a/examples/embeddable_examples/public/book/book_embeddable_factory.tsx b/examples/embeddable_examples/public/book/book_embeddable_factory.tsx index 727e0fd18a52da..f44446991fde5f 100644 --- a/examples/embeddable_examples/public/book/book_embeddable_factory.tsx +++ b/examples/embeddable_examples/public/book/book_embeddable_factory.tsx @@ -115,11 +115,13 @@ export class BookEmbeddableFactoryDefinition }); } - private async unwrapMethod(savedObjectId: string): Promise { + private async unwrapMethod( + savedObjectId: string + ): Promise<{ attributes: BookSavedObjectAttributes }> { const { savedObjectsClient } = await this.getStartServices(); const savedObject: SimpleSavedObject = await savedObjectsClient.get(this.type, savedObjectId); - return { ...savedObject.attributes }; + return { attributes: { ...savedObject.attributes } }; } private async saveMethod(attributes: BookSavedObjectAttributes, savedObjectId?: string) { diff --git a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts index 2e89ee70d057d1..3f6f9f0966c9ca 100644 --- a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts +++ b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts @@ -79,15 +79,12 @@ const panelsAreEqual = (panelsA: DashboardPanelMap, panelsB: DashboardPanelMap): } // embeddable ids are equal so let's compare individual panels. for (const id of embeddableIdsA) { - if ( - Object.keys( - commonDiff( - panelsA[id] as unknown as DashboardDiffCommon, - panelsB[id] as unknown as DashboardDiffCommon, - ['panelRefName'] - ) - ).length > 0 - ) { + const panelCommonDiff = commonDiff( + panelsA[id] as unknown as DashboardDiffCommon, + panelsB[id] as unknown as DashboardDiffCommon, + ['panelRefName'] + ); + if (Object.keys(panelCommonDiff).length > 0) { return false; } } diff --git a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.mock.tsx b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.mock.tsx index 8229b84d15b546..859e9be9d29ddd 100644 --- a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.mock.tsx +++ b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.mock.tsx @@ -17,14 +17,15 @@ export const mockAttributeService = < V extends EmbeddableInput & { [ATTRIBUTE_SERVICE_KEY]: A } = EmbeddableInput & { [ATTRIBUTE_SERVICE_KEY]: A; }, - R extends SavedObjectEmbeddableInput = SavedObjectEmbeddableInput + R extends SavedObjectEmbeddableInput = SavedObjectEmbeddableInput, + M extends unknown = unknown >( type: string, - options: AttributeServiceOptions, + options: AttributeServiceOptions, customCore?: jest.Mocked -): AttributeService => { +): AttributeService => { const core = customCore ? customCore : coreMock.createStart(); - return new AttributeService( + return new AttributeService( type, jest.fn(), core.i18n.Context, diff --git a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.test.ts b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.test.ts index ccca51b13f9efb..8b954b7271e410 100644 --- a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.test.ts +++ b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { ATTRIBUTE_SERVICE_KEY } from './attribute_service'; +import { ATTRIBUTE_SERVICE_KEY, AttributeServiceUnwrapResult } from './attribute_service'; import { mockAttributeService } from './attribute_service.mock'; import { coreMock } from '../../../../../core/public/mocks'; import { OnSaveProps } from 'src/plugins/saved_objects/public/save_modal'; @@ -35,7 +35,10 @@ describe('attributeService', () => { return { id: '123' }; }); }; - const defaultUnwrapMethod = (savedObjectId: string): Promise => { + + const defaultUnwrapMethod = ( + savedObjectId: string + ): Promise> => { return new Promise(() => { return { ...attributes }; }); @@ -104,12 +107,14 @@ describe('attributeService', () => { saveMethod: defaultSaveMethod, checkForDuplicateTitle: jest.fn(), }); - expect(await attributeService.unwrapAttributes(byReferenceInput)).toEqual(byReferenceInput); + expect(await attributeService.unwrapAttributes(byReferenceInput)).toEqual({ + attributes: byReferenceInput, + }); }); it('returns attributes when when given value type input', async () => { const attributeService = mockAttributeService(defaultTestType, options); - expect(await attributeService.unwrapAttributes(byValueInput)).toEqual(attributes); + expect(await attributeService.unwrapAttributes(byValueInput)).toEqual({ attributes }); }); it('runs attributes through a custom unwrap method', async () => { @@ -118,16 +123,20 @@ describe('attributeService', () => { unwrapMethod: (savedObjectId) => { return new Promise((resolve) => { return resolve({ - ...attributes, - testAttr2: { array: [1, 2, 3, 4, 5], testAttr3: 'kibanana' }, + attributes: { + ...attributes, + testAttr2: { array: [1, 2, 3, 4, 5], testAttr3: 'kibanana' }, + }, }); }); }, checkForDuplicateTitle: jest.fn(), }); expect(await attributeService.unwrapAttributes(byReferenceInput)).toEqual({ - ...attributes, - testAttr2: { array: [1, 2, 3, 4, 5], testAttr3: 'kibanana' }, + attributes: { + ...attributes, + testAttr2: { array: [1, 2, 3, 4, 5], testAttr3: 'kibanana' }, + }, }); }); }); diff --git a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx index 9eb743a3911c2c..507d2be7198d5b 100644 --- a/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx +++ b/src/plugins/embeddable/public/lib/attribute_service/attribute_service.tsx @@ -29,13 +29,28 @@ import { */ export const ATTRIBUTE_SERVICE_KEY = 'attributes'; -export interface AttributeServiceOptions { +export interface GenericAttributes { + title: string; +} +export interface AttributeServiceUnwrapResult< + SavedObjectAttributes extends GenericAttributes, + MetaInfo extends unknown = unknown +> { + attributes: SavedObjectAttributes; + metaInfo?: MetaInfo; +} +export interface AttributeServiceOptions< + SavedObjectAttributes extends GenericAttributes, + MetaInfo extends unknown = unknown +> { saveMethod: ( - attributes: A, + attributes: SavedObjectAttributes, savedObjectId?: string ) => Promise<{ id?: string } | { error: Error }>; checkForDuplicateTitle: (props: OnSaveProps) => Promise; - unwrapMethod?: (savedObjectId: string) => Promise; + unwrapMethod?: ( + savedObjectId: string + ) => Promise>; } export class AttributeService< @@ -43,7 +58,8 @@ export class AttributeService< ValType extends EmbeddableInput & { [ATTRIBUTE_SERVICE_KEY]: SavedObjectAttributes; } = EmbeddableInput & { [ATTRIBUTE_SERVICE_KEY]: SavedObjectAttributes }, - RefType extends SavedObjectEmbeddableInput = SavedObjectEmbeddableInput + RefType extends SavedObjectEmbeddableInput = SavedObjectEmbeddableInput, + MetaInfo extends unknown = unknown > { constructor( private type: string, @@ -53,7 +69,7 @@ export class AttributeService< ) => void, private i18nContext: I18nStart['Context'], private toasts: NotificationsStart['toasts'], - private options: AttributeServiceOptions, + private options: AttributeServiceOptions, getEmbeddableFactory?: (embeddableFactoryId: string) => EmbeddableFactory ) { if (getEmbeddableFactory) { @@ -64,20 +80,21 @@ export class AttributeService< } } - private async defaultUnwrapMethod(input: RefType): Promise { - return new Promise((resolve) => { - // @ts-ignore - return resolve({ ...input }); - }); + private async defaultUnwrapMethod( + input: RefType + ): Promise> { + return Promise.resolve({ attributes: { ...(input as unknown as SavedObjectAttributes) } }); } - public async unwrapAttributes(input: RefType | ValType): Promise { + public async unwrapAttributes( + input: RefType | ValType + ): Promise> { if (this.inputIsRefType(input)) { return this.options.unwrapMethod ? await this.options.unwrapMethod(input.savedObjectId) : await this.defaultUnwrapMethod(input); } - return input[ATTRIBUTE_SERVICE_KEY]; + return { attributes: input[ATTRIBUTE_SERVICE_KEY] }; } public async wrapAttributes( @@ -126,12 +143,12 @@ export class AttributeService< if (!this.inputIsRefType(input)) { return input; } - const attributes = await this.unwrapAttributes(input); + const { attributes } = await this.unwrapAttributes(input); + const { savedObjectId, ...originalInputToPropagate } = input; return { - ...input, - savedObjectId: undefined, + ...originalInputToPropagate, attributes, - }; + } as unknown as ValType; }; getInputAsRefType = async ( diff --git a/src/plugins/embeddable/public/plugin.tsx b/src/plugins/embeddable/public/plugin.tsx index 9043514fad317d..465c5d741d5a91 100644 --- a/src/plugins/embeddable/public/plugin.tsx +++ b/src/plugins/embeddable/public/plugin.tsx @@ -91,11 +91,12 @@ export interface EmbeddableStart extends PersistableStateService( type: string, - options: AttributeServiceOptions - ) => AttributeService; + options: AttributeServiceOptions + ) => AttributeService; } export type EmbeddablePanelHOC = React.FC<{ diff --git a/x-pack/plugins/lens/public/app_plugin/app.test.tsx b/x-pack/plugins/lens/public/app_plugin/app.test.tsx index c765725eb9750c..7748a5fe37179d 100644 --- a/x-pack/plugins/lens/public/app_plugin/app.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/app.test.tsx @@ -400,14 +400,18 @@ describe('Lens App', () => { savedObjectId: savedObjectId || 'aaa', })); services.attributeService.unwrapAttributes = jest.fn().mockResolvedValue({ - sharingSavedObjectProps: { - outcome: 'exactMatch', + metaInfo: { + sharingSavedObjectProps: { + outcome: 'exactMatch', + }, }, - savedObjectId: initialSavedObjectId ?? 'aaa', - references: [], - state: { - query: 'fake query', - filters: [], + attributes: { + savedObjectId: initialSavedObjectId ?? 'aaa', + references: [], + state: { + query: 'fake query', + filters: [], + }, }, } as jest.ResolvedValue); diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx index b07962c6e66a07..3b4edb8c72b076 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx @@ -8,10 +8,11 @@ import { Embeddable, LensByValueInput, + LensUnwrapMetaInfo, + LensEmbeddableInput, LensByReferenceInput, LensSavedObjectAttributes, - LensEmbeddableInput, - ResolvedLensSavedObjectAttributes, + LensUnwrapResult, } from './embeddable'; import { ReactExpressionRendererProps } from 'src/plugins/expressions/public'; import { Filter } from '@kbn/es-query'; @@ -52,9 +53,11 @@ const defaultSaveMethod = ( return { id: '123' }; }); }; -const defaultUnwrapMethod = (savedObjectId: string): Promise => { +const defaultUnwrapMethod = ( + savedObjectId: string +): Promise<{ attributes: LensSavedObjectAttributes }> => { return new Promise(() => { - return { ...savedVis }; + return { attributes: { ...savedVis } }; }); }; const defaultCheckForDuplicateTitle = (props: OnSaveProps): Promise => { @@ -71,17 +74,22 @@ const options = { const attributeServiceMockFromSavedVis = (document: Document): LensAttributeService => { const core = coreMock.createStart(); const service = new AttributeService< - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, LensByValueInput, - LensByReferenceInput + LensByReferenceInput, + LensUnwrapMetaInfo >('lens', jest.fn(), core.i18n.Context, core.notifications.toasts, options); service.unwrapAttributes = jest.fn((input: LensByValueInput | LensByReferenceInput) => { return Promise.resolve({ - ...document, - sharingSavedObjectProps: { - outcome: 'exactMatch', + attributes: { + ...document, + }, + metaInfo: { + sharingSavedObjectProps: { + outcome: 'exactMatch', + }, }, - } as ResolvedLensSavedObjectAttributes); + } as LensUnwrapResult); }); service.wrapAttributes = jest.fn(); return service; @@ -94,9 +102,10 @@ describe('embeddable', () => { let trigger: { exec: jest.Mock }; let basePath: IBasePath; let attributeService: AttributeService< - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, LensByValueInput, - LensByReferenceInput + LensByReferenceInput, + LensUnwrapMetaInfo >; beforeEach(() => { @@ -241,13 +250,17 @@ describe('embeddable', () => { attributeService.unwrapAttributes = jest.fn( (input: LensByValueInput | LensByReferenceInput) => { return Promise.resolve({ - ...savedVis, - sharingSavedObjectProps: { - outcome: 'conflict', - sourceId: '1', - aliasTargetId: '2', + attributes: { + ...savedVis, + }, + metaInfo: { + sharingSavedObjectProps: { + outcome: 'conflict', + sourceId: '1', + aliasTargetId: '2', + }, }, - } as ResolvedLensSavedObjectAttributes); + } as LensUnwrapResult); } ); const embeddable = new Embeddable( diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 15704925b1c6b7..aef3cda8679ea0 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -67,10 +67,16 @@ import { SharingSavedObjectProps } from '../types'; import type { SpacesPluginStart } from '../../../spaces/public'; export type LensSavedObjectAttributes = Omit; -export interface ResolvedLensSavedObjectAttributes extends LensSavedObjectAttributes { + +export interface LensUnwrapMetaInfo { sharingSavedObjectProps?: SharingSavedObjectProps; } +export interface LensUnwrapResult { + attributes: LensSavedObjectAttributes; + metaInfo?: LensUnwrapMetaInfo; +} + interface LensBaseEmbeddableInput extends EmbeddableInput { filters?: Filter[]; query?: Query; @@ -86,7 +92,7 @@ interface LensBaseEmbeddableInput extends EmbeddableInput { } export type LensByValueInput = { - attributes: ResolvedLensSavedObjectAttributes; + attributes: LensSavedObjectAttributes; } & LensBaseEmbeddableInput; export type LensByReferenceInput = SavedObjectEmbeddableInput & LensBaseEmbeddableInput; @@ -278,10 +284,10 @@ export class Embeddable } private maybeAddConflictError( - errors: ErrorMessage[], + errors?: ErrorMessage[], sharingSavedObjectProps?: SharingSavedObjectProps ) { - const ret = [...errors]; + const ret = [...(errors || [])]; if (sharingSavedObjectProps?.outcome === 'conflict' && !!this.deps.spaces) { ret.push({ @@ -297,21 +303,21 @@ export class Embeddable }); } - return ret; + return ret?.length ? ret : undefined; } async initializeSavedVis(input: LensEmbeddableInput) { - const attrs: ResolvedLensSavedObjectAttributes | false = await this.deps.attributeService + const unwrapResult: LensUnwrapResult | false = await this.deps.attributeService .unwrapAttributes(input) .catch((e: Error) => { this.onFatalError(e); return false; }); - if (!attrs || this.isDestroyed) { + if (!unwrapResult || this.isDestroyed) { return; } - const { sharingSavedObjectProps, ...attributes } = attrs; + const { metaInfo, attributes } = unwrapResult; this.savedVis = { ...attributes, @@ -324,7 +330,7 @@ export class Embeddable this.deps.documentToExpression ); this.expression = expression; - this.errors = errors && this.maybeAddConflictError(errors, sharingSavedObjectProps); + this.errors = this.maybeAddConflictError(errors, metaInfo?.sharingSavedObjectProps); if (this.errors) { this.logError('validation'); diff --git a/x-pack/plugins/lens/public/lens_attribute_service.ts b/x-pack/plugins/lens/public/lens_attribute_service.ts index 30369b0fd586cf..80bdb8ce737b09 100644 --- a/x-pack/plugins/lens/public/lens_attribute_service.ts +++ b/x-pack/plugins/lens/public/lens_attribute_service.ts @@ -9,8 +9,10 @@ import type { CoreStart } from '../../../../src/core/public'; import type { LensPluginStartDependencies } from './plugin'; import type { AttributeService } from '../../../../src/plugins/embeddable/public'; import type { - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, LensByValueInput, + LensUnwrapMetaInfo, + LensUnwrapResult, LensByReferenceInput, } from './embeddable/embeddable'; import { SavedObjectIndexStore } from './persistence'; @@ -18,9 +20,10 @@ import { checkForDuplicateTitle, OnSaveProps } from '../../../../src/plugins/sav import { DOC_TYPE } from '../common/constants'; export type LensAttributeService = AttributeService< - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, LensByValueInput, - LensByReferenceInput + LensByReferenceInput, + LensUnwrapMetaInfo >; export function getLensAttributeService( @@ -29,20 +32,20 @@ export function getLensAttributeService( ): LensAttributeService { const savedObjectStore = new SavedObjectIndexStore(core.savedObjects.client); return startDependencies.embeddable.getAttributeService< - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, LensByValueInput, - LensByReferenceInput + LensByReferenceInput, + LensUnwrapMetaInfo >(DOC_TYPE, { - saveMethod: async (attributes: ResolvedLensSavedObjectAttributes, savedObjectId?: string) => { - const { sharingSavedObjectProps, ...attributesToSave } = attributes; + saveMethod: async (attributes: LensSavedObjectAttributes, savedObjectId?: string) => { const savedDoc = await savedObjectStore.save({ - ...attributesToSave, + ...attributes, savedObjectId, type: DOC_TYPE, }); return { id: savedDoc.savedObjectId }; }, - unwrapMethod: async (savedObjectId: string): Promise => { + unwrapMethod: async (savedObjectId: string): Promise => { const { saved_object: savedObject, outcome, @@ -61,8 +64,12 @@ export function getLensAttributeService( }; return { - sharingSavedObjectProps, - ...document, + attributes: { + ...document, + }, + metaInfo: { + sharingSavedObjectProps, + }, }; }, checkForDuplicateTitle: (props: OnSaveProps) => { diff --git a/x-pack/plugins/lens/public/mocks/services_mock.tsx b/x-pack/plugins/lens/public/mocks/services_mock.tsx index c6db0dfb6aae89..5ec4f8db4a0ed5 100644 --- a/x-pack/plugins/lens/public/mocks/services_mock.tsx +++ b/x-pack/plugins/lens/public/mocks/services_mock.tsx @@ -18,7 +18,8 @@ import { dashboardPluginMock } from '../../../../../src/plugins/dashboard/public import type { LensByValueInput, LensByReferenceInput, - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, + LensUnwrapMetaInfo, } from '../embeddable/embeddable'; import { mockAttributeService, @@ -49,7 +50,9 @@ export const defaultDoc = { } as unknown as Document; export const exactMatchDoc = { - ...defaultDoc, + attributes: { + ...defaultDoc, + }, sharingSavedObjectProps: { outcome: 'exactMatch', }, @@ -83,9 +86,10 @@ export function makeDefaultServices( function makeAttributeService(): LensAttributeService { const attributeServiceMock = mockAttributeService< - ResolvedLensSavedObjectAttributes, + LensSavedObjectAttributes, LensByValueInput, - LensByReferenceInput + LensByReferenceInput, + LensUnwrapMetaInfo >( DOC_TYPE, { diff --git a/x-pack/plugins/lens/public/state_management/__snapshots__/load_initial.test.tsx.snap b/x-pack/plugins/lens/public/state_management/__snapshots__/load_initial.test.tsx.snap index 0c92267382053c..efde7184ac7314 100644 --- a/x-pack/plugins/lens/public/state_management/__snapshots__/load_initial.test.tsx.snap +++ b/x-pack/plugins/lens/public/state_management/__snapshots__/load_initial.test.tsx.snap @@ -21,36 +21,38 @@ Object { "isSaveable": true, "persistedDoc": Object { "exactMatchDoc": Object { - "expression": "definitely a valid expression", - "references": Array [ - Object { - "id": "1", - "name": "index-pattern-0", - "type": "index-pattern", - }, - ], - "savedObjectId": "1234", - "sharingSavedObjectProps": Object { - "outcome": "exactMatch", - }, - "state": Object { - "datasourceStates": Object { - "testDatasource": "datasource", - }, - "filters": Array [ + "attributes": Object { + "expression": "definitely a valid expression", + "references": Array [ Object { - "query": Object { - "match_phrase": Object { - "src": "test", - }, - }, + "id": "1", + "name": "index-pattern-0", + "type": "index-pattern", }, ], - "query": "kuery", - "visualization": Object {}, + "savedObjectId": "1234", + "state": Object { + "datasourceStates": Object { + "testDatasource": "datasource", + }, + "filters": Array [ + Object { + "query": Object { + "match_phrase": Object { + "src": "test", + }, + }, + }, + ], + "query": "kuery", + "visualization": Object {}, + }, + "title": "An extremely cool default document!", + "visualizationType": "testVis", + }, + "sharingSavedObjectProps": Object { + "outcome": "exactMatch", }, - "title": "An extremely cool default document!", - "visualizationType": "testVis", }, "references": Array [], "savedObjectId": "1234", diff --git a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts index 915c56d59dbb32..0944b4bb2cad47 100644 --- a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts +++ b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts @@ -45,7 +45,8 @@ export const getPersisted = async ({ }, }; } - const { sharingSavedObjectProps, ...attributes } = result; + const { metaInfo, attributes } = result; + const sharingSavedObjectProps = metaInfo?.sharingSavedObjectProps; if (spaces && sharingSavedObjectProps?.outcome === 'aliasMatch' && history) { // We found this object by a legacy URL alias from its old ID; redirect the user to the page with its new ID, preserving any URL hash const newObjectId = sharingSavedObjectProps?.aliasTargetId; // This is always defined if outcome === 'aliasMatch' diff --git a/x-pack/plugins/lens/public/state_management/load_initial.test.tsx b/x-pack/plugins/lens/public/state_management/load_initial.test.tsx index ac27ca4398326c..1143bf8f7561e2 100644 --- a/x-pack/plugins/lens/public/state_management/load_initial.test.tsx +++ b/x-pack/plugins/lens/public/state_management/load_initial.test.tsx @@ -64,19 +64,21 @@ describe('Initializing the store', () => { const datasource2State = { datasource2: '' }; const services = makeDefaultServices(); services.attributeService.unwrapAttributes = jest.fn().mockResolvedValue({ - exactMatchDoc, - visualizationType: 'testVis', - title: '', - state: { - datasourceStates: { - testDatasource: datasource1State, - testDatasource2: datasource2State, + attributes: { + exactMatchDoc, + visualizationType: 'testVis', + title: '', + state: { + datasourceStates: { + testDatasource: datasource1State, + testDatasource2: datasource2State, + }, + visualization: {}, + query: { query: '', language: 'lucene' }, + filters: [], }, - visualization: {}, - query: { query: '', language: 'lucene' }, - filters: [], + references: [], }, - references: [], }); const storeDeps = mockStoreDeps({ @@ -281,10 +283,14 @@ describe('Initializing the store', () => { it('redirects if saved object is an aliasMatch', async () => { const { store, deps } = makeLensStore({ preloadedState }); deps.lensServices.attributeService.unwrapAttributes = jest.fn().mockResolvedValue({ - ...defaultDoc, - sharingSavedObjectProps: { - outcome: 'aliasMatch', - aliasTargetId: 'id2', + attributes: { + ...defaultDoc, + }, + metaInfo: { + sharingSavedObjectProps: { + outcome: 'aliasMatch', + aliasTargetId: 'id2', + }, }, }); diff --git a/x-pack/plugins/maps/public/map_attribute_service.ts b/x-pack/plugins/maps/public/map_attribute_service.ts index 85d4d73da82cde..6f610d8a6a2ff0 100644 --- a/x-pack/plugins/maps/public/map_attribute_service.ts +++ b/x-pack/plugins/maps/public/map_attribute_service.ts @@ -22,11 +22,18 @@ export interface SharingSavedObjectProps { } type MapDoc = MapSavedObjectAttributes & { - sharingSavedObjectProps?: SharingSavedObjectProps; references?: SavedObjectReference[]; }; +export interface MapUnwrapMetaInfo { + sharingSavedObjectProps: SharingSavedObjectProps; +} -export type MapAttributeService = AttributeService; +export type MapAttributeService = AttributeService< + MapDoc, + MapByValueInput, + MapByReferenceInput, + MapUnwrapMetaInfo +>; let mapAttributeService: MapAttributeService | null = null; @@ -38,7 +45,8 @@ export function getMapAttributeService(): MapAttributeService { mapAttributeService = getEmbeddableService().getAttributeService< MapDoc, MapByValueInput, - MapByReferenceInput + MapByReferenceInput, + MapUnwrapMetaInfo >(MAP_SAVED_OBJECT_TYPE, { saveMethod: async (attributes: MapDoc, savedObjectId?: string) => { // AttributeService "attributes" contains "references" as a child. @@ -66,7 +74,12 @@ export function getMapAttributeService(): MapAttributeService { )); return { id: savedObject.id }; }, - unwrapMethod: async (savedObjectId: string): Promise => { + unwrapMethod: async ( + savedObjectId: string + ): Promise<{ + attributes: MapDoc; + metaInfo: MapUnwrapMetaInfo; + }> => { const { saved_object: savedObject, outcome, @@ -82,12 +95,16 @@ export function getMapAttributeService(): MapAttributeService { const { attributes } = injectReferences(savedObject); return { - ...attributes, - references: savedObject.references, - sharingSavedObjectProps: { - aliasTargetId, - outcome, - sourceId: savedObjectId, + attributes: { + ...attributes, + references: savedObject.references, + }, + metaInfo: { + sharingSavedObjectProps: { + aliasTargetId, + outcome, + sourceId: savedObjectId, + }, }, }; }, diff --git a/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts b/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts index a6f1eb8572ef18..a9547fe90a007d 100644 --- a/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts +++ b/x-pack/plugins/maps/public/routes/map_page/saved_map/saved_map.ts @@ -103,11 +103,13 @@ export class SavedMap { description: '', }; } else { - const doc = await getMapAttributeService().unwrapAttributes(this._mapEmbeddableInput); - const { references, sharingSavedObjectProps, ...savedObjectAttributes } = doc; + const { attributes: doc, metaInfo } = await getMapAttributeService().unwrapAttributes( + this._mapEmbeddableInput + ); + const { references, ...savedObjectAttributes } = doc; this._attributes = savedObjectAttributes; - if (sharingSavedObjectProps) { - this._sharingSavedObjectProps = sharingSavedObjectProps; + if (metaInfo?.sharingSavedObjectProps) { + this._sharingSavedObjectProps = metaInfo.sharingSavedObjectProps; } const savedObjectsTagging = getSavedObjectsTagging(); if (savedObjectsTagging && references && references.length) { From 571adbb04c7af93207cd536184903e09d768c768 Mon Sep 17 00:00:00 2001 From: Georgii Gorbachev Date: Wed, 1 Dec 2021 21:00:25 +0100 Subject: [PATCH 035/126] [Security Solution][Detections] Fix 409 conflict error happening when user enables a rule (#120088) **Tickets:** https://github.com/elastic/kibana/issues/119334, https://github.com/elastic/kibana/issues/119596 ## Summary With this PR, we do not update rule execution status to `going to run` for a rule immediately when the user enables this rule. Instead, the rule executor now does this as soon as the rule starts. This should fix the 409 conflict error that has been happening due to a race condition between the route handler and the executor both changing the status to `going to run` at almost the same time. ### Checklist - [ ] [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 --- .../routes/rules/perform_bulk_action_route.ts | 2 -- .../lib/detection_engine/rules/enable_rule.ts | 20 +------------------ .../lib/detection_engine/rules/patch_rules.ts | 2 +- .../detection_engine/rules/update_rules.ts | 2 +- 4 files changed, 3 insertions(+), 23 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/perform_bulk_action_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/perform_bulk_action_route.ts index 251ff1e6e5f388..fb766124ea6eef 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/perform_bulk_action_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/rules/perform_bulk_action_route.ts @@ -89,8 +89,6 @@ export const performBulkActionRoute = ( await enableRule({ rule, rulesClient, - ruleStatusClient, - spaceId: context.securitySolution.getSpaceId(), }); } }) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enable_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enable_rule.ts index e24da8a2ba0d48..828471a1aea612 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enable_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/enable_rule.ts @@ -7,15 +7,11 @@ import { SanitizedAlert } from '../../../../../alerting/common'; import { RulesClient } from '../../../../../alerting/server'; -import { RuleExecutionStatus } from '../../../../common/detection_engine/schemas/common/schemas'; -import { IRuleExecutionLogClient } from '../rule_execution_log/types'; import { RuleParams } from '../schemas/rule_schemas'; interface EnableRuleArgs { rule: SanitizedAlert; rulesClient: RulesClient; - ruleStatusClient: IRuleExecutionLogClient; - spaceId: string; } /** @@ -23,21 +19,7 @@ interface EnableRuleArgs { * * @param rule - rule to enable * @param rulesClient - Alerts client - * @param ruleStatusClient - ExecLog client */ -export const enableRule = async ({ - rule, - rulesClient, - ruleStatusClient, - spaceId, -}: EnableRuleArgs) => { +export const enableRule = async ({ rule, rulesClient }: EnableRuleArgs) => { await rulesClient.enable({ id: rule.id }); - - await ruleStatusClient.logStatusChange({ - ruleId: rule.id, - ruleName: rule.name, - ruleType: rule.alertTypeId, - spaceId, - newStatus: RuleExecutionStatus['going to run'], - }); }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts index ee3098b8577d4f..8c256c54c24abd 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/patch_rules.ts @@ -222,7 +222,7 @@ export const patchRules = async ({ if (rule.enabled && enabled === false) { await rulesClient.disable({ id: rule.id }); } else if (!rule.enabled && enabled === true) { - await enableRule({ rule, rulesClient, ruleStatusClient, spaceId }); + await enableRule({ rule, rulesClient }); } else { // enabled is null or undefined and we do not touch the rule } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts index eb406cffccbb44..476a9e4d615f2f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rules/update_rules.ts @@ -104,7 +104,7 @@ export const updateRules = async ({ if (existingRule.enabled && enabled === false) { await rulesClient.disable({ id: existingRule.id }); } else if (!existingRule.enabled && enabled === true) { - await enableRule({ rule: existingRule, rulesClient, ruleStatusClient, spaceId }); + await enableRule({ rule: existingRule, rulesClient }); } return { ...update, enabled }; }; From 6d86a3b6b1564b1457858048fd5a241462c7254a Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 1 Dec 2021 20:53:38 +0000 Subject: [PATCH 036/126] chore(NA): use internal pkg_npm on @elastic/eslint-config-kibana (#120139) --- packages/elastic-eslint-config-kibana/BUILD.bazel | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/elastic-eslint-config-kibana/BUILD.bazel b/packages/elastic-eslint-config-kibana/BUILD.bazel index 628b3a8bf173ca..d8b727bf3b6bc6 100644 --- a/packages/elastic-eslint-config-kibana/BUILD.bazel +++ b/packages/elastic-eslint-config-kibana/BUILD.bazel @@ -1,4 +1,5 @@ -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "pkg_npm") PKG_BASE_NAME = "elastic-eslint-config-kibana" PKG_REQUIRE_NAME = "@elastic/eslint-config-kibana" @@ -24,7 +25,7 @@ NPM_MODULE_EXTRA_FILES = [ "README.md", ] -DEPS = [ +RUNTIME_DEPS = [ "//packages/kbn-babel-preset", "//packages/kbn-dev-utils", "@npm//eslint-config-prettier", @@ -36,7 +37,7 @@ js_library( srcs = NPM_MODULE_EXTRA_FILES + [ ":srcs", ], - deps = DEPS, + deps = RUNTIME_DEPS, package_name = PKG_REQUIRE_NAME, visibility = ["//visibility:public"], ) From f9c84b65d7ddd3c52ff06a48a1048f6c34e8c517 Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Wed, 1 Dec 2021 16:29:27 -0500 Subject: [PATCH 037/126] Refreshing second signals index (#120153) --- .../security_and_spaces/tests/common/cases/patch_cases.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts index a4311774fd4480..7eae95ff54bacb 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts @@ -665,8 +665,7 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/117971 - describe.skip('esArchiver', () => { + describe('esArchiver', () => { const defaultSignalsIndex = '.siem-signals-default-000001'; beforeEach(async () => { @@ -725,6 +724,7 @@ export default ({ getService }: FtrProviderContext): void => { }); await es.indices.refresh({ index: defaultSignalsIndex }); + await es.indices.refresh({ index: signalsIndex2 }); let signals = await getSignals(); // There should be no change in their status since syncing is disabled @@ -748,6 +748,7 @@ export default ({ getService }: FtrProviderContext): void => { })) as CasesResponse; await es.indices.refresh({ index: defaultSignalsIndex }); + await es.indices.refresh({ index: signalsIndex2 }); signals = await getSignals(); @@ -773,6 +774,7 @@ export default ({ getService }: FtrProviderContext): void => { }, }); await es.indices.refresh({ index: defaultSignalsIndex }); + await es.indices.refresh({ index: signalsIndex2 }); signals = await getSignals(); From d08df9ece4c977f582626bf6dd6c4975feae2199 Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Wed, 1 Dec 2021 16:17:11 -0600 Subject: [PATCH 038/126] [Security Solution] remove POST metadata list API (#119401) --- .../common/endpoint/schema/metadata.test.ts | 4 +- .../common/endpoint/schema/metadata.ts | 4 +- .../management/pages/endpoint_hosts/mocks.ts | 24 - .../endpoint/routes/metadata/handlers.ts | 90 +-- .../server/endpoint/routes/metadata/index.ts | 54 +- .../endpoint/routes/metadata/metadata.test.ts | 513 +---------------- .../apis/metadata.ts | 540 ------------------ 7 files changed, 12 insertions(+), 1217 deletions(-) diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/metadata.test.ts b/x-pack/plugins/security_solution/common/endpoint/schema/metadata.test.ts index b9693fde1d659b..fa5104da8dab6a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/metadata.test.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/metadata.test.ts @@ -7,11 +7,11 @@ import { ENDPOINT_DEFAULT_PAGE, ENDPOINT_DEFAULT_PAGE_SIZE } from '../constants'; import { HostStatus } from '../types'; -import { GetMetadataListRequestSchemaV2 } from './metadata'; +import { GetMetadataListRequestSchema } from './metadata'; describe('endpoint metadata schema', () => { describe('GetMetadataListRequestSchemaV2', () => { - const query = GetMetadataListRequestSchemaV2.query; + const query = GetMetadataListRequestSchema.query; it('should return correct query params when valid', () => { const queryParams = { diff --git a/x-pack/plugins/security_solution/common/endpoint/schema/metadata.ts b/x-pack/plugins/security_solution/common/endpoint/schema/metadata.ts index eb123590af20cb..4271b8417a9849 100644 --- a/x-pack/plugins/security_solution/common/endpoint/schema/metadata.ts +++ b/x-pack/plugins/security_solution/common/endpoint/schema/metadata.ts @@ -9,7 +9,7 @@ import { schema, TypeOf } from '@kbn/config-schema'; import { ENDPOINT_DEFAULT_PAGE, ENDPOINT_DEFAULT_PAGE_SIZE } from '../constants'; import { HostStatus } from '../types'; -export const GetMetadataListRequestSchemaV2 = { +export const GetMetadataListRequestSchema = { query: schema.object( { page: schema.number({ defaultValue: ENDPOINT_DEFAULT_PAGE, min: 0 }), @@ -31,4 +31,4 @@ export const GetMetadataListRequestSchemaV2 = { ), }; -export type GetMetadataListRequestQuery = TypeOf; +export type GetMetadataListRequestQuery = TypeOf; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/mocks.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/mocks.ts index 781c332430c0fe..3aacd1db2f3dd9 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/mocks.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/mocks.ts @@ -48,30 +48,6 @@ type EndpointMetadataHttpMocksInterface = ResponseProvidersInterface<{ }>; export const endpointMetadataHttpMocks = httpHandlerMockFactory( [ - { - id: 'metadataList', - path: HOST_METADATA_LIST_ROUTE, - method: 'post', - handler: () => { - const generator = new EndpointDocGenerator('seed'); - - return { - hosts: Array.from({ length: 10 }, () => { - const endpoint = { - metadata: generator.generateHostMetadata(), - host_status: HostStatus.UNHEALTHY, - }; - - generator.updateCommonInfo(); - - return endpoint; - }), - total: 10, - request_page_size: 10, - request_page_index: 0, - }; - }, - }, { id: 'metadataList', path: HOST_METADATA_LIST_ROUTE, diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts index 708cac5a845ce5..06e63c6b7ec59c 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/handlers.ts @@ -23,11 +23,11 @@ import { } from '../../../../common/endpoint/types'; import type { SecuritySolutionRequestHandlerContext } from '../../../types'; -import { getPagingProperties, kibanaRequestToMetadataListESQuery } from './query_builders'; +import { kibanaRequestToMetadataListESQuery } from './query_builders'; import { PackagePolicy } from '../../../../../fleet/common/types/models'; import { AgentNotFoundError } from '../../../../../fleet/server'; import { EndpointAppContext, HostListQueryResult } from '../../types'; -import { GetMetadataListRequestSchema, GetMetadataRequestSchema } from './index'; +import { GetMetadataRequestSchema } from './index'; import { findAllUnenrolledAgentIds } from './support/unenroll'; import { getAllEndpointPackagePolicies } from './support/endpoint_package_policies'; import { findAgentIdsByStatus } from './support/agent_status'; @@ -82,91 +82,7 @@ const errorHandler = ( throw error; }; -export const getMetadataListRequestHandler = function ( - endpointAppContext: EndpointAppContext, - logger: Logger -): RequestHandler< - unknown, - unknown, - TypeOf, - SecuritySolutionRequestHandlerContext -> { - return async (context, request, response) => { - const endpointMetadataService = endpointAppContext.service.getEndpointMetadataService(); - const fleetServices = endpointAppContext.service.getScopedFleetServices(request); - - let doesUnitedIndexExist = false; - let didUnitedIndexError = false; - let body: HostResultList = { - hosts: [], - total: 0, - request_page_size: 0, - request_page_index: 0, - }; - - try { - doesUnitedIndexExist = await endpointMetadataService.doesUnitedIndexExist( - context.core.elasticsearch.client.asCurrentUser - ); - } catch (error) { - // for better UX, try legacy query instead of immediately failing on united index error - didUnitedIndexError = true; - } - - // If no unified Index present, then perform a search using the legacy approach - if (!doesUnitedIndexExist || didUnitedIndexError) { - const endpointPolicies = await getAllEndpointPackagePolicies( - fleetServices.packagePolicy, - context.core.savedObjects.client - ); - - const pagingProperties = await getPagingProperties(request, endpointAppContext); - - body = await legacyListMetadataQuery( - context, - endpointAppContext, - fleetServices, - logger, - endpointPolicies, - { - page: pagingProperties.pageIndex, - pageSize: pagingProperties.pageSize, - kuery: request?.body?.filters?.kql || '', - hostStatuses: request?.body?.filters?.host_status || [], - } - ); - return response.ok({ body }); - } - - // Unified index is installed and being used - perform search using new approach - try { - const pagingProperties = await getPagingProperties(request, endpointAppContext); - const { data, total } = await endpointMetadataService.getHostMetadataList( - context.core.elasticsearch.client.asCurrentUser, - fleetServices, - { - page: pagingProperties.pageIndex, - pageSize: pagingProperties.pageSize, - hostStatuses: request.body?.filters.host_status || [], - kuery: request.body?.filters.kql || '', - } - ); - - body = { - hosts: data, - total, - request_page_index: pagingProperties.pageIndex * pagingProperties.pageSize, - request_page_size: pagingProperties.pageSize, - }; - } catch (error) { - return errorHandler(logger, response, error); - } - - return response.ok({ body }); - }; -}; - -export function getMetadataListRequestHandlerV2( +export function getMetadataListRequestHandler( endpointAppContext: EndpointAppContext, logger: Logger ): RequestHandler< diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts index ffa0bf06379005..6cd1ae275d592d 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/index.ts @@ -9,20 +9,13 @@ import { schema } from '@kbn/config-schema'; import { HostStatus } from '../../../../common/endpoint/types'; import { EndpointAppContext } from '../../types'; -import { - getLogger, - getMetadataListRequestHandler, - getMetadataRequestHandler, - getMetadataListRequestHandlerV2, -} from './handlers'; +import { getLogger, getMetadataRequestHandler, getMetadataListRequestHandler } from './handlers'; import type { SecuritySolutionPluginRouter } from '../../../types'; import { - ENDPOINT_DEFAULT_PAGE, - ENDPOINT_DEFAULT_PAGE_SIZE, HOST_METADATA_GET_ROUTE, HOST_METADATA_LIST_ROUTE, } from '../../../../common/endpoint/constants'; -import { GetMetadataListRequestSchemaV2 } from '../../../../common/endpoint/schema/metadata'; +import { GetMetadataListRequestSchema } from '../../../../common/endpoint/schema/metadata'; /* Filters that can be applied to the endpoint fetch route */ export const endpointFilters = schema.object({ @@ -44,36 +37,6 @@ export const GetMetadataRequestSchema = { params: schema.object({ id: schema.string() }), }; -export const GetMetadataListRequestSchema = { - body: schema.nullable( - schema.object({ - paging_properties: schema.nullable( - schema.arrayOf( - schema.oneOf([ - /** - * the number of results to return for this request per page - */ - schema.object({ - page_size: schema.number({ - defaultValue: ENDPOINT_DEFAULT_PAGE_SIZE, - min: 1, - max: 10000, - }), - }), - /** - * the zero based page index of the the total number of pages of page size - */ - schema.object({ - page_index: schema.number({ defaultValue: ENDPOINT_DEFAULT_PAGE, min: 0 }), - }), - ]) - ) - ), - filters: endpointFilters, - }) - ), -}; - export function registerEndpointRoutes( router: SecuritySolutionPluginRouter, endpointAppContext: EndpointAppContext @@ -83,10 +46,10 @@ export function registerEndpointRoutes( router.get( { path: HOST_METADATA_LIST_ROUTE, - validate: GetMetadataListRequestSchemaV2, + validate: GetMetadataListRequestSchema, options: { authRequired: true, tags: ['access:securitySolution'] }, }, - getMetadataListRequestHandlerV2(endpointAppContext, logger) + getMetadataListRequestHandler(endpointAppContext, logger) ); router.get( @@ -97,13 +60,4 @@ export function registerEndpointRoutes( }, getMetadataRequestHandler(endpointAppContext, logger) ); - - router.post( - { - path: HOST_METADATA_LIST_ROUTE, - validate: GetMetadataListRequestSchema, - options: { authRequired: true, tags: ['access:securitySolution'] }, - }, - getMetadataListRequestHandler(endpointAppContext, logger) - ); } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts index c705246014a7b6..e324f66ad38f6c 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/metadata/metadata.test.ts @@ -18,12 +18,7 @@ import { loggingSystemMock, savedObjectsClientMock, } from '../../../../../../../src/core/server/mocks'; -import { - HostInfo, - HostResultList, - HostStatus, - MetadataListResponse, -} from '../../../../common/endpoint/types'; +import { HostInfo, HostStatus, MetadataListResponse } from '../../../../common/endpoint/types'; import { parseExperimentalConfigValue } from '../../../../common/experimental_features'; import { registerEndpointRoutes } from './index'; import { @@ -121,512 +116,6 @@ describe('test endpoint routes', () => { }); }); - describe('POST list endpoints route', () => { - describe('with .metrics-endpoint.metadata_united_default index', () => { - beforeEach(() => { - endpointAppContextService = new EndpointAppContextService(); - mockPackageService = createMockPackageService(); - mockPackageService.getInstallation.mockReturnValue( - Promise.resolve({ - installed_kibana: [], - package_assets: [], - es_index_patterns: {}, - name: '', - version: '', - install_status: 'installed', - install_version: '', - install_started_at: '', - install_source: 'registry', - installed_es: [ - { - id: 'logs-endpoint.events.security', - type: ElasticsearchAssetType.indexTemplate, - }, - { - id: `${metadataTransformPrefix}-0.16.0-dev.0`, - type: ElasticsearchAssetType.transform, - }, - ], - keep_policies_up_to_date: false, - }) - ); - endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); - endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); - mockAgentService = startContract.agentService!; - mockAgentClient = createMockAgentClient(); - mockAgentService.asScoped = () => mockAgentClient; - mockAgentPolicyService = startContract.agentPolicyService!; - - registerEndpointRoutes(routerMock, { - logFactory: loggingSystemMock.create(), - service: endpointAppContextService, - config: () => Promise.resolve(createMockConfig()), - experimentalFeatures: parseExperimentalConfigValue(createMockConfig().enableExperimental), - }); - }); - - afterEach(() => endpointAppContextService.stop()); - - it('should fallback to legacy index if index not found', async () => { - const mockRequest = httpServerMock.createKibanaRequest({}); - const response = legacyMetadataSearchResponseMock( - new EndpointDocGenerator().generateHostMetadata() - ); - (mockScopedClient.asCurrentUser.search as jest.Mock) - .mockImplementationOnce(() => { - throw new IndexNotFoundException(); - }) - .mockImplementationOnce(() => Promise.resolve({ body: response })); - [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => - path.startsWith(HOST_METADATA_LIST_ROUTE) - )!; - mockAgentClient.getAgentStatusById.mockResolvedValue('error'); - mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); - await routeHandler( - createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), - mockRequest, - mockResponse - ); - - const esSearchMock = mockScopedClient.asCurrentUser.search; - // should be called twice, united index first, then legacy index - expect(esSearchMock).toHaveBeenCalledTimes(2); - expect(esSearchMock.mock.calls[0][0]?.index).toEqual(METADATA_UNITED_INDEX); - expect(esSearchMock.mock.calls[1][0]?.index).toEqual(metadataCurrentIndexPattern); - expect(routeConfig.options).toEqual({ - authRequired: true, - tags: ['access:securitySolution'], - }); - expect(mockResponse.ok).toBeCalled(); - const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList; - expect(endpointResultList.hosts.length).toEqual(1); - expect(endpointResultList.total).toEqual(1); - expect(endpointResultList.request_page_index).toEqual(0); - expect(endpointResultList.request_page_size).toEqual(10); - }); - - it('should return expected metadata', async () => { - const mockRequest = httpServerMock.createKibanaRequest({ - body: { - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 0, - }, - ], - - filters: { - kql: 'not host.ip:10.140.73.246', - host_status: ['updating'], - }, - }, - }); - - mockAgentClient.getAgentStatusById.mockResolvedValue('error'); - mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); - mockAgentPolicyService.getByIds = jest.fn().mockResolvedValueOnce([]); - const metadata = new EndpointDocGenerator().generateHostMetadata(); - const esSearchMock = mockScopedClient.asCurrentUser.search as jest.Mock; - esSearchMock.mockResolvedValueOnce({}); - esSearchMock.mockResolvedValueOnce({ - body: unitedMetadataSearchResponseMock(metadata), - }); - [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => - path.startsWith(HOST_METADATA_LIST_ROUTE) - )!; - - await routeHandler( - createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), - mockRequest, - mockResponse - ); - - expect(esSearchMock).toHaveBeenCalledTimes(2); - expect(esSearchMock.mock.calls[0][0]?.index).toEqual(METADATA_UNITED_INDEX); - expect(esSearchMock.mock.calls[0][0]?.size).toEqual(1); - expect(esSearchMock.mock.calls[1][0]?.index).toEqual(METADATA_UNITED_INDEX); - expect(esSearchMock.mock.calls[1][0]?.body?.query).toEqual({ - bool: { - must: [ - { - bool: { - filter: [ - { - terms: { - 'united.agent.policy_id': [], - }, - }, - { - exists: { - field: 'united.endpoint.agent.id', - }, - }, - { - exists: { - field: 'united.agent.agent.id', - }, - }, - { - term: { - 'united.agent.active': { - value: true, - }, - }, - }, - ], - must_not: { - terms: { - 'agent.id': [ - '00000000-0000-0000-0000-000000000000', - '11111111-1111-1111-1111-111111111111', - ], - }, - }, - }, - }, - { - bool: { - should: [ - { - bool: { - filter: [ - { - bool: { - should: [ - { - exists: { - field: 'united.agent.upgrade_started_at', - }, - }, - ], - minimum_should_match: 1, - }, - }, - { - bool: { - must_not: { - bool: { - should: [ - { - exists: { - field: 'united.agent.upgraded_at', - }, - }, - ], - minimum_should_match: 1, - }, - }, - }, - }, - ], - }, - }, - { - bool: { - must_not: { - bool: { - should: [ - { - exists: { - field: 'united.agent.last_checkin', - }, - }, - ], - minimum_should_match: 1, - }, - }, - }, - }, - { - bool: { - should: [ - { - exists: { - field: 'united.agent.unenrollment_started_at', - }, - }, - ], - minimum_should_match: 1, - }, - }, - ], - minimum_should_match: 1, - }, - }, - { - bool: { - must_not: { - bool: { - should: [ - { - match: { - 'host.ip': '10.140.73.246', - }, - }, - ], - minimum_should_match: 1, - }, - }, - }, - }, - ], - }, - }); - expect(routeConfig.options).toEqual({ - authRequired: true, - tags: ['access:securitySolution'], - }); - expect(mockResponse.ok).toBeCalled(); - const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList; - expect(endpointResultList.hosts.length).toEqual(1); - expect(endpointResultList.hosts[0].metadata).toEqual(metadata); - expect(endpointResultList.total).toEqual(1); - expect(endpointResultList.request_page_index).toEqual(0); - expect(endpointResultList.request_page_size).toEqual(10); - }); - }); - - describe('with metrics-endpoint.metadata_current_default index', () => { - beforeEach(() => { - endpointAppContextService = new EndpointAppContextService(); - mockPackageService = createMockPackageService(); - mockPackageService.getInstallation.mockReturnValue( - Promise.resolve({ - installed_kibana: [], - package_assets: [], - es_index_patterns: {}, - name: '', - version: '', - install_status: 'installed', - install_version: '', - install_started_at: '', - install_source: 'registry', - installed_es: [ - { - id: 'logs-endpoint.events.security', - type: ElasticsearchAssetType.indexTemplate, - }, - { - id: `${metadataTransformPrefix}-0.16.0-dev.0`, - type: ElasticsearchAssetType.transform, - }, - ], - keep_policies_up_to_date: false, - }) - ); - endpointAppContextService.setup(createMockEndpointAppContextServiceSetupContract()); - endpointAppContextService.start({ ...startContract, packageService: mockPackageService }); - mockAgentService = startContract.agentService!; - mockAgentClient = createMockAgentClient(); - mockAgentService.asScoped = () => mockAgentClient; - - registerEndpointRoutes(routerMock, { - logFactory: loggingSystemMock.create(), - service: endpointAppContextService, - config: () => Promise.resolve(createMockConfig()), - experimentalFeatures: parseExperimentalConfigValue(createMockConfig().enableExperimental), - }); - }); - - afterEach(() => endpointAppContextService.stop()); - - it('test find the latest of all endpoints', async () => { - const mockRequest = httpServerMock.createKibanaRequest({}); - const response = legacyMetadataSearchResponseMock( - new EndpointDocGenerator().generateHostMetadata() - ); - (mockScopedClient.asCurrentUser.search as jest.Mock) - .mockImplementationOnce(() => { - throw new IndexNotFoundException(); - }) - .mockImplementationOnce(() => Promise.resolve({ body: response })); - [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => - path.startsWith(HOST_METADATA_LIST_ROUTE) - )!; - mockAgentClient.getAgentStatusById.mockResolvedValue('error'); - mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); - await routeHandler( - createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), - mockRequest, - mockResponse - ); - - expect(mockScopedClient.asCurrentUser.search).toHaveBeenCalledTimes(2); - expect(routeConfig.options).toEqual({ - authRequired: true, - tags: ['access:securitySolution'], - }); - expect(mockResponse.ok).toBeCalled(); - const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList; - expect(endpointResultList.hosts.length).toEqual(1); - expect(endpointResultList.total).toEqual(1); - expect(endpointResultList.request_page_index).toEqual(0); - expect(endpointResultList.request_page_size).toEqual(10); - }); - - it('test find the latest of all endpoints with paging properties', async () => { - const mockRequest = httpServerMock.createKibanaRequest({ - body: { - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 1, - }, - ], - }, - }); - - mockAgentClient.getAgentStatusById.mockResolvedValue('error'); - mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); - (mockScopedClient.asCurrentUser.search as jest.Mock) - .mockImplementationOnce(() => { - throw new IndexNotFoundException(); - }) - .mockImplementationOnce(() => - Promise.resolve({ - body: legacyMetadataSearchResponseMock( - new EndpointDocGenerator().generateHostMetadata() - ), - }) - ); - [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => - path.startsWith(HOST_METADATA_LIST_ROUTE) - )!; - - await routeHandler( - createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), - mockRequest, - mockResponse - ); - expect(mockScopedClient.asCurrentUser.search).toHaveBeenCalledTimes(2); - expect( - (mockScopedClient.asCurrentUser.search as jest.Mock).mock.calls[1][0]?.body?.query.bool - .must_not - ).toContainEqual({ - terms: { - 'elastic.agent.id': [ - '00000000-0000-0000-0000-000000000000', - '11111111-1111-1111-1111-111111111111', - ], - }, - }); - expect(routeConfig.options).toEqual({ - authRequired: true, - tags: ['access:securitySolution'], - }); - expect(mockResponse.ok).toBeCalled(); - const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList; - expect(endpointResultList.hosts.length).toEqual(1); - expect(endpointResultList.total).toEqual(1); - expect(endpointResultList.request_page_index).toEqual(10); - expect(endpointResultList.request_page_size).toEqual(10); - }); - - it('test find the latest of all endpoints with paging and filters properties', async () => { - const mockRequest = httpServerMock.createKibanaRequest({ - body: { - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 1, - }, - ], - - filters: { kql: 'not host.ip:10.140.73.246' }, - }, - }); - - mockAgentClient.getAgentStatusById.mockResolvedValue('error'); - mockAgentClient.listAgents.mockResolvedValue(noUnenrolledAgent); - (mockScopedClient.asCurrentUser.search as jest.Mock) - .mockImplementationOnce(() => { - throw new IndexNotFoundException(); - }) - .mockImplementationOnce(() => - Promise.resolve({ - body: legacyMetadataSearchResponseMock( - new EndpointDocGenerator().generateHostMetadata() - ), - }) - ); - [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => - path.startsWith(HOST_METADATA_LIST_ROUTE) - )!; - - await routeHandler( - createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), - mockRequest, - mockResponse - ); - - expect(mockScopedClient.asCurrentUser.search).toBeCalled(); - expect( - // KQL filter to be passed through - (mockScopedClient.asCurrentUser.search as jest.Mock).mock.calls[1][0]?.body?.query.bool - .must - ).toContainEqual({ - bool: { - must_not: { - bool: { - should: [ - { - match: { - 'host.ip': '10.140.73.246', - }, - }, - ], - minimum_should_match: 1, - }, - }, - }, - }); - expect( - (mockScopedClient.asCurrentUser.search as jest.Mock).mock.calls[1][0]?.body?.query.bool - .must - ).toContainEqual({ - bool: { - must_not: [ - { - terms: { - 'elastic.agent.id': [ - '00000000-0000-0000-0000-000000000000', - '11111111-1111-1111-1111-111111111111', - ], - }, - }, - { - terms: { - // here we DO want to see both schemas are present - // to make this schema-compatible forward and back - 'HostDetails.elastic.agent.id': [ - '00000000-0000-0000-0000-000000000000', - '11111111-1111-1111-1111-111111111111', - ], - }, - }, - ], - }, - }); - expect(routeConfig.options).toEqual({ - authRequired: true, - tags: ['access:securitySolution'], - }); - expect(mockResponse.ok).toBeCalled(); - const endpointResultList = mockResponse.ok.mock.calls[0][0]?.body as HostResultList; - expect(endpointResultList.hosts.length).toEqual(1); - expect(endpointResultList.total).toEqual(1); - expect(endpointResultList.request_page_index).toEqual(10); - expect(endpointResultList.request_page_size).toEqual(10); - }); - }); - }); - describe('GET list endpoints route', () => { describe('with .metrics-endpoint.metadata_united_default index', () => { beforeEach(() => { diff --git a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts index 471d00728bac3e..93f3756fc111cf 100644 --- a/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts +++ b/x-pack/test/security_solution_endpoint_api_int/apis/metadata.ts @@ -33,546 +33,6 @@ export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); describe('test metadata apis', () => { - describe('list endpoints POST route', () => { - describe('with .metrics-endpoint.metadata_united_default index', () => { - const numberOfHostsInFixture = 2; - - before(async () => { - await stopTransform(getService, `${METADATA_UNITED_TRANSFORM}*`); - await deleteAllDocsFromFleetAgents(getService); - await deleteAllDocsFromMetadataDatastream(getService); - await deleteAllDocsFromMetadataCurrentIndex(getService); - await deleteAllDocsFromIndex(getService, METADATA_UNITED_INDEX); - - // generate an endpoint policy and attach id to agents since - // metadata list api filters down to endpoint policies only - const policy = await indexFleetEndpointPolicy( - getService('kibanaServer'), - `Default ${uuid.v4()}`, - '1.1.1' - ); - const policyId = policy.integrationPolicies[0].policy_id; - const currentTime = new Date().getTime(); - - await Promise.all([ - bulkIndex(getService, AGENTS_INDEX, generateAgentDocs(currentTime, policyId)), - bulkIndex(getService, METADATA_DATASTREAM, generateMetadataDocs(currentTime)), - ]); - - // wait for latest metadata transform to run - await new Promise((r) => setTimeout(r, 30000)); - await startTransform(getService, METADATA_UNITED_TRANSFORM); - - // wait for united metadata transform to run - await new Promise((r) => setTimeout(r, 15000)); - }); - - after(async () => { - await deleteAllDocsFromFleetAgents(getService); - await deleteAllDocsFromMetadataDatastream(getService); - await deleteAllDocsFromMetadataCurrentIndex(getService); - await stopTransform(getService, `${METADATA_UNITED_TRANSFORM}*`); - await deleteAllDocsFromIndex(getService, METADATA_UNITED_INDEX); - }); - - it('should return one entry for each host with default paging', async () => { - const res = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send() - .expect(200); - const { body } = res; - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(numberOfHostsInFixture); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return page based on paging properties passed.', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 1, - }, - { - page_index: 1, - }, - ], - }) - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(1); - expect(body.request_page_index).to.eql(1); - }); - - it('metadata api should return accurate total metadata if page index produces no result', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 3, - }, - ], - }) - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(0); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(30); - }); - - it('metadata api should return 400 when pagingProperties is below boundaries.', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 0, - }, - { - page_index: 1, - }, - ], - }) - .expect(400); - expect(body.message).to.contain('Value must be equal to or greater than [1]'); - }); - - it('metadata api should return page based on filters passed.', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: 'not (united.endpoint.host.ip:10.101.149.26)', - }, - }) - .expect(200); - expect(body.total).to.eql(1); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return page based on filters and paging passed.', async () => { - const notIncludedIp = '10.101.149.26'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 0, - }, - ], - filters: { - kql: `not (united.endpoint.host.ip:${notIncludedIp})`, - }, - }) - .expect(200); - expect(body.total).to.eql(1); - const resultIps: string[] = [].concat( - ...body.hosts.map((hostInfo: Record) => hostInfo.metadata.host.ip) - ); - expect(resultIps.sort()).to.eql(['10.192.213.130', '10.70.28.129'].sort()); - expect(resultIps).not.include.eql(notIncludedIp); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return page based on host.os.Ext.variant filter.', async () => { - const variantValue = 'Windows Pro'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `united.endpoint.host.os.Ext.variant:${variantValue}`, - }, - }) - .expect(200); - expect(body.total).to.eql(2); - const resultOsVariantValue: Set = new Set( - body.hosts.map((hostInfo: Record) => hostInfo.metadata.host.os.Ext.variant) - ); - expect(Array.from(resultOsVariantValue)).to.eql([variantValue]); - expect(body.hosts.length).to.eql(2); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return the latest event for all the events for an endpoint', async () => { - const targetEndpointIp = '10.101.149.26'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `united.endpoint.host.ip:${targetEndpointIp}`, - }, - }) - .expect(200); - expect(body.total).to.eql(1); - const resultIp: string = body.hosts[0].metadata.host.ip.filter( - (ip: string) => ip === targetEndpointIp - ); - expect(resultIp).to.eql([targetEndpointIp]); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return the latest event for all the events where policy status is not success', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `not (united.endpoint.Endpoint.policy.applied.status:success)`, - }, - }) - .expect(200); - const statuses: Set = new Set( - body.hosts.map( - (hostInfo: Record) => hostInfo.metadata.Endpoint.policy.applied.status - ) - ); - expect(statuses.size).to.eql(1); - expect(Array.from(statuses)).to.eql(['failure']); - }); - - it('metadata api should return the endpoint based on the elastic agent id, and status should be healthy', async () => { - const targetEndpointId = 'fc0ff548-feba-41b6-8367-65e8790d0eaf'; - const targetElasticAgentId = '023fa40c-411d-4188-a941-4147bfadd095'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `united.endpoint.elastic.agent.id:${targetElasticAgentId}`, - }, - }) - .expect(200); - expect(body.total).to.eql(1); - const resultHostId: string = body.hosts[0].metadata.host.id; - const resultElasticAgentId: string = body.hosts[0].metadata.elastic.agent.id; - expect(resultHostId).to.eql(targetEndpointId); - expect(resultElasticAgentId).to.eql(targetElasticAgentId); - expect(body.hosts[0].host_status).to.eql('healthy'); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return all hosts when filter is empty string', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: '', - }, - }) - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(numberOfHostsInFixture); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - }); - - describe('with metrics-endpoint.metadata_current_default index', () => { - /** - * The number of host documents in the es archive. - */ - const numberOfHostsInFixture = 3; - - describe(`POST ${HOST_METADATA_LIST_ROUTE} when index is empty`, () => { - it('metadata api should return empty result when index is empty', async () => { - await stopTransform(getService, `${METADATA_UNITED_TRANSFORM}*`); - await deleteIndex(getService, METADATA_UNITED_INDEX); - await deleteMetadataStream(getService); - await deleteAllDocsFromMetadataDatastream(getService); - await deleteAllDocsFromMetadataCurrentIndex(getService); - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send() - .expect(200); - expect(body.total).to.eql(0); - expect(body.hosts.length).to.eql(0); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - }); - - describe(`POST ${HOST_METADATA_LIST_ROUTE} when index is not empty`, () => { - const timestamp = new Date().getTime(); - before(async () => { - // stop the united transform and delete the index - // otherwise it won't hit metrics-endpoint.metadata_current_default index - await stopTransform(getService, `${METADATA_UNITED_TRANSFORM}*`); - await deleteIndex(getService, METADATA_UNITED_INDEX); - await bulkIndex(getService, METADATA_DATASTREAM, generateMetadataDocs(timestamp)); - // wait for transform - await new Promise((r) => setTimeout(r, 60000)); - }); - // the endpoint uses data streams and es archiver does not support deleting them at the moment so we need - // to do it manually - after(async () => { - await deleteMetadataStream(getService); - await deleteAllDocsFromMetadataDatastream(getService); - await deleteAllDocsFromMetadataCurrentIndex(getService); - }); - it('metadata api should return one entry for each host with default paging', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send() - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(numberOfHostsInFixture); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return page based on paging properties passed.', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 1, - }, - { - page_index: 1, - }, - ], - }) - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(1); - expect(body.request_page_index).to.eql(1); - }); - - /* test that when paging properties produces no result, the total should reflect the actual number of metadata - in the index. - */ - it('metadata api should return accurate total metadata if page index produces no result', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 3, - }, - ], - }) - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(0); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(30); - }); - - it('metadata api should return 400 when pagingProperties is below boundaries.', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 0, - }, - { - page_index: 1, - }, - ], - }) - .expect(400); - expect(body.message).to.contain('Value must be equal to or greater than [1]'); - }); - - it('metadata api should return page based on filters passed.', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: 'not (HostDetails.host.ip:10.46.229.234 or host.ip:10.46.229.234)', - }, - }) - .expect(200); - expect(body.total).to.eql(2); - expect(body.hosts.length).to.eql(2); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return page based on filters and paging passed.', async () => { - const notIncludedIp = '10.46.229.234'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - paging_properties: [ - { - page_size: 10, - }, - { - page_index: 0, - }, - ], - filters: { - kql: `not (HostDetails.host.ip:${notIncludedIp} or host.ip:${notIncludedIp})`, - }, - }) - .expect(200); - expect(body.total).to.eql(2); - const resultIps: string[] = [].concat( - ...body.hosts.map((hostInfo: Record) => hostInfo.metadata.host.ip) - ); - expect(resultIps.sort()).to.eql( - [ - '10.192.213.130', - '10.70.28.129', - '10.101.149.26', - '2606:a000:ffc0:39:11ef:37b9:3371:578c', - ].sort() - ); - expect(resultIps).not.include.eql(notIncludedIp); - expect(body.hosts.length).to.eql(2); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return page based on host.os.Ext.variant filter.', async () => { - const variantValue = 'Windows Pro'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `HostDetails.host.os.Ext.variant:${variantValue} or host.os.Ext.variant:${variantValue}`, - }, - }) - .expect(200); - expect(body.total).to.eql(2); - const resultOsVariantValue: Set = new Set( - body.hosts.map( - (hostInfo: Record) => hostInfo.metadata.host.os.Ext.variant - ) - ); - expect(Array.from(resultOsVariantValue)).to.eql([variantValue]); - expect(body.hosts.length).to.eql(2); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return the latest event for all the events for an endpoint', async () => { - const targetEndpointIp = '10.46.229.234'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `HostDetails.host.ip:${targetEndpointIp} or host.ip:${targetEndpointIp}`, - }, - }) - .expect(200); - expect(body.total).to.eql(1); - const resultIp: string = body.hosts[0].metadata.host.ip.filter( - (ip: string) => ip === targetEndpointIp - ); - expect(resultIp).to.eql([targetEndpointIp]); - expect(body.hosts[0].metadata.event.created).to.eql(timestamp); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return the latest event for all the events where policy status is not success', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `not (HostDetails.Endpoint.policy.applied.status:success or Endpoint.policy.applied.status:success)`, - }, - }) - .expect(200); - const statuses: Set = new Set( - body.hosts.map( - (hostInfo: Record) => hostInfo.metadata.Endpoint.policy.applied.status - ) - ); - expect(statuses.size).to.eql(1); - expect(Array.from(statuses)).to.eql(['failure']); - }); - - it('metadata api should return the endpoint based on the elastic agent id, and status should be unhealthy', async () => { - const targetEndpointId = 'fc0ff548-feba-41b6-8367-65e8790d0eaf'; - const targetElasticAgentId = '023fa40c-411d-4188-a941-4147bfadd095'; - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: `HostDetails.elastic.agent.id:${targetElasticAgentId} or elastic.agent.id:${targetElasticAgentId}`, - }, - }) - .expect(200); - expect(body.total).to.eql(1); - const resultHostId: string = body.hosts[0].metadata.host.id; - const resultElasticAgentId: string = body.hosts[0].metadata.elastic.agent.id; - expect(resultHostId).to.eql(targetEndpointId); - expect(resultElasticAgentId).to.eql(targetElasticAgentId); - expect(body.hosts[0].metadata.event.created).to.eql(timestamp); - expect(body.hosts[0].host_status).to.eql('unhealthy'); - expect(body.hosts.length).to.eql(1); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - - it('metadata api should return all hosts when filter is empty string', async () => { - const { body } = await supertest - .post(HOST_METADATA_LIST_ROUTE) - .set('kbn-xsrf', 'xxx') - .send({ - filters: { - kql: '', - }, - }) - .expect(200); - expect(body.total).to.eql(numberOfHostsInFixture); - expect(body.hosts.length).to.eql(numberOfHostsInFixture); - expect(body.request_page_size).to.eql(10); - expect(body.request_page_index).to.eql(0); - }); - }); - }); - }); - describe('list endpoints GET route', () => { describe('with .metrics-endpoint.metadata_united_default index', () => { const numberOfHostsInFixture = 2; From 8d16f6086eaa94b18b67f7919e594f3842978120 Mon Sep 17 00:00:00 2001 From: mgiota Date: Wed, 1 Dec 2021 23:28:50 +0100 Subject: [PATCH 039/126] remove kibana.consumers from technical field names (#120173) --- packages/kbn-rule-data-utils/src/technical_field_names.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/kbn-rule-data-utils/src/technical_field_names.ts b/packages/kbn-rule-data-utils/src/technical_field_names.ts index 49e1397d10f970..349719c019c221 100644 --- a/packages/kbn-rule-data-utils/src/technical_field_names.ts +++ b/packages/kbn-rule-data-utils/src/technical_field_names.ts @@ -13,7 +13,6 @@ const KIBANA_NAMESPACE = 'kibana' as const; const ALERT_NAMESPACE = `${KIBANA_NAMESPACE}.alert` as const; const ALERT_RULE_NAMESPACE = `${ALERT_NAMESPACE}.rule` as const; -const CONSUMERS = `${KIBANA_NAMESPACE}.consumers` as const; const ECS_VERSION = 'ecs.version' as const; const EVENT_ACTION = 'event.action' as const; const EVENT_KIND = 'event.kind' as const; @@ -85,7 +84,6 @@ const namespaces = { }; const fields = { - CONSUMERS, ECS_VERSION, EVENT_KIND, EVENT_ACTION, @@ -187,7 +185,6 @@ export { ALERT_START, ALERT_SYSTEM_STATUS, ALERT_UUID, - CONSUMERS, ECS_VERSION, EVENT_ACTION, EVENT_KIND, From 2070fcb261c6a8c05ff5bbc301a009d42166258e Mon Sep 17 00:00:00 2001 From: Jonathan Budzenski Date: Wed, 1 Dec 2021 16:50:12 -0600 Subject: [PATCH 040/126] [ci] Add cloud image annotation (#120165) * [ci] Add cloud image annotation * typo Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/scripts/build_kibana.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.buildkite/scripts/build_kibana.sh b/.buildkite/scripts/build_kibana.sh index e811af224e9af5..61a1ba4ee1ce53 100755 --- a/.buildkite/scripts/build_kibana.sh +++ b/.buildkite/scripts/build_kibana.sh @@ -28,6 +28,11 @@ if [[ "${GITHUB_PR_LABELS:-}" == *"ci:deploy-cloud"* ]]; then --skip-docker-ubi \ --skip-docker-centos \ --skip-docker-contexts + + CLOUD_IMAGE=$(docker images --format "{{.Repository}}:{{.Tag}}" docker.elastic.co/kibana-ci/kibana-cloud) + cat << EOF | buildkite-agent annotate --style "info" --context cloud-image + Cloud image: $CLOUD_IMAGE +EOF fi echo "--- Archive Kibana Distribution" From b1bb4a93959f19a653b9cfb207a5c6acb6559482 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Thu, 2 Dec 2021 00:26:48 +0100 Subject: [PATCH 041/126] [APM] Disable telemetry in agent config endpoint (#120106) --- .../apm/server/routes/settings/agent_configuration/route.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration/route.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration/route.ts index 1122c2095ed3de..26a9eaefc04135 100644 --- a/x-pack/plugins/apm/server/routes/settings/agent_configuration/route.ts +++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration/route.ts @@ -186,7 +186,7 @@ const agentConfigurationSearchRoute = createApmServerRoute({ params: t.type({ body: searchParamsRt, }), - options: { tags: ['access:apm'] }, + options: { tags: ['access:apm'], disableTelemetry: true }, handler: async (resources) => { const { params, logger } = resources; From 178e1d6c7d1e5b100b1de4f9abf49a0d638eac9b Mon Sep 17 00:00:00 2001 From: Andrew Goldstein Date: Wed, 1 Dec 2021 17:57:46 -0700 Subject: [PATCH 042/126] [Security Solution] Fixes the formatting of the Alert Summary View in Timeline (#120185) ## [Security Solution] Fixes the formatting of the Alert Summary View in Timeline This PR fixes a formatting issue in Timeline resulting from redundant actions, (see for repro steps), as shown in the Before / After screenshots below: **Before** ![redundant-actions-cause-formatting-issue](https://user-images.githubusercontent.com/4459398/144320934-6e929c83-e096-4b5c-a8ab-36863a8b9ded.png) _Above: Before - The Alert summary view in Timeline renders redundant actions, resulting in the formatting above_ **After** ![redundant-actions-fixed](https://user-images.githubusercontent.com/4459398/144324353-3337700f-11ab-4c48-ae80-b881ab73131a.png) _Above: After - The redundant hover actions are gone, and the formatting is correct_ ### No changes to the `Security > Alerts` view The Security Alerts view is **unchanged**, per the screenshots below: **Before** ![security_alerts_before_fix](https://user-images.githubusercontent.com/4459398/144323960-7b95ab29-60fa-47ab-b258-9dd9ded4efe6.png) _Above: Before - Hover actions in the Alert summary in Security > Alerts before the fix_ **After** ![security_alerts_after_fix_noop](https://user-images.githubusercontent.com/4459398/144324007-09df11b7-d22c-4600-bdc6-b1ff113f34ed.png) _Above: After - `noop` The Alert summary in Security > Alerts remains **unchanged** after the fix_ --- .../event_details/alert_summary_view.test.tsx | 19 ++++++++++++++++ .../event_details/alert_summary_view.tsx | 22 ++++++++++--------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx index 8f4bed01960719..f7522cb4dd5858 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.test.tsx @@ -14,6 +14,7 @@ import { TimelineEventsDetailsItem } from '../../../../common/search_strategy'; import { useRuleWithFallback } from '../../../detections/containers/detection_engine/rules/use_rule_with_fallback'; import { TestProviders, TestProvidersComponent } from '../../mock'; +import { TimelineId } from '../../../../common'; import { mockBrowserFields } from '../../containers/source/mock'; jest.mock('../../lib/kibana'); @@ -49,6 +50,24 @@ describe('AlertSummaryView', () => { expect(getByTestId('summary-view')).toBeInTheDocument(); }); + test('it renders the action cell by default', () => { + const { getAllByTestId } = render( + + + + ); + expect(getAllByTestId('hover-actions-filter-for').length).toBeGreaterThan(0); + }); + + test('it does NOT render the action cell for the active timeline', () => { + const { queryAllByTestId } = render( + + + + ); + expect(queryAllByTestId('hover-actions-filter-for').length).toEqual(0); + }); + test("render no investigation guide if it doesn't exist", async () => { (useRuleWithFallback as jest.Mock).mockReturnValue({ rule: { diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx index 19a23e5002567f..82259aa2312ae6 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/alert_summary_view.tsx @@ -14,7 +14,7 @@ import { AlertSummaryRow, getSummaryColumns, SummaryRow } from './helpers'; import { ActionCell } from './table/action_cell'; import { FieldValueCell } from './table/field_value_cell'; -import { TimelineEventsDetailsItem } from '../../../../common'; +import { TimelineEventsDetailsItem, TimelineId } from '../../../../common'; import { getSummaryRows } from './get_alert_summary_rows'; @@ -37,15 +37,17 @@ const getDescription = ({ isDraggable={isDraggable} values={values} /> - + {timelineId !== TimelineId.active && ( + + )} ); From eb3c4b57a341b12d4bddfcb8483df178d70a0257 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 1 Dec 2021 18:43:56 -0700 Subject: [PATCH 043/126] [Maps] change resolution input from select to range slider (#120016) * [Maps] change resolution input from select to range slider * set title of card to match wizard title * tslint * update snapshots * update snapshots * decrease max icon size * change maxSize in wizard and not default props --- .../resolution_editor.test.tsx.snap | 36 ++++--- .../update_source_editor.test.tsx.snap | 14 +-- .../clusters_layer_wizard.tsx | 7 +- .../heatmap_layer_wizard.tsx | 7 +- .../resolution_editor.test.tsx | 1 + .../es_geo_grid_source/resolution_editor.tsx | 101 +++++++++++------- .../update_source_editor.tsx | 7 +- .../translations/translations/ja-JP.json | 5 - .../translations/translations/zh-CN.json | 5 - 9 files changed, 106 insertions(+), 77 deletions(-) diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/resolution_editor.test.tsx.snap b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/resolution_editor.test.tsx.snap index 75b865a936238e..90a5bd6758bde8 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/resolution_editor.test.tsx.snap +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/resolution_editor.test.tsx.snap @@ -8,33 +8,45 @@ exports[`render 1`] = ` fullWidth={false} hasChildLabel={true} hasEmptyLabelSpace={false} - label="Grid resolution" + label="Resolution" labelType="label" > - diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/update_source_editor.test.tsx.snap b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/update_source_editor.test.tsx.snap index e6c6303642a6b1..7043613b8e20ae 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/update_source_editor.test.tsx.snap +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/__snapshots__/update_source_editor.test.tsx.snap @@ -34,17 +34,14 @@ exports[`source editor geo_grid_source should not allow editing multiple metrics size="xs" >
    - + Heat map
    - + Clusters and grids
    {}, metrics: [], diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/resolution_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/resolution_editor.tsx index 5e554ae6566e17..72dec662791645 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/resolution_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/resolution_editor.tsx @@ -5,45 +5,51 @@ * 2.0. */ -import React, { ChangeEvent, Component } from 'react'; -import { EuiConfirmModal, EuiSelect, EuiFormRow } from '@elastic/eui'; +import React, { ChangeEvent, Component, MouseEvent } from 'react'; +import { EuiConfirmModal, EuiFormRow, EuiRange } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { i18n } from '@kbn/i18n'; import { AggDescriptor } from '../../../../common/descriptor_types'; import { AGG_TYPE, GRID_RESOLUTION } from '../../../../common/constants'; -const OPTIONS = [ - { - value: GRID_RESOLUTION.COARSE, - text: i18n.translate('xpack.maps.source.esGrid.coarseDropdownOption', { - defaultMessage: 'coarse', - }), - }, - { - value: GRID_RESOLUTION.FINE, - text: i18n.translate('xpack.maps.source.esGrid.fineDropdownOption', { - defaultMessage: 'fine', - }), - }, - { - value: GRID_RESOLUTION.MOST_FINE, - text: i18n.translate('xpack.maps.source.esGrid.finestDropdownOption', { - defaultMessage: 'finest', - }), - }, - { - value: GRID_RESOLUTION.SUPER_FINE, - text: i18n.translate('xpack.maps.source.esGrid.superFineDropDownOption', { - defaultMessage: 'super fine', - }), - }, -]; +function resolutionToSliderValue(resolution: GRID_RESOLUTION) { + if (resolution === GRID_RESOLUTION.SUPER_FINE) { + return 4; + } + + if (resolution === GRID_RESOLUTION.MOST_FINE) { + return 3; + } + + if (resolution === GRID_RESOLUTION.FINE) { + return 2; + } + + return 1; +} + +function sliderValueToResolution(value: number) { + if (value === 4) { + return GRID_RESOLUTION.SUPER_FINE; + } + + if (value === 3) { + return GRID_RESOLUTION.MOST_FINE; + } + + if (value === 2) { + return GRID_RESOLUTION.FINE; + } + + return GRID_RESOLUTION.COARSE; +} function isUnsupportedVectorTileMetric(metric: AggDescriptor) { return metric.type === AGG_TYPE.TERMS; } interface Props { + isHeatmap: boolean; resolution: GRID_RESOLUTION; onChange: (resolution: GRID_RESOLUTION, metrics: AggDescriptor[]) => void; metrics: AggDescriptor[]; @@ -58,9 +64,9 @@ export class ResolutionEditor extends Component { showModal: false, }; - _onResolutionChange = (e: ChangeEvent) => { - const resolution = e.target.value as GRID_RESOLUTION; - if (resolution === GRID_RESOLUTION.SUPER_FINE) { + _onResolutionChange = (event: ChangeEvent | MouseEvent) => { + const resolution = sliderValueToResolution(parseInt(event.currentTarget.value, 10)); + if (!this.props.isHeatmap && resolution === GRID_RESOLUTION.SUPER_FINE) { const hasUnsupportedMetrics = this.props.metrics.find(isUnsupportedVectorTileMetric); if (hasUnsupportedMetrics) { this.setState({ showModal: true }); @@ -114,7 +120,7 @@ export class ResolutionEditor extends Component {

    @@ -123,9 +129,9 @@ export class ResolutionEditor extends Component { render() { const helpText = - this.props.resolution === GRID_RESOLUTION.SUPER_FINE + !this.props.isHeatmap && this.props.resolution === GRID_RESOLUTION.SUPER_FINE ? i18n.translate('xpack.maps.source.esGrid.superFineHelpText', { - defaultMessage: 'Super fine grid resolution uses vector tiles.', + defaultMessage: 'High resolution uses vector tiles.', }) : undefined; return ( @@ -133,15 +139,34 @@ export class ResolutionEditor extends Component { {this._renderModal()} - diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx index 60a4c56fdb3b87..ba10479a2bd2cf 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.tsx @@ -20,6 +20,7 @@ import { IndexPatternField, indexPatterns } from '../../../../../../../src/plugi import { RenderAsSelect } from './render_as_select'; import { AggDescriptor } from '../../../../common/descriptor_types'; import { OnSourceChangeArgs } from '../source'; +import { clustersTitle, heatmapTitle } from './es_geo_grid_source'; interface Props { currentLayerType?: string; @@ -147,14 +148,12 @@ export class UpdateSourceEditor extends Component {
    - + {this.props.currentLayerType === LAYER_TYPE.HEATMAP ? heatmapTitle : clustersTitle}
    Date: Thu, 2 Dec 2021 02:34:59 +0000 Subject: [PATCH 044/126] chore(NA): use internal pkg_npm on @kbn/babel-preset (#120123) --- packages/kbn-babel-preset/BUILD.bazel | 7 ++++--- packages/kbn-react-field/BUILD.bazel | 1 - packages/kbn-ui-shared-deps-src/BUILD.bazel | 1 - 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/packages/kbn-babel-preset/BUILD.bazel b/packages/kbn-babel-preset/BUILD.bazel index ebead1ae0bfbdd..8e600eb6b23be1 100644 --- a/packages/kbn-babel-preset/BUILD.bazel +++ b/packages/kbn-babel-preset/BUILD.bazel @@ -1,4 +1,5 @@ -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "pkg_npm") PKG_BASE_NAME = "kbn-babel-preset" PKG_REQUIRE_NAME = "@kbn/babel-preset" @@ -24,7 +25,7 @@ NPM_MODULE_EXTRA_FILES = [ "README.md", ] -DEPS = [ +RUNTIME_DEPS = [ "@npm//@babel/plugin-proposal-class-properties", "@npm//@babel/plugin-proposal-export-namespace-from", "@npm//@babel/plugin-proposal-nullish-coalescing-operator", @@ -46,7 +47,7 @@ js_library( srcs = NPM_MODULE_EXTRA_FILES + [ ":srcs", ], - deps = DEPS, + deps = RUNTIME_DEPS, package_name = PKG_REQUIRE_NAME, visibility = ["//visibility:public"], ) diff --git a/packages/kbn-react-field/BUILD.bazel b/packages/kbn-react-field/BUILD.bazel index 9cb2df76bd6c94..d7645d86dbd1a7 100644 --- a/packages/kbn-react-field/BUILD.bazel +++ b/packages/kbn-react-field/BUILD.bazel @@ -42,7 +42,6 @@ RUNTIME_DEPS = [ ] TYPES_DEPS = [ - "//packages/kbn-babel-preset", "//packages/kbn-i18n", "@npm//tslib", "@npm//@types/jest", diff --git a/packages/kbn-ui-shared-deps-src/BUILD.bazel b/packages/kbn-ui-shared-deps-src/BUILD.bazel index 3da5e0ed9a6ffd..454121392ac68b 100644 --- a/packages/kbn-ui-shared-deps-src/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-src/BUILD.bazel @@ -45,7 +45,6 @@ TYPES_DEPS = [ "//packages/elastic-datemath:npm_module_types", "//packages/elastic-safer-lodash-set", "//packages/kbn-analytics:npm_module_types", - "//packages/kbn-babel-preset", "//packages/kbn-i18n:npm_module_types", "//packages/kbn-i18n-react:npm_module_types", "//packages/kbn-monaco", From 54c4df07ade215a892cfa60c19b57df1fd4709cc Mon Sep 17 00:00:00 2001 From: Ignacio Rivas Date: Thu, 2 Dec 2021 09:31:24 +0100 Subject: [PATCH 045/126] [Console] Unskip api integration proxy test (#120075) * Unskip test * commit using @elastic.co Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- test/api_integration/apis/console/proxy_route.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/api_integration/apis/console/proxy_route.ts b/test/api_integration/apis/console/proxy_route.ts index a208ef405306ff..d8a5f57a41a6e3 100644 --- a/test/api_integration/apis/console/proxy_route.ts +++ b/test/api_integration/apis/console/proxy_route.ts @@ -12,8 +12,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - // Failing: See https://github.com/elastic/kibana/issues/117674 - describe.skip('POST /api/console/proxy', () => { + describe('POST /api/console/proxy', () => { describe('system indices behavior', () => { it('returns warning header when making requests to .kibana index', async () => { return await supertest From 3cd176fffbf5c0a34de73eb2cd8794f69c8b0620 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 2 Dec 2021 12:06:29 +0300 Subject: [PATCH 046/126] [Lens] Waffle visualization type (#119339) * [WIP][Lens] Waffle visualization type Closes: #107059 * add showExtraLegend for waffle * add tests * resolved 1 and 5 * resolved 6 * add sortPredicate for waffle chart type Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../common/expressions/pie_chart/types.ts | 2 +- .../lens/public/assets/chart_waffle.tsx | 31 +++ .../public/pie_visualization/constants.ts | 97 -------- .../partition_charts_meta.ts | 214 ++++++++++++++++++ .../pie_visualization/render_function.tsx | 28 +-- .../pie_visualization/render_helpers.test.ts | 57 +++++ .../pie_visualization/render_helpers.ts | 14 +- .../pie_visualization/suggestions.test.ts | 133 ++++++++++- .../public/pie_visualization/suggestions.ts | 99 ++++++-- .../public/pie_visualization/to_expression.ts | 6 +- .../lens/public/pie_visualization/toolbar.tsx | 85 +++---- .../pie_visualization/visualization.tsx | 114 +++++----- 12 files changed, 641 insertions(+), 239 deletions(-) create mode 100644 x-pack/plugins/lens/public/assets/chart_waffle.tsx create mode 100644 x-pack/plugins/lens/public/pie_visualization/partition_charts_meta.ts diff --git a/x-pack/plugins/lens/common/expressions/pie_chart/types.ts b/x-pack/plugins/lens/common/expressions/pie_chart/types.ts index 00fc7abaa043bc..8c9ec4e5a54e77 100644 --- a/x-pack/plugins/lens/common/expressions/pie_chart/types.ts +++ b/x-pack/plugins/lens/common/expressions/pie_chart/types.ts @@ -8,7 +8,7 @@ import type { PaletteOutput } from '../../../../../../src/plugins/charts/common'; import type { LensMultiTable, LayerType } from '../../types'; -export type PieChartTypes = 'donut' | 'pie' | 'treemap' | 'mosaic'; +export type PieChartTypes = 'donut' | 'pie' | 'treemap' | 'mosaic' | 'waffle'; export interface SharedPieLayerState { groups: string[]; diff --git a/x-pack/plugins/lens/public/assets/chart_waffle.tsx b/x-pack/plugins/lens/public/assets/chart_waffle.tsx new file mode 100644 index 00000000000000..b9ee0557faea9f --- /dev/null +++ b/x-pack/plugins/lens/public/assets/chart_waffle.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { EuiIconProps } from '@elastic/eui'; + +export const LensIconChartWaffle = ({ title, titleId, ...props }: Omit) => ( + + {title ? : null} + + + +); diff --git a/x-pack/plugins/lens/public/pie_visualization/constants.ts b/x-pack/plugins/lens/public/pie_visualization/constants.ts index be0afc65aed3bc..bfb263b4158914 100644 --- a/x-pack/plugins/lens/public/pie_visualization/constants.ts +++ b/x-pack/plugins/lens/public/pie_visualization/constants.ts @@ -5,101 +5,4 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; -import { PartitionLayout } from '@elastic/charts'; -import { LensIconChartDonut } from '../assets/chart_donut'; -import { LensIconChartPie } from '../assets/chart_pie'; -import { LensIconChartTreemap } from '../assets/chart_treemap'; -import { LensIconChartMosaic } from '../assets/chart_mosaic'; - -import type { SharedPieLayerState } from '../../common/expressions'; - -interface CategoryOption { - value: SharedPieLayerState['categoryDisplay']; - inputDisplay: string; -} - -const groupLabel = i18n.translate('xpack.lens.pie.groupLabel', { - defaultMessage: 'Proportion', -}); - -const categoryOptions: CategoryOption[] = [ - { - value: 'default', - inputDisplay: i18n.translate('xpack.lens.pieChart.showCategoriesLabel', { - defaultMessage: 'Inside or outside', - }), - }, - { - value: 'inside', - inputDisplay: i18n.translate('xpack.lens.pieChart.fitInsideOnlyLabel', { - defaultMessage: 'Inside only', - }), - }, - { - value: 'hide', - inputDisplay: i18n.translate('xpack.lens.pieChart.categoriesInLegendLabel', { - defaultMessage: 'Hide labels', - }), - }, -]; - -const categoryOptionsTreemap: CategoryOption[] = [ - { - value: 'default', - inputDisplay: i18n.translate('xpack.lens.pieChart.showTreemapCategoriesLabel', { - defaultMessage: 'Show labels', - }), - }, - { - value: 'hide', - inputDisplay: i18n.translate('xpack.lens.pieChart.categoriesInLegendLabel', { - defaultMessage: 'Hide labels', - }), - }, -]; - -export const CHART_NAMES = { - donut: { - icon: LensIconChartDonut, - label: i18n.translate('xpack.lens.pie.donutLabel', { - defaultMessage: 'Donut', - }), - partitionType: PartitionLayout.sunburst, - groupLabel, - categoryOptions, - }, - pie: { - icon: LensIconChartPie, - label: i18n.translate('xpack.lens.pie.pielabel', { - defaultMessage: 'Pie', - }), - partitionType: PartitionLayout.sunburst, - groupLabel, - categoryOptions, - }, - treemap: { - icon: LensIconChartTreemap, - label: i18n.translate('xpack.lens.pie.treemaplabel', { - defaultMessage: 'Treemap', - }), - partitionType: PartitionLayout.treemap, - groupLabel, - categoryOptions: categoryOptionsTreemap, - }, - mosaic: { - icon: LensIconChartMosaic, - label: i18n.translate('xpack.lens.pie.mosaiclabel', { - defaultMessage: 'Mosaic', - }), - partitionType: PartitionLayout.mosaic, - groupLabel, - categoryOptions: [] as CategoryOption[], - }, -}; - -export const MAX_PIE_BUCKETS = 3; -export const MAX_TREEMAP_BUCKETS = 2; -export const MAX_MOSAIC_BUCKETS = 2; - export const DEFAULT_PERCENT_DECIMALS = 2; diff --git a/x-pack/plugins/lens/public/pie_visualization/partition_charts_meta.ts b/x-pack/plugins/lens/public/pie_visualization/partition_charts_meta.ts new file mode 100644 index 00000000000000..4f16ab01ba19cf --- /dev/null +++ b/x-pack/plugins/lens/public/pie_visualization/partition_charts_meta.ts @@ -0,0 +1,214 @@ +/* + * Copyright 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 { ArrayEntry, PartitionLayout } from '@elastic/charts'; +import type { EuiIconProps } from '@elastic/eui'; + +import { LensIconChartDonut } from '../assets/chart_donut'; +import { LensIconChartPie } from '../assets/chart_pie'; +import { LensIconChartTreemap } from '../assets/chart_treemap'; +import { LensIconChartMosaic } from '../assets/chart_mosaic'; +import { LensIconChartWaffle } from '../assets/chart_waffle'; + +import type { SharedPieLayerState } from '../../common/expressions'; +import type { PieChartTypes } from '../../common/expressions/pie_chart/types'; +import type { DatatableColumn } from '../../../../../src/plugins/expressions'; + +interface PartitionChartMeta { + icon: ({ title, titleId, ...props }: Omit) => JSX.Element; + label: string; + partitionType: PartitionLayout; + groupLabel: string; + maxBuckets: number; + isExperimental?: boolean; + requiredMinDimensionCount?: number; + toolbarPopover: { + isDisabled?: boolean; + categoryOptions: Array<{ + value: SharedPieLayerState['categoryDisplay']; + inputDisplay: string; + }>; + numberOptions: Array<{ + value: SharedPieLayerState['numberDisplay']; + inputDisplay: string; + }>; + }; + legend: { + flat?: boolean; + showValues?: boolean; + getShowLegendDefault?: (bucketColumns: DatatableColumn[]) => boolean; + }; + sortPredicate?: ( + bucketColumns: DatatableColumn[], + sortingMap: Record + ) => (node1: ArrayEntry, node2: ArrayEntry) => number; +} + +const groupLabel = i18n.translate('xpack.lens.pie.groupLabel', { + defaultMessage: 'Proportion', +}); + +const categoryOptions: PartitionChartMeta['toolbarPopover']['categoryOptions'] = [ + { + value: 'default', + inputDisplay: i18n.translate('xpack.lens.pieChart.showCategoriesLabel', { + defaultMessage: 'Inside or outside', + }), + }, + { + value: 'inside', + inputDisplay: i18n.translate('xpack.lens.pieChart.fitInsideOnlyLabel', { + defaultMessage: 'Inside only', + }), + }, + { + value: 'hide', + inputDisplay: i18n.translate('xpack.lens.pieChart.categoriesInLegendLabel', { + defaultMessage: 'Hide labels', + }), + }, +]; + +const categoryOptionsTreemap: PartitionChartMeta['toolbarPopover']['categoryOptions'] = [ + { + value: 'default', + inputDisplay: i18n.translate('xpack.lens.pieChart.showTreemapCategoriesLabel', { + defaultMessage: 'Show labels', + }), + }, + { + value: 'hide', + inputDisplay: i18n.translate('xpack.lens.pieChart.categoriesInLegendLabel', { + defaultMessage: 'Hide labels', + }), + }, +]; + +const numberOptions: PartitionChartMeta['toolbarPopover']['numberOptions'] = [ + { + value: 'hidden', + inputDisplay: i18n.translate('xpack.lens.pieChart.hiddenNumbersLabel', { + defaultMessage: 'Hide from chart', + }), + }, + { + value: 'percent', + inputDisplay: i18n.translate('xpack.lens.pieChart.showPercentValuesLabel', { + defaultMessage: 'Show percent', + }), + }, + { + value: 'value', + inputDisplay: i18n.translate('xpack.lens.pieChart.showFormatterValuesLabel', { + defaultMessage: 'Show value', + }), + }, +]; + +export const PartitionChartsMeta: Record = { + donut: { + icon: LensIconChartDonut, + label: i18n.translate('xpack.lens.pie.donutLabel', { + defaultMessage: 'Donut', + }), + partitionType: PartitionLayout.sunburst, + groupLabel, + maxBuckets: 3, + toolbarPopover: { + categoryOptions, + numberOptions, + }, + legend: { + getShowLegendDefault: (bucketColumns) => bucketColumns.length > 1, + }, + }, + pie: { + icon: LensIconChartPie, + label: i18n.translate('xpack.lens.pie.pielabel', { + defaultMessage: 'Pie', + }), + partitionType: PartitionLayout.sunburst, + groupLabel, + maxBuckets: 3, + toolbarPopover: { + categoryOptions, + numberOptions, + }, + legend: { + getShowLegendDefault: (bucketColumns) => bucketColumns.length > 1, + }, + }, + treemap: { + icon: LensIconChartTreemap, + label: i18n.translate('xpack.lens.pie.treemaplabel', { + defaultMessage: 'Treemap', + }), + partitionType: PartitionLayout.treemap, + groupLabel, + maxBuckets: 2, + toolbarPopover: { + categoryOptions: categoryOptionsTreemap, + numberOptions, + }, + legend: { + getShowLegendDefault: () => false, + }, + }, + mosaic: { + icon: LensIconChartMosaic, + label: i18n.translate('xpack.lens.pie.mosaiclabel', { + defaultMessage: 'Mosaic', + }), + partitionType: PartitionLayout.mosaic, + groupLabel, + maxBuckets: 2, + isExperimental: true, + toolbarPopover: { + categoryOptions: [], + numberOptions, + }, + legend: { + getShowLegendDefault: () => false, + }, + requiredMinDimensionCount: 2, + sortPredicate: + (bucketColumns, sortingMap) => + ([name1, node1], [, node2]) => { + // Sorting for first group + if (bucketColumns.length === 1 || (node1.children.length && name1 in sortingMap)) { + return sortingMap[name1]; + } + // Sorting for second group + return node2.value - node1.value; + }, + }, + waffle: { + icon: LensIconChartWaffle, + label: i18n.translate('xpack.lens.pie.wafflelabel', { + defaultMessage: 'Waffle', + }), + partitionType: PartitionLayout.waffle, + groupLabel, + maxBuckets: 1, + isExperimental: true, + toolbarPopover: { + isDisabled: true, + categoryOptions: [], + numberOptions: [], + }, + legend: { + flat: true, + showValues: true, + getShowLegendDefault: () => true, + }, + sortPredicate: + () => + ([, node1], [, node2]) => + node2.value - node1.value, + }, +}; diff --git a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx index 7bc5f4037c3e86..539d69207f5f92 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_function.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/render_function.tsx @@ -25,7 +25,8 @@ import { import { RenderMode } from 'src/plugins/expressions'; import type { LensFilterEvent } from '../types'; import { VisualizationContainer } from '../visualization_container'; -import { CHART_NAMES, DEFAULT_PERCENT_DECIMALS } from './constants'; +import { DEFAULT_PERCENT_DECIMALS } from './constants'; +import { PartitionChartsMeta } from './partition_charts_meta'; import type { FormatFactory } from '../../common'; import type { PieExpressionProps } from '../../common/expressions'; import { @@ -126,7 +127,7 @@ export function PieComponent( ); } - let sortingMap: Record; + let sortingMap: Record = {}; if (shape === 'mosaic') { sortingMap = extractUniqTermsMap(firstTable, bucketColumns[0].id); } @@ -145,17 +146,7 @@ export function PieComponent( return String(d); }, fillLabel, - sortPredicate: - shape === 'mosaic' - ? ([name1, node1], [, node2]) => { - // Sorting for first group - if (bucketColumns.length === 1 || (node1.children.length && name1 in sortingMap)) { - return sortingMap[name1]; - } - // Sorting for second group - return node2.value - node1.value; - } - : undefined, + sortPredicate: PartitionChartsMeta[shape].sortPredicate?.(bucketColumns, sortingMap), shape: { fillColor: (d) => { const seriesLayers: SeriesLayer[] = []; @@ -209,8 +200,10 @@ export function PieComponent( }; }); + const { legend, partitionType: partitionLayout, label: chartType } = PartitionChartsMeta[shape]; + const config: RecursivePartial = { - partitionLayout: CHART_NAMES[shape].partitionType, + partitionLayout, fontFamily: chartTheme.barSeriesStyle?.displayValue?.fontFamily, outerSizeRatio: 1, specialFirstInnermostSector: true, @@ -292,7 +285,7 @@ export function PieComponent( id="xpack.lens.pie.pieWithNegativeWarningLabel" defaultMessage="{chartType} charts can't render with negative values." values={{ - chartType: CHART_NAMES[shape].label, + chartType, }} /> @@ -319,9 +312,10 @@ export function PieComponent( !hideLabels && (legendDisplay === 'show' || (legendDisplay === 'default' && - bucketColumns.length > 1 && - !isTreemapOrMosaicShape(shape))) + (legend.getShowLegendDefault?.(bucketColumns) ?? false))) } + flatLegend={legend.flat} + showLegendExtra={legend.showValues} legendPosition={legendPosition || Position.Right} legendMaxDepth={nestedLegend ? undefined : 1 /* Color is based only on first layer */} onElementClick={props.interactive ?? true ? onElementClickHandler : undefined} diff --git a/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts b/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts index dd27632b36e443..d86500ff8a4fad 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts +++ b/x-pack/plugins/lens/public/pie_visualization/render_helpers.test.ts @@ -13,6 +13,7 @@ import { getFilterContext, byDataColorPaletteMap, extractUniqTermsMap, + checkTableForContainsSmallValues, } from './render_helpers'; import { chartPluginMock } from '../../../../../src/plugins/charts/public/mocks'; @@ -317,4 +318,60 @@ describe('render helpers', () => { ); }); }); + + describe('#checkTableForContainsSmallValues', () => { + let datatable: Datatable; + const columnId = 'foo'; + + beforeEach(() => { + datatable = { + rows: [], + } as unknown as Datatable; + }); + + it('should return true if the data contains values less than the target percentage (1)', () => { + datatable.rows = [ + { + [columnId]: 80, + }, + { + [columnId]: 20, + }, + { + [columnId]: 1, + }, + ]; + expect(checkTableForContainsSmallValues(datatable, columnId, 1)).toBeTruthy(); + }); + + it('should return true if the data contains values less than the target percentage (42)', () => { + datatable.rows = [ + { + [columnId]: 58, + }, + { + [columnId]: 42, + }, + { + [columnId]: 1, + }, + ]; + expect(checkTableForContainsSmallValues(datatable, columnId, 42)).toBeTruthy(); + }); + + it('should return false if the data contains values greater than the target percentage', () => { + datatable.rows = [ + { + [columnId]: 22, + }, + { + [columnId]: 56, + }, + { + [columnId]: 12, + }, + ]; + expect(checkTableForContainsSmallValues(datatable, columnId, 1)).toBeFalsy(); + }); + }); }); diff --git a/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts b/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts index bdffacde656391..fa20eb6f20fa8d 100644 --- a/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts +++ b/x-pack/plugins/lens/public/pie_visualization/render_helpers.ts @@ -39,7 +39,7 @@ export function getFilterContext( } export const isPartitionShape = (shape: PieChartTypes | string) => - ['donut', 'pie', 'treemap', 'mosaic'].includes(shape); + ['donut', 'pie', 'treemap', 'mosaic', 'waffle'].includes(shape); export const isTreemapOrMosaicShape = (shape: PieChartTypes | string) => ['treemap', 'mosaic'].includes(shape); @@ -95,3 +95,15 @@ export const byDataColorPaletteMap = ( }, }; }; + +export const checkTableForContainsSmallValues = ( + dataTable: Datatable, + columnId: string, + minPercentage: number +) => { + const overallSum = dataTable.rows.reduce( + (partialSum, row) => Number(row[columnId]) + partialSum, + 0 + ); + return dataTable.rows.some((row) => (row[columnId] / overallSum) * 100 < minPercentage); +}; diff --git a/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts b/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts index 656d00960766e2..92dde282da5022 100644 --- a/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts +++ b/x-pack/plugins/lens/public/pie_visualization/suggestions.test.ts @@ -304,7 +304,7 @@ describe('suggestions', () => { state: undefined, keptLayerIds: ['first'], }); - expect(currentSuggestions).toHaveLength(4); + expect(currentSuggestions).toHaveLength(5); expect(currentSuggestions.every((s) => s.hide)).toEqual(true); }); @@ -324,7 +324,7 @@ describe('suggestions', () => { state: undefined, keptLayerIds: ['first'], }); - expect(currentSuggestions).toHaveLength(4); + expect(currentSuggestions).toHaveLength(5); expect(currentSuggestions.every((s) => s.hide)).toEqual(true); }); @@ -921,4 +921,133 @@ describe('suggestions', () => { ).toMatchInlineSnapshot(`Array []`); }); }); + + describe('waffle', () => { + it('should reject when currently active and unchanged data', () => { + expect( + suggestions({ + table: { + layerId: 'first', + isMultiRow: true, + columns: [], + changeType: 'unchanged', + }, + state: { + shape: 'waffle', + layers: [ + { + layerId: 'first', + layerType: layerTypes.DATA, + groups: [], + metric: 'a', + + numberDisplay: 'hidden', + categoryDisplay: 'default', + legendDisplay: 'default', + }, + ], + }, + keptLayerIds: ['first'], + }) + ).toHaveLength(0); + }); + + it('waffle type should be added only in case of 1 group', () => { + expect( + suggestions({ + table: { + layerId: 'first', + isMultiRow: true, + columns: [ + { + columnId: 'a', + operation: { label: 'Top 5', dataType: 'string' as DataType, isBucketed: true }, + }, + { + columnId: 'b', + operation: { label: 'Count', dataType: 'number' as DataType, isBucketed: false }, + }, + ], + changeType: 'unchanged', + }, + state: { + shape: 'waffle', + layers: [ + { + layerId: 'first', + layerType: layerTypes.DATA, + groups: ['a', 'b'], + metric: 'c', + + numberDisplay: 'hidden', + categoryDisplay: 'inside', + legendDisplay: 'show', + percentDecimals: 0, + legendMaxLines: 1, + truncateLegend: true, + nestedLegend: true, + }, + ], + }, + keptLayerIds: ['first'], + }).filter(({ hide, state }) => !hide && state.shape === 'waffle') + ).toMatchInlineSnapshot(`Array []`); + }); + + it('waffle type should be added only in case of 1 group (negative test)', () => { + const meta: Parameters[0] = { + table: { + layerId: 'first', + isMultiRow: true, + columns: [ + { + columnId: 'c', + operation: { label: 'Count', dataType: 'number' as DataType, isBucketed: false }, + }, + ], + changeType: 'unchanged', + }, + state: { + shape: 'pie', + layers: [ + { + layerId: 'first', + layerType: layerTypes.DATA, + groups: ['a', 'b'], + metric: 'c', + + numberDisplay: 'hidden', + categoryDisplay: 'inside', + legendDisplay: 'show', + percentDecimals: 0, + legendMaxLines: 1, + truncateLegend: true, + nestedLegend: true, + }, + ], + }, + keptLayerIds: ['first'], + }; + + // test with no group + expect( + suggestions(meta).filter(({ hide, state }) => !hide && state.shape === 'waffle') + ).toMatchInlineSnapshot(`Array []`); + + meta.table.columns.push({ + columnId: 'b', + operation: { label: 'Top 6', dataType: 'string' as DataType, isBucketed: true }, + }); + + meta.table.columns.push({ + columnId: 'c', + operation: { label: 'Top 7', dataType: 'string' as DataType, isBucketed: true }, + }); + + // test with 2 groups + expect( + suggestions(meta).filter(({ hide, state }) => !hide && state.shape === 'waffle') + ).toMatchInlineSnapshot(`Array []`); + }); + }); }); diff --git a/x-pack/plugins/lens/public/pie_visualization/suggestions.ts b/x-pack/plugins/lens/public/pie_visualization/suggestions.ts index 30cd63752f4200..f638bfd908be4b 100644 --- a/x-pack/plugins/lens/public/pie_visualization/suggestions.ts +++ b/x-pack/plugins/lens/public/pie_visualization/suggestions.ts @@ -10,8 +10,9 @@ import { i18n } from '@kbn/i18n'; import type { SuggestionRequest, TableSuggestionColumn, VisualizationSuggestion } from '../types'; import { layerTypes } from '../../common'; import type { PieVisualizationState } from '../../common/expressions'; -import { CHART_NAMES, MAX_MOSAIC_BUCKETS, MAX_PIE_BUCKETS, MAX_TREEMAP_BUCKETS } from './constants'; -import { isPartitionShape, isTreemapOrMosaicShape } from './render_helpers'; +import { PartitionChartsMeta } from './partition_charts_meta'; +import { isPartitionShape } from './render_helpers'; +import { PieChartTypes } from '../../common/expressions/pie_chart/types'; function hasIntervalScale(columns: TableSuggestionColumn[]) { return columns.some((col) => col.operation.scale === 'interval'); @@ -30,6 +31,31 @@ function shouldReject({ table, keptLayerIds, state }: SuggestionRequest maxBuckets) +); + export function suggestions({ table, state, @@ -45,7 +71,7 @@ export function suggestions({ const [groups, metrics] = partition(table.columns, (col) => col.operation.isBucketed); - if (metrics.length > 1 || groups.length > Math.max(MAX_PIE_BUCKETS, MAX_TREEMAP_BUCKETS)) { + if (metrics.length > 1 || groups.length > maximumGroupLength) { return []; } @@ -61,20 +87,18 @@ export function suggestions({ const results: Array> = []; - if (groups.length <= MAX_PIE_BUCKETS && !isTreemapOrMosaicShape(subVisualizationId!)) { - let newShape: PieVisualizationState['shape'] = - (subVisualizationId as PieVisualizationState['shape']) || 'donut'; - if (groups.length !== 1 && !subVisualizationId) { - newShape = 'pie'; - } - + if ( + groups.length <= PartitionChartsMeta.pie.maxBuckets && + !hasCustomSuggestionsExists(subVisualizationId) + ) { + const newShape = getNewShape(groups, subVisualizationId as PieVisualizationState['shape']); const baseSuggestion: VisualizationSuggestion = { title: i18n.translate('xpack.lens.pie.suggestionLabel', { defaultMessage: 'As {chartName}', - values: { chartName: CHART_NAMES[newShape].label }, + values: { chartName: PartitionChartsMeta[newShape].label }, description: 'chartName is already translated', }), - score: state && !isTreemapOrMosaicShape(state.shape) ? 0.6 : 0.4, + score: state && !hasCustomSuggestionsExists(state.shape) ? 0.6 : 0.4, state: { shape: newShape, palette: mainPalette || state?.palette, @@ -104,7 +128,7 @@ export function suggestions({ hide: table.changeType === 'reduced' || hasIntervalScale(groups) || - (state && !isTreemapOrMosaicShape(state.shape)), + (state && !hasCustomSuggestionsExists(state.shape)), }; results.push(baseSuggestion); @@ -112,7 +136,7 @@ export function suggestions({ ...baseSuggestion, title: i18n.translate('xpack.lens.pie.suggestionLabel', { defaultMessage: 'As {chartName}', - values: { chartName: CHART_NAMES[newShape === 'pie' ? 'donut' : 'pie'].label }, + values: { chartName: PartitionChartsMeta[newShape === 'pie' ? 'donut' : 'pie'].label }, description: 'chartName is already translated', }), score: 0.1, @@ -125,7 +149,7 @@ export function suggestions({ } if ( - groups.length <= MAX_TREEMAP_BUCKETS && + groups.length <= PartitionChartsMeta.treemap.maxBuckets && (!subVisualizationId || subVisualizationId === 'treemap') ) { results.push({ @@ -174,7 +198,7 @@ export function suggestions({ } if ( - groups.length <= MAX_MOSAIC_BUCKETS && + groups.length <= PartitionChartsMeta.mosaic.maxBuckets && (!subVisualizationId || subVisualizationId === 'mosaic') ) { results.push({ @@ -216,6 +240,49 @@ export function suggestions({ }); } + if ( + groups.length <= PartitionChartsMeta.waffle.maxBuckets && + (!subVisualizationId || subVisualizationId === 'waffle') + ) { + results.push({ + title: i18n.translate('xpack.lens.pie.waffleSuggestionLabel', { + defaultMessage: 'As Waffle', + }), + score: state?.shape === 'waffle' ? 0.7 : 0.5, + state: { + shape: 'waffle', + palette: mainPalette || state?.palette, + layers: [ + state?.layers[0] + ? { + ...state.layers[0], + layerId: table.layerId, + groups: groups.map((col) => col.columnId), + metric: metricColumnId, + categoryDisplay: 'default', + layerType: layerTypes.DATA, + } + : { + layerId: table.layerId, + groups: groups.map((col) => col.columnId), + metric: metricColumnId, + numberDisplay: 'percent', + categoryDisplay: 'default', + legendDisplay: 'default', + nestedLegend: false, + layerType: layerTypes.DATA, + }, + ], + }, + previewIcon: 'bullseye', + hide: + groups.length !== 1 || + table.changeType === 'reduced' || + hasIntervalScale(groups) || + (state && state.shape === 'waffle'), + }); + } + return [...results] .map((suggestion) => ({ ...suggestion, diff --git a/x-pack/plugins/lens/public/pie_visualization/to_expression.ts b/x-pack/plugins/lens/public/pie_visualization/to_expression.ts index fd754906ceb021..e13fbf62708eeb 100644 --- a/x-pack/plugins/lens/public/pie_visualization/to_expression.ts +++ b/x-pack/plugins/lens/public/pie_visualization/to_expression.ts @@ -55,7 +55,11 @@ function expressionHelper( categoryDisplay: [layer.categoryDisplay], legendDisplay: [layer.legendDisplay], legendPosition: [layer.legendPosition || 'right'], - percentDecimals: [layer.percentDecimals ?? DEFAULT_PERCENT_DECIMALS], + percentDecimals: [ + state.shape === 'waffle' + ? DEFAULT_PERCENT_DECIMALS + : layer.percentDecimals ?? DEFAULT_PERCENT_DECIMALS, + ], legendMaxLines: [layer.legendMaxLines ?? 1], truncateLegend: [layer.truncateLegend ?? true], nestedLegend: [!!layer.nestedLegend], diff --git a/x-pack/plugins/lens/public/pie_visualization/toolbar.tsx b/x-pack/plugins/lens/public/pie_visualization/toolbar.tsx index 23003a4ec34043..195a72cca9fedd 100644 --- a/x-pack/plugins/lens/public/pie_visualization/toolbar.tsx +++ b/x-pack/plugins/lens/public/pie_visualization/toolbar.tsx @@ -17,36 +17,13 @@ import { } from '@elastic/eui'; import type { Position } from '@elastic/charts'; import type { PaletteRegistry } from 'src/plugins/charts/public'; -import { DEFAULT_PERCENT_DECIMALS, CHART_NAMES } from './constants'; +import { DEFAULT_PERCENT_DECIMALS } from './constants'; +import { PartitionChartsMeta } from './partition_charts_meta'; import type { PieVisualizationState, SharedPieLayerState } from '../../common/expressions'; import { VisualizationDimensionEditorProps, VisualizationToolbarProps } from '../types'; import { ToolbarPopover, LegendSettingsPopover, useDebouncedValue } from '../shared_components'; import { PalettePicker } from '../shared_components'; -const numberOptions: Array<{ - value: SharedPieLayerState['numberDisplay']; - inputDisplay: string; -}> = [ - { - value: 'hidden', - inputDisplay: i18n.translate('xpack.lens.pieChart.hiddenNumbersLabel', { - defaultMessage: 'Hide from chart', - }), - }, - { - value: 'percent', - inputDisplay: i18n.translate('xpack.lens.pieChart.showPercentValuesLabel', { - defaultMessage: 'Show percent', - }), - }, - { - value: 'value', - inputDisplay: i18n.translate('xpack.lens.pieChart.showFormatterValuesLabel', { - defaultMessage: 'Show value', - }), - }, -]; - const legendOptions: Array<{ value: SharedPieLayerState['legendDisplay']; label: string; @@ -81,17 +58,24 @@ export function PieToolbar(props: VisualizationToolbarProps - {state.shape && CHART_NAMES[state.shape].categoryOptions.length ? ( + {categoryOptions.length ? ( { setState({ ...state, @@ -112,27 +96,32 @@ export function PieToolbar(props: VisualizationToolbarProps ) : null} - - { - setState({ - ...state, - layers: [{ ...layer, numberDisplay: option }], - }); - }} - /> - - + + {numberOptions.length ? ( + + { + setState({ + ...state, + layers: [{ ...layer, numberDisplay: option }], + }); + }} + /> + + ) : null} + + {numberOptions.length + categoryOptions.length ? : null} + => ({ id: 'lnsPie', - visualizationTypes: [ - { - id: 'donut', - icon: CHART_NAMES.donut.icon, - label: CHART_NAMES.donut.label, - groupLabel: CHART_NAMES.donut.groupLabel, - }, - { - id: 'pie', - icon: CHART_NAMES.pie.icon, - label: CHART_NAMES.pie.label, - groupLabel: CHART_NAMES.pie.groupLabel, - }, - { - id: 'treemap', - icon: CHART_NAMES.treemap.icon, - label: CHART_NAMES.treemap.label, - groupLabel: CHART_NAMES.treemap.groupLabel, - }, - { - id: 'mosaic', - icon: CHART_NAMES.mosaic.icon, - label: CHART_NAMES.mosaic.label, - showExperimentalBadge: true, - groupLabel: CHART_NAMES.mosaic.groupLabel, - }, - ], + visualizationTypes: Object.entries(PartitionChartsMeta).map(([key, meta]) => ({ + id: key, + icon: meta.icon, + label: meta.label, + groupLabel: meta.groupLabel, + showExperimentalBadge: meta.isExperimental, + })), getVisualizationTypeId(state) { return state.shape; @@ -113,7 +94,7 @@ export const getPieVisualization = ({ }, getDescription(state) { - return CHART_NAMES[state.shape] ?? CHART_NAMES.pie; + return PartitionChartsMeta[state.shape] ?? PartitionChartsMeta.pie; }, switchVisualizationType: (visualizationTypeId, state) => ({ @@ -165,25 +146,25 @@ export const getPieVisualization = ({ }; switch (state.shape) { - case 'mosaic': - case 'treemap': + case 'donut': + case 'pie': return { ...baseProps, - groupLabel: i18n.translate('xpack.lens.pie.treemapGroupLabel', { - defaultMessage: 'Group by', + groupLabel: i18n.translate('xpack.lens.pie.sliceGroupLabel', { + defaultMessage: 'Slice by', }), - supportsMoreColumns: sortedColumns.length < MAX_TREEMAP_BUCKETS, - dataTestSubj: 'lnsPie_groupByDimensionPanel', - requiredMinDimensionCount: state.shape === 'mosaic' ? 2 : undefined, + supportsMoreColumns: sortedColumns.length < PartitionChartsMeta.pie.maxBuckets, + dataTestSubj: 'lnsPie_sliceByDimensionPanel', }; default: return { ...baseProps, - groupLabel: i18n.translate('xpack.lens.pie.sliceGroupLabel', { - defaultMessage: 'Slice by', + groupLabel: i18n.translate('xpack.lens.pie.treemapGroupLabel', { + defaultMessage: 'Group by', }), - supportsMoreColumns: sortedColumns.length < MAX_PIE_BUCKETS, - dataTestSubj: 'lnsPie_sliceByDimensionPanel', + supportsMoreColumns: sortedColumns.length < PartitionChartsMeta[state.shape].maxBuckets, + dataTestSubj: 'lnsPie_groupByDimensionPanel', + requiredMinDimensionCount: PartitionChartsMeta[state.shape].requiredMinDimensionCount, }; } }; @@ -279,33 +260,54 @@ export const getPieVisualization = ({ if (state?.layers.length === 0 || !frame.activeData) { return; } - - const metricColumnsWithArrayValues = []; + const warningMessages = []; for (const layer of state.layers) { const { layerId, metric } = layer; - const rows = frame.activeData[layerId] && frame.activeData[layerId].rows; + const rows = frame.activeData[layerId]?.rows; + const numericColumn = frame.activeData[layerId]?.columns.find( + ({ meta }) => meta?.type === 'number' + ); + if (!rows || !metric) { break; } - const columnToLabel = frame.datasourceLayers[layerId].getOperationForColumnId(metric)?.label; + if ( + numericColumn && + state.shape === 'waffle' && + layer.groups.length && + checkTableForContainsSmallValues(frame.activeData[layerId], numericColumn.id, 1) + ) { + warningMessages.push( + {state.shape}, + }} + /> + ); + } + + const columnToLabel = frame.datasourceLayers[layerId].getOperationForColumnId(metric)?.label; const hasArrayValues = rows.some((row) => Array.isArray(row[metric])); if (hasArrayValues) { - metricColumnsWithArrayValues.push(columnToLabel || metric); + warningMessages.push( + {columnToLabel || metric}, + }} + /> + ); } } - return metricColumnsWithArrayValues.map((label) => ( - {label}, - }} - /> - )); + + return warningMessages; }, getErrorMessages(state) { From 3232689b5dfdd248666e73069e1f6bddcce4c846 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Thu, 2 Dec 2021 10:47:52 +0100 Subject: [PATCH 047/126] [Uptimes] Push configs to service (#120069) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/uptime/common/types/index.ts | 5 +- .../lib/adapters/framework/adapter_types.ts | 2 + .../synthetics_service/get_api_key.test.ts | 2 +- .../lib/synthetics_service/get_api_key.ts | 13 +- .../get_service_locations.test.ts | 9 +- .../get_service_locations.ts | 7 +- .../synthetics_service/service_api_client.ts | 111 ++++++++++++++++++ .../synthetics_service/synthetics_service.ts | 98 ++++++++++++---- x-pack/plugins/uptime/server/plugin.ts | 17 ++- .../synthetics_service/add_monitor.ts | 16 ++- .../synthetics_service/delete_monitor.ts | 18 ++- .../synthetics_service/edit_monitor.ts | 17 ++- .../get_service_locations.ts | 3 +- x-pack/test/api_integration/config.ts | 2 +- 14 files changed, 269 insertions(+), 51 deletions(-) create mode 100644 x-pack/plugins/uptime/server/lib/synthetics_service/service_api_client.ts diff --git a/x-pack/plugins/uptime/common/types/index.ts b/x-pack/plugins/uptime/common/types/index.ts index e013fb11c2d685..f4218d53c27de7 100644 --- a/x-pack/plugins/uptime/common/types/index.ts +++ b/x-pack/plugins/uptime/common/types/index.ts @@ -33,9 +33,10 @@ export interface MonitorIdParam { export type SyntheticsMonitorSavedObject = SimpleSavedObject<{ name: string; - runOnce: boolean; + runOnce?: boolean; urls?: string[]; tags?: string[]; + locations: string[]; schedule: string; type: 'http' | 'tcp' | 'icmp' | 'browser'; source?: { @@ -59,4 +60,4 @@ export interface ManifestLocation { status: string; } -export type ServiceLocations = Array<{ id: string; label: string; geo: LocationGeo }>; +export type ServiceLocations = Array<{ id: string; label: string; geo: LocationGeo; url: string }>; diff --git a/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts b/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts index 2958e3e1719485..c5779a56bfe828 100644 --- a/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts +++ b/x-pack/plugins/uptime/server/lib/adapters/framework/adapter_types.ts @@ -26,6 +26,7 @@ import { SecurityPluginStart } from '../../../../../security/server'; import { CloudSetup } from '../../../../../cloud/server'; import { FleetStartContract } from '../../../../../fleet/server'; import { UptimeConfig } from '../../../../common/config'; +import { SyntheticsService } from '../../synthetics_service/synthetics_service'; export type UMElasticsearchQueryFn = ( params: { @@ -47,6 +48,7 @@ export interface UptimeServerSetup { security: SecurityPluginStart; savedObjectsClient: SavedObjectsClientContract; encryptedSavedObjects: EncryptedSavedObjectsPluginStart; + syntheticsService: SyntheticsService; } export interface UptimeCorePluginsSetup { diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.test.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.test.ts index f9ba0ce545bad0..540dfe150d0370 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.test.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.test.ts @@ -50,7 +50,7 @@ describe('getAPIKeyTest', function () { cluster: ['monitor', 'read_ilm', 'read_pipeline'], index: [ { - names: ['synthetics-*'], + names: ['synthetics-*', 'heartbeat-*'], privileges: ['view_index_metadata', 'create_doc', 'auto_configure'], }, ], diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.ts index 015442dd3c4fe8..9ca854598e7868 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/get_api_key.ts @@ -28,10 +28,15 @@ export const getAPIKeyForSyntheticsService = async ({ includedHiddenTypes: [syntheticsServiceApiKey.name], }); - const apiKey = await getSyntheticsServiceAPIKey(encryptedClient); - if (apiKey) { - return apiKey; + try { + const apiKey = await getSyntheticsServiceAPIKey(encryptedClient); + if (apiKey) { + return apiKey; + } + } catch (err) { + // TODO: figure out how to handle decryption errors } + return await generateAndSaveAPIKey({ request, security, savedObjectsClient }); }; @@ -61,7 +66,7 @@ export const generateAndSaveAPIKey = async ({ cluster: ['monitor', 'read_ilm', 'read_pipeline'], index: [ { - names: ['synthetics-*'], + names: ['synthetics-*', 'heartbeat-*'], privileges: ['view_index_metadata', 'create_doc', 'auto_configure'], }, ], diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.test.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.test.ts index 375ceffe492daf..7c4b0d52e5182c 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.test.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.test.ts @@ -27,13 +27,7 @@ describe('getServiceLocations', function () { }); it('should return parsed locations', async () => { const locations = await getServiceLocations({ - config: { - unsafe: { - service: { - manifestUrl: 'http://local.dev', - }, - }, - }, + manifestUrl: 'http://local.dev', }); expect(locations).toEqual([ @@ -44,6 +38,7 @@ describe('getServiceLocations', function () { }, id: 'us_central', label: 'US Central', + url: 'https://local.dev', }, ]); }); diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.ts index fdd24ed2394b2a..f63a2c7babb97a 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/get_service_locations.ts @@ -6,20 +6,19 @@ */ import axios from 'axios'; -import { UptimeConfig } from '../../../common/config'; import { ManifestLocation, ServiceLocations } from '../../../common/types'; -export async function getServiceLocations({ config }: { config: UptimeConfig }) { - const manifestURL = config.unsafe.service.manifestUrl; +export async function getServiceLocations({ manifestUrl }: { manifestUrl: string }) { const locations: ServiceLocations = []; try { - const { data } = await axios.get>(manifestURL); + const { data } = await axios.get>(manifestUrl); Object.entries(data.locations).forEach(([locationId, location]) => { locations.push({ id: locationId, label: location.geo.name, geo: location.geo.location, + url: location.url, }); }); diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/service_api_client.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/service_api_client.ts new file mode 100644 index 00000000000000..55dd67088eb2c6 --- /dev/null +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/service_api_client.ts @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import axios from 'axios'; +import { forkJoin, from as rxjsFrom, Observable, of } from 'rxjs'; +import { catchError, tap } from 'rxjs/operators'; +import { ServiceLocations, SyntheticsMonitorSavedObject } from '../../../common/types'; +import { getServiceLocations } from './get_service_locations'; +import { Logger } from '../../../../../../src/core/server'; + +const TEST_SERVICE_USERNAME = 'localKibanaIntegrationTestsUser'; + +export type MonitorConfigs = Array< + SyntheticsMonitorSavedObject['attributes'] & { + id: string; + source?: { + inline: { + script: string; + }; + }; + } +>; + +export interface ServiceData { + monitors: MonitorConfigs; + output: { + hosts: string[]; + api_key: string; + }; +} + +export class ServiceAPIClient { + private readonly username: string; + private readonly authorization: string; + private locations: ServiceLocations; + private logger: Logger; + + constructor(manifestUrl: string, username: string, password: string, logger: Logger) { + this.username = username; + this.authorization = 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64'); + this.logger = logger; + this.locations = []; + + getServiceLocations({ manifestUrl }).then((result) => { + this.locations = result; + }); + } + + async post(data: ServiceData) { + return this.callAPI('POST', data); + } + + async put(data: ServiceData) { + return this.callAPI('POST', data); + } + + async delete(data: ServiceData) { + return this.callAPI('DELETE', data); + } + + async callAPI(method: 'POST' | 'PUT' | 'DELETE', { monitors: allMonitors, output }: ServiceData) { + if (this.username === TEST_SERVICE_USERNAME) { + // we don't want to call service while local integration tests are running + return; + } + + const callServiceEndpoint = (monitors: ServiceData['monitors'], url: string) => { + return axios({ + method, + url: url + '/monitors', + data: { monitors, output }, + headers: { + Authorization: this.authorization, + }, + }); + }; + + const pushErrors: Array<{ locationId: string; error: Error }> = []; + + const promises: Array> = []; + + this.locations.forEach(({ id, url }) => { + const locMonitors = allMonitors.filter( + ({ locations }) => !locations || locations?.includes(id) + ); + if (locMonitors.length > 0) { + promises.push( + rxjsFrom(callServiceEndpoint(locMonitors, url)).pipe( + tap((result) => { + this.logger.debug(result.data); + }), + catchError((err) => { + pushErrors.push({ locationId: id, error: err }); + this.logger.error(err); + // we don't want to throw an unhandled exception here + return of(true); + }) + ) + ); + } + }); + + await forkJoin(promises).toPromise(); + + return pushErrors; + } +} diff --git a/x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.ts b/x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.ts index ecec66db845c2f..cd5a72c2a14144 100644 --- a/x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.ts +++ b/x-pack/plugins/uptime/server/lib/synthetics_service/synthetics_service.ts @@ -7,7 +7,8 @@ /* eslint-disable max-classes-per-file */ -import axios from 'axios'; +import { ValuesType } from 'utility-types'; + import { CoreStart, KibanaRequest, @@ -27,6 +28,7 @@ import { SyntheticsMonitorSavedObject } from '../../../common/types'; import { syntheticsMonitorType } from '../saved_objects/synthetics_monitor'; import { getEsHosts } from './get_es_hosts'; import { UptimeConfig } from '../../../common/config'; +import { MonitorConfigs, ServiceAPIClient } from './service_api_client'; const SYNTHETICS_SERVICE_SYNC_MONITORS_TASK_TYPE = 'UPTIME:SyntheticsService:Sync-Saved-Monitor-Objects'; @@ -35,6 +37,7 @@ const SYNTHETICS_SERVICE_SYNC_MONITORS_TASK_ID = 'UPTIME:SyntheticsService:sync- export class SyntheticsService { private logger: Logger; private readonly server: UptimeServerSetup; + private apiClient: ServiceAPIClient; private readonly config: UptimeConfig; private readonly esHosts: string[]; @@ -46,6 +49,10 @@ export class SyntheticsService { this.server = server; this.config = server.config; + const { manifestUrl, username, password } = this.config.unsafe.service; + + this.apiClient = new ServiceAPIClient(manifestUrl, username, password, logger); + this.esHosts = getEsHosts({ config: this.config, cloud: server.cloud }); } @@ -101,7 +108,7 @@ export class SyntheticsService { async run() { const { state } = taskInstance; - // TODO: Push API Key and Monitor Configs to service here + await service.pushConfigs(); return { state }; }, @@ -120,7 +127,7 @@ export class SyntheticsService { id: SYNTHETICS_SERVICE_SYNC_MONITORS_TASK_ID, taskType: SYNTHETICS_SERVICE_SYNC_MONITORS_TASK_TYPE, schedule: { - interval: '5m', + interval: '1m', }, params: {}, state: {}, @@ -137,7 +144,7 @@ export class SyntheticsService { }); } - async pushConfigs(request: KibanaRequest) { + async getOutput(request?: KibanaRequest) { if (!this.apiKey) { try { this.apiKey = await getAPIKeyForSyntheticsService({ server: this.server, request }); @@ -152,43 +159,92 @@ export class SyntheticsService { throw error; } - const monitors = await this.getMonitorConfigs(); + return { + hosts: this.esHosts, + api_key: `${this.apiKey.id}:${this.apiKey.apiKey}`, + }; + } + + async pushConfigs(request?: KibanaRequest, configs?: MonitorConfigs) { + const monitors = this.formatConfigs(configs || (await this.getMonitorConfigs())); const data = { monitors, - output: { - hosts: this.esHosts, - api_key: `${this.apiKey.id}:${this.apiKey.apiKey}`, - }, + output: await this.getOutput(request), }; - const { url, username, password } = this.config.unsafe.service; - try { - await axios({ - method: 'POST', - url: url + '/monitors', - data, - headers: { - Authorization: 'Basic ' + Buffer.from(`${username}:${password}`).toString('base64'), - }, - }); + return await this.apiClient.post(data); } catch (e) { this.logger.error(e); + throw e; } } + async deleteConfigs(request: KibanaRequest, configs: MonitorConfigs) { + const data = { + monitors: configs, + output: await this.getOutput(request), + }; + return await this.apiClient.delete(data); + } + async getMonitorConfigs() { const savedObjectsClient = this.server.savedObjectsClient; - const monitorsSavedObjects = await savedObjectsClient.find({ + const monitorsSavedObjects = await savedObjectsClient.find< + SyntheticsMonitorSavedObject['attributes'] + >({ type: syntheticsMonitorType, }); const savedObjectsList = monitorsSavedObjects.saved_objects; - return savedObjectsList.map(({ attributes, id }) => ({ + return savedObjectsList.map>(({ attributes, id }) => ({ ...attributes, id, })); } + + formatConfigs(configs: MonitorConfigs) { + // TODO: Move to dedicated formatter class + function parseSchedule(schedule: any) { + if (schedule?.number) { + return `@every ${schedule.number}${schedule.unit}`; + } + return schedule; + } + + function parseUrl(urls?: string | string[]) { + if (!urls) { + return undefined; + } + if (urls instanceof Array) { + return urls; + } + return [urls]; + } + + function parseInlineSource(monAttrs: any) { + if (monAttrs['source.inline.script']) { + return { + inline: { + script: monAttrs['source.inline.script'], + }, + }; + } + } + return configs.map((monAttrs) => { + const { id, schedule, type, name, locations, tags, urls } = monAttrs; + return { + id, + type, + name, + locations, + tags, + source: parseInlineSource(monAttrs), + urls: parseUrl(urls), + schedule: parseSchedule(schedule), + }; + }); + } } class APIKeyMissingError extends Error { diff --git a/x-pack/plugins/uptime/server/plugin.ts b/x-pack/plugins/uptime/server/plugin.ts index 6269c690a18adb..49658f3def5a12 100644 --- a/x-pack/plugins/uptime/server/plugin.ts +++ b/x-pack/plugins/uptime/server/plugin.ts @@ -27,6 +27,7 @@ import { mappingFromFieldMap } from '../../rule_registry/common/mapping_from_fie import { Dataset } from '../../rule_registry/server'; import { UptimeConfig } from '../common/config'; import { SyntheticsService } from './lib/synthetics_service/synthetics_service'; +import { syntheticsServiceApiKey } from './lib/saved_objects/service_api_key'; export type UptimeRuleRegistry = ReturnType['ruleRegistry']; @@ -89,9 +90,16 @@ export class Plugin implements PluginType { } public start(coreStart: CoreStart, plugins: UptimeCorePluginsStart) { - this.savedObjectsClient = new SavedObjectsClient( - coreStart.savedObjects.createInternalRepository() - ); + if (this.server?.config?.unsafe?.service.enabled) { + this.savedObjectsClient = new SavedObjectsClient( + coreStart.savedObjects.createInternalRepository([syntheticsServiceApiKey.name]) + ); + } else { + this.savedObjectsClient = new SavedObjectsClient( + coreStart.savedObjects.createInternalRepository() + ); + } + if (this.server) { this.server.security = plugins.security; this.server.fleet = plugins.fleet; @@ -102,6 +110,9 @@ export class Plugin implements PluginType { if (this.server?.config?.unsafe?.service.enabled) { this.syntheticService?.init(coreStart); this.syntheticService?.scheduleSyncTask(plugins.taskManager); + if (this.server && this.syntheticService) { + this.server.syntheticsService = this.syntheticService; + } } } diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/add_monitor.ts b/x-pack/plugins/uptime/server/rest_api/synthetics_service/add_monitor.ts index 11d7dcedcaa34e..c30b4f96e81453 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics_service/add_monitor.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics_service/add_monitor.ts @@ -16,11 +16,21 @@ export const addSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ validate: { body: schema.any(), }, - handler: async ({ request, savedObjectsClient }): Promise => { - const monitor = request.body as SyntheticsMonitorSavedObject; + handler: async ({ request, savedObjectsClient, server }): Promise => { + const monitor = request.body as SyntheticsMonitorSavedObject['attributes']; const newMonitor = await savedObjectsClient.create(syntheticsMonitorType, monitor); - // TODO: call to service sync + + const { syntheticsService } = server; + + const errors = await syntheticsService.pushConfigs(request, [ + { ...newMonitor.attributes, id: newMonitor.id }, + ]); + + if (errors) { + return errors; + } + return newMonitor; }, }); diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/delete_monitor.ts b/x-pack/plugins/uptime/server/rest_api/synthetics_service/delete_monitor.ts index 68eb8aa130d2e5..c951acae216332 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics_service/delete_monitor.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics_service/delete_monitor.ts @@ -9,6 +9,7 @@ import { SavedObjectsErrorHelpers } from '../../../../../../src/core/server'; import { UMRestApiRouteFactory } from '../types'; import { API_URLS } from '../../../common/constants'; import { syntheticsMonitorType } from '../../lib/saved_objects/synthetics_monitor'; +import { SyntheticsMonitorSavedObject } from '../../../common/types'; export const deleteSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ method: 'DELETE', @@ -18,17 +19,30 @@ export const deleteSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ monitorId: schema.string(), }), }, - handler: async ({ request, savedObjectsClient }): Promise => { + handler: async ({ request, savedObjectsClient, server }): Promise => { const { monitorId } = request.params; + const { syntheticsService } = server; + try { + const monitor = await savedObjectsClient.get( + syntheticsMonitorType, + monitorId + ); + await savedObjectsClient.delete(syntheticsMonitorType, monitorId); - // TODO: call to service sync + const errors = await syntheticsService.deleteConfigs(request, [ + { ...monitor.attributes, id: monitorId }, + ]); + if (errors) { + return errors; + } return monitorId; } catch (getErr) { if (SavedObjectsErrorHelpers.isNotFoundError(getErr)) { return 'Not found'; } + throw getErr; } }, }); diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/edit_monitor.ts b/x-pack/plugins/uptime/server/rest_api/synthetics_service/edit_monitor.ts index 46a91738c380d0..684838ed4efe05 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics_service/edit_monitor.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics_service/edit_monitor.ts @@ -19,13 +19,26 @@ export const editSyntheticsMonitorRoute: UMRestApiRouteFactory = () => ({ }), body: schema.any(), }, - handler: async ({ request, savedObjectsClient }): Promise => { + handler: async ({ request, savedObjectsClient, server }): Promise => { const monitor = request.body as SyntheticsMonitorSavedObject['attributes']; const { monitorId } = request.params; + const { syntheticsService } = server; + const editMonitor = await savedObjectsClient.update(syntheticsMonitorType, monitorId, monitor); - // TODO: call to service sync + + const errors = await syntheticsService.pushConfigs(request, [ + { + ...(editMonitor.attributes as SyntheticsMonitorSavedObject['attributes']), + id: editMonitor.id, + }, + ]); + + if (errors) { + return errors; + } + return editMonitor; }, }); diff --git a/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_locations.ts b/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_locations.ts index b96b98870e38eb..b63f89b490dc9f 100644 --- a/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_locations.ts +++ b/x-pack/plugins/uptime/server/rest_api/synthetics_service/get_service_locations.ts @@ -13,5 +13,6 @@ export const getServiceLocationsRoute: UMRestApiRouteFactory = () => ({ method: 'GET', path: API_URLS.SERVICE_LOCATIONS, validate: {}, - handler: async ({ server }): Promise => getServiceLocations({ config: server.config }), + handler: async ({ server }): Promise => + getServiceLocations({ manifestUrl: server.config.service.manifestUrl }), }); diff --git a/x-pack/test/api_integration/config.ts b/x-pack/test/api_integration/config.ts index bf42a5b0865a21..dde3b827bcdae2 100644 --- a/x-pack/test/api_integration/config.ts +++ b/x-pack/test/api_integration/config.ts @@ -38,7 +38,7 @@ export async function getApiIntegrationConfig({ readConfigFile }: FtrConfigProvi '--xpack.uptime.unsafe.service.enabled=true', '--xpack.uptime.unsafe.service.password=test', '--xpack.uptime.unsafe.service.manifestUrl=http://test.com', - '--xpack.uptime.unsafe.service.username=user', + '--xpack.uptime.unsafe.service.username=localKibanaIntegrationTestsUser', `--xpack.securitySolution.enableExperimental=${JSON.stringify(['ruleRegistryEnabled'])}`, ], }, From 976253a5f23cc4251f11c275984c74d221ad3f8d Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Thu, 2 Dec 2021 10:56:06 +0100 Subject: [PATCH 048/126] [Lens] Improve column type detection in table for alignment (#120007) * :bug: Fix last value alignment behaviour * :white_check_mark: Add unit test --- .../components/table_basic.test.tsx | 46 +++++++++++++++++++ .../components/table_basic.tsx | 9 +++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.test.tsx b/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.test.tsx index f71d2b9ec63262..19315b5835d5fb 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.test.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.test.tsx @@ -508,6 +508,52 @@ describe('DatatableComponent', () => { }); }); + test('it detect last_value filtered metric type', () => { + const { data, args } = sampleArgs(); + + const table = data.tables.l1; + const column = table.columns[1]; + + column.meta = { + ...column.meta, + field: undefined, + type: 'number', + sourceParams: { ...column.meta.sourceParams, type: 'filtered_metric' }, + }; + table.rows[0].b = 'Hello'; + + const wrapper = shallow( + ({ convert: (x) => x } as IFieldFormat)} + dispatchEvent={onDispatchEvent} + getType={jest.fn()} + renderMode="view" + paletteService={chartPluginMock.createPaletteRegistry()} + uiSettings={{ get: jest.fn() } as unknown as IUiSettingsClient} + /> + ); + + expect(wrapper.find(DataContext.Provider).prop('value').alignments).toEqual({ + // set via args + a: 'center', + // default for string + b: 'left', + // default for number + c: 'right', + }); + }); + test('it should refresh the table header when the datatable data changes', () => { const { data, args } = sampleArgs(); diff --git a/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.tsx b/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.tsx index 6635ada9a40363..7ceffcaaff5dbd 100644 --- a/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.tsx +++ b/x-pack/plugins/lens/public/datatable_visualization/components/table_basic.tsx @@ -212,7 +212,14 @@ export const DatatableComponent = (props: DatatableRenderProps) => { const isNumericMap: Record = useMemo(() => { const numericMap: Record = {}; for (const column of firstLocalTable.columns) { - numericMap[column.id] = column.meta.type === 'number'; + // filtered metrics result as "number" type, but have no field + numericMap[column.id] = + (column.meta.type === 'number' && column.meta.field != null) || + // as fallback check the first available value type + // mind here: date can be seen as numbers, to carefully check that is a filtered metric + (column.meta.field == null && + typeof firstLocalTable.rows.find((row) => row[column.id] != null)?.[column.id] === + 'number'); } return numericMap; }, [firstLocalTable]); From acbee9bc491ec0ac99a2c056503404242ce4b708 Mon Sep 17 00:00:00 2001 From: Georgii Gorbachev Date: Thu, 2 Dec 2021 11:03:59 +0100 Subject: [PATCH 049/126] [Security Solution][Detections] Add basic error handling to logging methods of Rule Execution Log (#120157) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Ticket:** https://github.com/elastic/kibana/issues/119595 ## Summary With this PR, calling `IRuleExecutionLog.logStatusChange()` is now safe for callers (rule executors or route handlers). It doesn't throw and writes any exceptions being caught to Kibana logs. Example error in the logs: ``` [2021-12-01T20:05:36.620+01:00][DEBUG][plugins.securitySolution] ... [2021-12-01T20:05:37.591+01:00][ERROR][plugins.securitySolution.ruleExecution] Error logging rule execution status change; status: "succeeded", rule id: "abea42f0-489b-11ec-83fa-1bde56c47ca8", rule name: "SDH-247 my loooooong loooooong name"; Error: TESTING ERROR HANDLING at EventLogAdapter.logStatusChangeToSavedObjects (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts:91:11) at processTicksAndRejections (node:internal/process/task_queues:96:5) at async Promise.all (index 0) at EventLogAdapter.logStatusChange (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts:83:5) at RuleExecutionLogClient.logStatusChange (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/rule_execution_log_client.ts:91:7) at Object.executor (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts:345:15) at Object.executor (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts:20:23) at TaskRunner.executeAlertInstances (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:316:31) at promiseResult (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/lib/result_type.ts:47:17) at TaskRunner.loadAlertAttributesAndRun (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:569:14) at errorAsAlertTaskRunResult (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:1119:12) at TaskRunner.run (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:635:33) at TaskManagerRunner.run (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/task_manager/server/task_running/task_runner.ts:297:22) [2021-12-01T20:05:37.591+01:00][DEBUG][plugins.securitySolution] ... ``` ## Additional log metadata For debugging purposes, rule execution log client writes additional log metadata with any caught exception. It's not visible in Kibana console logs by default, but can be enabled in Kibana config. I used the following config to test it: ```yaml logging: appenders: custom_console: type: console layout: type: pattern highlight: true pattern: "[%date][%level][%logger] %message %meta" root: appenders: [custom_console] level: warn loggers: - name: config level: info - name: plugins level: warn - name: plugins.securitySolution level: debug - name: plugins.ruleRegistry level: info - name: plugins.alerting level: info - name: plugins.taskManager level: info - name: savedobjects-service level: info - name: elasticsearch-service level: off - name: elasticsearch level: off - name: elasticsearch.query level: off - name: server level: fatal - name: optimize level: info - name: metrics.ops level: off ``` Error in the logs with additional metadata (find it after the stack trace): ``` [2021-12-01T20:03:30.807+01:00][DEBUG][plugins.securitySolution] ... [2021-12-01T20:03:31.812+01:00][ERROR][plugins.securitySolution.ruleExecution] Error logging rule execution status change; status: "succeeded", rule id: "abea42f0-489b-11ec-83fa-1bde56c47ca8", rule name: "SDH-247 my loooooong loooooong name"; Error: TESTING ERROR HANDLING at EventLogAdapter.logStatusChangeToSavedObjects (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts:91:11) at runMicrotasks () at processTicksAndRejections (node:internal/process/task_queues:96:5) at async Promise.all (index 0) at EventLogAdapter.logStatusChange (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts:83:5) at RuleExecutionLogClient.logStatusChange (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/rule_execution_log_client.ts:93:7) at Object.executor (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts:345:15) at Object.executor (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts:20:23) at TaskRunner.executeAlertInstances (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:316:31) at promiseResult (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/lib/result_type.ts:47:17) at TaskRunner.loadAlertAttributesAndRun (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:569:14) at errorAsAlertTaskRunResult (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:1119:12) at TaskRunner.run (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/alerting/server/task_runner/task_runner.ts:635:33) at TaskManagerRunner.run (/Users/georgii/Code/elastic/kibana-main/x-pack/plugins/task_manager/server/task_running/task_runner.ts:297:22) {"rule":{"id":"abea42f0-489b-11ec-83fa-1bde56c47ca8","name":"SDH-247 my loooooong loooooong name","type":"siem.queryRule","execution":{"status":"succeeded"}},"kibana":{"spaceId":"default"}} [2021-12-01T20:03:31.812+01:00][DEBUG][plugins.securitySolution] ... ``` Here it is extracted from the log: ``` {"rule":{"id":"abea42f0-489b-11ec-83fa-1bde56c47ca8","name":"SDH-247 my loooooong loooooong name","type":"siem.queryRule","execution":{"status":"succeeded"}},"kibana":{"spaceId":"default"}} ``` More info on the layout configuration: https://www.elastic.co/guide/en/kibana/master/logging-configuration.html#pattern-layout I couldn't decently pretty print it with the config options that are available 😞 I was thinking what to include in the log metadata and what to include in the regular log message, and my thoughts so far were: - It could be useful to add important attributes like correlation ids (rule id etc) and details of the original exception directly into the log message, because that's what is going to be logged out of the box with the default logging configuration. - Log meta could be used for logging optional attributes that could be useful when digging deeper into an issue when debugging Security app and Detection Engine. ### Checklist - [ ] [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 --- .../event_log_adapter/event_log_adapter.ts | 43 +++++++++------- .../rule_execution_log_client.ts | 49 +++++++++++++++---- .../rule_execution_log/types.ts | 17 ++++++- .../create_security_rule_type_wrapper.ts | 1 + .../signals/signal_rule_alert_type.ts | 1 + .../security_solution/server/plugin.ts | 2 +- .../server/request_context_factory.ts | 6 ++- 7 files changed, 89 insertions(+), 30 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts index f622ea9248b24b..d88f4119b691fa 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/event_log_adapter/event_log_adapter.ts @@ -79,7 +79,32 @@ export class EventLogAdapter implements IRuleExecutionLogClient { // EventLog execution events are immutable, nothing to do here } - private async logExecutionMetrics(args: LogExecutionMetricsArgs) { + public async logStatusChange(args: LogStatusChangeArgs): Promise { + await Promise.all([ + this.logStatusChangeToSavedObjects(args), + this.logStatusChangeToEventLog(args), + ]); + } + + private async logStatusChangeToSavedObjects(args: LogStatusChangeArgs): Promise { + await this.savedObjectsAdapter.logStatusChange(args); + } + + private async logStatusChangeToEventLog(args: LogStatusChangeArgs): Promise { + if (args.metrics) { + this.logExecutionMetrics({ + ruleId: args.ruleId, + ruleName: args.ruleName, + ruleType: args.ruleType, + spaceId: args.spaceId, + metrics: args.metrics, + }); + } + + this.eventLogClient.logStatusChange(args); + } + + private logExecutionMetrics(args: LogExecutionMetricsArgs): void { const { ruleId, spaceId, ruleType, ruleName, metrics } = args; this.eventLogClient.logExecutionMetrics({ @@ -98,20 +123,4 @@ export class EventLogAdapter implements IRuleExecutionLogClient { }, }); } - - public async logStatusChange(args: LogStatusChangeArgs) { - await this.savedObjectsAdapter.logStatusChange(args); - - if (args.metrics) { - await this.logExecutionMetrics({ - ruleId: args.ruleId, - ruleName: args.ruleName, - ruleType: args.ruleType, - spaceId: args.spaceId, - metrics: args.metrics, - }); - } - - this.eventLogClient.logStatusChange(args); - } } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/rule_execution_log_client.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/rule_execution_log_client.ts index bc77c6e44fa56c..f3321580aa0524 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/rule_execution_log_client.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/rule_execution_log_client.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SavedObjectsClientContract } from '../../../../../../../src/core/server'; +import { Logger, SavedObjectsClientContract } from 'src/core/server'; import { IEventLogClient, IEventLogService } from '../../../../../event_log/server'; import { IRuleStatusSOAttributes } from '../rules/types'; import { EventLogAdapter } from './event_log_adapter/event_log_adapter'; @@ -20,6 +20,7 @@ import { GetCurrentStatusArgs, GetCurrentStatusBulkArgs, GetCurrentStatusBulkResult, + ExtMeta, } from './types'; import { truncateMessage } from './utils/normalization'; @@ -28,13 +29,16 @@ interface ConstructorParams { savedObjectsClient: SavedObjectsClientContract; eventLogService: IEventLogService; eventLogClient?: IEventLogClient; + logger: Logger; } export class RuleExecutionLogClient implements IRuleExecutionLogClient { - private client: IRuleExecutionLogClient; + private readonly client: IRuleExecutionLogClient; + private readonly logger: Logger; constructor(params: ConstructorParams) { - const { underlyingClient, eventLogService, eventLogClient, savedObjectsClient } = params; + const { underlyingClient, eventLogService, eventLogClient, savedObjectsClient, logger } = + params; switch (underlyingClient) { case UnderlyingLogClient.savedObjects: @@ -44,6 +48,10 @@ export class RuleExecutionLogClient implements IRuleExecutionLogClient { this.client = new EventLogAdapter(eventLogService, eventLogClient, savedObjectsClient); break; } + + // We write rule execution logs via a child console logger with the context + // "plugins.securitySolution.ruleExecution" + this.logger = logger.get('ruleExecution'); } /** @deprecated */ @@ -74,11 +82,34 @@ export class RuleExecutionLogClient implements IRuleExecutionLogClient { return this.client.deleteCurrentStatus(ruleId); } - public async logStatusChange(args: LogStatusChangeArgs) { - const message = args.message ? truncateMessage(args.message) : args.message; - return this.client.logStatusChange({ - ...args, - message, - }); + public async logStatusChange(args: LogStatusChangeArgs): Promise { + const { newStatus, message, ruleId, ruleName, ruleType, spaceId } = args; + + try { + const truncatedMessage = message ? truncateMessage(message) : message; + await this.client.logStatusChange({ + ...args, + message: truncatedMessage, + }); + } catch (e) { + const logMessage = 'Error logging rule execution status change'; + const logAttributes = `status: "${newStatus}", rule id: "${ruleId}", rule name: "${ruleName}"`; + const logReason = e instanceof Error ? `${e.stack}` : `${e}`; + const logMeta: ExtMeta = { + rule: { + id: ruleId, + name: ruleName, + type: ruleType, + execution: { + status: newStatus, + }, + }, + kibana: { + spaceId, + }, + }; + + this.logger.error(`${logMessage}; ${logAttributes}; ${logReason}`, logMeta); + } } } diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/types.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/types.ts index 06a0b90985af73..1fa256b0f088c4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/types.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_execution_log/types.ts @@ -6,7 +6,7 @@ */ import { Duration } from 'moment'; -import { SavedObjectsFindResult } from '../../../../../../../src/core/server'; +import { LogMeta, SavedObjectsFindResult } from 'src/core/server'; import { RuleExecutionStatus } from '../../../../common/detection_engine/schemas/common/schemas'; import { IRuleStatusSOAttributes } from '../rules/types'; @@ -103,3 +103,18 @@ export interface ExecutionMetrics { lastLookBackDate?: string; executionGap?: Duration; } + +/** + * Custom extended log metadata that rule execution logger can attach to every log record. + */ +export type ExtMeta = LogMeta & { + rule?: LogMeta['rule'] & { + type?: string; + execution?: { + status?: RuleExecutionStatus; + }; + }; + kibana?: { + spaceId?: string; + }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts index bc13a12e01ca4a..daab0540c23af5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts @@ -70,6 +70,7 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = underlyingClient: config.ruleExecutionLog.underlyingClient, savedObjectsClient, eventLogService, + logger, }); const completeRule = { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts index 85285eed2817ac..f49c6327483e3d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -149,6 +149,7 @@ export const signalRulesAlertType = ({ underlyingClient: config.ruleExecutionLog.underlyingClient, savedObjectsClient: services.savedObjectsClient, eventLogService, + logger, }); const completeRule: CompleteRule = { diff --git a/x-pack/plugins/security_solution/server/plugin.ts b/x-pack/plugins/security_solution/server/plugin.ts index 5e7bf0659947c1..dfff89a90c7324 100644 --- a/x-pack/plugins/security_solution/server/plugin.ts +++ b/x-pack/plugins/security_solution/server/plugin.ts @@ -140,7 +140,7 @@ export class Plugin implements ISecuritySolutionPlugin { const eventLogService = plugins.eventLog; registerEventLogProvider(eventLogService); - const requestContextFactory = new RequestContextFactory({ config, core, plugins }); + const requestContextFactory = new RequestContextFactory({ config, logger, core, plugins }); const router = core.http.createRouter(); core.http.registerRouteHandlerContext( APP_ID, diff --git a/x-pack/plugins/security_solution/server/request_context_factory.ts b/x-pack/plugins/security_solution/server/request_context_factory.ts index b7586ee9596526..f6c1d6b44eca62 100644 --- a/x-pack/plugins/security_solution/server/request_context_factory.ts +++ b/x-pack/plugins/security_solution/server/request_context_factory.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { KibanaRequest, RequestHandlerContext } from 'kibana/server'; +import { Logger, KibanaRequest, RequestHandlerContext } from 'kibana/server'; import { ExceptionListClient } from '../../lists/server'; import { DEFAULT_SPACE_ID } from '../common/constants'; @@ -28,6 +28,7 @@ export interface IRequestContextFactory { interface ConstructorOptions { config: ConfigType; + logger: Logger; core: SecuritySolutionPluginCoreSetupDependencies; plugins: SecuritySolutionPluginSetupDependencies; } @@ -44,7 +45,7 @@ export class RequestContextFactory implements IRequestContextFactory { request: KibanaRequest ): Promise { const { options, appClientFactory } = this; - const { config, core, plugins } = options; + const { config, logger, core, plugins } = options; const { lists, ruleRegistry, security } = plugins; const [, startPlugins] = await core.getStartServices(); @@ -73,6 +74,7 @@ export class RequestContextFactory implements IRequestContextFactory { savedObjectsClient: context.core.savedObjects.client, eventLogService: plugins.eventLog, eventLogClient: startPlugins.eventLog.getClient(request), + logger, }), getExceptionListClient: () => { From 9814a8191040e339f89babf2c19220be3e62b369 Mon Sep 17 00:00:00 2001 From: Marco Liberati Date: Thu, 2 Dec 2021 11:11:07 +0100 Subject: [PATCH 050/126] [Lens] Show generic error for invalid time shift string (#120077) * :bug: Show generic error for invalid string * :white_check_mark: add unit test --- .../dimension_panel/dimension_panel.test.tsx | 17 +++++++++++++++++ .../dimension_panel/time_shift.tsx | 5 +++++ 2 files changed, 22 insertions(+) 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 06c1bb931f730e..2ff2fd67435ab1 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 @@ -1485,6 +1485,23 @@ describe('IndexPatternDimensionEditorPanel', () => { }, }); }); + + it('should report a generic error for invalid shift string', () => { + const props = getProps({ + timeShift: '5 months', + }); + wrapper = mount(); + + expect(wrapper.find(TimeShift).find(EuiComboBox).prop('isInvalid')).toBeTruthy(); + + expect( + wrapper + .find(TimeShift) + .find('[data-test-subj="indexPattern-dimension-time-shift-row"]') + .first() + .prop('error') + ).toBe('Time shift value is not valid.'); + }); }); describe('filtering', () => { diff --git a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_shift.tsx b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_shift.tsx index 36cc4a3c22e440..7055d39f80aa1f 100644 --- a/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_shift.tsx +++ b/x-pack/plugins/lens/public/indexpattern_datasource/dimension_panel/time_shift.tsx @@ -129,6 +129,7 @@ export function TimeShift({ Date: Thu, 2 Dec 2021 10:49:55 +0000 Subject: [PATCH 051/126] [Uptime] Add throttling parameters to the Fleet UI (#118594) * [Uptime] add throttling parameters to the browser synthetic monitor form This commit adds three fields to the browser synthetic monitor creation form, these fields are: `download_speed`, `upload_speed`, and `latency`. Each of these fields is used to test how applications behave under particular network conditions. This commit closes #114155. * [Uptime] add functional tests for synthetic monitors throttling fields * [Uptime] add toggling for throttling fields * [Uptime] add normalizer for editing browser throttling fields --- .../step_select_agent_policy.tsx | 2 +- .../browser/advanced_fields.test.tsx | 44 ++-- .../fleet_package/browser/advanced_fields.tsx | 16 +- .../fleet_package/browser/formatters.ts | 20 ++ .../fleet_package/browser/normalizers.test.ts | 78 ++++++++ .../fleet_package/browser/normalizers.ts | 42 +++- .../browser/throttling_fields.test.tsx | 171 ++++++++++++++++ .../browser/throttling_fields.tsx | 188 ++++++++++++++++++ .../contexts/browser_context_advanced.tsx | 5 + .../fleet_package/custom_fields.test.tsx | 14 +- .../fleet_package/custom_fields.tsx | 2 +- .../hooks/use_update_policy.test.tsx | 25 +++ .../public/components/fleet_package/types.tsx | 27 +++ .../components/fleet_package/validation.tsx | 11 + .../monitor_management/formatters/browser.ts | 5 + .../apps/uptime/synthetics_integration.ts | 78 ++++++++ .../synthetics_integration_page.ts | 36 +++- 17 files changed, 737 insertions(+), 27 deletions(-) create mode 100644 x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts create mode 100644 x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx create mode 100644 x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx index 58af86b09ed032..c46ef8893fa40f 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx @@ -229,7 +229,7 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{

    diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx index fabf6da49cf479..f0900ae2595926 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.test.tsx @@ -6,18 +6,29 @@ */ import React from 'react'; -import { fireEvent } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { render } from '../../../lib/helper/rtl_helpers'; import { BrowserAdvancedFields } from './advanced_fields'; -import { ConfigKeys, IBrowserAdvancedFields, IBrowserSimpleFields } from '../types'; +import { + ConfigKeys, + DataStream, + IBrowserAdvancedFields, + IBrowserSimpleFields, + Validation, +} from '../types'; import { BrowserAdvancedFieldsContextProvider, BrowserSimpleFieldsContextProvider, defaultBrowserAdvancedFields as defaultConfig, defaultBrowserSimpleFields, } from '../contexts'; +import { validate as centralValidation } from '../validation'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +const defaultValidation = centralValidation[DataStream.BROWSER]; jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ + ...jest.requireActual('@elastic/eui/lib/services/accessibility/html_id_generator'), htmlIdGenerator: () => () => `id-${Math.random()}`, })); @@ -25,16 +36,20 @@ describe('', () => { const WrappedComponent = ({ defaultValues = defaultConfig, defaultSimpleFields = defaultBrowserSimpleFields, + validate = defaultValidation, }: { defaultValues?: IBrowserAdvancedFields; defaultSimpleFields?: IBrowserSimpleFields; + validate?: Validation; }) => { return ( - - - - - + + + + + + + ); }; @@ -43,18 +58,19 @@ describe('', () => { const syntheticsArgs = getByLabelText('Synthetics args'); const screenshots = getByLabelText('Screenshot options') as HTMLInputElement; + expect(screenshots.value).toEqual(defaultConfig[ConfigKeys.SCREENSHOTS]); expect(syntheticsArgs).toBeInTheDocument(); }); - it('handles changing fields', () => { - const { getByLabelText } = render(); - - const screenshots = getByLabelText('Screenshot options') as HTMLInputElement; - - fireEvent.change(screenshots, { target: { value: 'off' } }); + describe('handles changing fields', () => { + it('for screenshot options', () => { + const { getByLabelText } = render(); - expect(screenshots.value).toEqual('off'); + const screenshots = getByLabelText('Screenshot options') as HTMLInputElement; + userEvent.selectOptions(screenshots, ['off']); + expect(screenshots.value).toEqual('off'); + }); }); it('only displayed filter options when zip url is truthy', () => { diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx index cbbc9a33642b5e..0133642b8c4b37 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/advanced_fields.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { memo, useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiAccordion, @@ -20,11 +20,16 @@ import { ComboBox } from '../combo_box'; import { useBrowserAdvancedFieldsContext, useBrowserSimpleFieldsContext } from '../contexts'; -import { ConfigKeys, ScreenshotOption } from '../types'; +import { ConfigKeys, Validation, ScreenshotOption } from '../types'; import { OptionalLabel } from '../optional_label'; +import { ThrottlingFields } from './throttling_fields'; -export const BrowserAdvancedFields = () => { +interface Props { + validate: Validation; +} + +export const BrowserAdvancedFields = memo(({ validate }) => { const { fields, setFields } = useBrowserAdvancedFieldsContext(); const { fields: simpleFields } = useBrowserSimpleFieldsContext(); @@ -156,6 +161,7 @@ export const BrowserAdvancedFields = () => { } />
    + { /> + + ); -}; +}); const requestMethodOptions = Object.values(ScreenshotOption).map((option) => ({ value: option, diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts b/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts index e457453a38f195..5384122a186218 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/formatters.ts @@ -21,6 +21,21 @@ import { export type BrowserFormatMap = Record; +const throttlingFormatter: Formatter = (fields) => { + if (!fields[ConfigKeys.IS_THROTTLING_ENABLED]) return 'false'; + + const getThrottlingValue = (v: string | undefined, suffix: 'd' | 'u' | 'l') => + v !== '' && v !== undefined ? `${v}${suffix}` : null; + + return [ + getThrottlingValue(fields[ConfigKeys.DOWNLOAD_SPEED], 'd'), + getThrottlingValue(fields[ConfigKeys.UPLOAD_SPEED], 'u'), + getThrottlingValue(fields[ConfigKeys.LATENCY], 'l'), + ] + .filter((v) => v !== null) + .join('/'); +}; + export const browserFormatters: BrowserFormatMap = { [ConfigKeys.METADATA]: (fields) => objectToJsonFormatter(fields[ConfigKeys.METADATA]), [ConfigKeys.SOURCE_ZIP_URL]: null, @@ -31,6 +46,10 @@ export const browserFormatters: BrowserFormatMap = { [ConfigKeys.SOURCE_INLINE]: (fields) => stringToJsonFormatter(fields[ConfigKeys.SOURCE_INLINE]), [ConfigKeys.PARAMS]: null, [ConfigKeys.SCREENSHOTS]: null, + [ConfigKeys.IS_THROTTLING_ENABLED]: null, + [ConfigKeys.DOWNLOAD_SPEED]: null, + [ConfigKeys.UPLOAD_SPEED]: null, + [ConfigKeys.LATENCY]: null, [ConfigKeys.SYNTHETICS_ARGS]: (fields) => arrayToJsonFormatter(fields[ConfigKeys.SYNTHETICS_ARGS]), [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: (fields) => @@ -49,6 +68,7 @@ export const browserFormatters: BrowserFormatMap = { stringToJsonFormatter(fields[ConfigKeys.JOURNEY_FILTERS_MATCH]), [ConfigKeys.JOURNEY_FILTERS_TAGS]: (fields) => arrayToJsonFormatter(fields[ConfigKeys.JOURNEY_FILTERS_TAGS]), + [ConfigKeys.THROTTLING_CONFIG]: throttlingFormatter, [ConfigKeys.IGNORE_HTTPS_ERRORS]: null, ...commonFormatters, }; diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts new file mode 100644 index 00000000000000..49a08a12454e36 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright 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 { ConfigKeys } from '../types'; +import { getThrottlingParamNormalizer, isThrottlingEnabledNormalizer } from './normalizers'; +import { defaultBrowserAdvancedFields } from '../contexts'; + +describe('browser normalizers', () => { + const makeThrottlingConfig = (value: string) => ({ + [ConfigKeys.THROTTLING_CONFIG]: { value }, + }); + + describe('throttlingToParameterNormalizer', () => { + it('can extract download values', () => { + const fields = makeThrottlingConfig('10d/5u/2.5l'); + + expect(getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED)(fields)).toEqual('10'); + }); + + it('can extract upload values', () => { + const fields = makeThrottlingConfig('10d/5u/2.5l'); + + expect(getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED)(fields)).toEqual('5'); + }); + + it('can extract latency values', () => { + const fields = makeThrottlingConfig('10d/5u/2.5l'); + + expect(getThrottlingParamNormalizer(ConfigKeys.LATENCY)(fields)).toEqual('2.5'); + }); + + it('returns default values when throttling is disabled', () => { + const fields = makeThrottlingConfig('false'); + + expect(getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED)(fields)).toEqual( + defaultBrowserAdvancedFields[ConfigKeys.DOWNLOAD_SPEED] + ); + expect(getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED)(fields)).toEqual( + defaultBrowserAdvancedFields[ConfigKeys.UPLOAD_SPEED] + ); + expect(getThrottlingParamNormalizer(ConfigKeys.LATENCY)(fields)).toEqual( + defaultBrowserAdvancedFields[ConfigKeys.LATENCY] + ); + }); + + it("returns default values when the desired suffix doesn't exist", () => { + const noUploadFields = makeThrottlingConfig('10d/2.5l'); + expect(getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED)(noUploadFields)).toEqual( + defaultBrowserAdvancedFields[ConfigKeys.UPLOAD_SPEED] + ); + + const noDownloadFields = makeThrottlingConfig('10u/2.5l'); + expect(getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED)(noDownloadFields)).toEqual( + defaultBrowserAdvancedFields[ConfigKeys.DOWNLOAD_SPEED] + ); + + const noLatencyFields = makeThrottlingConfig('10d/5u'); + expect(getThrottlingParamNormalizer(ConfigKeys.LATENCY)(noLatencyFields)).toEqual( + defaultBrowserAdvancedFields[ConfigKeys.LATENCY] + ); + }); + }); + + describe('isThrottlingEnabledNormalizer', () => { + it('returns true for any value that is not "false"', () => { + expect(isThrottlingEnabledNormalizer(makeThrottlingConfig('10d/2l'))).toEqual(true); + expect(isThrottlingEnabledNormalizer(makeThrottlingConfig('test'))).toEqual(true); + }); + + it('returns false when throttling config is the string "false"', () => { + expect(isThrottlingEnabledNormalizer(makeThrottlingConfig('false'))).toEqual(false); + }); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts index 2c675b9f288042..6d8b35673fba36 100644 --- a/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/normalizers.ts @@ -5,7 +5,13 @@ * 2.0. */ -import { BrowserFields, ConfigKeys } from '../types'; +import { + BrowserFields, + ConfigKeys, + ThrottlingSuffix, + ThrottlingConfigKey, + configKeyToThrottlingSuffix, +} from '../types'; import { Normalizer, commonNormalizers, @@ -30,6 +36,35 @@ export const getBrowserJsonToJavascriptNormalizer = (key: ConfigKeys) => { return getJsonToJavascriptNormalizer(key, defaultBrowserFields); }; +export function throttlingToParameterNormalizer( + suffix: ThrottlingSuffix, + throttlingConfigValue?: string +): unknown { + if (!throttlingConfigValue || throttlingConfigValue === 'false') return null; + return ( + throttlingConfigValue + .split('/') + .filter((p) => p.endsWith(suffix))[0] + ?.slice(0, -1) ?? null + ); +} + +export const isThrottlingEnabledNormalizer: Normalizer = function isThrottlingEnabledNormalizer( + fields +) { + const throttlingEnabled = fields?.[ConfigKeys.THROTTLING_CONFIG]?.value; + + // If we have any value that's not an explicit "false" it means throttling is "on" + return throttlingEnabled !== 'false'; +}; + +export function getThrottlingParamNormalizer(key: ThrottlingConfigKey): Normalizer { + const paramSuffix = configKeyToThrottlingSuffix[key]; + return (fields) => + throttlingToParameterNormalizer(paramSuffix, fields?.[ConfigKeys.THROTTLING_CONFIG]?.value) ?? + defaultBrowserFields[key]; +} + export const browserNormalizers: BrowserNormalizerMap = { [ConfigKeys.METADATA]: getBrowserJsonToJavascriptNormalizer(ConfigKeys.METADATA), [ConfigKeys.SOURCE_ZIP_URL]: getBrowserNormalizer(ConfigKeys.SOURCE_ZIP_URL), @@ -41,6 +76,11 @@ export const browserNormalizers: BrowserNormalizerMap = { [ConfigKeys.PARAMS]: getBrowserNormalizer(ConfigKeys.PARAMS), [ConfigKeys.SCREENSHOTS]: getBrowserNormalizer(ConfigKeys.SCREENSHOTS), [ConfigKeys.SYNTHETICS_ARGS]: getBrowserJsonToJavascriptNormalizer(ConfigKeys.SYNTHETICS_ARGS), + [ConfigKeys.IS_THROTTLING_ENABLED]: isThrottlingEnabledNormalizer, + [ConfigKeys.DOWNLOAD_SPEED]: getThrottlingParamNormalizer(ConfigKeys.DOWNLOAD_SPEED), + [ConfigKeys.UPLOAD_SPEED]: getThrottlingParamNormalizer(ConfigKeys.UPLOAD_SPEED), + [ConfigKeys.LATENCY]: getThrottlingParamNormalizer(ConfigKeys.LATENCY), + [ConfigKeys.THROTTLING_CONFIG]: getBrowserNormalizer(ConfigKeys.THROTTLING_CONFIG), [ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES]: getBrowserJsonToJavascriptNormalizer( ConfigKeys.ZIP_URL_TLS_CERTIFICATE_AUTHORITIES ), diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx new file mode 100644 index 00000000000000..b27e848c98a139 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.test.tsx @@ -0,0 +1,171 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import userEvent from '@testing-library/user-event'; +import { render } from '../../../lib/helper/rtl_helpers'; +import { ThrottlingFields } from './throttling_fields'; +import { DataStream, IBrowserAdvancedFields, IBrowserSimpleFields, Validation } from '../types'; +import { + BrowserAdvancedFieldsContextProvider, + BrowserSimpleFieldsContextProvider, + defaultBrowserAdvancedFields as defaultConfig, + defaultBrowserSimpleFields, +} from '../contexts'; +import { validate as centralValidation } from '../validation'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +const defaultValidation = centralValidation[DataStream.BROWSER]; + +jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ + ...jest.requireActual('@elastic/eui/lib/services/accessibility/html_id_generator'), + htmlIdGenerator: () => () => `id-${Math.random()}`, +})); + +describe('', () => { + const WrappedComponent = ({ + defaultValues = defaultConfig, + defaultSimpleFields = defaultBrowserSimpleFields, + validate = defaultValidation, + }: { + defaultValues?: IBrowserAdvancedFields; + defaultSimpleFields?: IBrowserSimpleFields; + validate?: Validation; + }) => { + return ( + + + + + + + + ); + }; + + it('renders ThrottlingFields', () => { + const { getByLabelText, getByTestId } = render(); + + const enableSwitch = getByTestId('syntheticsBrowserIsThrottlingEnabled'); + const downloadSpeed = getByLabelText('Download Speed'); + const uploadSpeed = getByLabelText('Upload Speed'); + const latency = getByLabelText('Latency'); + + expect(enableSwitch).toBeChecked(); + expect(downloadSpeed).toBeInTheDocument(); + expect(uploadSpeed).toBeInTheDocument(); + expect(latency).toBeInTheDocument(); + }); + + describe('handles changing fields', () => { + it('for the enable switch', () => { + const { getByTestId } = render(); + + const enableSwitch = getByTestId('syntheticsBrowserIsThrottlingEnabled'); + userEvent.click(enableSwitch); + expect(enableSwitch).not.toBeChecked(); + }); + + it('for the download option', () => { + const { getByLabelText } = render(); + + const downloadSpeed = getByLabelText('Download Speed') as HTMLInputElement; + userEvent.clear(downloadSpeed); + userEvent.type(downloadSpeed, '1337'); + expect(downloadSpeed.value).toEqual('1337'); + }); + + it('for the upload option', () => { + const { getByLabelText } = render(); + + const uploadSpeed = getByLabelText('Upload Speed') as HTMLInputElement; + userEvent.clear(uploadSpeed); + userEvent.type(uploadSpeed, '1338'); + expect(uploadSpeed.value).toEqual('1338'); + }); + + it('for the latency option', () => { + const { getByLabelText } = render(); + const latency = getByLabelText('Latency') as HTMLInputElement; + userEvent.clear(latency); + userEvent.type(latency, '1339'); + expect(latency.value).toEqual('1339'); + }); + }); + + describe('validates changing fields', () => { + it('disallows negative/zero download speeds', () => { + const { getByLabelText, queryByText } = render(); + + const downloadSpeed = getByLabelText('Download Speed') as HTMLInputElement; + userEvent.clear(downloadSpeed); + userEvent.type(downloadSpeed, '-1337'); + expect(queryByText('Download speed must be greater than zero.')).toBeInTheDocument(); + + userEvent.clear(downloadSpeed); + userEvent.type(downloadSpeed, '0'); + expect(queryByText('Download speed must be greater than zero.')).toBeInTheDocument(); + + userEvent.clear(downloadSpeed); + userEvent.type(downloadSpeed, '1'); + expect(queryByText('Download speed must be greater than zero.')).not.toBeInTheDocument(); + }); + + it('disallows negative/zero upload speeds', () => { + const { getByLabelText, queryByText } = render(); + + const uploadSpeed = getByLabelText('Upload Speed') as HTMLInputElement; + userEvent.clear(uploadSpeed); + userEvent.type(uploadSpeed, '-1337'); + expect(queryByText('Upload speed must be greater than zero.')).toBeInTheDocument(); + + userEvent.clear(uploadSpeed); + userEvent.type(uploadSpeed, '0'); + expect(queryByText('Upload speed must be greater than zero.')).toBeInTheDocument(); + + userEvent.clear(uploadSpeed); + userEvent.type(uploadSpeed, '1'); + expect(queryByText('Upload speed must be greater than zero.')).not.toBeInTheDocument(); + }); + + it('disallows negative latency values', () => { + const { getByLabelText, queryByText } = render(); + + const latency = getByLabelText('Latency') as HTMLInputElement; + userEvent.clear(latency); + userEvent.type(latency, '-1337'); + expect(queryByText('Latency must not be negative.')).toBeInTheDocument(); + + userEvent.clear(latency); + userEvent.type(latency, '0'); + expect(queryByText('Latency must not be negative.')).not.toBeInTheDocument(); + + userEvent.clear(latency); + userEvent.type(latency, '1'); + expect(queryByText('Latency must not be negative.')).not.toBeInTheDocument(); + }); + }); + + it('only displays download, upload, and latency fields with throttling is on', () => { + const { getByLabelText, getByTestId } = render(); + + const enableSwitch = getByTestId('syntheticsBrowserIsThrottlingEnabled'); + const downloadSpeed = getByLabelText('Download Speed'); + const uploadSpeed = getByLabelText('Upload Speed'); + const latency = getByLabelText('Latency'); + + expect(downloadSpeed).toBeInTheDocument(); + expect(uploadSpeed).toBeInTheDocument(); + expect(latency).toBeInTheDocument(); + + userEvent.click(enableSwitch); + + expect(downloadSpeed).not.toBeInTheDocument(); + expect(uploadSpeed).not.toBeInTheDocument(); + expect(latency).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx new file mode 100644 index 00000000000000..19bfd961f64616 --- /dev/null +++ b/x-pack/plugins/uptime/public/components/fleet_package/browser/throttling_fields.tsx @@ -0,0 +1,188 @@ +/* + * Copyright 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, { memo, useCallback } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiDescribedFormGroup, + EuiSwitch, + EuiSpacer, + EuiFormRow, + EuiFieldNumber, + EuiText, +} from '@elastic/eui'; + +import { OptionalLabel } from '../optional_label'; +import { useBrowserAdvancedFieldsContext } from '../contexts'; +import { Validation, ConfigKeys } from '../types'; + +interface Props { + validate: Validation; +} + +type ThrottlingConfigs = + | ConfigKeys.IS_THROTTLING_ENABLED + | ConfigKeys.DOWNLOAD_SPEED + | ConfigKeys.UPLOAD_SPEED + | ConfigKeys.LATENCY; + +export const ThrottlingFields = memo(({ validate }) => { + const { fields, setFields } = useBrowserAdvancedFieldsContext(); + + const handleInputChange = useCallback( + ({ value, configKey }: { value: unknown; configKey: ThrottlingConfigs }) => { + setFields((prevFields) => ({ ...prevFields, [configKey]: value })); + }, + [setFields] + ); + + const throttlingInputs = fields[ConfigKeys.IS_THROTTLING_ENABLED] ? ( + <> + + + } + labelAppend={} + isInvalid={!!validate[ConfigKeys.DOWNLOAD_SPEED]?.(fields)} + error={ + + } + > + { + handleInputChange({ + value: event.target.value, + configKey: ConfigKeys.DOWNLOAD_SPEED, + }); + }} + data-test-subj="syntheticsBrowserDownloadSpeed" + append={ + + Mbps + + } + /> + + + } + labelAppend={} + isInvalid={!!validate[ConfigKeys.UPLOAD_SPEED]?.(fields)} + error={ + + } + > + + handleInputChange({ + value: event.target.value, + configKey: ConfigKeys.UPLOAD_SPEED, + }) + } + data-test-subj="syntheticsBrowserUploadSpeed" + append={ + + Mbps + + } + /> + + + } + labelAppend={} + isInvalid={!!validate[ConfigKeys.LATENCY]?.(fields)} + data-test-subj="syntheticsBrowserLatency" + error={ + + } + > + + handleInputChange({ + value: event.target.value, + configKey: ConfigKeys.LATENCY, + }) + } + append={ + + ms + + } + /> + + + ) : null; + + return ( + + +

    9H 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%0DCC#0``S>x7Z7j(QYxEi>BZg z3?2#GF2%85uo%<@v-(^lLS*6JD>8NAuR|pr=%Ws6y_UzXqaSkEnfK?bErMz5^{X(P3h*;7d3Dnh_(#TaJC=SjcBOLP=m}HtI;7Dhtq6(r`X08E~wEX0GZ+c z;9~QdA`cq30u|T+gW9m0I;|Ch(EM5?-dQl!diZ^2#`7vK(P^D#$Z!O58}E$@O)A*E z9z3cI$KEQpkdba-TLt{qtMSNP9cIylt+!cG#5JmuAA}1_te%Yhc5{9xOP9$0OS%4H zjtO(VIlomDg`dEM$gSkm^b4v4+p_@__}c)gZHRgu`7y1Lk7tS={V+}_?hF3FE&Vw+ z*?0lhnmX`mq2VKn6rsm4#9YRE>oGxVp~|X8eBI2v389)A+p5P&s3iiQ?#2(1>erM? zRN(agIb{y4}aUK;X8VMo5vm3_>XgrQ04?te49lv_sO+YH3M%E* zinp%FsL%pA2)5gIwmQIlDx5mEvSWrXq96yfCqGlM(dn z_4=c?MHB(@>-oL|B@f57y?t@pJHBN*c2RRIB^U_@XJ93uQxR(ro5@IA4|!n^SI7n5 zyUi+D_FWXlC)<{Hp+Rgyv2GEtv@GLC#Kj+x(`u<_OPRYdZ;!(I8lLyyFOk(oFCCR}rm=8lKU^F~;& z#=fY!a(L9FiB-wID-@q|L^gH3h6^ND5T7v*Z@4sJzZxZebG0)QyGXH*LHt zE3-nulX+?d6jMA(%ddiwbchMjaidj6#&+ptdo7*d^-V2cqejm$e$-WGwAt;VQRWSk zM`Sg1*=fS03}@PRJTv9q!y!C>`zx^oLEN6+LCS3p7rfinJD8gRu&=KXLTAkq-55pQP z^%|J}j)(`;)BiZxFm!YiXWwJF%wfCFONel$HPs<3?(6qZ^=rV8K+lyHLnuqLl4(?P zLnrRG+WrO zriD5R#-KVxZ98+{PIdnn?5rlGZUp~8vwAIWdn)v>(o7{%Ih2$2*mxgzcQDgp;z+J< zw|P)6jT&WF5QvszbayaU=Wuh-W;Jdp2-@sIe~dd{wUhqcabP=7w=%JDdBDFT_f5_< z`6nh33MOp)sM%g)8s-Z{ES8|uq&kZ{K2M$`+XJ?HwY?Q{MGBJzhk+gOZ~}BZx4xgM zohVUlU&AmjPri z8{`CVn^GHJ%@(?BaGWt>W}T>)uQpDW&Plw4L5!QwfYMT=>I#9r1zVj-@2)Q7n~Z`e z`7Q$wB@=vf`ja%BCosDE!q8(ix@F0my0q5yNET)k2?m3b+&@XD^7SImT1i;wq~A(JZt#g^bFL_D@Ag#=d)T$1!+`+8bb-N+VjL$^fi-m`njByxyRh7J}|H)Aju`1!dyRU961fL1YB&1S{Ot2Uw}(Z$`3 z!jQ*UaIPn#S%#r>_in8(2Hr)}OiAl_GBZrCjxs#nDvMS0Sc{snvRgn!1q|PykiKNm>igj`w~TOXjok(Q(P#Go!l7kL(MvT+vJe;m#m5`R!`3AJb`BC)taAZ z#?FRjBJx3BH_-|OMDRuo!)L;O5Yq(v@UKJ*6MKnu_%=!lzZN-v?S$A@auM@MkI@J# zcFSe0+*NI(pYY+r+RRq&8&3!pl}wd!>w$#O`i+nBwC3EJ2^FD*S?i~7Qx~%)MAsA5 z$A+E+avttn!y(#~dzSRHDVMCYDXpBQuSzuQ1apUznIxNfYX?B&>O&d{vx>vK& z3?%?Q=@s4(d*?E7mgz;JV`akU34LGZWMXEEn$kx5KCyvhsw|nRTNayRSdFGh`=eqJ zxe@D;jw`p+N^{ko1}Z$~-CrS>`zLo;+)k!6JYQT}-zjV6g5io3;GQiJhk36dwQ^zn zu2Ay`J~ueC#hrJJTBn$DIDvO2Ab&@xVj?{-1;$_StN5?Pnmr>{rzBK#pcXRhS-1IR z&VC7Qd_565lOiy+-|?_lsSBi{^!u112VJfwo zdJtq8FpZj zHZuieWZta^f#PKm-hF~!eJD=KzmZv)#ONNbIMrYL<*cuaI(K%sa9e|^T&LYlr&|&0 zj~GG9pjJ{a>-2;8msY;R4=hHi24MKjyg9*V!G+K@MjAPGIPmeNm5Dh)llh(y?$$~~ zF?6S>tWL$(1uNAQ^@wY36PkRZ!C2<+o}I;a&9-Z4%n!eVgcBL{A4W>ZTZh~mQXAi*3$bhC35cg&|7f-g?632E}>ojIG2B^W3tt>&KPn0aq&#e_`w%*cY_> zq0fg#3fTKhHdZ~i>fH=;4o|^)Hd(ZDt{$zG z9LFULt_AzY9oJTCFUr1VnLjKX$oO1q`+K&?R;$35O%vokv)=6sav=Aq#5k?P*;_59^O-bFVbnBH zG3ZP-I^yRE2?LMs=*B%Bl%23H`*-HS5Z>DW*2XND|k9&`;$V zQfz_}*Tp*LSnh;?!;ok=g-l+Wda>+YK-r33hJuvk;pl$rbiBU8qRmzL09TAXr3QV< z!Ag(b8=KAv%BAf&Pid6J`ExVYZMo&tWa?kRB7pq+0o>*C@nV4uj4!RMBj! zY#-&85;ZxkJt!$hY@gks_0jQ9M+fI-?0vgc4lh6f7%DT!Uyf2hF83fQP^*vBbQzlA zQ06lb&92=W$FX+ZRig{?Hba5%9tC+jZ@0e!NEI2&)R;xLZk7jIDt&bBLOD3p_8DAa z1|Unyk6Ag{*+PCu~W^*>HlKD+~R52!?6&EzeKt%!x1{#ve=oUL{7QGL}T2hMn z!%mk53h`Dc^rE-tB{TND`{Q+q=oN`657|bD0&Bl@Y`B#Ko=PNCk9d9d&CoWf{p}3Z1{s}lD*FdnR-be5ur*lVtvEP@+`kc z{Y+$6K+02(amhI(1e>GRsC1%t37r{JvCpj`HlD@Nl3b^f#kmK_Ml=m%n zNrU#szxWUQC9VkR&`5>ko0KLkR?lHEItz0CBz+9I@iKDxor^`Oe#XLym4Otg8lEF% zgNl3t>BKR?+U|kn@=p&BdivgGibcIIIf(4a#b&X}L~DWl-X<2q_=Bg?C^^Y5*=reT z#2_ka-J~16)HWLlGv24y(7lD2j!_pHu8MSise$0I&xEAS*&nXOU;`sPPF$c=jH16|K-?Yhy7kr zd*Uch@`8$THGNOtH*x)uB!w%z5(wjrTlOVST+1O5CEDEpfMTxHn{nw5Co12@K=Xcr zL0#w{`S@h-8?b6rN715@TOqGBz$JPdzsFkX(YDpK9iR9-+Bp<=J{$2H{jd-BY=`Yz zt#2SJ7>O?AsKAFU0`DiWLb)bUDvI1vuBO)GwfW)I+)$>Nuha3|#_Q}xC zxmn{1&s%)ch0=uHO~Sz3x=AG7O7SnK7E*(tMC)qGAK~ z=Sxrf$+&tD+&ZVfO`&5JV=?3!FW0s4`(^x zZoB;z_0bTTz`*;s9>h1oqyr{*B>{`)ZPF7A^2~{;$cCk2t5p~A9Co#$k&6)QGsCy0 zqa{U3wuV}OD^-+os2TUE1|h2uFOL`FAK>s zd?E#i_L7QXz3l<$6#1AfCwp_E8^e&y2nh;L_F;T&ut7yh(Ee%v7`4eY_~n2E#s;~+%eh~8^_m-?=r^Yl0!Kin_5fhQNE5MAEWbA9jV zY{_JW&%QD*>USeb?&i|r*YpnKvp;mxHeqpDEdYo}#hv4DnNu@Z2m)cQ#mRVIYxRJXbDzT(DK*h;hMFu_b9&9swpg-)O*ptlP#+CVDPg z5=-hKd@keYXG{avW32apAcw+=aFVf33NFoa#nvNB|9p>hVy2J<}g3V2CFlYn&M>d;%$Rbf2DQ6{d$`_p)# zDD&xK*A&!?fAUF==ZjNO}%7B(#^ww_udk(5br(5U!5U&N(JA@j2u zOioDjoT)ck$#So+>tnU@xfW?Ar1sp($huO^5+{r2vj3#gXi?+R_a&ns3h4BtoeH`# z596q(qm(dg3zbz=nEmxk)0@w65eyHbEE$twh_!<-F}}qVDi@l?9-S!XDW?WCF;7Ub zg^O6Oeh9^DDZTo!<;SMw;SV5t^ZKtdluPIiF3kyhE!y+>oK2k0znP`UmXO7*cg8Ly zrh*Svx(6e>^pffbMS3%P)beeK3B93 z53bd))u=ZJ%xV#>@%>)oFemhy)wpImJ_+VA+O71(fOBD)U-N=q&T;(tRNkK)Iy94= z>1T!&O0iV+{qb!6!`O8=4E&khmFs~$THQI$w%IbJX+8$ARLISjyUbX~6<)+mf3X0< z_F0zwKyTW+)=mqjgWl6r&TI*lUP2ce?z+=$shR4%a1C87-MNbuDAMm<*ExSo{$zll z+gP?IdLEky41g1^cic;tGwL6nq-)J}n;Pb_xAr!v$rP^cAI*|rD0VZ{ap=+xkPN%13qjcPj*@&ZzBel&EkEEJmI698Xk8dyrb1zb8qgH8@ zDFdsmCIadlOp5cKY;1qQv!rIH$0}3o+vGi6^e4eZJI{ZZv_MU;mtiqk6Q%jekTQlc zen(KdgaT7Mu~r(ZPe95*1MgMuY-elDp64EI61)8u$tOK3|$55cyF! z-HL@kXaL`mtF6S!GgK7zeToYHlY1y(7Vi z4DkDg%5E{^2HJ0zh0SpjAN_LN2e8pb=i=$c@wS1PMp-xm2H6ikJ!NsN>iDe--R?+KKa@*Mr}EM#1rEJ%OmhIVvKAXb zKkV}M)Ah3tY-pj1<0qn$g&+=+h`p-E?c_?np9-L0^1SnSTF!nw4If!-xDw=AfNjhyhO}h-{$r z+ibi+PwWvbHp|NsNov;X!ie|-vyy~yB!n&b0KXE@1*Ovr6_f(&>9yJm;e_gSo;^=% zaR;?Rf&@YV1BEiRP!AWh@F;7Okf|MODPEUZ^3G5Z=-Fm|!u!sP+#*8nk0Y0J zZpB|rK_T$e_UL+PG%eGpF{v=NNVT-H)EAVgnL-kr3A$G=APNsBiro1*yrX7De%Jd< zaE)=wY&1M-wCI@*d;iw5yL~oPit9YmbkvlzUccxo^UE(7=rZ=dy=CM#o(%}S8*>B& zw`a5Pm?B@ld7Rx^QKQ|}85uj-uGiQ!?SPLU(webYmZ93AE~d$zb%41=<$I$_JJV>T z#k0;xN!x`&wy;=RtzbxP3hxp85JT;NPW8pxZrka|wgQ2H5hJb)AeC9SETs;9hLb5C z$JbFB6CRS}It<9+cC))l38Z@MPcNot-?t9z1NW{=C%lTPOy-GoQGstBt+SoyIZtP;27luUNLy0ZE%=4inngxoVur`ztGyb(1gDi7 zH{Wze9SW)p&w8z8MA{n*5yv&#+P+|rW|Mr&Y)(m~wNYyMjS@GGqoHsdyCw*PYLbU6 z)jn_tg!Xs4T=`$SyoT3<9`pV4x3hvKBU~7JIs$W4V5#?uhR6A=k$t z()A~}Tc7BqqFB7!L_&Rd%Pkqqo8XrCL59;aJHSBloTG^0_H0Q?zGi)^4k=p_=O7$k z0+wXL@n{g&g(yXMx0j}1kVb`3IEIO359jt5gj_T46LB3mUrs-c{>Q@V@`9cYsM~X) z#Ut`M_e)Ei5BVv*?M3Yqg(`W0g!|MBRf~b8e0|I~C&A6^=B#egi35QxY;Nx!6 zsXdU$vQ__K$(0=6!`F=#xj=Z@^B0Q!&gTA!zR|`glSe= z?@jfP-@*c*;eB({jX1B|S{VLHus6~c7{mF}ueqUAcOoR1YtM1yBa+eTv$vs~R|pDu z^2vGa4fs7I6@^+J=TQOZH2DVXM9;bY@R+J_-`o|{fZy?7(EbT*M0WqEqWz~S`yNp? z%^YbC<3f%!iMFSXHIBu*qh*2w&F(BwOj#60`I%B%Aq3?uA`ymziOxv+k)Vv+MKy%^ z6DIwK`{>ta!w+wo?6)wIYV=<2<1boXW@2g$nph(IRwQ!b>v~jY3j@3DQDWI>=+Z%j zw34qxEr~MpV_F}2Dm+Ic8TPJ}K!FtcITaN)%ZywPN9L9rk8dl-eHD3S^=!jROXQ>S zp(8H&{!cAK9(GZ_Bp-(VzabrLc3rbo z^J||_;ChQNA&Bdv=GLxD&aYN&N*x)HWS;*)mVD~v9}*+g!X!!+&X|MdlRS-=^dSqS z%{Lc;@>#ZA4kqZ^I+l6A=r2z!kGDPzsAijV5r(O2@19gsGe72_sc|2n%8AM_@W6(b zRZY-`FJk$Jps%_X>gzfOLmaVs>9RocB&HGu&D zp+CtNBr!PjLU@n`n}8JCoOHL%>$FR3>O50>o6k@o3U8B=p*j1&Yej*^YO4gTJ#_Q7 z4C8$pm$??vBTnL7E4dFT=h|(P(T)?|N4@fT{#CYjW%CeoeG7|bH8|=Ei(|`%{1!i7 zxg64^cr`RRpU5Xh5ep5ZaGG?(B+?8DnMA0gyiLni@X%%EVrV$!K z5((7$#c{Y(fzL1j;3Z`w@t;6_{j-ZsHnlq*ao4)qp2lDCf&fEa8jWIkk1X!hr^B?vPwm=3rj z6eW_=Oa*K)sFV)^wf?fb#Nv?I@*gkqe6D)3z_ZKit#(v=?VI_lYlm8u5!k&*vZc(P z6Nu|c4=#~6;lNAQuKNIO&9d4APmOgA1Fenq88y%<^Y0V#koB%D($8OlGM-_>VxyW) z6cO2P4gYX32g5{$_sD0SI=-9YyA0YuvzR~t!eI_m!f}nl@#Mn2Rqu+n=u9mN>EZmq z@nBv}|C$GXv+gh+c%CD1ypN>GX9$0M$F~gfjq%L~zjKY2@XmdFmVm_37Wgu=);4RM zK1=rtfyz|9<7qt?hdb-e=9rm$rm99GT8Dhv^~IKzi!bxq@fvKhV}(+&j1~m}XgJ^! zP&nNj7r(82t;60_NsGTA`K8d)5RoNZ4t_uCxvdesRy~nlg5`C032JYYp|NgWwOB?9J^UKpbVV1Kozjls!FUBR^@XW~FdtDANFT>4j%Kat zo1OW_P)S5b1Tdr#Fh9g*FlaG3UG28SEv6YG&U=&EaTfJ!Blk>Z95nnj+At_o1t^Ed z2dVLT7o73CnPFO7x;Oq?hFH zfqzVDI8lJpvnhE)g#u+s6k%c4%zPx0%B6V7@xpJ3 zh&d#Z+10|wsWs~e+nf6xK1BD#26j;>QD$(~+J3P6zEoljw~!a?d$gHBx#F`hY(Tzs zff~4OQYW?C-X4t2OBY44>Cnfs*Yr7~Os1{PcYR|V2gzU_TE&0RXu4u*l&SslI;{d- zu~Bu_eGu`THaUcCz7DE=@V`w&>*67eLEGa`R{zL5KTQQ1pwcb1)U!+*TVlHM`QB_tS#j+#Jf*1eYBk0R)G&l@$? z^>NOzd;ytL)uL;}V(Ze%n(2}DOTH>Hohib8!)d2XaNQrS>_Vlb>2C2z+?f`fdqq97 zv3>d%_FFNR$_&eHz?U;((py1;J5a64T&U62VU@7B^+H_9UyZpqYkR6ZSL{Mn*_eiA zvmEzFk)vAAex-=O%2pv?bU*QXw;N>5fg;t$BIUy->hcn?vBlQ;(J8btk30%Q{9i{N zYqdH>aS6*3W@yA@Uq^J;B(u{5kv7b;iat&t#xydd(Cfc19#Qx%dQ^f6;bwLCH2Isv zs)kIf>gh9FoV628z`wb%l#8xSYU1vtC*RI8FWA&4KxzwcRWD~SVV27h2a44WdgqPs zbD$c-jZ#PfsX<~BiT!8ZN6K0ZG!FhXk4e_8bRl-v)0w&u)=ViAimrnZDarHYMFhG2 z6<7P^^~dyYxjVKglWfwk?+SfeK5q%f!#7Pok#|+=HxW$m0RE0G%7f>H@Nqqk=Yb68{tH^iT^ln|e4LyW zx$J(~)^;j;=JLecSQ)Iz!qm|UE{!2B&O2MTw0Y()H=1FBy&KJ`T4^ez z@o;~XoHU`nnJsV7om>6c9`gqwN`FrVi*- zr?#bDn39Xt(m6PqMA6xiP{NF$a`znN$IzTieFJ{qOs2CHmFbr`+G`J4_VkA$M)D`j z-(ym{b@OfzTaSE+ie!@$axT0PPhw6m><=g}`MJN3?^4Iq!57Dps@=9kuMu|uQLQ$N zdoJ>W+)TwEQC+IU27S$*-*UwT_KiR9(Q==SL3i8w+9NAi^-^=MiBrnco>|h)2{e+R zG|?7=c=k_?QkI-s@(F(rFI$&Y;v;7?g!0lQVllp^*V%K92RGNgIqn^neCO z?yH<&B3PC9+Cm$U_>d8|C!qI7$E#Ls=5#eA#!+D|noRuT1>nzhJQ`7^UU7|hhg(b= zDxI}&VGKpMZns}_XOJ;e`gFg-Ukfh(P-v-2vF30d_p(4xs(-*T#LQ3PAi%A2OC*7% z=tTANikn-kSv(L8s7_=mXK6bgkjb^bu#D{-E47tkclzU(t+PLo!a_3NP&})h-+MEj z<|OxZEKi;f~n_*;LEct+0204qV+>4CSSel&eWe+;?T!&bRb5v$%&}K zJr?DSf^g(fT{JLd5vF@(Hfox);-pD1+h7ufc^*pT0-{9Le9#Zu0;`ndPtu9LxR^f& z2Ds}5fK^>~r5TIU@x18KY=bk$@dl>RwM}hUGhoilmXTwf>9jJ(2Q8?UscASC!3UQFgQH-J~3it(rX!6|=|af+0Sq*#3?(=TN#*GD##@oFi2^ax&8N!2b=_&E z=Q2d}69@X+>T4%|I8O?=eSP_+4(S9k@)};;r3_JB(HGbidZUr+o(&xl8QKT~B z2*0p4hBJF?I<}Q`G3(f!O7+txuXh_pq*p>X5-`58Mq?5%=sU4fe@>Bpsk5I0h5&fT z?xdrYNh79ZL$Vx7-=^Gpn~qr)L^v&0NTh{O}(rXq4&QeMjn`_1VWSkDd&y*_k zBh8){EJ-LeP(4XVbV6!uL6IwTuvryz@blMn`8SrGg?ZH3wz?>g+QvE86PY#YM*EQ~*J73Q*ARSW;`yuQ z+w|)eRiAkN#I9Wq#>va&@p4JWajEZjJr=-oLUf;pZwaExR49;d-HL0QY(AOJKLXy5 zPcV~HOvT>04UAgNgn%Y<(yyon=jG}{-?vE-dyiM%c>R($S8&kmAd{^LQ|5O6QsibIC7H;+Q`z5&S5ArjWGJFXz3%AYSl*04kDj@Y z%lWW!O7PlhyrG+a@@#VLc*le|aseqb|G)8uqKWcZa!ebnLt3g7n+ERu{?;$SnJW}Z zTWON;j7elX-`%A03mSy_?6aj#Gn7Lwg^J`nPo~z$Rg!o7%)tS6oX6Q2$g}52Y%rQP zB48Ev+tgW4Ikn{>X=X{Hqk{RkYO_gsGD~8U%NPe2c01ertY6#24f04{I-qMN*9SzA zW-lzLKVG9z{=;+ud?hkVeIrPuTooDt<+3}GEka5C8&b8tUU?Fgnxk~_{D*NhwnAW; zK3Xf6_~S7Hx9?oIAgsHT>dZ5{xhxAM8j9~Uh%L{Hxw9oMV2_a6Wg8cvl%GYyHgl&y*ryb zx?H@?cS^NWWiQfa?P@W4zY{k=f_3#Uy9yd=Ds|@Qv8u=oUym1W8Ayy2?S47l8su4I zo)^_$ezTUuetcAxtfQ2yVPv_`Bt|?%Hp%Mch*)VlH#HvAs6s-M)1SmJ*0E_oibTAc zmh)yP0`tQoWLz=~CYA(=nJ+2s%p6p)+@Eo!wj>x!`po?+X4)*fbX_;}>3XU@`iXb) zW!9d}RM{hK&Nrqv8#erwP?B~~RBfbx{NcwqOeE?+S7vP`IZG7$c->A>p=HSSfi=!8 z^;Ed!g`L#7zD|qaCGuPYhNL_Fod2uA=4xr<@k7z7oBrq93%gOcy@H1rZyE~rAE}}* zv(Me18qHGyBW4dp^TeF1>Zp%Je?CM(Ah-iuba?*@xWtMokevVYx68O_aBEY2%{)6l zR@dEXq?iaA#-BCa$0izavj<|a#71_N-B!))V~Ysj$fD%2?2!qL4lawEC%+x<*3Zbl zXkG&$7m3C9gQ71h0fn{elguT+F}{wLL!_gNGM+5)s@i2zz^!Mfr!mMU9hXoZZ^#sj z86>34=i{Dq{$U^A&FC56L2*7jjoD<#M{ebyQey2d9zrt|fka{lMPd1Vh#~{6fpeop zeG$wG_YJNp3I~6lb z8-BICU+XQ~eN#0txfZ(NKVwBi#Xs5V-kj;P>=jqsB`-L5?lhuD)(v2T6-&2UxJtBU zBmjmd~H9QfFM8zx|6`oK?<4Q6G$;l zCz=Ac$!SL2to3O!MWe{qi^^>>ZN%RsY1RHHmFq27DDeT#d+X`)%Wa7cJE}63c^`Ip z?0g(y8)#WgM+H*mS`&M_6RN*7h~&!MO4JV>0S)1m`L*6ni=#0ZV#MXHV-|DX)-o8z zd!5lH-EW1LQ+q-t-Hf6nzN zs&ASsO~Etqy)gOn6qT=_szuzHt6vBj*Qq+2%(9p3CY{A$d$TQTeK3lpX^Gzvf+eY- zHy_p}&Nh<^;1BH;@#x&Oz|&@h#r85cYMrQD&xPbq6=#Wg<6FG}Wd=PHgK2GIjTeRV z`>SbS#E^7j9g~85r;#GU$u`q>GXmc{!s3!J7Tq&E7snpvc!+CLP!%fVa}uWdB%up4 zdi46^#wlT@75kg@^g~92O>y>j1<~=3^%T=hpFVpvC^y@q;sTd27Er4~9Ba)7m6ZX& zwb!G3C0?a`bp()H`;4&+#b1x+6L`S&nK%2g%9Yqes?=iJsaQl4JV+<-KJWo zVe@!$2DO+Yic&`4v_tEA9rBJ9!|r_x|HE;iR(+7B+rG2s*cbEx`i@AG^2$<}`j&>O z-n}4MB8ZvcI432=c>dmp&u^Yi^{H}=ZfP&<1!1d6t5eVWIAD{-8qWelptr3E4%a#~ z2s4hmsUz9_Px22IWb>Lc(=fF>ybf0T$wcC^Vt}lSWTNZTwY@-Dt-!gDQ>#hIVF)f&s^xgi6jl!I z&zep*&ZQ@_KF}gZ>e+`O@e>Nr*-BRPqD;yQM?C-X%we~l?eT2vrRnxpn}1kMuO9!E zZo%N8KmbC41v!09z=To)8sqeyqwd7&*|%~vs?F{Rq++X2hYJJ70%zD!X)xUr6}dk0Muxg!%KNQM8d5 zw2)Z5Z&An1ZcuOOGo+-j7$8*4&ohxt{KU=mm4bm&aB1bYH?ju!`m2t&m0J@l#988T z^zW5oQ#(h21|UXMY1h*bKZ2X&z4+;zqZR_hy1)BL5fUa>Hic5LY&@e$#%wZi-&_>M zq-?*EmWSY#<=SPEL=B}>oa`B;R7PtdTlD+62wUH-C%~KS^Oa4n?2DNNc>F69KornxXcC^=Rg*0YZC*sXbZ(74b58o0Vsv}f zk$&_E?=Yk8_Qr|VW@}vQ_snLVQL9;H1XXEvmlmuZ#CwsEn(S6L8zJWxkkt7uj+(b zVYcKxjBrWcj;`i7Xm#X0q)nL=f9B1f^|S*A!C*IGNvdC`$q|YN9tT1-Knr`PgOJk< z^np*2WuoUyH2>8A{Y3;ZD0tGO`nO2L`_Z3>FNFaG(C=dcE|6hn%2@>(tyt{8d4YKw z^GDP{tf`|G((el3`lf4=YcjxqI!~hx{M-D000SlL@eK2WEH}eZYA~G^?^ozL)|ady z_x~>wy2`OC5;oaYS^(RNv+L5WfYLd3oD(tf{?U;lklinlswwNWIwsHmwT| zBdmE;rFiWt_W|KM0*?Z6otx}{U+tcoFArd7j5vS6d-?C1dk($1c?fT4%SXVU(0PC* z0p7_2aLv(oD3TBBVX^KIzkk@v;I_dOm=-c$zMG(V=PzHuO^02f_-T}Q6N|^DaU>Jj z5}VFc5jFnNMedHohjYK2d&X}4i?%P0LksPO^{}Z?jm*6++l~$X9h_Hja}(d;Dov{I z&5fgKvra_Q+QvwBI-r3dV$R}D%zUL)?R8(PM}W#W`WfJJ|8)!RU7+yn(JrD3`Xhj% zJca8thP{8LGz@5V@Urtxjqnc_4Ei)+I?G*LI_hT#!U6TrvhRb4+KZF7e89r_S>9o; zYdw!XPkO%!h=$;Ybw@2OF2sSXzr* z`4`h0OcR)1_e+i^(6@BL09X3&w^RpxOLlwDT%tP>wgKnt`gp>^1&oU((`w@MpM9MN z7W*A39mEo-W?$L|%Gv%$=>h}p6-;fp@0~a%>nwx+OK1gubGGz+`g9(@&S@X1&S3|8 zBkM9ZJNesMa*yP|no~4A;wPg3bh7YMydhU%cxbzBqkMqI-_`RuSmBq*Q$DCwmi%-_3s0NuY(MRJC_=OD+w-V`CnU9k9dM|#2f*V+X$YwlaZ90RmA z|M>+xdXxvyPG@Iq*Q*L!u3YCry8YaHAg^q~0)r5J(4yxAoxeZ}aE_1~XV3U+E&~p8WSE#eu$^|Npe4QIO%O z-9N-}o&AE30=7uQ*{Y(9oF;g1I zb@4~9ZhydY7&x)>5d~moV)SAAlwulp2Yd(GhCx8^+yKb;2p|lLN^$MOgJHE1qEVFO z(Aq;Yx&c;m6&OvKoy2k4y;WtQD&2)DX!jcS?xcAycz@E^Tk5I* zXYcbYzXK=D^1NEm(|<)W$A@>I#)CUh13djlY=rIE#!wJosqzDI4;}?$bEqqEm>$8a z9`rwPhd4=lno2iEH%Xd$K|5&GH+59?$1R5gQw}t>!Cek0e(=ycK)BD-entig!8cu> zaF8Fn5Y429Vl#Zw)g_ViA8#LvP*dEx0zg9sibV+x6WvA zpzIEDJ5yGz(yeU3Wz(e{E09shhQ2~@7R%p%U9xM;?GK?JJb(q46rhF%tlh@8&VN36 z0E1_(bRT6={)w_RULVnh4!3>Z$~0c|*)#m3Thbz_#u^bJvGm7919^VjYMO)tnKhN{4n=>3v4t$%@7=|#$W zx9rmO^Ymi>yX@eh0SG2SQey21v-Xi>s zx7x4uz(4=4d7ene(8y6&N7=QMhxV*%_2#5N~AaHepPY<)xs)=T`7*= z4z@lY0X@Aj3l%tXlYUTb-(qz@JD{@k>YW)=ebd- zq?Ng5qhGCvJ$k&?e9Nm;q?rliZ6YyYq1o<1Wd^QahBIBeORu0E;J({>vcuR(_uJOz z!=}U&3HYreN3-QBWPrQsu~lckMRReGPh)Tamn$a+X8h>KzGML-bA7mKt$CvdK#63~ zliWA%Q=2#Iziv`xyWoD><(ktyl~jAH<+e|xQR@(FdFvdg>9X+P66EPGn7=FVAY zMD4>)T!fcuJC*p^EtIR?$)D@;=p7`93j#S+XLdQ$xh$P}7TcqBb6|FHG%~QR`9X@F zD=E3mu;)3ynI${7K==e>&HD;1r^u7*16uMtxelwlQBD#5{GSe3*rH{oLq~9RSykH_OHl& zF08W^&K!kqTK9z3@P6I#5m5Z+$)rC4$G9^2j6xPL)RY6W*G3Jb*KV)Yn$bBt5gW_R zeTdQHA0Do_`mo!Z^FKstFcjLdj>@y&NW(kd|8R2jV*jg4vdbwJY1A*^vX&v56!4m* zK(gd#IbalO@D)?jDVe!IO(-y?;G2kC*5wg}UVHY#RjMo0r{V>=c@4Zv z?Z^`vbTiHeT_o$@Z+6)Gp3;^&Xl}n#ZPKkIY>GGGj7Dt>7#^&C#2SteD-NhIIMCBs zMctP|ky02^XP*)DY19n2e2prjDmeP$&9P<_6J>xW$DwFz1l2^&8eofUPq1|!Je3Q*@1a0Q?o>Moe%hd zy-5sh*_LKM>y8taFM$D7Mhj&{QbdW@K@|FH|lS zT4P`U5lpnx%VOPUErlW7ev*(J=;(Z)enPKVJm}p)=b8O^wOWld%xen$dS6^OY4fm) z;4e?#2tIy}dtwryF><;+?=KtpOkf`pOIUAtZ3q-#$)V;w_ViO_A`xFkzj+jfC9Kbv zb6YGl^_1dx8WpHiDzDM)^?)waQ9EhB_HP!OpW1mU>3P&fk0cX0`5D@-D-vQT^`5_; zRO&5!XZYe?IwOK{SH+2!MWDTbgD&g`FwjH)<6E%2kKmrB{j2nR0RP(;TGrMjIz34ssEohs= zbK_hdGRQ`)g z<)1b!v*sOdhX5ntMzCA`y1IQBV7^Mh5W-4p^)e=4%?HY{;${%BtMEgN@73# zgKwaG7)7J>Wj>j;edtqu<AjL70 ztQbuG+{hjoN`_oEZX!jm*WURnhT+4#x$#SexY}j;TS*;~TN1gHjSVyJ)H!{nZ+!9! zlafZUK)T&;A6_C&_tvA)oaHiy4^UpSHb&Y5nd_nUH3}62Y|24yPXZ9Cl2z*+^cqvU zs6zv`h!HY@mPaXuH)-$DkZoJHJ)@oSui8KD*efQ#&%SakF!4Tn8h4l1=m^|p5v{Cq zgXs6U-QBWKhb9+F+5$xXStro*?Flq{RY8ODl%oT)ODscM+ z+J5)9TaS`ahYEvwO6@ZM&2~7YrO*kGgyf16Y2v#)TDQX+40nVyyUmElUXsbauR*`9 zw?nKm-lvy{HSoEa*Vqdv&EC%&0rFGas@~4=S3Lnu4M)F`><(8Yrpq0T=BkWtA-rFR1pl; zKs=3;Xn3D2-r}@Vsk8w`p=J+o-6lp;sbwZCHQ}<=B;W#Pw>PJi)+3sgLhcgZRyeok zk5*zd(WA>`hk;l>YmEd`S9hz9NzC543f|@SGMO_3T(|1)?@y0Ojk(VHk@i zcJ0&_u(#>y1|4-8b;UrN%13xlbRCOo&ACx`ir8g*G1mBzh@n7t56-V?*`gD_C=tMiF$G}*=Tp+zsmpC^f z%kot+1B>WnSKey<91fbA>cIJdSWDqKTv}5Qx?F8qoH;i0N&qmHGG+^4VKs0k4y2Y7 zQ$~^kqmmk!S2&`)3Y9QW#~DYmBq-7+MLFJ@AD028v?jel7iyc}{1qRUs01dBMwUYU z#KtLCj7qI8{z_L;;O7fk|73D{;gGc)yWHQhH?yU-p_rDG5qZHH5($jodgB;Iy5zEn znzAzgOqFNJcA=)K<>0V7!53=O^V$n`nmc&hWQl($s!4k9TQ``*Ln9}9 zJS1GoX7;E5U_*(AP zw#jaJukgU3euiB={8N$Gu|VTGB-HgJbik9Z(mRUO-h8S-6~zJYz@1>38VL*C3#Qkmc`fQ1ruP`>>AkHAIAqXI(1sJ!58Tr=Mh2M zS6ybuM#C9cj7IaY&L-Cud7RL;35xUI4vzC730aWeLYF~LhjHLo_fFlI`&q-Jpr#^y zM=%yI9o>fviNm>~_O{(#u_($s>LvT#!CYU5+a~QBN*!KEvjs%)yhtwFVYJBtsra;( zoK>zSJB8gMt1dFSW`S0pQ}Rp(MIGuSY9Q)yYvt@1?C^5H88}PYKZQF&cFwbT_noU? zESFx@4VSjLqq&BZ6y!LgAGohP0KKDJP+9@JSHwaxjr(7V5&;U!dZF;K|LZjW$n*XV zJY|1$2cELL(C*>uKCXJB5;|i#no(KxbhKLPx#@gC>Mmb3?zQ*K#@s=CS0J`G>J%YP zUQj_z5$StR^USd44vX{kN|;fJ#u$*oabc*aU@~nDj2a@uFaB1dY(iw6XR3=ynTm*( z)!8#$X*&2v$10D|nfYZujt-GVUT*;>)E$+Wr!1Z=~pDoeke^4laS&YeG5-@c|mpuX2-Bf?f5YqzXB(e2qRck%)e6Y6*?Zn@zPCh#&} z_}zCQUa)$Fe-A4tDy_Cqky0r)JlVkN!Rb@2$kywS?5z0f!LjAGTAxHPS61}uZ5oN1 zTME5%!EORpNw?%!e#hYYSN>i~c5@=2kl+Xocu7?-B9TVY!vGw+w*=u=g2a{Gjw^NR zp4LZM&E>^4DZ-4n7yyo`@!}`ecX{1QcB>zfxUN%6rfZ`t=Pn|ILSC6uM8sn|Dm%=T zLi%BIt+5dGGUK*8gGbtK*t}qkk2#5iF!6 z6eR_O5fURrKqV$!5(X_G(xXHaq*b~$VZi9_QG#@i(W!Lj7`bsjpn&&x?|t3xANtad zvgfn&obx{K6VG|RUmvY-+_l}|D!#%Xbz#W?6xhoqUT8Uj^Z7sLIcCGEyqF1GGw6xX zB#(iyBJHZ`riB5w4)|@oEL~k2V4&DOs2*lkK9U2}wEBVo^*_8+e4KH=Nb&I6pOXl; zvy2pWlMWHKwJg-i2Pxg2(Cg}%&mR`Q zD;rlGF6}LF5m=v|$-W*e>LT>ACRHf=ZS(CcdWL2E#vNvHHAt#X><3XaeDfE58O#SmjML zoy0pS13uk3=PY8=o?7{3%Y+{lJQ1ji?qJoW!ta=}e|@#`jhq+iS2wE45UuKR0D-iB zA&}OZZ4mM1cA7XHMK{CNvdlvjmy-PhzKSUyO0fO+UX>3BR?h@^;T!Lid|)5~I`LW~ zxg(y2_%NzRwnRU0^rRM8DSAsb86)aY&!Sak7?TEEIZjCpGX0#ZHaCj*9)z z0Oh#*lhw4NQ*tp4xMW*C@_bcPuefrvAwMSTQUCw zXuklH1ELVdKZNs|J22(a`vQfFj=JOYF9oQGxt5E$*6Vxw;{s#Gvb7qhMDe?~RZ}N# z4P_5hfgTnwzW(~7KQ!6T{x)?5ST9Q0U%Il_S7g^;N zyw%KkWEBZE`=)N2Sk*ThFvLC<<4g4EsflbflY945;|EZc%a-)(mn|1&w{~-7uPcLF zfsSx^bVuKT+XMy*5WU==@W<~Oo&kzIsU{BG$#=MKG{pVy!Tjy zCfgqIm6RcMOl#grW$xYF z1WqW27Pk~M`>RS_poj+sWH!HsXB7*w0R+q#<4GbGxVtY|S$MV+h<3$9Pck7a21|i#U9qVtObso4ha0B*x@o#@? zr+0)eeKW7yugo__puR6wutrTkmIW>k63sK)(52ex{&G?U;A>QN-_-A^ezc(ij(vqZ zGv+sLQ~)kPyg{R0644;KpDRmjR5fjKV0Z7j1I-P*$>uE{;5K*-Pk8~~v|#Yc z4=0-umyMZ80n0uGmu-^Z9=pXxTWQ8;WrmXG=sFw5h+uD6qN?&M7FQ2oy0Z4L&b9X2 zuQp(KlO3E+jz4hOlG3_qh(YfiUgEj!oX6QY{r%Gfpf5$I1o>J=Av|h9!yCpVh`yt} zdHN@WDCn7!_g3yJndR<6;7F`v;be|?0?^tXJGLd@q>!ffj=RkxS-Do(eRpe@!QUA8 z&bNW{y!-c*Fq-2A@hjouRr&@Ihtt1X?H4-S`wPujs})wCK9rsXCf_)ZkU8g)@tIN@ znGa>a_h*%@j@jTR|-RWJfm_LKvdldpmumDSOs6TFkLXIlTv z<|56fTm@J#&~xwspm+>WPlLGFEB|=WqR+r%&JW%x|5(il;?Mizf*cNoz2D>2sFxJ4 zR>_ts1~O_vCSwd6Cjoc%q}r2o*>t=8H=?sd-iV5V-WN7dkcLdtlq{U?i`Uc^a@~!8 z(_>1D@h+Y2+G61PJ6CV5vE_B|V6k4JQO@hQ<_I3ef;VmLJ?a@sz|6DP<>HUp43?Ua z>Uu3>s>t=Ky!hGIXwaAS??5k(5=`A^dR9JFQ$a)U3Ue(a{OKBnLwzNX_KVBV>7Uz{ zJRja&Ty&G2ur}E$4^ZRV2CdN&yKQoUKm*D};_O$r`K_GUpSPjI>BVoZiUHGc9Dm9A zfE}h;Xs@W*KwzTm>5Wgt{lu7V^?sJVykDO9n-x44EpG4l_@4b_<255-V)2J)RuBo5 z$ottIS;HIPOMR>=zA!bOH%hmmIUNZKL$$gfprKAKczOVGeAoEQt+jjeSLRF{n@AC5N|K(f3j;|P5>DR+_j(EoN7w z9`)mSmTy~W=8Z1Rxvq36V906LngsLb%Ayrz;~!ObdDyZ6$lwc0FNz!+&Duf%R}5)2 z;dh(3@=PbRUMyHA7j#GdZC*4}d%hn4y8mTA?$=n(lQh7i$1=^x+0>Ak<>j}7kdUay z2D)7PHs@1O^1<7F0Jtthc>nmr%PD#5`C8lpD%q*cl?M`VvkjeiiQR?}{|L*g(~(46!dy@97_#}RJRe=PM5^+8*R#6eq# zAot}5z_6DT;BLCK?LMPiOuRQD2{;ts7{fh=$#a@Agd6syzy9$sVf36gd)Tv#=UiLk z%2x(Hc9hi7Ch)O8*IY>n2x4wiLNL(@M5}!&Xsn*vZ-<@bo107e32?de7mLHi-aLlQ z-v{_l1u?aJ7hJnhp9GlZD3GHc6jW{=)qOEXDgQ9-iSe(8z!o7xIj9{&1i0i1*WP&B zw6F!pP#&Plk@ZE(T}elJ(D;|ju&koQ5}zapLFiSW8#QM zr-M_^v58$israbIeeV7H&)X6oo__rJ@k`L}`9*wLo7TEoI(112bP&ADK4qht?ubX- zf^_e6rf`+*sT=MQmiDfEb1o$C>h;iXP0Qr&3@^Fga{M-&+4E#c*&mmO6lHaq?s1ck z)On69u?+HuQHafd?Gql^5_mD#=GqN0B7?S{@)3M{^5i*j{iyT$*q_tIEfspTq`==# z5M6#>>3X$tx)?qpoa=dlnBm01Q+CFz))Oem2XR!;uTnN56Y)(qLK|1Z@M>rwa2C(2 zt-y5;Ubpuc=P9r&QQr~pA(OD6Za5WftA>~kQP(l}(UHkvH@cg#1bu{)3=GV4QUA@` zp0+cx-J;h-7#JGm3@z!2{q-|YWQDcQOiw#fLEQu^;<8;bZ@r|rC?q(;H`AZ+*id)` zZxe}Dwsss^!Y7t>tYU051zUlWaxO!X73sa7rbYGMX3pQ`DvxIgqNWaJsUFoH#yX{E z`jpP+kQwN$^NpxbTFpuOa7w=HhYVd$Uiy7;X~UpK;ai|fGa{$X#m(8=g}Z%sbPLzG z4tHDR@3uy$izOp5k%=spI zhrM~9zgaH=&qla&45C%rLia?#xQm`NZkC*k)kAoe94(TW_<)D7HP;N3-{(Kinwq0q4rXHqshfpY_MCz94f_S?PB?-8Hhg-J_3p z3Z`6chm|4pT+8utb1Ke_Z|t;>a_$JkzqMN_bPdYMu_;vXU)U>MRrgsEx}Fs%%Y}c2 z%kmOqyHVH@bK->fi6@UFR8YICd)W9l-_RgDjBW!T*h04xUL^cR5zU#{Vxn0w!I?4R zU;}QLPA)wwvV5!0;D#KAyMcr~=m%u4Irkxz%kG3Qfd$pq(#o}{x820m2HPo}^4g(y z9^5btbl5Ds;kdss1G4%tLf7%dWfej4bX$Bq&x3~cn&^~7PQ-gjxZ=sV(v7M7#a#3s zZL~orF}Y{mqz2uUHZX*t44$={P5e+(659o=pOFZMQ@y%q5>F|6Mo|adW^qxwDD?BJ zz1x&(NK7N3!CUk2y_)$j*O|L7NXfQRGV5V0AV_+%jKECBM#;!)1kx`;4>zHwv&*?; zU$OHV;?^HTllc~6&(alLJ`q)M%V~9wpjUE_)b0IaA+6_&TU#3}t3~@Nm1RLh3Fd}o z>8e!<=LOmEpMq6LKyYbocPrzQ6+BsMZrc=xt$1n+i* z@wLEBVv&S#P>y=(sH)Vr4;^GV47*zbWhQnLb)tsCZwb0rveaUq7?x3#Z5s6Dx@Pc_ zrOXd4+EK*h0B>COJ1tOqc=f|efd*9?Fnq(8s}Z(QN^#v~WP;Pab4S?Oj14KiacXfd;YC2t$XiKV?TA}$StNlzggl@?y%gzrh6|bNhtPAb z*fE3?sO+0XcYg=IuE0l*uu`&CERZkhc>c_T^CPCvXhmGUo|{$nTGIArY1>ZpJRN*T zuClPnzp6Sd>|KZdrv111QQWm+#Qy zSN;tZF?!Af*_%I`xQ^3h(5KImt}8soQ$gp8iS z>2$Zvy1o(o5Xxtl-=%A6WI^f_=y_Vzv>>&Aj+g6Lp?V&SZoFuNVh}{r-)bDzcZ#zD zFI=I$>!e+c7t7qvuMKz=^%}c7S3wwBdqm zCIGxrkI)P+GYw3X@tT{Kk`a8)_9^VbBV9WEiu%p*I!oJU$vFbV2x9_2_LTnuiuP?`$HL4p?P&Is#bAv!vA%>Zb@>@^W@1WiR1j0=n z=Mm`i=5C8+-WrnV*OJqSn4{9z?mT=aVqQRZUAu-|MBN-)I@xcQyR=hYM}g-%6U;0! zEup7YT2$4s^ZAVmP_)t4+O5=geiVq)xEa8 z)yzJ7@TwELVU09%=yHPIwp1T|WS?Z+ouK84y*jU4%iIwlv;a`9VlV73fZ!3TbsGw&=zdpW*=mhAHBG=cDm2njX>q^MZUd@a#4!X znMu75O{oZU#rn)Ej;s~=^yQl0BXhvpTc^p72rAzZaV{eB2MG>ZhBvtboS;lKMTWe zcptbz4MxBRQi6Lntr6@;2$gjmz^t$jU#0)DwS6#)t`s^oKg{fI$Na-Fgt+59>O+_t z&?03t1#_~<|*MpZ~!`#xlHjzVg^y~FYSwoyln7+_vSexVGMF7cG1=xhCO$4gx zciopRWzOv`%7|q+T-r6$+o9=;S;9t0MY&S!j#~)TTWl1GULzaXEy=>nT!StDoIgchn#UuuV7P8h;UbfCd!g;Ys{FX2w?rZw@O$=;1 zettuDV|)HI*XJKAPoyEL<+CZNx%BvKIE!5D)1U^GQd?|HP$TCm!0J*8FpPXqLY1`} z|NL^~WYheXk2=8+2XH0F>Ypj^;9C*!uR6QwBjGM<0xm9E=|zM;9OTL1SNjh31>dUu zZPS+g<0$#WeA8*CM|KxR2H5-co*ScVZf|dF+Pl_O&v*5brI(fuHZ`v<*=1s;<}-)X z`ohY`xB4gschi|+pxM_@lAQzfxUSUEOcn8 zd}!}dr}0PPea)4u$CHf$%qWb={ zdpa2j>6sd06*aGrdLCIijXvzMGejA67MY1c+pJk#{_-t)hMVU~vg8LF5gsX1FCwq2 z@r)?-GGES8oySwBj`39=bUqDKxk!92PxyRm>Ye4$uw9>p=C#50Pj=^>YawC=lZ$z& zqX}UyEIU7$Gg>TM*P;g8Mh1sTz81oYW60b#SLemV-bvwD3sL3{Iy=pm?iGI^Xv?2m z13*hJR~bo~E4pI?H)Uy4<=|bb!PL{!PaQ{mBf&GbbHlihKn^4$i6-^5E@W zyb{>34K({o;H=nXOf(yzeR&%WMN9P|UAAfEDd;#m#=U#Wwr2y4=u5GZedGl+seV$0 z6+;U-7rC~Bb;+t`1Y8J?Q|ldO%%X~C0N**!dlJ7f9#@xu8$q1CAwo}jHiBsELdM*= zTWcaoizWtoY-SSHJ5h8zx~6iNZgwR`H)jVD*F@Z z4eSWN7(e2h;>321)5%-miYhXu#0D~L?>~|q>30^0xWpgkg=_x;w&69GY1?&Yw8IWY zz)xQT{L^2oU%RGZ^nOU@$@ifrZ*|GtDN3iqa;HRg9Ah099&CjQ;DaHw>X=a= zrZQX*&1d&xw}vYkNKz>`*x-g-+tHioQxW4Z(^Mmg4XFcRD;MJ~9lwVw;9q*$qUmn^ z$p!$Qpm4CP#8qSatI=Ukeo1k;YT~j3bz<;q6}z$rF%=q%aa(21$=vDByti1a;RlGa zW>b;oz^0!5A#LA;)sI)F0WuLHq$sz5TErV?n_yc1fZVo{9i76J)Yr|&|I6~6K6WrF zGt&FvVO;3GetBO4Mvo38aKoKZ`&W4#xPk>mD4AoIA6|0ZXn?sjeg@E;YpYoBrCsw??{bc;9In#Qfr zkLoYtxZ|1Lqpd3{+ziQ%mJL-3tZYk&d;W1Hnf5_qUSMU3(C1s zL-V@^d=TOD?iF}cMO#McYRZ>YsSQ--LMZghc&pu3w;0sP&RL|@!j90A1JKP}qf|MQ z18MX^|5E9_;`>Ld;-V{=sKL3fc9atD`T8xW&dvNT!8)WhYC6!OrUK3VU%$zG4Z*D6 zh(bF=Cztk*b}cCQf(~`_a<4NWZh<}FmmiNrsh@goA4&C{B{0A>_LwDn+Ue&UuMJ;x zbt>n+d3`ZjsI%1}e)k?G&PZcEPFT{ZB@M)XKpCy4oj{-6uU?UdhzBZS7@%_5VA zXm>UTtmZ2Se13_Y-?K|Ni}A*_Q6+BS~iIHd_3Z`y9vS zCPy?!lC@KGe&5*~3(oC)nzC1%*v5u^ZS$ca_Ff`l=Y!JqEMgueJNZB>iAfgmrGw<5zIp z&#P?oUE8;?j~|#G#zBXo&5)rX5A-3|4(T5ffbtlwev?qvKCqXXN6IyS1F&J#x(m-S^>{maAfSfr4~Zi?RlqOJi$#c) zUJG9e%1`&oavpp2Qw0XY4P-(SKViNOr4CC`40Fb>?WbJ-s#jLTA1H|0qS045+T`zC z?q&C()P4wrF^R1QOQyxr|5RfT6`;m7#16Jj?jJ55ecB24-~+zT^&e$vv^|SM%-7S| z?WLhcYz4}n8y>%!U9dPWlr-nZ?-%?xdmZmLlb$)-7pp_Yu~2z4=ImMYFUQYlYZ;FHj8fAvfd$42W zmpd0#HC+tM3IAt<9_hOxkj26+z24}ckt>IiyZm1K(}50f|2F|y`ojvSFjND^$vFt* z!m^_c@BbaOF8jf}3apU}zcl**tgyr0v{~49S2Au_|J8s$d&BzQmJX4Il;JuC#6;4{ ziIkTbZ%*@t|HenChVtks2xFO=u`D(wE3-IOVW^rPtPVG8=Y#^rv|nfKIhNY1^C|!_ zDtKbl8G^hIwV1cBtvqrOmC}E>$@Pnoj#cqeiX2%1Z@58CDZYt}PCh#OhB=z*A8=3p zBJyybSgOw+OR>`M56D?eTE175IC2K%#Dkyv3Z1o!Ww~|)E@qJB{C+ms@?tWv^%^&{ z|AdP?FP}$frbVDx^qAVdo?%5^%Cr@5MerUfK0}rSaU2?Bx5SHgG)6)B{b6TuK6V3T z7}B1^l2FmEucB{w?*|z}9jGA6eIA&eA>)#W6DY~w$LeY4zrVe$0sA?gCu+PF7l4gMG@@>qA1!2WqA5cE#@x zN8I1fdyfxHp6$P>m9;;t|H(|z`!t3!zsL#hfdH7fblb{wJqb(|foz5YsaBmPi=q!l z)cJDn1EM8pk5gPS$kBG^_j0A~ghi%xp^jknT<=2Hf-f~#RSX0NKzO7Ge&W>e&o$lM z7gAvKf7=LC1d=5=u)6xirSQ|g%zF}S1nzQO9#P_rLSuv)cBK{xp@^}Sq%6+>X)ETo zcQO!mdOsMqjxdyNAoW*ZD?lrj-2cH;6(Sxe9ZZOqL$IE-Wzg~MTYV!;*pF!wPY9~8 z`HN^CFd;VVtVhxl9S_f&AuWO10YI`ShU6c2Ja$kp3Eq!i{&`yQ#~JPH2)~*935H!JwFbniw$rx_#TH3#oX&c(K1s!=GyO2t;(g8bc@DC6-aAB`{9z97O z0$?>d_~8hOBg4|5I*6RE{+D|DtXz+-Cu(Ja z=ja6(vJk|C-$P3+fC4mt7N;E>?Y{H`#9;hj<+8~3EW}g*K|K7%(VK*a9Jnj~|LCqL z!F4~B2`ndksv&&VfJ{Np9x-D$ zKyZ2Up`#!G5(v}-iu~hvSkUwJ9e3`@Fo~-!#a*-vQ~QSviR)LN%RAF6&;FF*>6=+f zI=XIYmoJw%_P#T*m3@IdeM)9ohw-Ut7Wv()E7589U2-7l%b6n?0RI0VHz42&YThp+ z?i-^!{_c0%Dk-3lwIiV2c2nc~P&b&vA%g*Rd&a|qQeU0^R(i+RMy=`6g5l)bS{M~* zNkK9LO1BP1=M#gJNs(7o$J0e+D|@X5wA51(1l5{#91-)=a=cKwDD>Jngpp5>*)a-d z6Aw;18cVmG5`e;Zt|4b25n{HXt|I4zp|zVO*p!#c$%M4J{saSzr1>;{krJ%T_WY3P zo^Yo>)s8KeBi0{t;6u@DzW6?c{_R{_1Rv@xlpEgKY~c zK-A!&bCC}#0e<@HAAWj&-?V67m4qh)fUe;A4_?s!U}K;iiUQDzBAHTL~H?538yPfC(=nUR*fD z7V+=C2R2ChUu@8;a*`Tc^MG2onw{V1KD30jQ*ViLC~|Q%Sun6=Q?Nk20G{1b*fgCi zz|as3_42iV$Jh_c+f7|GWI9?;-|O6Sr-hk$k1$u3`BA}}KZk@NeP#n^fy5Q~=5^qz z1zNDRve64{UQZ5kQvTM8h|UHN^l4;CrOI7e=sRFUfVt(Wv5c1x-#_78;kkow z&VH`2`pqGC>4gwA@j!0~vrS~SV}F&9g!XH)f=QieRfKK3Nke*sj0gR!1*IXju{t7r z>JdUi(~fU4O?%h}Wb6V^(3jXW7uvx?S9`+U|MuH08PQ0c6*Rkf-KO#C&BzQAAiB0i z7^O(Ox;dO@bXyjqv7_ViDG??U8fXDf`<7(XQ# z9ZRdnqj@aUQ~M!lM%A=8VX%^(T=LLG>LbtJ!%Pci>4bPn4sfvcNtvihLl$s?1v(FW zB~dmv1VU5Q^P4IokTZOXb&Tc(ca)6=fhIceT8v1(U{Le-DVVjLU7fIQaNf_mhb9E% zoDwg8L9aEki{7BS^Ucv(pX@rVsZra{X~75g!9tw@G3c&j8Q&@o=>|#ZTg-jVPlURk zl4IoT_wMNq4d(}aGu;l7g8DqxuE|9h{RsNUcc6(=PTFbz;~rd9A80Gmtu9 zBmkYvv}|jEE4pcs4Ew=kWcnwRQBJi(qD#;);e_gc3|L%W@?7au+1~Y+i&ip_g-MeV zP-zvoCzfA9z;=65Ru%;HahC&9)pRp_3*1tZ3LN2{3!~MTM@;uQ7P<>d7=$+ltvgJQ zf$HSBH|N~vGEkyBp9}m7Ynt6*`aMDOP#?f)lvgI7{dlIjy79BBbe)jyP=;%JY+U6( z(VtgkiS6_~X^5h<+hVJwKX9wXADGS(CceQ9mBu?tY3$te>@li6fwF@LvFP@=KA%q< z@66lz7NGwN`!jS6h^k-CLMKY-lSMDtwvp5-5+~W)bkluMOj?Z7{i1tE~dZ01E1}l|{c#fzSjF5%Zh{frM`AI5!L=Q1? zemePf%*ALXUIUz;G{pRtrFJd7e~$JLKrg5CvDd{&55bNh%Y--sMcAH4&=>R2&_xz2 z3p+*{lSo6T#H`T|QqdrCn5dp*(-P*B9AvHLSw&ADg(W(cl|17(>w&wbQ3zy9E%q!u zsSc%a;-nsXwAZ6fxFJ?V<$akm;%laNEx!>6%0^h6l+zm^F+)r?@%kF_$Wie#(}36M z>_gO@b-eP-OtGD%`B6whK$WMgAucb#;Dl<7@bK@d`O>vk+3m5bM?tmtuRG^Ucffm; zyvX72g7?u$@*$oDzrWdG{ZP>Ui#_X=Ur&!F(1Szi@{;AEt*W=~pKimnJd}oX4K;PMDD2>B|@mlYshM4$?_yk0VovO|EMPbHg_KyCyBB2 z_{Ukg5O=3bQt(0J#0r-LYCj)}q!&!&O9>XkWvAvso=2s5Xgvd;8E&Et>R>3rVEU5+ zaC~i@)5%J8Qi3ye*!ErwEqG%0-o{2=$AR7nBIZZGPSF?f3Y%MY1$(cx^J{+-1eKTTFhLgBGKU@*Ear&> zMfNXX0-?`E$2Ejqiv&BDY!z&0f6UBT@D5RZGIn83P5fz=EHrX)hD?k($ zUjhQk`^W3(E1!D~o$->}oycTuY`gjyYL4Q1(|tOjw%l79Vl$n%n?iXUB8DsI4++_j zOGB_z*rkZ8$8Z=yEMf?TMA_nJ=HN5^$V{)q1$I3dYVi%{5c?Rakw#r=uuGT%moN&Q zTas$z;DQ=mfrdDltGB%Zc>oO{+E;_@dyj3Q^8A&e-POR?>dzfNMF@ilu=z<=N#u+S z_|3Sdyh*c)M`FKf*$iLp_4eXHh#IhL<>!e)~LTKjESgSin?Uo9)I%fYQci9jz* z#p}Yd7V}caV|RIi$n4HC*WR}K{PtXakkO#Z6TtDU$NI%U4V++fSfmb$)bHpIn_uCbL_X|T^R1DCWaVB|fu!7fIqBUIx?W8oz8)+jl&9e3 zbPO~x#0n3A1a0A3VO7$Re8gkkXHs-yP>Tox?<*vDo~~QS{E~`UI1jXOc}B+NlCmPs zJp{vT(gNy=(2<6un@6gH!uiW8@-jLCtQn0WEYB!t-{`7+swGJ4k4?e#*4DpVPT{(i zR8ghVV+6NVvm164Xb{~BvYc!AC*yfphM?9n-GtGLEbuE#8g*A?aC4`AvFh@tk zwrB?A(`;o&khhG~dHaLoAszicYQ-%3tC2mkF=Oi|b5)S!)v)AZ&^?EzCjGHN1)&fM zp6ZvzqPwHEaLtiS1Uo=&ZFN&y)(-g~*uW6VUu@(DEg~vX?mbT+nnl1`6G8tqMGlWf?GMIw9l?${T z=b**)y@@ljX~)Ezx7-YSbe)8R?}DZn$|cs`CVBbT#C#eOxqI25<0c!pLd{QSn}_dR zw?FI$QHu2Hs}z7N!^#(>F-=Yg%(&9F!)7$`k2AxvWW9fnqh*EkHzro z<2jZhg4Hz`&zsuxQF({RwNHYmdvX|!sHB=0#LT)j3J&TwS3pvIv}e_ z5>1GU1B`^6-4H^>+vRGy;J0GCBzfscVWL4*YQH%>lkBCL{x_^Yf2GIRsJDF`qCcC9 zteFgK_{$yP45I6eY4f+{`N+U(`3gf60NB!k|?DM{=FJDbxu{5dQJsAsm?qq)7{!Fgn zeGAjGkeW`8Nejc)>SaT@vJ~)83#fL~Lla{+o)`B*l8IiwJ&9Uo*sDYNTGHa2G{mgt z0xPpv8bJkt^hrcH!vw8sQ>Rc+x`~%O7Bp_Y+JhpfyTVR4{0=(*{**E2?!5gJA(B}# zJNputZq(`yRvc%7_)l~uE7yE+<_7814_-$g&v=t^l(QW)V;#sJ$SyuGp)DanAWtB~ z1h$Q8e;tBl? zeOFlkr8Ad5jGJ#OZ}N3Jwz^K2?_KB?n*gbFYljJ?AABnVR#2_vS22~*I5yVNNj2MF zE6d{<(6a0pU-(u_Fh7GZsyCyF>ej<6F9>m2uALt$9G96gASLOfI@O)E|GtPyym) zKzMRZ-}E6pzD`Lcxr-Hp(M>aG`tm{ve|jwb>NiBQx}1)oLYKF&O)Y-{D1kd)7}@yq z?5Ed6wrj}9i;0l3P;jTJTi1|?2im&PY@kcQ^x>s3`9y@MmLE)sTQP1^dFkp`PGWq> zf~kn8;_D9`Kat2eXWu9|d}uY4BI(?*vwdF~dG5JYO-P@ry52Rpn5z*y_OlI)V4ZPk z2&Csr+_RP%;}z@|u=#b^Lmv-?n%7Cn!MpvF#r*aURyr8MMppE6mjAB@_oZn(?dKpg_I4j9}tajbhaVAJ3iqa~n93l6{D z5|*`Avl@_5cEg8x<0lxzR{#3dgBi=l`(7_CWD2cyFeHqA8&f)HQ$axuIw3^4B6t-)uWQ zmU8pPbR`zgf~GtTrW-4(+&!XeFL`vg{b$*kI2n;Ne5%@7R>p1#j0xNcf@NSg7gS@i z1q;#{kLhgz<*7L`ur`bEC(4;I#(yk$_@RThH~i)|!~4*uMN%h|q%dD$mm32Sj1l5v z7^$mYUU|z8aO!%Izza*dIM%*JA6f#SS!xo$urqTxfjYLTc0;xTADO+dx_u(VCnng&fLMwUxaUm$w>fd z_p$i}FY01J9$mAyK?8~k_n$F&Hew~{yGY51BQPM*>(^UiZVlNOKA8J)JJs#74YD;` z%tW5{2ZO0ewod-FreLy5HQWx+q}TK&u5XYv(-9lwvl=KibT3*tg7KQy%I7%Qo(VJG zJSXH&gL^^LVlL`!44ikn<>sF_49|Yp`xfIAWbFYJUMh_mH@7~F$blFx+^Z7kqU9$K zGl0I+sq+`0JB>CL0)1|_>1plkoq-g1HL5{2gp{~r$_v2bcdGO zaSLi_>tJgjZ9o#^-&>%z16Te=}hiTEy@{dLo`)9H7-C zDShz49lgX+0Mkp9R=Dd4O}TT;h(%?j3o{GE)VEh+FIk1Z#;LTs@cLv!Yo;V~9p{I) zOlZ|soar@LRGfdR_$zkxH(mdcWDmfJ? zPbdFGMo4Jet*fl-<9Mx+jXMRa1QkV+d0CaG#9B_>Uz%=G#7HoBTB+1s_X-Uw28c6*{4cJC8&f1^26)m&NBB_Su3XvCeH>9lHWMp&YNz5edLvB zQ*>N84?6!{GId)seimr+@7u*^kpfp%UpVAw_;YVO37r}ouPrWyoZTAmjX#aqFcR}YDIuM!b?a)=P+z|>fc4)W6uWoawBgSVjzIp}m! zr5y;PB;ux@*i0E1IPu{HrX^fLQkpior(o`!kjhMX#J7%k#Sjyh$`=KeXx^c;f zc=NWN;`Ws6*e~R@aFP*Q<6bnVzU|R7|K`uhd0!TZS{_ARRPvTOUt^;Vp$M8?m~M{H z(0%W`xz%fedq3iF9ekR*C2xcMPi5kAcUAsIDIRW&q%;4Edei>Rw*wQK>5-MmXy!*Xl)8p)H`JNfq_ z$F0x*O-fc~Tru{HO3gNEDST{lgY#_>RnFt^x3QZAtYx<|7Hc|+?B{DQMXC-Zt+HwV zoLUg&gO)Uaey$-tlZ^GGj(B;gy3D`IpnP0*DrRAsXGO@_bER-$lIk5q&;HdHMcdz# zC}`pj2e%v+^3Oa@o=(@^LmTUBrqN#uLIU5Z)}qI7-3Agg?cKfAHTL-QBNX+P~lJ;b$2~>kJ z?N%JJqN-jvQ1ZNzz#T`ywvAk_x7%fK9T4za>UL)GMtiJ+&v7zegX82(S=MqfA^tl5oI zzuwZIukPhm;1Ik?jcy2-gd!tY)02>1=Nzb?xA}id(Oz^&o}*+}FCpzoEf=M3Vk@Ux z!>>)(^Q%6^%u8E#bY2--zu{HrWC_kQntVq7WJmqs=eoMcE`G^Kw@u1U8QU`cd9sO` zD$SUWVj-Ok0-{gZV<)R)Eq?@z4l9pEKn^43f-rF^&DN>Q-SoCGQz{o!{J#bn(xyDV z-W~9I?>6RBW2e{4-z65715L?~+wHchB~q^BCvZ0Q6tfElD{G0KDKh~rJ?g5O`2Awg zkM+*D3AIPh$^+C~L(X%-*0{7uMJ6xO-2z(~2p_PoCG9Ga7pqN|hloe(KO$D;??I^| z1lOrIG`L^}1Z;JafrO2;)x2X!Za>L+RYgtK>Ptta(aS@W{F&FbS7=-1LCSkyVI5?m z!jM^PF0XqnbKsrLGm_fV!QWeU-hzz!)tXZmCzJVI{7SlioBu?u=5js;*HLidhuf0N zJ56;B&>a_ICI7cr&6y};NzqQ(=SEAmtTL+jZ!3ja0NuWR zQmOa^vh{dqt8GgE`L^o`t%~^;r_U6)n!<0r&3H33A%SgA?*B}7t7|(?VQyvfe*e4W zP(9j;MlT%ZwSR21ZYT{nVJKzw$p@vET;!1{$afZ4l8qmO$wR_Tv_i@fY`Mrn+D9q< zd2Z5-OKpo)31Y0lew@#>40n~=l7^g|LZ4G4=70OA1`=}RaY*P#-MTC9ngX9TB(2;z z5pr{Ys-Gy{SBAp%s`E^o!R7Y=ClyguANYwp(}GR5TY9#Y?QF2DCV-0yU7N#3Ul`>r zd;UO9S-wBQRgSF32j)p?`)@}C2{D^eM#|W1`p3al#5dZzzwChKHKU2t@iRx6+_cb2 zYAjOo{@S`?y0z8`(Y`L_jR`H|a?;2&qm;DFSfO)zOW5@eW4mB`$9+ z(^pd&M3v(-FFp4Xs*#p4@GF0T%d^9Z?>-n(0{!e8djq79`Q0x&LQ1gQCYSjA?gm>C zf$K4`;-iicpZV$cXUa97Je7+h9GzneT!JGl zpiUB;XXGj4W>W_HE#IIzgV=&i#Z`T+wo=Z>)6i@V2$;ESI$T_!qRGt5yu(G2S#2~A zLif#tKlI+5#VI{vLzB5pl#I;XlbHUo@fLn|*4GB~b{1ZwY?LG{gnNKgS^Ud<7UriJg$}4K)5m`4$n|iL9w8j?6#oz*AkHhZY zYh*T0m}zBmIbDjJnP0EAHO~fdgavTR+xv$lZrPgRp!!~11+MeO>R0F z#?L*n4c!piO6)n|J1Y?uQ5!^8pXtP>|LGx3hiA%V(W_s>1eAhTT!FyXnw-8zuZ$a{ z+tf^zDcQ0slz6FGmHMtJsLj?S$?VgtP{+ENal7c~eO^1WCNFbuSIuA`mGo4uHb&qY zp8?;xmK|-mgO)aI7mYHW1B%}U?(($I*TRs&m+XB1Y858n?s z^C>0n>!sKpQk5y{@v!~V?F1{(>=O?C+7fiB$t1+d{A(WkqU6L5W}1@@zrJXo*MCLD zyvrc2pS5msA$Yx!-4Z3|t)4+XH&bG%T`$)ZE2&I%wGEfa&QH(0_NlrP;0cw7U=B%m|$TcNPs zAQNpKaHE2zTh`FnM9tf@J@m&yx&#BAk&-@;9R>6f-qRR0oT14Zt=Ahb!qF?7o>{7< z)S*=6&=mjvZnE~IjgBT{1tN2cUS2m|FnsXdth^kjUen5jqZGZyDfguM)d1?)2_AuP z-np?E7CkO%EjF>)zVwakB7h0m6_Mc8gae->vg^D`dCGRq*38Xd+;5>)8skv13S1J} zzNQoANrdALrs1UxPjJ-ax;DB!%R!sc^~6%uZZvhE>=qcWTy6+XOoR~2Uk^{r$-Acf z-~(G{_o_TPk|ImrjrGCZ&jV7C3H|UJ3lvci|BJ1!jEd_0!c|126a)lB3F$^UhZK+; z>5x!Bx|^Y-8M<|KYi$A~q{t0@+l#Y(JCy=~pIQZ5n0IPj&RyIEx5 zeQO#a7x$6+LT53}{Fyh4T;JU_6Xg#v1fIJKU0~xHW{tI$ zHuj7sx9vPB(@J{KoFA8be85eUjOPr8)z#|ivFdkms?lSi#U=}DnLnae>{8T*k0o`$ zT^J78BME`E^)>J!0>*Y=8lr`uT@tx3mbEPTnoU*jFw8#Z=DBaLc&l@L~6<8I z2BoD@Td~e8o(r^eEK8+4QmW?h_~FrrJ3Lk#S0u3+sMZJVjTbw)+vFGJE^dgJ`PINa z1|(p7z8cjM`Oq)XhaY}Xw(HGA$<-_AcrQY&e4IVWsP5HnnkbvSqy2JB0DE}akK%7D zf4hEM5osh~R!fKPut3%e)&?Nw(vG1zPcko4ah%N%LA!o4P>x?$TjlYOBXo4OPZ>?} z!J^X7@((^(9yuhoPsxYFtb9-UlB&nPL|BuyvZ6W1QBMrrR$%Z$z%tME|b7?Y7o;u|4h1b>@8GP#u-3`c(5q#Dqk zdDg7YWWr%zzFf5?*_PaziNmaOl4iOo#bYahd76A`sIi>o>M~eDSCFH^uR(Tre!y$E zTS7aKf0{lCFl6t?4MXU{8~N6Oo_1z8uF{)+uocomlZ&j%;;E57$q)Bg?Jyp|*!p+4 zk8}wXj3eu#@b$l*F@GZzp8LrA?(XSs(U@Q;EqX79egQYlI4=!1kSuu!d}el|$a0i+ z{Ed!dXzC_IL(ul<%sV!VI|kQ0M=&PPU(w|Cf;lI;TNH3QkLVPU`HQXrt2V) zcYCGC)W+0~y`!y6n?}BuC7o|qlU8r|$9E}AM8prs`0{<9W~m=qoNXQ9uys#XiieP? zq4IEKt@5DeJYfWBls97zp6WNa%FPl%#Y3+RXQF;4EN!o(vpZBUDjmz3k}VUg6Vy_n zN{$te?Z#iZ?ZcAsB(+rBTgQaPH6#tsb6~`!%!KBRMo`99#K~pr7k{2-Lc@;(U~zP8 zmsvk#>N`8aHY<$c!;OKj$6dpWl5``vcGg``dd(`;3q=YBfs6nd$A?w!EGYF8dNfGn z#G5ID`;wMf%tk$E$;)>}4J{oe4Jp8iF=VW?s0kw7qo_6pkq_-}YEiNX`P`DRtJJgf zzH%pG>ce!(IFYrFuCg8%1mUPR?-gtuUCBPs50dWC9I}0r=Xk1?+26hI0xDI}DQg?~ zfL)brko{ayEP2nJc= zY;_3!Y+I;dDzAi2K96WKXo;A1Stz)bOs)L0mTIbaNidu_S&e3=w?n;`+Bo+pJ9RuN zH!5xPap>5eXu+8HJAU4fqH#*}TF-%yBnTH2hh|NnZ1?s@lz3UrTarNsL%SZ@agIpb zz_=4;GUe%C6Ar5R)&6oL)gKcpW%a9uoz?hDUxw>X#^kF>LnY98Mqt8a?im#{OJa~v z3y)0j@c6ZJOvY*l8#vFUebP91cs~LY6v`B)o+kO$=`)v7j&pV|WQK?Sa|laXd`a<> z$NjX}TPhYapoDsvY?8yWA)8=UbCTBK3+|C;q4*g+5S}7+v$=y9m%%rqbZTVps!p`G zmAWsF&jXGE0;7~DaT$zy-3Eu|&x2*L{zLh~WkmJCy!ZHdkK2weg$6&5Lg(44Rq|9B zHySwoNR*i@jdSU@x0oz{(nisiWejZ|rV(v29hDL=YOP6?$ui7Alowv4nb<&a)(z`O zm>Q5o!5Wgh<^FXl3@9}UUo)0bnT(9`NK~YQ#GxTeq(Y9-j)8iJiF7bJ%FC>gFO^Vr zm>MhVTkzi5Ww67e8*n4Wq{9C2{BvJViV&3|mNk>K$kg;(BcmS&?FVU&4jGhBdM!;^ z%9m1P7l%aBH$?B^=htR+RcY3T#m?9uOFxx7)RD`xirwgv5UmvSWsm)g@JBToH8BmM z{ka1AdJvSU%9a4dQFWf(^{^el$1uANYS*N{%4^%{;b_nayH(depGtvkb*rlK1rM=@ zw2f1j5vrk=!Zy?K)pxK~L^~>Fj3{J2N-;sQ^)#i^X~m}WdI~3;{2G)4yyKb6H8uDZ z9r92{!>Pki4ow>vkUVK;O0)w?4=sJ4K=ap z;nxxc5t3dX2cur+qbP-B634Gc3f*e8&!c?1(e}D^GPhYn-J1@|8TwJuaop&VHFEU< z*f%`NT2_^D>7(u3i>vhAh32iCY&Th9Aa|*XIs8r=x52{~#Wxln1-U1cA0(Q%y|^x{ z@P1~T8$?gP>V5)=9f`=|)uQb6T$xi?e$g$(4#~FA2oxpNn>BbAf9TkmsCuZOcEX#? z>NIvn|0wBc$ts!rN5B5)B_v2Cb4~v9Hn`63{f@0s(c|IKCyv*k3BT(u4k`ROqNwH5 zVNi;eC!L2M*iqa>mqq0qzbi-Y-L4a!9)G>-2~@y9lCb`Rf=>z>+J8zfaiwjUy84Dj-4*~XRIVh#%t^oK;! z8Tz!KtS;+kvkRkR|EZh{yx&J^^{WV`RmZlMe~8caH9#a)H+Qa}-nW`Qg|JoEB*(B) z>fu71JkxO|QM^kV(~qUjhcO#6=KY5-<2PVn4Hfcu*5EL6wP|FX$3Mj_7V`Bd zoGZRgLdj@mEZ~G2?kVh+Zq-6K(^1n5A=71nBjvp5ReA{#Ng1jCPjpB5Uv%elE4r&i zjDqopwxAfD=Z5HU(zSfA@0--yQ^+f4lbXc#T^0~tdWiyhiL~YNt#9(9S#BI?_EXl% zv~@^ux2%#*!`!ackyiZZ&B*BBo>xSH^i1n3ghJI=eH|%i|WS<)Y=qk>o}z zPo8RL1U8jQH*6ap%p z`cH}eI&CIYcX6#>=BeEeR<@bo0vYc zzqoOXscEL#&hs&k`NLwud*JFUb)Nx8Lh}NAkPiCc+uEs3*oO{a*p~d2);j1Y`N(Lv zurumb7ch$O&=J+%jfJ}&0~kv zY(Y~%vA$jW;6x^Vy^+Fytn!hwn%p=uL}_@DcJ|%tk7`mWEOiCyVhd{K6?9=EQVfyv zVtY|r7B^u@29^O*egJ#U40dqjRFN!C1aeuIkO-*3;$?h&iiV@<;@kD`@@RXeOlH?s z$~oI{K0C(MRq?P!Ad6{sm#t^WsY0-G~ zIt~P;yu1a31(nG3mowJPRZmOmA3U2j4Wf!ah)RLDJbG)KS`SqV_4mcF?tM9_F1b~d z1LH;!+$x`_Odr*r?9gFxvU}Y*s?G@?U2keteV(cxtsgn8@$UD>EQgQxmy*;(2|u7a zCKnmG8YdckY1{7NbE*E=rA;q?-4p9RiCno6xNB7KGt0H1*4m&d{p9^J-B3<-VXi#3 z0m0{v8Op6os8SdXT3m65o_GfHb9ADr?cCC5KBhXQJsW64a=YB44fLYmVN2P=-uFkm zeWIjnnvqJjAJiYWLD`G>YLl2jRU53%6w8%2X*3=I;()$R4|#Adx~GFlG^BTyH}CxI z`#4i}T#EFUI$Und_2@(8B17eni+fvZ1MIG8H!7}(IU#Zdqsxpw6R}j|ED{nP!VxsaCvA#wO_TjbVTw)2wk;F=oc6%l1O(bE3LXO9fyjVL@gb6W`zC4 z>XLNJ9^y?mw;zhYfCq10fCDEw4PpnWCh0#fIhyoI^JA>X$?p%x64v&g!WjnX>w zRrM#Oh5)_i0h_y8&Iq~3@X>}&Hd_n*b!HD^f(GFb=DHCWvaTz)88Iy#(1r0td8amSB3OSZLR((x)26y*MHDhU07s>YZ)MzwA^WZ-g2R+u> z#mw!qp?NWEK(q9&bbPNYb=zsVp@Q^hJKW!;%Ii|W!HUzHxrHk|)THrYiI44kQViMh z|7eBv69Z))thhKe2P1dnM+NL$K{U=0mhgH|lx=raq;#aAq0_ASkV2;lWBKr$PsOUG z^?0zXag?b87r!JCddi!lw7!yx93iYAXvVzMiwrRuD~yOxBO6tBN z4tg98*-EPOc24NM6Pp9Zak8E33scO}`Q-Lqt15GONQV|}PCaXd; zf5liOqOtlA*8Y5)Exx^)Z!>j0&cKA$c_WpRqOEW=)#F$Ad3gBZvPes(cR7eVv6NKF3cqB9Olu*{a%-*=llbH|X; zdX>R&FJqEs_QPa+V;Y__$S(gu3&w2cvvF zd0;E>Hq<7iWNz8C@^JVDEU#VHWkP9+RbRa+S2snNmb3Eax02+A##dhANYcaL8xxX_ z6(i!--s_)Tv<#$8AB~JNxPVv*oTsNU3wSb?&$&aa!zQiEE03t~Ksoz6t~9GlUuwTB zScI>?cHwD)$ByU6D(F8iK>s?sx=uQxW(LnY8}91hpKbg0H)7F8_FA($8RY86L;pq6 zTj_un%`sdjI$f2|zvSZd{H3kXdF@DCQS{rR_Y-3u>9>fV#|@VJlqD+IumwhY;45Yl z5~DAhc#!ReaF>$=>zbi2HKc;y(7ADd7TEcYC72-ql7C1Kf3+ot}-2;4Yo$a29M9grfuXPOr-5- z^n0$35X-z!^DHSwO-o>*S?N>8HS%)4m=yl_F;>zr7}*;QZ|}#{}?o$ zqUPW$I%TQ4-H%RSl+Ph*zvtHq9adQJp=2y?jdF1chvB{TvvV?l`uX7ImGy^s=W;BbB!8@Z0+ci;_e?=)f%X&T?IrM zE~DKUze?^;0dr0~*H{V6*QFpH$pZ5WxEG^uZ&phJE^_Q?Nf0%Wef~$IS*x&4c^2y6 z_+Cfb=OD$o;IPqZjpw9_lI=W(Bb-SFHYT)7hRZQs^ej&)%{SD|hmB=;a?W|5GZ579 zTdO@}`LX(9k6H%CEIfP@+U6k!6xtUx$bKo_;gpzPHZjdU5Om0c{DzoXo@BBN8@7tu zt#=of8Y_@auGw9y}3R8JYVb~DX2Fi&Y9?31^ zT&OlR-86#4d}+)+fISB-sp*}4_4)9q%;G64O55^er*Ua|7PFG+gDsucHB~PMb9r<{ zOLQ4aU{cA!u~fRt=i!U{VjzYDE_J}3Vl*6%)Gi1P|3>=*5J6Phx zkqdm)|w+$i@%ihXvkHR{wger(nGuKatRInF}X|GR_3~=pNm}? z!6T@q>!MmVZf4@9%UL1h8K}&51rc3;FxbodvkDgKkxR8cL`wwrzqOkG>xFkGApOio zKEhTeg9T$FQJt*EQ!SsWU@TzDxpN3P+&5`DTA#uoP^0Vt)^`6lL4XmHD4=Cp84Lg{ z*V#{Z{2PaI^vWAgcVl9@P;GtJ^czB4%Xd^S=*j_+(Ns3&fMoEPjGdV^6twrkVnHtI zTc&LasH4*#7{0~bE$R0>K-r^In6Bvr-5IqiT0BKdI!sm+8(!hfi_GL`{PXhn1<0jS z*tB{w3x@P%R%V0WRks@O#IeJ$IxxB-iNd?d(QBf8=Wb*GKEsA1b9< zb2s}s1HTmc)}v;vJK$er#ImUO=RO=vW*JDQ`b&^CvG++p>9J(q+(Yh$8j*-Nqe)G` zMDQnjLZ_pFU&T^TKKodjnsKF6+gJFsbxJ2Rw%}O1eB%+B5}57Scp+Z9Ew9l&uN`{l zo$-zljhDTVO{{aPHUT|DU*C}>4v2s~tgDrr%3X!5VgKp;1UmxZ&qT)=hR+#F2{pc1 z^!;*Q@kuzW)09J+2Y>2u`#RW_Eo2?uEBE}s=n2C|ZLwbcn0lDqDL+}#KCvm6qz}vSQf>Zjp!H>m{cVayoq)$W{1sQ*atd!oL@tAV%=!Oq5kW#Rfih zA2~ClTDtBHpQ*!mhMIpCxz)MTyqp{8vo^qet2WF#!cG@=29oMt z$s+yrnplxc0xszmYxUmeK5TsM*@va1vv)AJ=+_lQ@NxzPQfqiq{?P$1dv+DQI%UbXa z?Rnamjp{}8;MH#ur|jwG$Ha!eXSLJBb4r_naNgLO@kw=4oh3}JQH$UtQN-~fxJekO ziTl^=R!S?8oMjY|UYkL8jhAmxSd#`DHAP0G4rey1ex@wbftelAyV)HfH6;(H2b23k zZZ&EWx@RoTDE=?iS#Uemd5*X;o)qxHIIkFt#{Hl@-o-YUhmUyP?a@$TP+$y*(r^SX z)V#gxtf!8-V+0*KZ16__b|I~?HJu>|%GH1UFYPbO|H1ll6| z98jUEH^4v>PcMa4-HXrkQRxYHRwCpyO{51>wE^NT?egTgW-4(Zr@PCQ0cdlhE&T(7 z0DMLX0^uDO{pE{k^9Kj8U>Cbom|D=72!|8luUV!nJgKvMD0EiuIDy@*;9UY`EGQ7c zZqVqww2J+L6z@Ni$Bi6sdtFLt|t*`f5}oi3_${+0#KC zV0MS>bLSdI(Ivx?;$&qPg%Ho@X1v7}@B8-QQoo67APK4#N5Am}Qg-F|UKGlR(Im9=WHcc5L; z)&w+sIWA7k>Vbo^&5q&P-%B!~`Y)6hi3;OrUpZ%_=2Y{oS~8^NSzd1vZ9GNB-pFw* z8fo%c=|xv{WYoj{RCgLH77d8~EZ}2m^M&hY8v4j3iCQioFVub-lt0wRt@5YHMboX1 zuS`C-nock$8@V}_DWU`uPEw;GEsL?5Nr}cxSs7bFr@U#N5eJxP)!E%{RMeMS_@?If zHTVv9X>dRrY*q8kYqxSN@|)1bUgqPctTfX8}j8R2=%OifUW++-z*l z_&Q(afqE z)HC7V9?2ToKg2ci4xQ9KO7FC;ZW>-?Hg*OXsg&g7$kQ^^b}qgMf&yDQ2?OIgy-kth zW)5o-G#rkMqi>lGW#kB<;@@aFs1X;NSwC_~Y|6*Fht>wd?knGz7c69W+|?AyVnGno zO^g#JKy;xR%JwTu{^)I;k(O}cp&(J&Go2NP%NcJ!Zf}bGtOD0r&LS>{lTn-{PX-Jj=_e-_BeD_rz7p)V?r6%AiK*Fj=y5&I}7-{JPTMkan`xKnY} zzo7g3x{EYRF^(ws(FdH}i5Gjk+RAw-_O6tGIY((lg!#*XcaX>leC9(O!h(=J2 z1lqW!-yQd5tO?sI$hb83xzz_ua^*;v9VC=#x&&=efFtAhj|hzVKOW`&j8P>rJ-gVY zdN6I;x^;g_j;+4@Aa*GC{@L(iNkUfSDDF1baBtGL4cWna|1%RN{O)s_?I*$Eo1cIY zqz%I&OP?tgPBzo|zE^dg3-F7+v#z6hihhA5pXZ@8T`RgcT=!CU7E)@Z7H-yT!g1Y2 zpnSMlrYw%96@mYD!ggXzZ~*7$jh%m1_xDzJDGM_%gLn-32)!6jLkAriOcPceb3U4o z`OL3QPg(=!ey%ZA?BeV>U+<)fl5tOio6sbZX6NMy)wLTU5Gk-A8@%0Pv=U_h5lbW| zk-oA?p0B?X9YNYmn}7m*s5v<}>{~KH0#l3qg-l5#2q`bOl8wu_y~o$RF$J6eL&E_Q zF?qH>f5e7pjRU6n$@aC~_|#~G^i`Nt`C!$^Rjc%->a~HWl+3@%p?&n|J0s?P$X&A& zMi#ez2tilt+5H~qoF1Xp&yT0-UE9#$kc#&(FcHh&3Xe>HK$SI2^wsZsyz9rQSF+E- zW)HcrjpZ$~mOtr{{p|?UVc3q_aJfdiNEVe3VFc;-uvykvm2RAMGX%@sA*U_Ifm+e| zeP%T1#%7u{u&d%<+*%?1^f)p2`KdL#X2eZ*o-G1p7XK=fQy*qy66_+ZA2}Z6LR=@6 z)IBvj%rjcGhBvGq@E2{NSSsFC@^4a`r?`G#e!uc7S@;*n=#F&Z?bjG6-cdj%L+xV-_A7ojE-h_T~;@#wt1 z(F0_g^?udhn39J((N9)o?A8(t?fcW9Eo;{0rmwrV!qjNUVtd1KUO5|~0h4%Qt;TbI zJ9-P}GtPS`A{COa! zRM8dRvT&kbdb#M{6eWN!9IdHMB=~;Ih~;&8y!Q6?`cabySE=B&{@&w6CX{RQLHr%@ zbfdpsuYVHYKvyI@L&MpKJI_Fb<)KELzWSBcZ5U#id<>J>F3oy0QMXn&48(1lTzHLl>YZ@d z+T|!=mrlp=mt??anxvfGP%#MgF)+iJCKbYAq0b36Zf~U>#SrjSs!HL{;jQ%i+oah| zQHTQA+`(PNc+kE;4O)h&@7B|)sF^UFO|U_RtScKtZI*05 z^AV`iFv$0ROWLnautGZECsDz}wQB4vlvi)LIYc>$_tCifA(rN{CLRL}c|;Tg!1~t3di`0( zX=d;q-p_jI60oC>VMBG1RXLGKAVkpKAI|D%4U{#m>$IZ09BXX{sn+)>z%*Ws zIt4{=S}Eve7o~*RaT+D z&~yj*a<%woKk)gOJ;0OdUycKf8a>+`ldiC}GC4{1ixr_gbav>hqJ3fu<7BIeeNl zxwd{BhnjeVIGCv+XNN3q9(v5IvgFM4P+QAJ(E4e z$xwk0M_RsC;kPxsnQGQzNjAq0J{^I>J#Dv}ps2u(D|Hs~$?96B1m1HX_Zao$GTKS7 z8rk=&PEX>*tqqu-WZ+R=$9L1B@0Bhp8Ltw#rVYC7*NW6wj-e8Dsow7#4XlcLlcNVF zaspZK6Nb{^Xi3v+{Wde}GK%7m=dy2G*fdq9Vc4XwFFV59D2AjFTr+|_Lg0hFRB#wA zzVUbqf87C0drJ>%RCfN0yeayFmacDsRpeRSuN-|YTVCO?LU5*A-UWJpl}ciec#z*+ ziC10ewO?=4YkhqlpicxUpn=%O@}2kvPiw)$sX9i`0*meQ6UPTuKrdJ_B~sGgeB*=! zLjEJ%XXkvIK*J45!;8P3P+=&rN5!q{F!SNOvRm#LJZqPTD3q?;Y*kmkr#v_co){l@ zgkX8hYiCZdPV-AQpD>w6VSjt{1M?``0r(H_0&()buD80Rz115hnve0pchJMwsJZ(41>wjhb~NN*JLgC1zhfn8X>oT3Ket` z@1FuioV6ykF+pYhqZgA5&_kUW{CJ{=p88bJ&!GXMlzp8kU+~7wduh6ky+S1!97n3!0_%t}p~=oCd@+(mDR;fu0jOxK%H-#y$xIpLM8aV=jT zWzXZv{kc79%{#0|=#su%tH%z>02esvn|kc7tx@R`#eHTMk4C)(jI|cZdljF_nn!gZ?jIP`@SA#Q2a!{Do$94j+fsR> zulKFV+xe;zy`vXX7fnr8wPCj5um=Nx5M~9&AC(SJ&Hua@$!dWol*pvNxK$&>P+_`D zZv)iTS}Frn4^(i|r*)5B`{HPk{uO5tJ@$i+EA>b+V-Q$Fr&Wh4$2qRKeu#4PV5M zB2sF0G(Msfe5PV2I{|hekXL6(SLm&z0s}%MY)V@4G1e1R+%(KY2F`J|det*Q-#&?; zy=!q0_^yit4*-}0?fL1edE>n2B2ujP+m*n!auudc4aY94yZe9R+qcbxT4TX}G2urR z0AaD^agoSke>tb~?2mQZA!`%s?EA!dLuU|NsiZneNx^HyWe;ei=}CLKjXxkikC-UuQB6epN4S9m(U=PQYp$Z!P16)uDH0({3bEl_^Ot zWFAi!+>uJR{Ud9)8zM#-Zs&Hi*ZmY2-bW4x)^QfQFk| zDF{v2I3+9Al0dJYPqd$p0!;MlTMv|@W?eeUV{|$py~uH+XNd3PHDf+C)*`Mj8TZM< zOr2ri`S;V>?ZT!$9HvuSBzoZauUUEgU}H7_qEQ?L`6YV{DZvCZl;NwYFrUe)Rp^q) zO~wvb?|8?ZMNBOA^~!rrs@KbD^ox}K{kGtH1l4AX2e*3S!SCa*=73J-`RT8r?2fxF zmceimvlFng3P1YcFBg!_iB6dcWXm+xkjO0Iz`-ew(lk4f*ETaj3aUT-j;){1>2j8L z_~>G)1f z{HM+$NnCg}i&5pp7)Nnkdim7og8^J5Uhl|8SXV0?CY4lCc_NM4tl98JrMZn}N?lha zo*gQ(BBb%3gf`Ycv1nP!=y7_wBtCua)wUp(F^!b@a|;$gShXoenXz{y8oIXWcW0PcGCu)e)`bRIg^pm>! zxK>TTk5_F7BZKanD~)b@v~1+o2kUGnV8s6S68A@BpYfk_SUBVftBuBNZfWi#vq0kX ztIZdMDItEJhgxIlYqQ_qMzGsQ~}>afdpvKR}IR0Mpz6Di>@Zxo7rvbSQv?6 z-%uJuh5v3{`P!6m0qVPEN$2W9sWv@s8n=&w)xCgj9K5@=v=qoENnb_ETfc*u?)^o9 z&zLb8{F@m9=p$zkgQ>B-e902nule$L*r|2u>hJ!!$U9RC=f4Yn5pJCcQBxyNPQ#5A zQam&@jj4J(dv>g2l`rEmW?N@Isi}lZ{pR@M! zz$a=~e|5*kvasm)t-jb^?fJzr&j{cBp1rf;IJMsV*i9%iyI(v6HZGQ$kfj@SVADQdXK97vHK42uqyK z4f-NGwEsTdz1IIz*Lv|i_qR(#JW--Z^C9dQ_CnvNr{i0pa%=vM6yz;|FgGxCZw^hU zKPXY8_(_P|#QG0{P$-E_4RQP`)FopoXg}xSQ*X72?h4i%?tu8>@S z@hRG_zJ+^3dxQ^Hn?C+Wg8wLi`OMv6Ir*6ocqPgI+;w;6*&hO3{TaBrUb+Jl1|Q3N z^?uD{{l-qY@6|_zTUMHe&8d_L%*oDullp5F26Wx^?cuW7L2Ya)tcrv_H*~h*LXeY+ zO{`e|h2L;~>Pxzfm?R~GVlwch8SLVE_wpHrr(TpBH*m2wY4zsX#@M*14RtL{$*TCZ zTI>Fy)wX|*is#NL^nEq8p~~)w_+m^L{IDw@1!RdjNq?kEh%d&70`|UnF`hdWDMsiO z(;|qN(K~Kv6D08B<#%5T|s1UMUybgHI;(|5MF*)c6b*2F5rinnA=IOe+n`Ka!vKY zRBYJdVb|l!SVk>T7rkSc*jiSYwBtT;q9J8-6%5rJ`le%en3`=1FVStTs`wevZIZu7 zT*PoEA3vCM!6FO$n9Oz!g z^31W+quypO8G`Ex44Wof)Y(>AAp|!#wTo-nc64WJ9m5`qwDtJvEFxTN8WRisAj(DR zZ^o}@m{19<7UNW780`ll9hbxCeb zkKuHM55B&{d(EgRxT-9Jh*AFR^SSkmGfCF~@J1Ig8JO@ZjIaO?kA7P+|93OmRS&}cce7R#N@-E9>MMaOB{$Ngt1bl=ozUscI#JL)GF*W z!^>JWt-IiLR{Xc+Ve#qR*$0GMj+e*7Pd+%|%CZpv%H)m|9|1SulBG1=-LO665^3fq z#e`@-d{XP!wX;Qcpg?qQ^`BFK5l8OJz{xxUk9QWPXL02HLtF$@oOOgTsghf88?ps7LkcL?;II`SNr5h{9m+b4kC1A$YVP~ zQ9S^h@X$?xdP65qXm%#9W%{7!;zmLq&ty;!z|C8X}K6#70c zyJObZDzLbV;3;`60A%F&xQybBk#oHuviPN`3H-<=@BNtJ4U~K0!$QlhlS)XNFV?xM`+u_ zZ@~PnXrs4)5?~b!;>JWZa8cwxFJ<&932BM>DwLjU~^`!~NJ1c8TF5Kaqv{KT-Aze6!p6Mz))D zJZxEv2$Otsm#4PJsm}g%IVnI4{JEpihD^{i21`6l;>Yj;^W5%A>;?uH2ZHca=C)|I zG9svaN8FXRw8Lu3(f`EjVIwgV^YSP{2s{%St*fU9H)JkGEeF)iRcoyNmB{rj03ztK z+wvMKN=)cLwcjtr&$s=L@o#>KL4O(hvSUKo?v{fjxX3c#VBP~ z#GAneDp+mNj$I(WfwE}pdYhha)DahDC#VOdFl8b?*Z*Fi?0BayAyK@uL2dGr624Pd z*L|Yz2TC8n0@c|$7*=$szAHun2@);~0Uk#LPoSK4jROV;4rJ=P8E2X^&x2#!ss|VT zu^9dV0<0(cdQ3Z{2Z&;kTMEgP&6S?<85seuwgUi5P7b}FWEHaa4dJan;w>+O_yxic zA3?qbZ$dNzmx-b;^;RQB(kv2!#?#4I}uxH z16T-PKOPn@D25#cPjA{M7F91BTpWmOs8IodX1O)D>gA5ZffWCfe1a`<$4FgFTe<^8 zl!V(HdGi9%1T|qJpG2|o+0KFg**>OJnT8(5=kuXi4&nn{!VOVx$=iZX#(l*>0B%m- zweH_m%0_;K$tM0@=OI2y>hCrcNJyZMes&4rTZI%f1q;e+)E#|~Jiv~O<)o-Wrr#_; z*JA&9AL++~yZW5irU>B4eu@JxX##e8vi}`seS~{;gnz`&s4mVP88kdBzKf5pNI)0ID5i;at0DMj`&1E&U}JdLnk{eS(c3v_<&{Dmjg1SEYC z5m+_8uQjVfl|i;CkJQ_{3%5_{vrG@Ile@y+ZJ5URZunXJ6WY$W3&`vPwykOjv{-W! z@&dTeh%nj7Z#pBF7>{k9ZTpRsmj}MHfmfVIb08%tZ99c%vj1gzL3JmKwEv&Li$u7w zpiw@A=7iE@yD*s&mc|J~@Q^7G1CQ|79b!Qy;X-kYL3sOp998 zYzSq*J9rgHn#68viWLz8S1%x9EA{pPKmBg==q-{i$8XkMNn1X-+VyPD=5U0^(Ic1H zk2J?}g!*$Qt}exQx9=u)yF-dW=>FzD)arF7zcc{$y|bp~(L!JnPR)Rs9DN)ws9{7@ zl&CkOUNX$t!CCjVZ%X)t^I#TT=tnI49OiT&B?Z`_0SD)PhksCi4e19fdgKFZTg}*M zgVu9kQTabHOe-xy(P9z>6j>^T@<1wmWW=UA&0=h8hwe0JydrY7?Isie92LE`#Esep z(1E94hCfvtHDM@p5E~*PCUtUoxyo-sin-3Y{u-T3aaP((>24_0@NtzFt>gdS3`t2y z*uBx?TX>-PXx0o9vM7Vl%3c`w=GO+bziyg+F5@RXI%j6|U~EaV{+km736Kzf9=<{@ zl3H@!fB2E&D?oPw>tnOTeYTnC?j$tQBOn1|eIg<+4NyMh>CPJUREBn{tc@3RgUy!y z6C~sxBK)`yIO*F8mL3CGvTWh-< z7olIl*DnK>j`Cs661br3KNN3eLU6w?^8~5^CquB5vP8RXuVy2;@<8Mi2sj@C9Sq9sh8q^n#|)H5ccUJCuRRguseF{Fz8FAs)F8 z>@e?#bcDiClUGGH)H!cG1V9lCeWVws+fKf30B8N%SKjO&a+LnrV&IvOYNt2mo4@Qv zz5CHfc_6+Vr7Y-&fy@=RFGcK%@y(F1>zu`P?miUx8bz-H~?m zqFu+T$f?%M)N5IZ7z!;aYAIP`!7-=Q^1RU~ZGQo~0G`paW1tCKCap(z!2PWq6zBP*QHkU~X^Pqx8I~pBtEAArJT^Dz( z4>Jowe4gsf%TA4;+FH*9TnICIWWUEh@JU8>}cvWmZwv$%rBB6+8^WNt$p-953Kqaf%h4hlFI1`!lBk(@AvKcAw(jN_M0eyAWOqr7yA2^pJDl> zZ)W`x2km;V%>14GVl_}5(|il8(hfY2!N|Ze5HkQKOqB5}L=6I=2lZ(0*zS0;I$Zv* zro@8K*Aw%`oJ&7vF-q2=rE_HA24-5020;ZFo54GLp4FLS2Zz3QAkUy!Nz&<{pK5hs zy*RYL5u_3k_y3c*RPi|3?Io))o?(v#>b`<0i#B1gU*Zpx7}Rk|ztkstjV$`-^ZJ zk*0=9XXIXUVTjVqDku$=bzT#KuN)fI2eM%VZWY60$e(r5e}D9aY+FqmMma-A9o;29 z_~c`mh@K6!|gaoCf)nWU*Wz z4ImFb@$e2h&>LQ?Mj$dec=@#JucE-Y<<0J{{(G%oVE!8_4E?$tr~eamVDv85dl4VKKr>>R zg^5IH@dl96=C7Mp)>Ll|)Hu{R&7WvT>iz~$d zh>Dhjf1?o7m|npu)EA(Fp_h^HDp5UEj`$PyeyFlvWPoqXI>Pbsd^0_xh5{7{+Fv+E zFz06C@_EQ1Fd$yx*TI2P@I-~#6)8+nH5qr;7rogq2BZSvI_L*|EtaU~*^c5EOnm=| z9<#pt%44PNpK)~K&7S-w8*GA^UESMe@w)^it9i;8t3#16cP&*bAmT30b=Ocl? z7v~c$3Ldya*z7KmKyE%COVnZFlLJSrl7P1V!Xhowc@`@!k39$vObHtwf3Pwh1l3|v z9C#!Nx2J{w_~E6Vt6jpcXY;sIz&@Ekxjp6cZ*hLDU7^vLeVol5-uw{<3z<00`J z!OOazKVT41u;c?wjsZ$hC#1$|#D7m5@DIya4*~LB00b2Vdf^{0R`%5d5~Lk*w97hm z1EKzUmw%wH{!hJ(r9-bH7FZeKUZ$iB z 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%0AHAbZI|8sPuU!^iCy7BUfTqJgeGV z)uP%Ke3?D|e(3FlKPGSi| zZs@?o%*4%#?fFT+|IlzUcMgD38MVTT%tdKaV!`)$7txU`?~~@ea1vwa&J$M5Y67pk zmh=hxoZ7q(MkPn(j{zCAj@JlUA#NeEO>+qILBiokx?I<>C+J}V>+WqjIE}Z!sc1*| zlpJ@&2GirY!b)!8Y`y|K?74%7t=3nE^Bv4sItLR3-46ScbFM=2C)zHf52+BHM!aBeqQ|c?kgm~<7crlf9Wt1n*{qUTtYX~z zhk$$kJw553kus+e$1$HDHd+y;2Jg{=Ox!9*1L)iwm$u-%ysHL)x=KlE2Ii-U%+R0_G10r zvs=y-F8@LFGl*@oV?k<91HV;v?|N#ym-FwksXIZpdk4~UwXzy`nxM;1dUWg`lewcO zb|%@m#w3~A4fYoc7O9Nzmg~Yi@s+6R`=-yZ(A}X#S%5rKlVv%47avBDmfaIcin=Vb z@@ui9af>0)McRXy!{}FElOKDc+gv%WaFB-({fao>H-L8^S~N-PEH^F9$1qkBGEiv< z(5njWs-~-p$oRZwB@Kq4m{hB2>@g-IDM#-QDm^uUE;ZxHisV;??YqmCD+EE9CmZ54 zmT}S)xL8*#k%sd-CI&gxOAQWYlXJB5#K|DL(pzU%3Sm$6i}fl;z@vY!*Xns;zbp`> zJvu^@#B(_vBM6dyyxGKNKeed5QAj#8T^nAl3`8T$R%>!pn6T+sp#)?TzW-#Cmd%c_ zbA(H{a%+U(dnfZqr#$=Xfa5Ul2LwkP{GN&e!97mHMQjM>xiDg5K%POB7)@3SCuug@ z>u7j&cQhOBs5JL;#a+w1@pgwRRzThWbn_N*-If5m*STa=D~zvJ)!4jaPE_=T)F|Ngv(%m%}w zhR0@JoPg;Dt@QF>HVd~ixIVu3dJQ&iD9*=kuoO(r?|>%dB=#juxaGi!5B1+IG_KHY z@jS*&KYe+D`JPFjq`!<(hr~AlSBP)q@5hbU=w?u}4#<9KSIiM>|5=mV(4ffz^6ECf zWmfpJ!Op{@d*Hk-gMvdcSfk@C>ij@ePF%r!Cm9_vd)vIT0*3+4{{jYn9^tHu~Hg`&=VE#GQvv z*z+de6s~k9@7ZbJ7a!MFc6`eI22BkF?}rXTp3&g=zx7ri=eJk6r^wo5_^JGfT?XFT z5g56uTE8FUnVIIBVE=v#?B#)m8f zK)HPkVZWsXMAe4N_{H}YwJbqUA$3m{UMS8j1;|;uFG@O+PDBH%FOC_azIC8~;C}&J zrc()^<~dun=u7MO!T$OMQyt3Zw*Q7g$oAJGzCh5^$O9yTtqNn`#@>yOSn|uGu~$EE zCduAbzq0tMeb5J;R!JAMWM9eULhnj@zJ;to|3z1Im^EPevjHO9M~v%xdHt{F{7(DT z-ye)m%Ll`=|D~X==ecBU36-`b#5`p z5J&%CwWF=8P3-Q?UCOuYae&px*z&R5vF`GnZpXu%UP8g=EQcX!*8~(#R2LutpqxjU zdgI0}Z|;L{j2i^C)J~#4<9b14!<-fg8cl7HOQ__|Wa&oMl?lN_@%4SzUbQ>_?5f@G zrQ?ZWrkF&lr<>VOel$m@v7orC00oOs_JTwiba^jMZDB6U4&&d0U?=wPLC7#j*IBKR zlVV828sk$=Q(mjE?n&h!DkbuGF-_t-z%};+(6yeSbO}G_nOLTeFWs;y0*W3|f4YP~ z8Y7^MH!vuKzv6wQEV{d>62`pVeLcMULb8h$XzCUF(vFvhVkKH)#U5PIj3q_^)I*aR zIpm+x`M)n}lo!85{Cx@5vww-uVi3>&C!xJUJqf6Tx9Ncq*oQ>;s{vR_e5rhnFluh| zxe!twR}C%u$RsxNmXK2QQ+|-G5AG3n$Sc2C(RSI}7`N`gj9v5ZutX7232>0T(tRqQ z57CjlU;xy+#|4#GAq)Lz(J31he>)F8KeF zSxf&~IHPuA)9ck?jLk36EbEKH-+Avay6Pu=Fr#1m_pYgPaBVdS>m)<*xGq~{2+J&+ zS*$ndhXd5gHie0SAh9gS<5jC=1sEwLgbcW0GJc7?gn!#f7u3W1&^gKs737zdqclK6 z0WRPFzWV zK!l1j7UkULJd^&Hin-U%M*+Rn$3APLW6VJco(zjdp2T6}#ruqNW#D+YMW^Y(N5#E= zow_PZ=v6ysD+XY`32CiXiAu9}DchhNW*DG(;-lXuC;hs@Y$?}o3M1V z(X33AM`--W;_pg`@q9(ms6PUxa7TJoLM>h0l07E@i@IXHa$C^V;k+RWMUJd`x#IJ? z{czPr<&c;E?2vlue?FZe`xvF?EC+^2pqe~Ze9rtb(rOt?5o3a5Z@T-*lHKe7?oE6@ zU`kJUk7JuWS-V(Wsqr*78CI`u64zFd((&_1s|!z!Bt?Oi@|E2GK2iBYv7^3z>BD6Z zHOUmc&u^--R54Yg(Es0k84Ad_^tkEB2@;PN&p5*Vvu8fy`*$YdQZO*x?K= zHyo;+7QYEF*EWt-o8gmkm8TuQ*$}1f{+9|dGG$yDb6EcI({VYPF_zQAyduJV?P2Sz z`;{hetl|Fs<7@W$o_-O`+0XuV(MX9@6ky#XXB z5gTr*h(oCN(*w=J?X|H0Q-q8U{$LkCkS2*M%Fzqb+zDkx>0*8keSW5rQ&?@WTlxz} z+s8{F33Tw1NuyHo^Xw)K4)8WUqy9^3B$6O4D2tDZk^S#E{7U2JOd$|zlg8&cq-K{%m3yK;(5thP5A$w*=MgDfe&XtpBn4`e)5CiUv{QYy&&xWa6)JqP(DcgEMTVU7+m;>cJ>0!{Ejg(j^Z$d0Jp9dib z;zFmJM9&toyV>E}(FQ$v%a+>HXm;9x*d@^?B*=r&x0(c47f?uRp2z8i z*&IXwNo*w}6MYnz1N+%Dn&b{kzzg8&+l;4h%px|3f@|Pv2Z)MJK#;5) zmI!$>rB$h7kk3i!-(WpH-t@y=D5%j$Bwz63Yq+RKJU!QT%9{f=Fzp3MHv zFwF@2`^x1qAGXFotR}mhTCG0*OC~C%iYY69%DKKfIpC0r49gwIS%iLJbIoA~rjea9r@(^EZd<_7mBuI* zr`u+p*!;br*mRj|V0D}$&z4lt^TmWO4kqu#Y5}J^glta!hQZHfP%WN%VoOYnDDbsB z@yE{({2n0dU4?(jp19GR2;P= zFg;58A)Of3cmF%j3$j|*Nr`nYV40x+^lr0(I1e!FaMBID0ZK63wHnVnxm|WC3AsF? zVL(BCgWJ)kkvEG%3CyOL++9ilaxpx5{6iHY;-hzPnN$5DEh4|r9M6=)M>x|Q8@|6N zm9LbWiGM&XbN-T2(z-ExjLbC*pDi6>DD4Psfh6{eJjGX_<0Yne+9k@kHu24}2cg_w z+kdx+ckowrz-JsG3gHRi{YO{co!0?y>Eaf@+5dCBAnYrm>gt`({g-h_mPO%Kdgp)_M9LTM68&{Lbge|B%kde)YuSpS48- zM1za>cUMgJf4J5P1K?WxbL48o`v*n~!`~vIeS{_ZgrExHe%}c0R?fyavTw(N@%;Xw z_P}ey^(cWeE$gd)FBgP4J@7aC@0-J4=JOq#@JZVU%iG!)3ICAu1OtBf6l;{u=dmwf z@#y~M{r^$Y4hx`Yl>2{=!rkYSd6Wsn`v?B=gHr_>kYUPuLS6OZzh97)z)zi-tpF}| zjuZKPzqM^ZiXWf}R?2@>{hhf0^xd7ZgL4J&`51QxI?`o4IXT|Xq`iNc_fH<_p~TON zqE=CKhKWbsZzKljZ=OSZW=O*MKb|1G&;b|NNSP;_l$ifr*aO60@$eNJ1!b5LxU#bn z{`U(K{yVu-1y(GvBuw+qio^bfGPOK@j{iK67_eA9z24&gTnUs_z}=oCgH2pISEAGZ zFduvip57(mO#l`V=D?cyXA4l_(3QX&ToFP9)yMbj@bm@1B5%t2{;`mPg3@pnp#d0u z&sy-^9i8r|^@9LT6B#swJ*wP4>Hjb{#(#8X#v+*x()}({1p}HO+L2)t^PaAsAHxHQ zL4=^x@(~&ZiTf|!KY}OzN~oXAM%i`RQT_8&jK6-5^7~vNmVXG24EJ@Bqk3?Mm) zcann^lq$6JR_DK7CR}pF;L*YsK$e=TrxyQkTI63YVZn68aQ}x|R&cUtpQBXY-`!8+ z&KoHDu!+0F_v93g#`@1k0B&aLxdG4FQP~dfzuOG#Kfqo>GI!eb^_t)R zSX%G|zHskzM7Br&Tc2OF417PiI!0K?&dIBu-!Bjme(#`gKNlyy|GfK} zAOVtX{QE5bUO9TF{N_+aAZGQ@JfwSSihlk${fL|c0b%b&L&CqpVEFm(9^!1{sbtEjVlIJjC&^utm5-#QY~tT!YiZ*a62(p6eEg?q1XTDZtNqgkh+s z^ef!|T{qz6asiy3lk6E1`yV9*?5-f~olj20c=9z+&yV{bPQ|=a+p0_>sR8&w()Y@Q zBoO!oAn*yo+|Lsq-V&j$UxyIlU?<#%zzS=;2X2t?z6DNo>@h8J((A<|^KU}IX+ zr}2A2Vj%t9&mN&*VXXTXYD0h6m*(?eh4uap9|bk;l7roV9-NvB9=zvJlB+u%`w+EC zLSH~I?EZ^3%fH&Bxuua3{az9>Bj8R;BgMZG_QUv2RRP%xs(OwL>-zi!;f ze3BG%3k_g|aK3pIa85t7&M;I_f z{PgI^c>g{Fhjmy zVt~|Nk0j3(dHQ|>07nzx?6rAmz={0d3Jw1{4IeX1X-}R_{Lg84fcRYyZV(E;_?^9* zXViIiFCSC^e+B;KnE43mJ+T1u)R!jtG58+|dw}@qj^Z)?8Kxt(PhbBdtyXur6u=@x z6!U-jzkcPN#DDD~6ivNnC=6}5iJ!U^w*H4yQ*hR1ror*(@rV$*z5fD`1Gu3?dop`F z|MDLr;>YGj_{sg-k4nJFf(+Qn ztE-0=i1%OUVcltytI?8LDX#GE_xIz2Rr!wO&mi?d6-O5W^Zsp^?xS5F|emT0UR;lMab1{?QSLq7-@k ztVbeibRdr$uHhJgsAE$1t(f{gJVXARLq|RzUcIp=V;|s} z!)BPIrMH((%9wE}&=Yd>J0xyAc4%&Mf}wS!xOPz(1dh(^3DXOYz{f)>4!FTZ;=q+< zeJU6i6u!*n=eRM9JQuN(?s|@K1N2LgC8oRi3gn2yk7}A0$yU2| zD{7Je@_=RJu3xs+ha-wr?ohR?a$Bc8f~pL1l!a`tDs!4&XYlj%+(NZyL_{SI{1`Fe z-bw)wmwe^G(5%P2Q0z;sG=XFj&bf}Yiv$l57Lyern#8`x`3a12E*(dE%RM|(OeL3Ro*tez@3L@TrBcev;u(!Fee>L2JD?>y zZxz&_P)~GT`t$xdel=_8AHzw*0fNl(+_>BBB0GZpzx>*Xwyqep!(k-^jBP|MsQUC6 zstDOHee5h-MHWOfn#99wG3b`aY5zr0BYgLKWQ+{O(BhDHYUf}`H+(^1y?@0(6SbGQkc~=fR@f?0IjFc=~jbzX? z>?n~DXR#M2U6Erl?MCMbWvv@}&TtC2eXt#%Hx{jBboyyFTW1~``OfPwBybwW*uKuz&`S8r}=m9mc)V0i#( zkTVcN{Vc0?gpj`L7iR@}-czx|)oAQuJtk`{V_ z*Jm5G{`d!!?Klo>{FhG1&5PB!_P3!7yb|8mPAFWZ zt1XN;Gfer;r^l|b->>zR4n*FS5_6hyHVYWlXo{Am+A5^XLXvu$ur{G!Fw8LjLo(rC z?yVeNGjN2yrp0qIuXkMg(H**uig3Uwv$;r10U zl|bo|qQD{)pSw-~z@KP(qD7WV0Aa-L0?WkD6hTgB^L?_%K2uBQPPF}zdYi>R-=F78 zsrRnVXdL%C>*J+9be_<6%YSJ7DhNd2apo4bJ>@PLH~85oBCuPUR}PpZ6_+4RA)iRm zJ?yf=n6VCZ9?FwVYJu8MRG&a&PQ=d_`J+e&LrZpfuQodY44MDdnYL|p+Othg?A}NO z3k@7hKD`xl!^>f!RL_zp&o`$#i3rboZ*;bQ=F@mLx}@l1iv&NLIWTvfiD+%ts@Y0! zMzVOQOdbKpOsQs-5eLJaaa;x<{3(kHtn9zBpKk(rj+-eBC7EL72?z4_c7W?fJM&fY zdyQ3o*1`}6H8Am9_7_Da3#XZJ_%4*oB$ZEkji}U+|BrYCk@%}L zFC7yAoAV9@?snL`1LE^FwO-kbr9WkQgC^Fcs;pf7=>XbL!fg}h#proM(n_4bCF`sW z5u^z~<_9PiV-Mj0!|1HP>vY@s^3)y4Ie? zx6RP1#!nFQI_=(Yn%2b~GFn7Fxm*MJma8xhqus$vdNenV%j!pgpKr3z6S$>IpdyL= zac|;r#|y*ZntI>2M4RTr+uNJ9fgmQGxWq4DtDE+&R1#+SQs;}{HnC3ldqQfzDQlk5 z?MZ#yxK<9(qZqf{NQFw~QWViMW-N)z;b6zt3I`lWIMv3@?K`E;ITUHs@~xpvevJXI zSs2tZLmfn^ay-5XC=V8kiXi&g?TmFip8OxDiAN*|Vv)<$Ec;rnVyrx`{6r>4lt(m9 zqe3bFy9YHc*Q>@QOIB_f!s&GEc`$ysk`>nUQ^E0SBE+P{ij&)`OC#}k(TOG8^=CP@ z=k3kLfv?#T41s@xJe*ke@iW9$ZWG#YQf)lq41}{Bt#T!2mh<5hJtnn?rn7;8`dvlL z73zm6isWkAQp(;4)da33|TUe|K#B zXt%%8a19R|hgUL7=yq0x#P^{Q0RF|dzII0%N@a;qE4k^A0TZ7~2Lvb6zM+R&nyi*( zQ9m$T$TF=9d-@h`l;>8kyJc8W`9vC3VJ!$EU{zmLseRuoYzg^Yd!`j9=(_cZ*^!}E z#0x+E)}~#CQJ?@i@lKnaz+gSnAq5#5uM4p)NKL`6G=6IF>I|}`(wY!}M{2C4E#?{$cu!_*=Bom^oxD=yQlxYq zeJ6IKiSw13)=xVj6WtBG#9}m(G<%x+5m)+C^=+#7u?9#dUC>ACVs!95_G_qnVbhI! zLRj`vViVH}<4Lr;0m>sF1q4Jmb76jGX7$%pg+w=_Fo)ZmbtG1Nn{Yg?=z$ozt)C z|I0+Z{~r_O4o8*65delTFiUQPG|1o3?fA2c2;{H|v;JL-AW+;MrB!NHueZhm+pFC? zItFECTjWW^1I@Q45yvL?=QYum=-J&zUtXYd8?@-vvJ!UXPKwEb0&^o zcL0HXD9Ccv-2YQN=af_0s%i8C=sdsAjw&REiO-}`d0(BxvU;^W z$#_Mh&Y^yxbF!t=`8!u$ShVXgJm`AzOaxN5skUOfdi0y(vuRr2NRc_|_I!RZuhV?R z+^Pke9y6qMrV)SAV~Y!_QCsQz=MA^VZeIN4jX(o*_-piSs#P?bCAO{-%W&F9+^-{T z^aJPwoHD@?1h3F{1t>kwtfJKilk1Lp@CT0{%_u@Ifqq|My!*`@aUgQPM94uVtseX8 za(m~*SO53)a0%bFv&;9r-Cr3~1k_*p*&vmi5kCl$Y@`p^GEBpXI2f*76 zb34;%+;1cXW(;ISlV0eZT&A^3?v~P;s^jM6))O6nwnV ztgim9ysZMX193X(vmba9n+c)0(gB7`RGHt31&vXp_*nAJ?c}DhkLq`H`x1@jB-dA1 z@?mpMO5XC3t-0od1qgytxA}haXAI+9$=;Owq3~HEs4yOu;h6tswma+{`TUpsGb1;X z?=%s0>gqa&JKO!J5ow$T$x^=1At&`7)COa50!Y)w5^8YKOhD2V&E8S2xY2QUFneXYU2PMj4_j4cBVH8ng*^g>0DVM5 zx%`!xCvS74*O$T~p>QDW$sfm{2XEXw!gp@GraVisggdAuw_Tu^m3TO-50QZ!t1}*d z_|ZZ*@0Jv!>H>pZ+Zvf?0LTD^?Fn;KO=kK1jmZ4|ZeYvVm_8wHGb^Wt8r@wgXY>>o&7923c`BLG> z(8fiE+NGJ&R+u=@Dm16cko>&)*LgJC&O(mP5a==fr#;^ce)ZkcUp_US5Fc)rllTkq zi->0-Ar|h?HKwTkr9)@oMKJj)e{EZ9NLuXy>xIdHQ?47kv11IIl0GzB#-otn%|4M#Jg5%N&v11;$otolL zP_%~qhMmpJ4a~UjP6e$^0tGVE&|i)^9PDUyBv)9apF16-8JBQYCOE(i1J({_y$US| z=tR7tuNibReQtvR7v_%{YnE%N&BfFyfH(+ z^g_WY`s%fEv)aBR5s&L$#;u{|PoS@smTNo)^naOVG6IWntx+(*&F z$6{}3Tm8`F~vPrcH#j{~wy<^GTW2A94!s!(9 z;(1>_u}QnE?l)VkNSR5c*PT^XE-%uY)*|!x8%FRN z&+6oHFAgR!*UttpR^B3^jSiyk3uNDVYhlOV6?PF?0E)M({z=iv7;_jy*WCk96#TjOj}2Zs3zE+@QCy{_0UZ{ zo+&Wb_btX^v(T8Pc>eYm0AK)Gqy=V}dYu%O)jEv*FlTj`&>+=kH@uRejCcD+_AUJx zIcOjnC?qQ0?*b7)1+Fwu>E$_)LXCNC4;o7utIZZaQ}Zgyg|VOCBFFnZdrnMu5wPg( znplGt!GFbgx;+!)5E@tAx*Ut{DY`oebxup*EGSPD`N~{tWz6Vu!pQyh2_-(Ol|fhQ zMTg@=tvm-y*t|jD&T@wBXr`F-kdU=|cr9Dtkx*{9wLkWibga*q2Dao7xMk^wq=-i~ zlt#R2w)7`-qX?Z`*>t7F=XASt5bRWP7B!%}SDNH=6>Bn-DnGuIX716u)}e{xTVmqu zu{YU;OH;J07NcJAiMGt?)u$e5hAC8!4?NNQ`BUDf17blRIrL8GxbS6))qBsZx7He} zZ>aa?edOD3=s`1Q#k0e2{I5qVCkuW?UGUY^YU4eI25ukNbzF>gynpLI+Uk2@&@A7w zr)Mq;)L@Ljram#zn~mgU=WnL)YE{rIMceV*NN`y^qlMB^-EisWO=!K>5)6BrDS zqretk%(yGcc6XKu)Q#lrV=`%TIR`nMZcmyWwkzA*XfQDYeRUK0 zJW~_Y=+cD)k0)}R9f|8@bL>6Y3mp)_%KF~rDtaa}4up%Z^q{6gsfEP|U}@a|tBxqU z`A^#XwCK^VzzC=Al}QkiI*Y#L=s)WEbdD(>KC}WoEzoS5CbSVmzBzd06c$KO1xqr}f z;~8t_9<#$lEQZoX@qg>&ZodJux2T5;moxGGJ8y@SL# z&u`B^zyyZTNYY+oW+U*i<`O?&NZkA9WQenWzF+A?IvbI(_-4ue`4DTq`37=ifh!Vx zlKU$HJ4^VS&rlTVdbJ^q74w}rW&ZeB{y@e9691Xv_iF6gmU?5=INFmw)`q>=1E2IB zSuNb$`BeKGFZ?%ZNRcbKr5_1+5hBP`*3=_mvkpq& zLD9{alTwoOmME-vup_BeZ6(9kB?xOc@IB0zSAA3KbO0-G`4yii&&I^abu!TQgZqQI zaM>R3xz2OEkfxtF$X>9IvwL&_qj0IXYNUTHK~|vuF^GdYdV$kQtiC9 z9Qb%Jsd*`#f`*r#VbZ2E+jh#thm5)Y%7}8w&&uic21T7>ZEH4$Zf>Ejpy}n zh|rkcWd1BbHrl&c$w8)i>~F--q8<_kR@*) znDfEtv~7d6cFXx_E4f&1sRN1$LA$M3Bnb&{Vu;WYAgU-wqSU}zJ+tC5yyf&@yD@03 zZ^MGW5Zijcam)AOcCxZ}MRyYp3U@G(K zPVko)=7^LQhCxKb;FPXpOspy{;TfK$)z$ zV~6EeG}9wM-%i<7)?p{^?15i5vPzZfEGHh*dOfSO?xTge+|MY`)I?V7W>)NoQ_okN zwnr@=c(+*92R=UUpDIpFs-e}H4#D!aM!cxyPxrO;SY64i7!a~XdX6hOo(o|uF-VH^ zL%4~+El2gfWFD=a&OWuzIlVscjUOhcKnce65=iM7G058DJF@P~Fdq+^$X3pj4N>;! z%GH4Yheu_SCwx0Nda2@9M!qmIL4Y9mcR{s6H zHVW9^K60txc<>YIi9pUx2Q&QqgEVI|c$Ocw+5Z;jq_(?!+~0#!fa2lFe`DyCZ7n_C z8S9OaG!ES@WbeqLf?&I%(9#0^a@i;!G6P8)*QJyMwUQ?8@sJ%;juTWQ`RZ0Qyr02~ zo9ndcP8d?V7Qz_bE7?~i;ze?mt@Aj+V-%AO=&y-Uj(>OOCtFMwjE%H=tZ6g0Qq(SG zE6*_NS?AumQjK5C73|gc#^({&@izL*&td5v#5BwISE#P&5;c8C|Bcy zo~xEv;U;pf(48t7=@+y38q;aA3jCNc{6gvw z5KRmR@S(9=j>_?rfw14YXasq9?rN(P{Y0>+swXz%r=^g`ke+(=QV$dKwCnS7QfXYh z2ikY{e(Sps0$iavI(HT$SHet{3&OUF&xfx5I@60=J7mWYfdD0|%AGxQIyenx>~ zk^Z{k>wafIS_E%{nqSpVJOa;fxA0Hh!uFWtLejW^%Bhq&ypFQ+#zOBs{gG7vys(TAI^0DZ<%Yit(Q)yUpRoaatAkmGqCo<}Z> zKyNNlf`kS;Xrz2|2YPOL`Z8*wtpp~{r zr<~CHZTq@i+OdmQ%{}U?K}?L$jd)qGC>4v}=Mpj^;krFP`JS4h{8)7H7g-u3NSERk zxpezNC0i6hGq#!i=CE1}sV5;EmuJ)~V!Bj4$qiGzSFRL)jZf`HG4V<-Qz-X^{aPBg zUZ2sh3t>IC%VK^f&4dmPjW{!6rYlgb6LYFxX7|E*XP>ucc*_mbr#ut=S+I2FS1?dR z?>8`46zL#0^xs|pwQD;Fr&6gvLoap*9g3#LN{J6_z=p2WbQPO4j1Cyct>5)y^l(_Y0fc} z`H*Gb)BnbQomn(n@GdWn4yepBEU^a3CgY_}^f;zaP3Y-yIv-WyYfBfPfL*3?V~_<> zwyeCDFkq-=`@|^W*JDHMoU2cUVn*ZS&j(MMvV7j}AjC6oi7roj~$0@9G?Q=JIxA$;)eX8ErOPI_lkawV4=MwF zESfKPL9fA%$HzYlTQ3GO%bXI0jL%`c?&TzUMVlgqxMNU5sv~Qy2*EQUs}{LajjrCJ zA9Tt&0p%yx>qB#9J%ckjjDw)B1pE5-otJhO$Az}t-n?rA@voSa@)WLB4bejWgue3p zyicRkr!ma!8E%zxWL@W0aH|>%*2|QN^^&30byK|2Ti5o%@>=@Y7JJQ4<29b!8q#v* z5Y|nKiNakN0QOd6M#2-`ifU+J8Gj}p{rVLAp|0C>MLuPZ_4jT6iCuYDcHl%q;Erql zdj6ccz`hd#VT0way+z{!D&Ly(&76tr@l1tD25E4_XmUN2?g5==XV!3#QBNR}C?(#PQOvXfvg9 zs6FS_r|=gLkzXHprUf*Gd2$wXX;+?klBV&=bEhT^;d|tyYi(4fYgeCr2g|OC=GSuF zMw6I`X(d%fi?}__`U|U}S#kmT(B`z`3i)ZBsGu6#CD5?O`Xi0<^U)^sL1vLiLiHjY z+0v>;?hA;+9#E*wxIY7&w`7w^3vf{6*$EYEvA;_7)=B^sw6d@$?ee}cmRB1)X3o;C zfmtPt^nwoCY6TeTEqs~|O8*4z)OUdL7r$QC<(Z*?$EQO*JI)Ozw;5<}zl?9DM%g0E zR~$641j^(4Aw7_ac2jY)9I$ocUBlhXl_T>oSl*Z@c$M~e&0SEpSw!_M_}EP{2Pri6 zdvH&UOY!SG*U~N_boWnj&4!&mT;>X@Ck5v}VYJWBF0O{czIQ-oa^%n>-4p@ny>{8 zxl^t6f=u(fbZ=EtDu(3{>WDaoD9S84ZSzq{2fiON-Tr4Ym8Q9;_&&@|aRuS#zXF(4 zN{S{?RO%K-3usAp29Gg4iyAoOZLW48t>)z;Zwj&c-5#{e;p-YZ7!|H(;dxZ3pAt{o zGLH56N%Ol^x^e&q@2({}vHkjy-+aTKefFi*<|XGXFsZ9h@k*MK4O5mojhoJ|sQPMz z`@?Hy%n3@j^&DY_i+DIL7nO7jB+ZZQ(fQSc;2=PG$*Nz&aT(-0;obTeO4vsftP!-H z?qOv+0-WCtB=~1-t)Fbsr7}A2870(tT{`p}7nydsN`tY(o?mLj#O+qR-Y72gWn4;2 zM#6u``m*pvf17t$tL&F&DLm7G*S+gQ+H2-a554^~FxeV`hE-Xx@Z^ibQwYjI-Plu7 z0&ee^BrSnldqlS9XHoD59%Hy~gICEgBz5s>Y3Cta3)e#4)0?P#szB?xkR_3BV(+dI z*F(1xU<_a5_Jcfi2uGgW-Ue4b**md_mtPhKl-wR5ZC9)p1P`g}ADDAD8Rn`rReYh( zD?I$!d&b$!9W-p@dH%XSf{03Qc+g^J-8uG^=1ku~%XMhdhBG_S9#4}TIJT5^yv!#z z;~UMY=NRvc970vKs)$^N7b}~k$&emd?L3zh@g_^e*g1WVj2sPaUXGNPXe8{PC7}&5 zfxAJeMTOMYZXjj-0q@$PvfB@Y{5ym*vBJ(KQyWA3J=94RI<<6Q)ike$XnGyagMuUm zn$;gN3H!_yN+5eSTfGEY`BWXl$y{mS+N%Kb9Sj>D0!?zLSCf}!C-!RmNIxW*t=G6~ zW0eEX7pY7Rx?5jaCG2*g(i*ed07|HB-P4=nJOfI}CH$Y9AZzHI#I=sQUk79=I6s!V zB)#hz=Zj}NoXnSYc#!Z16Lz&xbireEdA&sJOLn+q`{$Zv<)riv3rsGVH^pxEq90Ll zG(aRc0{NClxaq~u#sfj&mPhEgzOPa}$cu*l9QB5oEb864 zN4tea$esD){d)`sO{iCbLk#W4g&+=H!bSukj|~^YSEM0Fo!~bj5}L!%ha06+86HF2 z$ik9llC}2ZCer*1o@dg_4TVCePMX_qpRi4i_rSt+8;86sCe3#p`QtwWGl7%bk>loL zrR!ydFIXUsNyEupMv|RKQHv=SIR^Y`UKL#wvcTE8)|eMi4V1>ZGi_TH-Rpk3%hvWi z{D7txEWq^HoC|`qRHSK|y5ZD%d*I7&ej|oBps}Z3AqUt@@g#3f_k!CPa0<6~PWE6W zF!Q7BTzV>`mMyI`=@26DM{A6b*Nt)o7AzIN)g{9Wz7#}%wAOt&v%|l?=h|)CeU-%T zejJAgOBuLAK`-G~MV>wwqcD;c?G!H_Z1B42H*+GoAK)O=gpb6Y1h zxiRSR8CQru(5J;K#vL{}?QxN;P8zWBj)ktWD%gOuCw?PPodH}~py$87UO&C$Hts_e zZWQnUY(?8xj@nz19KEB_6Lp-bi)K9Y4I~=-%GuZSPvf_A*sUwf@Y7Xp>ThpdqHiKb zKM=$u*-VEMP5C1lPB&jqX*KitR3vZ+B)w+P+>a6vNSZv4xpnVV3AaBS0iJwR~kV)N}pXx=ZjR)n&dro6VROA87Y{PoPU_D$#cO^2g;$ zZyN0}-gG}bDOAitfBtZsJk4vj;>|`@lx1SITX#`ZbLoV8eTaK_D;64YjgO;!MhEAl zOeg56k$GAJA~g@}6e563CZ);<#R`HTwES7 zt!3dqynX(&w4C^Q$9Kh}g!To5w7MiqJfc>eY-N=p7pp+E6eQUTq4ZR^oIT*k<@3H$ z2Xo-nGR3zo#aEQvTvrCG7Pc}&z)ovvc^2}qW$xffpKfP0=SSOoQ+(1~m4a#d7J3!@ zk=qRXVPCVJ-W5F9Pn7f86nKdr#yaD)2ia}2!Vhaj7|f^jtITHFC8kf7d^hO0m11#) zk4Pg&6=7k5mAHM zj~(P)@$$T`ZhPO?s&ig$D}Oxd4R*Ml)CbZ;46yxjB!fN!1E4CA=j z&L0I~60f@E6&zB<`u?TXaZX`M>vpz%0AtVqZJ*hs05rJPyHv-9bN{Q7@(2m&&+LM< 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 Date: Wed, 1 Dec 2021 12:58:18 +0100 Subject: [PATCH 007/126] [RAC] fix failing alerts table pagination functional tests (#119985) * [RAC] fix failing alerts table pagination functional tests --- .../observability/alerts/data.json.gz | Bin 3909 -> 4051 bytes .../services/observability/alerts/common.ts | 33 +++++++++++++++- .../observability/alerts/pagination.ts | 6 +++ .../apps/observability/alerts/index.ts | 4 +- .../apps/observability/alerts/pagination.ts | 37 +++++++++++------- 5 files changed, 63 insertions(+), 17 deletions(-) diff --git a/x-pack/test/functional/es_archives/observability/alerts/data.json.gz b/x-pack/test/functional/es_archives/observability/alerts/data.json.gz index 544888178cb092cd9e71f1b82f7dd8967ac77d48..86bd5735e6206b8762d8a2188269b18cc33af6c4 100644 GIT binary patch literal 4051 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 F004T?#4i8< literal 3909 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 diff --git a/x-pack/test/functional/services/observability/alerts/common.ts b/x-pack/test/functional/services/observability/alerts/common.ts index dd7d49af4fe5a2..8c6352fff98640 100644 --- a/x-pack/test/functional/services/observability/alerts/common.ts +++ b/x-pack/test/functional/services/observability/alerts/common.ts @@ -6,6 +6,11 @@ */ import { chunk } from 'lodash'; +import { + ALERT_STATUS_ACTIVE, + ALERT_STATUS_RECOVERED, + AlertStatus, +} from '@kbn/rule-data-utils/alerts_as_data_status'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { WebElementWrapper } from '../../../../../../test/functional/services/lib/web_element_wrapper'; @@ -192,7 +197,6 @@ export function ObservabilityAlertsCommonProvider({ const viewRuleDetailsLinkClick = async () => { return await (await testSubjects.find(VIEW_RULE_DETAILS_FLYOUT_SELECTOR)).click(); }; - // Workflow status const setWorkflowStatusForRow = async (rowIndex: number, workflowStatus: WorkflowStatus) => { await openActionsMenuForRow(rowIndex); @@ -220,6 +224,30 @@ export function ObservabilityAlertsCommonProvider({ return await selectedWorkflowStatusButton.getVisibleText(); }; + // Alert status + const setAlertStatusFilter = async (alertStatus?: AlertStatus) => { + let buttonSubject = 'alert-status-filter-show-all-button'; + if (alertStatus === ALERT_STATUS_ACTIVE) { + buttonSubject = 'alert-status-filter-active-button'; + } + if (alertStatus === ALERT_STATUS_RECOVERED) { + buttonSubject = 'alert-status-filter-recovered-button'; + } + const buttonGroupButton = await testSubjects.find(buttonSubject); + await buttonGroupButton.click(); + }; + + const alertDataIsBeingLoaded = async () => { + return testSubjects.existOrFail('events-container-loading-true'); + }; + + const alertDataHasLoaded = async () => { + await retry.waitFor( + 'Alert Table is loaded', + async () => await testSubjects.exists('events-container-loading-false', { timeout: 2500 }) + ); + }; + // Date picker const getTimeRange = async () => { const isAbsoluteRange = await testSubjects.exists('superDatePickerstartDatePopoverButton'); @@ -266,6 +294,9 @@ export function ObservabilityAlertsCommonProvider({ setWorkflowStatusForRow, setWorkflowStatusFilter, getWorkflowStatusFilterValue, + setAlertStatusFilter, + alertDataIsBeingLoaded, + alertDataHasLoaded, submitQuery, typeInQueryBar, openActionsMenuForRow, diff --git a/x-pack/test/functional/services/observability/alerts/pagination.ts b/x-pack/test/functional/services/observability/alerts/pagination.ts index 6bffcf3596e2d7..e9e7b7c7d5ca2c 100644 --- a/x-pack/test/functional/services/observability/alerts/pagination.ts +++ b/x-pack/test/functional/services/observability/alerts/pagination.ts @@ -83,6 +83,11 @@ export function ObservabilityAlertsPaginationProvider({ getService }: FtrProvide await (await getPaginationButtonOne()).click(); }; + const goToNthPage = async (page: number) => { + const pageButton = await testSubjects.find(`pagination-button-${page - 1}`); + await pageButton.click(); + }; + const getPrevButtonDisabledValue = async () => { return await (await getPrevPageButton()).getAttribute('disabled'); }; @@ -105,5 +110,6 @@ export function ObservabilityAlertsPaginationProvider({ getService }: FtrProvide goToPrevPage, goToFirstPage, getPrevButtonDisabledValue, + goToNthPage, }; } diff --git a/x-pack/test/observability_functional/apps/observability/alerts/index.ts b/x-pack/test/observability_functional/apps/observability/alerts/index.ts index 048c007dcb6a46..3abf04ed29e670 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/index.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/index.ts @@ -15,14 +15,14 @@ async function asyncForEach(array: T[], callback: (item: T, index: number) => } const ACTIVE_ALERTS_CELL_COUNT = 78; -const RECOVERED_ALERTS_CELL_COUNT = 100; +const RECOVERED_ALERTS_CELL_COUNT = 120; const TOTAL_ALERTS_CELL_COUNT = 165; export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); const find = getService('find'); - describe('Observability alerts 1', function () { + describe('Observability alerts', function () { this.tags('includeFirefox'); const testSubjects = getService('testSubjects'); diff --git a/x-pack/test/observability_functional/apps/observability/alerts/pagination.ts b/x-pack/test/observability_functional/apps/observability/alerts/pagination.ts index a00fbe2a77f346..8fe91d686c59c3 100644 --- a/x-pack/test/observability_functional/apps/observability/alerts/pagination.ts +++ b/x-pack/test/observability_functional/apps/observability/alerts/pagination.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { ALERT_STATUS_ACTIVE } from '@kbn/rule-data-utils/alerts_as_data_status'; import { FtrProviderContext } from '../../../ftr_provider_context'; const ROWS_NEEDED_FOR_PAGINATION = 10; @@ -15,7 +16,7 @@ export default ({ getService }: FtrProviderContext) => { const esArchiver = getService('esArchiver'); // FAILING: https://github.com/elastic/kibana/issues/113486 - describe.skip('Observability alerts pagination', function () { + describe('Observability alerts pagination', function () { this.tags('includeFirefox'); const retry = getService('retry'); @@ -23,21 +24,25 @@ export default ({ getService }: FtrProviderContext) => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/observability/alerts'); + await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); + await observability.alerts.common.navigateToTimeWithData(); }); after(async () => { await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); + await esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs'); }); describe(`When less than ${ROWS_NEEDED_FOR_PAGINATION} alerts are found`, () => { before(async () => { - // current archiver has 3 closed alerts - await observability.alerts.common.setWorkflowStatusFilter('closed'); + // current archiver has 8 active alerts + await observability.alerts.common.setAlertStatusFilter(ALERT_STATUS_ACTIVE); }); after(async () => { - await observability.alerts.common.setWorkflowStatusFilter('open'); + // current archiver has 33 alerts + await observability.alerts.common.setAlertStatusFilter(); }); it('Does not render page size selector', async () => { @@ -50,11 +55,6 @@ export default ({ getService }: FtrProviderContext) => { }); describe(`When ${ROWS_NEEDED_FOR_PAGINATION} alerts are found`, () => { - before(async () => { - // current archiver has 12 open alerts - await observability.alerts.common.setWorkflowStatusFilter('open'); - }); - describe('Page size selector', () => { it('Renders page size selector', async () => { await observability.alerts.pagination.getPageSizeSelectorOrFail(); @@ -92,12 +92,11 @@ export default ({ getService }: FtrProviderContext) => { before(async () => { await (await observability.alerts.pagination.getPageSizeSelector()).click(); await (await observability.alerts.pagination.getTenRowsPageSelector()).click(); - }); - beforeEach(async () => { await observability.alerts.pagination.goToFirstPage(); }); it('Renders previous page button', async () => { + await observability.alerts.common.alertDataHasLoaded(); await observability.alerts.pagination.getPrevPageButtonOrFail(); }); @@ -111,17 +110,27 @@ export default ({ getService }: FtrProviderContext) => { expect(prevButtonDisabledValue).to.be('true'); }); + it('Goes to nth page', async () => { + await observability.alerts.pagination.goToNthPage(3); + await observability.alerts.common.alertDataIsBeingLoaded(); + await observability.alerts.common.alertDataHasLoaded(); + const tableRows = await observability.alerts.common.getTableCellsInRows(); + expect(tableRows.length).to.be(10); + }); + it('Goes to next page', async () => { await observability.alerts.pagination.goToNextPage(); + await observability.alerts.common.alertDataIsBeingLoaded(); + await observability.alerts.common.alertDataHasLoaded(); const tableRows = await observability.alerts.common.getTableCellsInRows(); - expect(tableRows.length).to.be(2); + expect(tableRows.length).to.be(3); }); it('Goes to previous page', async () => { - await (await observability.alerts.pagination.getPaginationButtonTwo()).click(); await observability.alerts.pagination.goToPrevPage(); + await observability.alerts.common.alertDataIsBeingLoaded(); + await observability.alerts.common.alertDataHasLoaded(); const tableRows = await observability.alerts.common.getTableCellsInRows(); - expect(tableRows.length).to.be(10); }); }); From f1aae775a9aabb0f69cb338f41cb00ce52f41730 Mon Sep 17 00:00:00 2001 From: Esteban Beltran Date: Wed, 1 Dec 2021 07:12:09 -0500 Subject: [PATCH 008/126] [Security Solution] Update host isolation exceptions test to check for specific API call (#119876) --- .../view/host_isolation_exceptions_list.test.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx index f6f68f1f6e9709..81e46eb8e2a2bb 100644 --- a/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/view/host_isolation_exceptions_list.test.tsx @@ -142,7 +142,15 @@ describe('When on the host isolation exceptions page', () => { userEvent.click(renderResult.getByTestId('searchButton')); // wait for the page render - await waitForApiCall(); + await waitFor(() => + expect(getHostIsolationExceptionItemsMock).toHaveBeenLastCalledWith({ + filter: + '(exception-list-agnostic.attributes.name:(*this*does*not*exists*) OR exception-list-agnostic.attributes.description:(*this*does*not*exists*) OR exception-list-agnostic.attributes.entries.value:(*this*does*not*exists*))', + http: mockedContext.coreStart.http, + page: 1, + perPage: 10, + }) + ); // check the url changed expect(mockedContext.history.location.search).toBe('?filter=this%20does%20not%20exists'); From f9125c1157d3b1697fa1cf4fc07eab8d28054097 Mon Sep 17 00:00:00 2001 From: Muhammad Ibragimov <53621505+mibragimov@users.noreply.github.com> Date: Wed, 1 Dec 2021 17:27:36 +0500 Subject: [PATCH 009/126] [Console] Fix error markers in editor output (#119831) * Replace json with hjson Co-authored-by: Muhammad Ibragimov Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../editor/legacy/console_editor/editor_output.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx index cb5301fa41c1d8..9f9cdcad9115bf 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx @@ -12,7 +12,7 @@ import React, { useEffect, useRef } from 'react'; // Ensure the modes we might switch to dynamically are available import 'brace/mode/text'; -import 'brace/mode/json'; +import 'brace/mode/hjson'; import 'brace/mode/yaml'; import { expandLiteralStrings } from '../../../../../shared_imports'; @@ -47,7 +47,8 @@ function modeForContentType(contentType?: string) { return 'ace/mode/text'; } if (isJSONContentType(contentType)) { - return 'ace/mode/json'; + // Using hjson will allow us to use comments in editor output and solves the problem with error markers + return 'ace/mode/hjson'; } else if (contentType.indexOf('application/yaml') >= 0) { return 'ace/mode/yaml'; } From f3aa7612529e125e239c3a533888fabb6e8117b8 Mon Sep 17 00:00:00 2001 From: Pierre Gayvallet Date: Wed, 1 Dec 2021 14:11:44 +0100 Subject: [PATCH 010/126] Improve the HTTP and routing doc with more examples (#119591) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- dev_docs/tutorials/endpoints.mdx | 437 ++++++++++++++++++++++++++++--- 1 file changed, 394 insertions(+), 43 deletions(-) diff --git a/dev_docs/tutorials/endpoints.mdx b/dev_docs/tutorials/endpoints.mdx index 1d6fc0edf1e643..5f2fc7da010c7b 100644 --- a/dev_docs/tutorials/endpoints.mdx +++ b/dev_docs/tutorials/endpoints.mdx @@ -3,24 +3,105 @@ id: kibDevTutorialServerEndpoint slug: /kibana-dev-docs/tutorials/registering-endpoints title: Registering and accessing an endpoint summary: Learn how to register a new endpoint and access it -date: 2021-10-05 +date: 2021-11-24 tags: ['kibana', 'dev', 'architecture', 'tutorials'] --- -## Registering an endpoint +## The HTTP service API + +### The server-side HTTP service The server-side `HttpService` allows server-side plugins to register endpoints with built-in support for request validation. These endpoints may be used by client-side code or be exposed as a public API for users. Most plugins integrate directly with this service. The service allows plugins to: -- to extend the Kibana server with custom HTTP API. -- to execute custom logic on an incoming request or server response. -- to implement custom authentication and authorization strategy. +- extend the Kibana server with custom HTTP API. +- execute custom logic on an incoming request or server response. +- implement custom authentication and authorization strategy. See [the server-side HTTP service API docs](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.httpservicesetup.md) -**Registering a basic GET endpoint** +### The client-side HTTP service + +The client-side counterpart of the HTTP service provides an API to communicate with the Kibana server via HTTP interface. +The client-side `HttpService` is a preconfigured wrapper around `window.fetch` that includes some default behavior and automatically handles common errors (such as session expiration). + +**The service should only be used for access to backend endpoints registered by the same plugin.** Feel free to use another HTTP client library to request 3rd party services. + + + See [the client-side HTTP service API docs](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.httpsetup.md) + + +## Registering an endpoint + +Registering an endpoint, or `route`, is done during the `setup` lifecycle stage of a plugin. The first step to register a route +is to create a [router](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.irouter.md) +using the `http` core service. + +Once the router is instantiated, it is possible to use its APIs, such as `router.get` or `router.post` to create a route for the equivalent +HTTP method. All these APIs share the same signature, and receive two parameters: +- `route` - the route configuration, such as the `path` of the route, or the parameter validation schemas +- `handler` - the handler function that will be called when a request matching the route configuration is received + +When invoked, the `handler` receive three parameters: `context`, `request`, and `response`, and must return a response that will be sent to serve +the request. +- `context` is a request-bound context exposed for the request. It allows for example to use an elasticsearch client bound to the request's credentials. +- `request` contains information related to the request, such as the path and query parameter +- `response` contains factory helpers to create the response to return from the endpoint + + + See the [request](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.kibanarequest.md) + and [response](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.kibanaresponsefactory.md) + documentation + + +## Basic examples + +### Registering a GET endpoint + +The following snippet demonstrate how to create a basic `GET` endpoint on the `/api/my_plugin/get_object` path: + +```ts +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/get_object', + validate: false, + }, + async (context, request, response) => { + return response.ok({ + body: { result: 'everything is alright'}, + }); + } + ); + } +} +``` + +consuming the endpoint from the client-side using core's `http` service would then look like: + +```ts +import { HttpStart } from 'kibana/public'; + +interface ResponseType { + result: string; +}; + +async function fetchData(http: HttpStart) { + return await http.get(`/api/my_plugin/get_object`); +} +``` + +### Using and validating path parameters + +It is possible to specify dynamic parameters in the `path` of the endpoint using the `{name}` syntax. +When doing so, the associated validation schema must be defined via the `validate.params` option +of the route definition. ```ts import { schema } from '@kbn/config-schema'; @@ -29,59 +110,329 @@ import type { CoreSetup, Plugin } from 'kibana/server'; export class MyPlugin implements Plugin { public setup(core: CoreSetup) { const router = core.http.createRouter(); - - const validate = { - params: schema.object({ - id: schema.string(), - }), - }; - - router.get({ - path: '/api/my_plugin/{id}', - validate - }, - async (context, request, response) => { - const data = await findObject(request.params.id); - if (!data) return response.notFound(); - return response.ok({ - body: data, - headers: { - 'content-type': 'application/json' + router.get( + { + path: '/api/my_plugin/get_object/{id}', + validate: { + params: schema.object({ + id: schema.string(), + }) + }, + }, + async (context, request, response) => { + const { id } = request.params; + const data = await findObject(id); + if (!data) { + return response.notFound(); } - }); - }); + return response.ok({ body: data }); + } + ); } } ``` - - See [the routing example plugin](https://github.com/elastic/kibana/blob/main/examples/routing_example) for more route registration examples. - +consuming the endpoint from the client-side using core's `http` service would then look like: + +```ts +import { HttpStart } from 'kibana/public'; +import { MyObjectType } from '../common/types'; -## Consuming the endpoint from the client-side +async function fetchData(http: HttpStart, id: string) { + return await http.get(`/api/my_plugin/get_object/${id}`); +} +``` -The client-side HTTP service provides an API to communicate with the Kibana server via HTTP interface. -The client-side `HttpService` is a preconfigured wrapper around `window.fetch` that includes some default behavior and automatically handles common errors (such as session expiration). +### Registering a POST endpoint and validating the payload -**The service should only be used for access to backend endpoints registered by the same plugin.** Feel free to use another HTTP client library to request 3rd party services. +Similar to the validation we performed against the path parameters in the previous example, the `body` validation schema +must be provided when registering a `post` handler that will access the payload. + +```ts +import { schema } from '@kbn/config-schema'; +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.post( + { + path: '/api/my_plugin/objects/{id}/update', + validate: { + params: schema.object({ + id: schema.string(), + }), + body: schema.object({ + title: schema.string(), + description: schema.string() + }), + }, + }, + async (context, request, response) => { + const { id } = request.params; + const { title, description } = request.body; + await updateObject(id, { title, description }); + return response.ok({ body: { updated: true }}); + } + ); + } +} +``` + +consuming the endpoint from the client-side using core's `http` service would then look like: ```ts import { HttpStart } from 'kibana/public'; -interface ResponseType {…}; +interface ResponseType { + updated: boolean; +}; -async function fetchData(http: HttpStart, id: string) { - return await http.get( - `/api/my_plugin/${id}`, - { query: … }, - ); +interface UpdateOptions { + title?: string; + description?: string; +} + +async function fetchData(http: HttpStart, id: string, { title, description }: UpdateOptions) { + return await http.post(`/api/my_plugin/objects/${id}/update`, { + body: JSON.stringify({ title, description }) + }); } ``` - - See [the client-side HTTP service API docs](https://github.com/elastic/kibana/blob/main/docs/development/core/public/kibana-plugin-core-public.httpsetup.md) - +### Using the query parameters + +Similar to the `body` validation, the query parameters schema has to be defined using the `validate.query` +option of the route definition to be accessible from the handler. + +```ts +import { schema } from '@kbn/config-schema'; +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/objects/find', + validate: { + query: schema.object({ + term: schema.maybe(schema.string()), + page: schema.number({ min: 1, defaultValue: 1 }), + perPage: schema.number({ min: 5, max: 50, defaultValue: 10 }), + }), + }, + }, + async (context, request, response) => { + const { term, page, perPage } = request.query; + const results = await findObjects(term, { page, perPage }); + return response.ok({ body: { results } }); + } + ); + } +} +``` + +consuming the endpoint from the client-side using core's `http` service would then look like: + +```ts +import { HttpStart } from 'kibana/public'; +import { MyObjectType } from '../common/types'; + +interface ResponseType { + results: MyObjectType[]; +}; + +interface UpdateOptions { + term?: string; + page?: number; + perPage?: number; +} + +async function fetchData(http: HttpStart, { term, page, perPage }: UpdateOptions) { + return await http.get(`/api/my_plugin/objects/find`, { + query: { term, page, perPage }, + }); +} +``` + +## Customizing the response + +### Attaching headers to the response + +All APIs of the `response` parameter of the handler accept a `headers` property that can be used +to define headers to attach to the response. + +```ts +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/some_text_response', + validate: false, + }, + async (context, request, response) => { + return response.ok({ + body: 'some plain text response', + headers: { + 'content-type': 'text/plain', + 'cache-control': 'must-revalidate', + }, + }); + } + ); + } +} +``` + +### Defining a specific HTTP status code for the response + +The `response` parameter of the handler already provides APIs for the most common HTTP response codes, such as +- `response.ok` for `200` +- `response.notFound` for `404` +- `response.badRequest` for `400` +- and so on + +However, some of the less commonly used return codes don't have such helpers. In that case, the `response.custom` +and/or `response.customError` APIs should be used. + +```ts +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/some_text_response', + validate: false, + }, + async (context, request, response) => { + return response.custom({ + body: `Kibana is a teapot`, + statusCode: 418, + }); + } + ); + } +} +``` + +## Some advanced usages + +### Handling request cancellation + +Some request lifecycle events are exposed to the handler via `request.events` in the form of `rxjs` +observables, such as `request.events.aborted$` that emits if/when the request is canceled by the client. + +These observables can either be used directly, or be used to control an `AbortController`. + +```ts +import { schema } from '@kbn/config-schema'; +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/objects/find', + validate: { + query: schema.object({ + term: schema.maybe(schema.string()), + }), + }, + }, + async (context, request, response) => { + const { term } = request.query; + const { aborted$ } = request.events; + + const abortController = new AbortController(); + aborted$.subscribe(() => { + abortController.abort(); + }); + + const results = await findObjects(term, { abortController }); + return response.ok({ body: results }); + } + ); + } +} +``` + +### Disabling authentication for an endpoint + +By default, when security is enabled, endpoints require the user to be authenticated to be accessed, +and will return a `401 - Unauthorized` otherwise. + +It is possible to disable this requirement using the `authRequired` option of the route. + +```ts +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/get_object', + validate: false, + options: { + authRequired: false, + }, + }, + async (context, request, response) => { + return response.ok({ + body: { authenticated: request.auth.isAuthenticated }, + }); + } + ); + } +} +``` + +Note that in addition to `true` and `false`, `authRequired` accepts a third value, `'optional'`. When used, +Kibana will try to authenticate the user but will allow access to the endpoint regardless of the result. In that +case, the developer needs to manually checks if the user is authenticated via `request.auth.isAuthenticated`. + +### Accessing the url or route configuration from the handler + +In some advanced use cases, such as generic handlers being used for multiple routes, it can be useful to know, +from within the handler, the route configuration and the actual url that was requested by the user. This can +be achieved by using the `url` and `route` properties of the `request` parameter of the handler. + +request.url / request.route + +```ts +import type { CoreSetup, Plugin } from 'kibana/server'; + +export class MyPlugin implements Plugin { + public setup(core: CoreSetup) { + const router = core.http.createRouter(); + router.get( + { + path: '/api/my_plugin/get_object', + validate: false, + options: { + authRequired: false, + }, + }, + async (context, request, response) => { + const { url, route } = request; + return response.ok({ + body: `You requested ${route.method} ${url}`, + }); + } + ); + } +} +``` + +## More examples - See [the routing example plugin](https://github.com/elastic/kibana/blob/main/examples/routing_example) for more endpoint consumption examples. + See [the routing example plugin](https://github.com/elastic/kibana/blob/main/examples/routing_example) for more route registration examples. From 44a070f6db146a181d93ca0ffa25a43330deef88 Mon Sep 17 00:00:00 2001 From: Angela Chuang <6295984+angorayc@users.noreply.github.com> Date: Wed, 1 Dec 2021 13:29:12 +0000 Subject: [PATCH 011/126] [SecuritySolution] Fix styling issue for data views (#119972) * styling * rm styled component --- .../index_pattern_table.tsx | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx b/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx index eeed4b9054d7b8..fdbd6543b08bac 100644 --- a/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx +++ b/src/plugins/data_view_management/public/components/index_pattern_table/index_pattern_table.tsx @@ -5,15 +5,16 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - +import { css } from '@emotion/react'; import { EuiBadge, EuiButton, - EuiBadgeGroup, EuiButtonEmpty, EuiInMemoryTable, EuiPageHeader, EuiSpacer, + EuiFlexItem, + EuiFlexGroup, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { RouteComponentProps, withRouter, useLocation } from 'react-router-dom'; @@ -59,6 +60,10 @@ const securityDataView = i18n.translate( const securitySolution = 'security-solution'; +const flexItemStyles = css` + justify-content: center; +`; + interface Props extends RouteComponentProps { canSave: boolean; showCreateDialog?: boolean; @@ -120,19 +125,24 @@ export const IndexPatternTable = ({ } ) => ( <> - - {name} - -   - + + + + {name} + + {index.id && index.id.indexOf(securitySolution) === 0 && ( - {securityDataView} + + {securityDataView} + )} {index.tags && index.tags.map(({ key: tagKey, name: tagName }) => ( - {tagName} + + {tagName} + ))} - + ), dataType: 'string' as const, From 722a33ffb362359ad1ed42af17c44ae1ad60029e Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Wed, 1 Dec 2021 14:30:51 +0100 Subject: [PATCH 012/126] add docs how to debug Kibana using log correlation (#119640) * add docs how to debug Kibana using log correlation * Apply suggestions from code review Co-authored-by: Rudolf Meijering * Apply suggestions from code review Co-authored-by: Christiane (Tina) Heiligers * add a link to ECS JSON format * Apply suggestions from code review Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> Co-authored-by: Rudolf Meijering Co-authored-by: Christiane (Tina) Heiligers Co-authored-by: gchaps <33642766+gchaps@users.noreply.github.com> --- .../getting-started/debugging.asciidoc | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/docs/developer/getting-started/debugging.asciidoc b/docs/developer/getting-started/debugging.asciidoc index 1254462d2e4eac..f3308a12673869 100644 --- a/docs/developer/getting-started/debugging.asciidoc +++ b/docs/developer/getting-started/debugging.asciidoc @@ -130,3 +130,71 @@ Once you're finished, you can stop Kibana normally, then stop the {es} and APM s ---- ./scripts/compose.py stop ---- + +=== Using {kib} server logs +{kib} Logs is a great way to see what's going on in your application and to debug performance issues. Navigating through a large number of generated logs can be overwhelming, and following are some techniques that you can use to optimize the process. + +Start by defining a problem area that you are interested in. For example, you might be interested in seeing how a particular {kib} Plugin is performing, so no need to gather logs for all of {kib}. Or you might want to focus on a particular feature, such as requests from the {kib} server to the {es} server. +Depending on your needs, you can configure {kib} to generate logs for a specific feature. +[source,yml] +---- +logging: + appenders: + file: + type: file + fileName: ./kibana.log + layout: + type: json + +### gather all the Kibana logs into a file +logging.root: + appenders: [file] + level: all + +### or gather a subset of the logs +logging.loggers: + ### responses to an HTTP request + - name: http.server.response + level: debug + appenders: [file] + ### result of a query to the Elasticsearch server + - name: elasticsearch.query + level: debug + appenders: [file] + ### logs generated by my plugin + - name: plugins.myPlugin + level: debug + appenders: [file] +---- +WARNING: Kibana's `file` appender is configured to produce logs in https://www.elastic.co/guide/en/ecs/master/ecs-reference.html[ECS JSON] format. It's the only format that includes the meta information necessary for https://www.elastic.co/guide/en/apm/agent/nodejs/current/log-correlation.html[log correlation] out-of-the-box. + +The next step is to define what https://www.elastic.co/observability[observability tools] are available. +For a better experience, set up an https://www.elastic.co/guide/en/apm/get-started/current/observability-integrations.html[Observability integration] provided by Elastic to debug your application with the <> +To debug something quickly without setting up additional tooling, you can work with <> + +[[debugging-logs-apm-ui]] +==== APM UI +*Prerequisites* {kib} logs are configured to be in https://www.elastic.co/guide/en/ecs/master/ecs-reference.html[ECS JSON] format to include tracing identifiers. + +To debug {kib} with the APM UI, you must set up the APM infrastructure. You can find instructions for the setup process +https://www.elastic.co/guide/en/apm/get-started/current/observability-integrations.html[on the Observability integrations page]. + +Once you set up the APM infrastructure, you can enable the APM agent and put {kib} under load to collect APM events. To analyze the collected metrics and logs, use the APM UI as demonstrated https://www.elastic.co/guide/en/kibana/master/transactions.html#transaction-trace-sample[in the docs]. + +[[plain-kibana-logs]] +==== Plain {kib} logs +*Prerequisites* {kib} logs are configured to be in https://www.elastic.co/guide/en/ecs/master/ecs-reference.html[ECS JSON] format to include tracing identifiers. + +Open {kib} Logs and search for an operation you are interested in. +For example, suppose you want to investigate the response times for queries to the `/api/telemetry/v2/clusters/_stats` {kib} endpoint. +Open Kibana Logs and search for the HTTP server response for the endpoint. It looks similar to the following (some fields are omitted for brevity). +[source,json] +---- +{ + "message":"POST /api/telemetry/v2/clusters/_stats 200 1014ms - 43.2KB", + "log":{"level":"DEBUG","logger":"http.server.response"}, + "trace":{"id":"9b99131a6f66587971ef085ef97dfd07"}, + "transaction":{"id":"d0c5bbf14f5febca"} +} +---- +You are interested in the https://www.elastic.co/guide/en/ecs/current/ecs-tracing.html#field-trace-id[trace.id] field, which is a unique identifier of a trace. The `trace.id` provides a way to group multiple events, like transactions, which belong together. You can search for `"trace":{"id":"9b99131a6f66587971ef085ef97dfd07"}` to get all the logs that belong to the same trace. This enables you to see how many {es} requests were triggered during the `9b99131a6f66587971ef085ef97dfd07` trace, what they looked like, what {es} endpoints were hit, and so on. From 5667523793b89e42852a4541a92b5fa939b6814b Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Wed, 1 Dec 2021 14:31:24 +0100 Subject: [PATCH 013/126] enable execution_context by default (#119932) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- src/core/server/execution_context/execution_context_config.ts | 2 +- test/plugin_functional/config.ts | 1 - x-pack/test/functional_execution_context/config.ts | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/core/server/execution_context/execution_context_config.ts b/src/core/server/execution_context/execution_context_config.ts index 0f63952d5cfa9e..af6e7253433f7b 100644 --- a/src/core/server/execution_context/execution_context_config.ts +++ b/src/core/server/execution_context/execution_context_config.ts @@ -10,7 +10,7 @@ import { TypeOf, schema } from '@kbn/config-schema'; import { ServiceConfigDescriptor } from '../internal_types'; const configSchema = schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), }); /** diff --git a/test/plugin_functional/config.ts b/test/plugin_functional/config.ts index 5b74463703797b..4a96b2b4028986 100644 --- a/test/plugin_functional/config.ts +++ b/test/plugin_functional/config.ts @@ -60,7 +60,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { '--corePluginDeprecations.noLongerUsed=still_using', // for testing set buffer duration to 0 to immediately flush counters into saved objects. '--usageCollection.usageCounters.bufferDuration=0', - '--execution_context.enabled=true', ...plugins.map( (pluginDir) => `--plugin-path=${path.resolve(__dirname, 'plugins', pluginDir)}` ), diff --git a/x-pack/test/functional_execution_context/config.ts b/x-pack/test/functional_execution_context/config.ts index 6c7935593a18d8..a934b6e7634371 100644 --- a/x-pack/test/functional_execution_context/config.ts +++ b/x-pack/test/functional_execution_context/config.ts @@ -43,7 +43,6 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, '--server.requestId.allowFromAnyIp=true', - '--execution_context.enabled=true', '--logging.appenders.file.type=file', `--logging.appenders.file.fileName=${logFilePath}`, '--logging.appenders.file.layout.type=json', From eb2ddcd7c6edac8f159f70aca6c25de347621944 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Wed, 1 Dec 2021 07:32:05 -0600 Subject: [PATCH 014/126] [data views] data view api docs - index patterns => data views (#119415) * initial pass at changing urls and anchors * update api.asciidoc * upate a few more anchor tags * upate a few more anchor tags * update data view api docs * Update delete.asciidoc * Update default-get.asciidoc * add redirects * fix redirects * remove duplicate redirect Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- dev_docs/key_concepts/building_blocks.mdx | 2 +- dev_docs/tutorials/data_views.mdx | 2 +- docs/api/dashboard-api.asciidoc | 2 +- docs/api/data-views.asciidoc | 42 +++++++++++++ .../create.asciidoc | 34 +++++------ .../default-get.asciidoc | 22 +++---- .../default-set.asciidoc | 28 ++++----- .../delete.asciidoc | 22 +++---- .../get.asciidoc | 24 ++++---- .../runtime-fields/create.asciidoc | 16 ++--- .../runtime-fields/delete.asciidoc | 12 ++-- .../runtime-fields/get.asciidoc | 12 ++-- .../runtime-fields/update.asciidoc | 16 ++--- .../runtime-fields/upsert.asciidoc | 16 ++--- .../update-fields.asciidoc | 20 +++---- .../update.asciidoc | 32 +++++----- docs/api/index-patterns.asciidoc | 42 ------------- docs/api/saved-objects.asciidoc | 2 +- docs/redirects.asciidoc | 60 +++++++++++++++++++ docs/user/api.asciidoc | 2 +- 20 files changed, 234 insertions(+), 174 deletions(-) create mode 100644 docs/api/data-views.asciidoc rename docs/api/{index-patterns => data-views}/create.asciidoc (64%) rename docs/api/{index-patterns => data-views}/default-get.asciidoc (59%) rename docs/api/{index-patterns => data-views}/default-set.asciidoc (64%) rename docs/api/{index-patterns => data-views}/delete.asciidoc (51%) rename docs/api/{index-patterns => data-views}/get.asciidoc (67%) rename docs/api/{index-patterns => data-views}/runtime-fields/create.asciidoc (74%) rename docs/api/{index-patterns => data-views}/runtime-fields/delete.asciidoc (70%) rename docs/api/{index-patterns => data-views}/runtime-fields/get.asciidoc (78%) rename docs/api/{index-patterns => data-views}/runtime-fields/update.asciidoc (75%) rename docs/api/{index-patterns => data-views}/runtime-fields/upsert.asciidoc (78%) rename docs/api/{index-patterns => data-views}/update-fields.asciidoc (79%) rename docs/api/{index-patterns => data-views}/update.asciidoc (67%) delete mode 100644 docs/api/index-patterns.asciidoc diff --git a/dev_docs/key_concepts/building_blocks.mdx b/dev_docs/key_concepts/building_blocks.mdx index da3d0f32780bef..6536019f668cfc 100644 --- a/dev_docs/key_concepts/building_blocks.mdx +++ b/dev_docs/key_concepts/building_blocks.mdx @@ -72,7 +72,7 @@ Check out are a high-level, space-aware + are a high-level, space-aware abstraction layer that sits above Data Streams and Elasticsearch indices. Index Patterns provide users the ability to define and customize the data they wish to search and filter on, on a per-space basis. For example, users can specify a set of indices, and they can customize the field list with runtime fields, diff --git a/dev_docs/tutorials/data_views.mdx b/dev_docs/tutorials/data_views.mdx index 453146d81c4d7c..76c4bff8e51e38 100644 --- a/dev_docs/tutorials/data_views.mdx +++ b/dev_docs/tutorials/data_views.mdx @@ -83,4 +83,4 @@ await data.indexPatterns.delete(dataViewId); ### Data view HTTP API -Rest-like HTTP CRUD+ API - [docs](https://www.elastic.co/guide/en/kibana/master/index-patterns-api.html) +Rest-like HTTP CRUD+ API - [docs](https://www.elastic.co/guide/en/kibana/master/data-views-api.html) diff --git a/docs/api/dashboard-api.asciidoc b/docs/api/dashboard-api.asciidoc index e6f54dd9156ecb..e8d0a829d178dc 100644 --- a/docs/api/dashboard-api.asciidoc +++ b/docs/api/dashboard-api.asciidoc @@ -4,7 +4,7 @@ deprecated::[7.15.0,Both of these APIs have been deprecated in favor of <> and <>.] Import and export dashboards with the corresponding saved objects, such as visualizations, saved -searches, and index patterns. +searches, and data views. WARNING: Do not write documents directly to the `.kibana` index. When you write directly to the `.kibana` index, the data becomes corrupted and permanently breaks future {kib} versions. diff --git a/docs/api/data-views.asciidoc b/docs/api/data-views.asciidoc new file mode 100644 index 00000000000000..d7380cbd97c998 --- /dev/null +++ b/docs/api/data-views.asciidoc @@ -0,0 +1,42 @@ +[[data-views-api]] +== Data views API + +experimental[] Manage data views, formerly known as {kib} index patterns. + +WARNING: Do not write documents directly to the `.kibana` index. When you write directly +to the `.kibana` index, the data becomes corrupted and permanently breaks future {kib} versions. + +WARNING: Use the data views APIs for managing data views instead of lower-level <>. + +The following data views APIs are available: + +* Data views + ** <> to retrieve a single data view + ** <> to create data view + ** <> to partially updated data view + ** <> to delete a data view +* Default data views + ** <> to retrieve a default data view + ** <> to set a default data view +* Fields + ** <> to change field metadata, such as `count`, `customLabel` and `format` +* Runtime fields + ** <> to retrieve a runtime field + ** <> to create a runtime field + ** <> to create or update a runtime field + ** <> to partially update an existing runtime field + ** <> to delete a runtime field + +include::data-views/get.asciidoc[] +include::data-views/create.asciidoc[] +include::data-views/update.asciidoc[] +include::data-views/delete.asciidoc[] +include::data-views/default-get.asciidoc[] +include::data-views/default-set.asciidoc[] +include::data-views/update-fields.asciidoc[] +include::data-views/runtime-fields/get.asciidoc[] +include::data-views/runtime-fields/create.asciidoc[] +include::data-views/runtime-fields/upsert.asciidoc[] +include::data-views/runtime-fields/update.asciidoc[] +include::data-views/runtime-fields/delete.asciidoc[] + diff --git a/docs/api/index-patterns/create.asciidoc b/docs/api/data-views/create.asciidoc similarity index 64% rename from docs/api/index-patterns/create.asciidoc rename to docs/api/data-views/create.asciidoc index 521e25931ad49f..c1666589b7e2b5 100644 --- a/docs/api/index-patterns/create.asciidoc +++ b/docs/api/data-views/create.asciidoc @@ -1,45 +1,45 @@ -[[index-patterns-api-create]] -=== Create index pattern API +[[data-views-api-create]] +=== Create data view API ++++ -Create index pattern +Create data view ++++ -experimental[] Create {kib} index patterns. +experimental[] Create data views. -[[index-patterns-api-create-request]] +[[data-views-api-create-request]] ==== Request `POST :/api/index_patterns/index_pattern` `POST :/s//api/index_patterns/index_pattern` -[[index-patterns-api-create-path-params]] +[[data-views-api-create-path-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. -[[index-patterns-api-create-body-params]] +[[data-views-api-create-body-params]] ==== Request body -`override`:: (Optional, boolean) Overrides an existing index pattern if an -index pattern with the provided title already exists. The default is `false`. +`override`:: (Optional, boolean) Overrides an existing data view if a +data view with the provided title already exists. The default is `false`. -`refresh_fields`:: (Optional, boolean) Reloads index pattern fields after -the index pattern is stored. The default is `false`. +`refresh_fields`:: (Optional, boolean) Reloads data view fields after +the data view is stored. The default is `false`. -`index_pattern`:: (Required, object) The index pattern object. All fields are optional. +`index_pattern`:: (Required, object) The data view object. All fields are optional. -[[index-patterns-api-create-request-codes]] +[[data-views-api-create-request-codes]] ==== Response code `200`:: Indicates a successful call. -[[index-patterns-api-create-example]] +[[data-views-api-create-example]] ==== Examples -Create an index pattern with a custom title: +Create a data view with a custom title: [source,sh] -------------------------------------------------- @@ -67,7 +67,7 @@ $ curl -X POST api/index_patterns/index_pattern -------------------------------------------------- // KIBANA -At creation, all index pattern fields are optional: +At creation, all data view fields are optional: [source,sh] -------------------------------------------------- @@ -92,7 +92,7 @@ $ curl -X POST api/index_patterns/index_pattern // KIBANA -The API returns the index pattern object: +The API returns the data view object: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/default-get.asciidoc b/docs/api/data-views/default-get.asciidoc similarity index 59% rename from docs/api/index-patterns/default-get.asciidoc rename to docs/api/data-views/default-get.asciidoc index 5c7e8e01ce3990..300a0612b18ea5 100644 --- a/docs/api/index-patterns/default-get.asciidoc +++ b/docs/api/data-views/default-get.asciidoc @@ -1,34 +1,34 @@ -[[index-patterns-api-default-get]] -=== Get default index pattern API +[[data-views-api-default-get]] +=== Get default data view API ++++ -Get default index pattern +Get default data view ++++ -experimental[] Retrieve a default index pattern ID. Kibana UI uses default index pattern unless user picks a different one. +experimental[] Retrieve a default data view ID. Kibana UI uses the default data view unless user picks a different one. -[[index-patterns-api-default-get-request]] +[[data-views-api-default-get-request]] ==== Request `GET :/api/index_patterns/default` `GET :/s//api/index_patterns/default` -[[index-patterns-api-default-get-params]] +[[data-views-api-default-get-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. -[[index-patterns-api-default-get-codes]] +[[data-views-api-default-get-codes]] ==== Response code `200`:: Indicates a successful call. -[[index-patterns-api-default-get-example]] +[[data-views-api-default-get-example]] ==== Example -Retrieve the default index pattern id: +Retrieve the default data view id: [source,sh] -------------------------------------------------- @@ -36,7 +36,7 @@ $ curl -X GET api/index_patterns/default -------------------------------------------------- // KIBANA -The API returns an ID of a default index pattern: +The API returns an ID of a default data view: [source,sh] -------------------------------------------------- @@ -45,7 +45,7 @@ The API returns an ID of a default index pattern: } -------------------------------------------------- -In case there is no default index pattern, the API returns: +In case there is no default data view, the API returns: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/default-set.asciidoc b/docs/api/data-views/default-set.asciidoc similarity index 64% rename from docs/api/index-patterns/default-set.asciidoc rename to docs/api/data-views/default-set.asciidoc index 3b3cec6be6324b..752054cfb17483 100644 --- a/docs/api/index-patterns/default-set.asciidoc +++ b/docs/api/data-views/default-set.asciidoc @@ -1,43 +1,43 @@ -[[index-patterns-api-default-set]] -=== Set default index pattern API +[[data-views-api-default-set]] +=== Set default data view API ++++ -Set default index pattern +Set default data view ++++ -experimental[] Set a default index pattern ID. Kibana UI will use default index pattern unless user picks a different one. +experimental[] Set a default data view ID. Kibana UI will use the default data view unless user picks a different one. The API doesn't validate if given `index_pattern_id` is a valid id. -[[index-patterns-api-default-set-request]] +[[data-views-api-default-set-request]] ==== Request `POST :/api/index_patterns/default` `POST :/s//api/index_patterns/default` -[[index-patterns-api-default-set-params]] +[[data-views-api-default-set-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. -[[index-patterns-api-default-set-body]] +[[data-views-api-default-set-body]] ==== Request body -`index_pattern_id`:: (Required, `string` or `null`) Sets a default index pattern id. Use `null` to unset a default index pattern. +`index_pattern_id`:: (Required, `string` or `null`) Sets a default data view id. Use `null` to unset a default data view. -`force`:: (Optional, boolean) Updates existing default index pattern id. The default is `false`. +`force`:: (Optional, boolean) Updates existing default data view id. The default is `false`. -[[index-patterns-api-default-set-codes]] +[[data-views-api-default-set-codes]] ==== Response code `200`:: Indicates a successful call. -[[index-patterns-api-default-set-example]] +[[data-views-api-default-set-example]] ==== Example -Set the default index pattern id if none is set: +Set the default data view id if none is set: [source,sh] -------------------------------------------------- @@ -49,7 +49,7 @@ $ curl -X POST api/index_patterns/default // KIBANA -Upsert the default index pattern: +Upsert the default data view: [source,sh] -------------------------------------------------- @@ -61,7 +61,7 @@ $ curl -X POST api/index_patterns/default -------------------------------------------------- // KIBANA -Unset the default index pattern: +Unset the default data view: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/delete.asciidoc b/docs/api/data-views/delete.asciidoc similarity index 51% rename from docs/api/index-patterns/delete.asciidoc rename to docs/api/data-views/delete.asciidoc index a25f2f13e0b41f..9bc63c89365e7a 100644 --- a/docs/api/index-patterns/delete.asciidoc +++ b/docs/api/data-views/delete.asciidoc @@ -1,38 +1,38 @@ -[[index-patterns-api-delete]] -=== Delete index pattern API +[[data-views-api-delete]] +=== Delete data view API ++++ -Delete index pattern +Delete data view ++++ -experimental[] Delete {kib} index patterns. +experimental[] Delete data views. -WARNING: Once you delete an index pattern, _it cannot be recovered_. +WARNING: Once you delete a data view, _it cannot be recovered_. -[[index-patterns-api-delete-request]] +[[data-views-api-delete-request]] ==== Request `DELETE :/api/index_patterns/index_pattern/` `DELETE :/s//api/index_patterns/index_pattern/` -[[index-patterns-api-delete-path-params]] +[[data-views-api-delete-path-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `id`:: - (Required, string) The ID of the index pattern you want to delete. + (Required, string) The ID of the data view you want to delete. -[[index-patterns-api-delete-response-codes]] +[[data-views-api-delete-response-codes]] ==== Response code `200`:: - Indicates that index pattern is deleted. Returns an empty response body. + Indicates that data view is deleted. Returns an empty response body. ==== Example -Delete an index pattern object with the `my-pattern` ID: +Delete a data view object with the `my-pattern` ID: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/get.asciidoc b/docs/api/data-views/get.asciidoc similarity index 67% rename from docs/api/index-patterns/get.asciidoc rename to docs/api/data-views/get.asciidoc index 64588e63f62ae3..0584dfeae1cd52 100644 --- a/docs/api/index-patterns/get.asciidoc +++ b/docs/api/data-views/get.asciidoc @@ -1,40 +1,40 @@ -[[index-patterns-api-get]] -=== Get index pattern API +[[data-views-api-get]] +=== Get data view API ++++ -Get index pattern +Get data view ++++ -experimental[] Retrieve a single {kib} index pattern by ID. +experimental[] Retrieve a single data view by ID. -[[index-patterns-api-get-request]] +[[data-views-api-get-request]] ==== Request `GET :/api/index_patterns/index_pattern/` `GET :/s//api/index_patterns/index_pattern/` -[[index-patterns-api-get-params]] +[[data-views-api-get-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `id`:: -(Required, string) The ID of the index pattern you want to retrieve. +(Required, string) The ID of the data view you want to retrieve. -[[index-patterns-api-get-codes]] +[[data-views-api-get-codes]] ==== Response code `200`:: Indicates a successful call. `404`:: -The specified index pattern and ID doesn't exist. +The specified data view and ID doesn't exist. -[[index-patterns-api-get-example]] +[[data-views-api-get-example]] ==== Example -Retrieve the index pattern object with the `my-pattern` ID: +Retrieve the data view object with the `my-pattern` ID: [source,sh] -------------------------------------------------- @@ -42,7 +42,7 @@ $ curl -X GET api/index_patterns/index_pattern/my-pattern -------------------------------------------------- // KIBANA -The API returns an index pattern object: +The API returns a data view object: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/runtime-fields/create.asciidoc b/docs/api/data-views/runtime-fields/create.asciidoc similarity index 74% rename from docs/api/index-patterns/runtime-fields/create.asciidoc rename to docs/api/data-views/runtime-fields/create.asciidoc index b0773c29e5309f..442bede9cba7a5 100644 --- a/docs/api/index-patterns/runtime-fields/create.asciidoc +++ b/docs/api/data-views/runtime-fields/create.asciidoc @@ -1,4 +1,4 @@ -[[index-patterns-runtime-field-api-create]] +[[data-views-runtime-field-api-create]] === Create runtime field API ++++ Create runtime field @@ -6,23 +6,23 @@ experimental[] Create a runtime field -[[index-patterns-runtime-field-create-request]] +[[data-views-runtime-field-create-request]] ==== Request `POST :/api/index_patterns/index_pattern//runtime_field` `POST :/s//api/index_patterns/index_pattern//runtime_field` -[[index-patterns-runtime-field-create-params]] +[[data-views-runtime-field-create-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `index_pattern_id`:: -(Required, string) The ID of the index pattern. +(Required, string) The ID of the data view. -[[index-patterns-runtime-field-create-body]] +[[data-views-runtime-field-create-body]] ==== Request body `name`:: (Required, string) The name for a runtime field. @@ -30,10 +30,10 @@ experimental[] Create a runtime field `runtimeField`:: (Required, object) The runtime field definition object. -[[index-patterns-runtime-field-create-example]] +[[data-views-runtime-field-create-example]] ==== Examples -Create a runtime field on an index pattern: +Create a runtime field on a data view: [source,sh] -------------------------------------------------- @@ -50,7 +50,7 @@ $ curl -X POST api/index_patterns/index_pattern//runtime_field -------------------------------------------------- // KIBANA -The API returns created runtime field object and update index pattern object: +The API returns created runtime field object and updated data view object: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/runtime-fields/delete.asciidoc b/docs/api/data-views/runtime-fields/delete.asciidoc similarity index 70% rename from docs/api/index-patterns/runtime-fields/delete.asciidoc rename to docs/api/data-views/runtime-fields/delete.asciidoc index 840789fe1ec23f..b2a8e9f3104775 100644 --- a/docs/api/index-patterns/runtime-fields/delete.asciidoc +++ b/docs/api/data-views/runtime-fields/delete.asciidoc @@ -1,26 +1,26 @@ -[[index-patterns-runtime-field-api-delete]] +[[data-views-runtime-field-api-delete]] === Delete runtime field API ++++ Delete runtime field ++++ -experimental[] Delete a runtime field from an index pattern. +experimental[] Delete a runtime field from a data view. -[[index-patterns-runtime-field-api-delete-request]] +[[data-views-runtime-field-api-delete-request]] ==== Request `DELETE :/api/index_patterns/index_pattern//runtime_field/` `DELETE :/s//api/index_patterns/index_pattern//runtime_field/` -[[index-patterns-runtime-field-api-delete-path-params]] +[[data-views-runtime-field-api-delete-path-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `index_pattern_id`:: -(Required, string) The ID of the index pattern your want to delete a runtime field from. +(Required, string) The ID of the data view your want to delete a runtime field from. `name`:: (Required, string) The name of the runtime field you want to delete. @@ -28,7 +28,7 @@ experimental[] Delete a runtime field from an index pattern. ==== Example -Delete a runtime field from an index pattern: +Delete a runtime field from a data view: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/runtime-fields/get.asciidoc b/docs/api/data-views/runtime-fields/get.asciidoc similarity index 78% rename from docs/api/index-patterns/runtime-fields/get.asciidoc rename to docs/api/data-views/runtime-fields/get.asciidoc index 42bd209c708bc3..66530ae5f3f3fe 100644 --- a/docs/api/index-patterns/runtime-fields/get.asciidoc +++ b/docs/api/data-views/runtime-fields/get.asciidoc @@ -1,4 +1,4 @@ -[[index-patterns-runtime-field-api-get]] +[[data-views-runtime-field-api-get]] === Get runtime field API ++++ Get runtime field @@ -6,30 +6,30 @@ experimental[] Get a runtime field -[[index-patterns-runtime-field-get-request]] +[[data-views-runtime-field-get-request]] ==== Request `GET :/api/index_patterns/index_pattern//runtime_field/` `GET :/s//api/index_patterns/index_pattern//runtime_field/` -[[index-patterns-runtime-field-get-params]] +[[data-views-runtime-field-get-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `index_pattern_id`:: -(Required, string) The ID of the index pattern. +(Required, string) The ID of the data view. `name`:: (Required, string) The name of the runtime field you want to retrieve. -[[index-patterns-runtime-field-get-example]] +[[data-views-runtime-field-get-example]] ==== Example -Retrieve a runtime field named `foo` of index pattern with the `my-pattern` ID: +Retrieve a runtime field named `foo` of data view with the `my-pattern` ID: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/runtime-fields/update.asciidoc b/docs/api/data-views/runtime-fields/update.asciidoc similarity index 75% rename from docs/api/index-patterns/runtime-fields/update.asciidoc rename to docs/api/data-views/runtime-fields/update.asciidoc index f34460896f7bc9..970826560f4a8e 100644 --- a/docs/api/index-patterns/runtime-fields/update.asciidoc +++ b/docs/api/data-views/runtime-fields/update.asciidoc @@ -1,4 +1,4 @@ -[[index-patterns-runtime-field-api-update]] +[[data-views-runtime-field-api-update]] === Update runtime field API ++++ Update runtime field @@ -6,26 +6,26 @@ experimental[] Update an existing runtime field -[[index-patterns-runtime-field-update-request]] +[[data-views-runtime-field-update-request]] ==== Request `POST :/api/index_patterns/index_pattern//runtime_field/` `POST :/s//api/index_patterns/index_pattern//runtime_field/` -[[index-patterns-runtime-field-update-params]] +[[data-views-runtime-field-update-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `index_pattern_id`:: -(Required, string) The ID of the index pattern. +(Required, string) The ID of the data view. `name`:: (Required, string) The name of the runtime field you want to update. -[[index-patterns-runtime-field-update-body]] +[[data-views-runtime-field-update-body]] ==== Request body `runtimeField`:: (Required, object) The runtime field definition object. @@ -37,10 +37,10 @@ You can update following fields: -[[index-patterns-runtime-field-update-example]] +[[data-views-runtime-field-update-example]] ==== Examples -Update an existing runtime field on an index pattern: +Update an existing runtime field on a data view: [source,sh] -------------------------------------------------- @@ -55,7 +55,7 @@ $ curl -X POST api/index_patterns/index_pattern//runtime_field -------------------------------------------------- // KIBANA -The API returns updated runtime field object and updated index pattern object: +The API returns updated runtime field object and updated data view object: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/runtime-fields/upsert.asciidoc b/docs/api/data-views/runtime-fields/upsert.asciidoc similarity index 78% rename from docs/api/index-patterns/runtime-fields/upsert.asciidoc rename to docs/api/data-views/runtime-fields/upsert.asciidoc index 1b436db19c62e4..427aa30afa94a5 100644 --- a/docs/api/index-patterns/runtime-fields/upsert.asciidoc +++ b/docs/api/data-views/runtime-fields/upsert.asciidoc @@ -1,4 +1,4 @@ -[[index-patterns-runtime-field-api-upsert]] +[[data-views-runtime-field-api-upsert]] === Upsert runtime field API ++++ Upsert runtime field @@ -6,23 +6,23 @@ experimental[] Create or update an existing runtime field -[[index-patterns-runtime-field-upsert-request]] +[[data-views-runtime-field-upsert-request]] ==== Request `PUT :/api/index_patterns/index_pattern//runtime_field` `PUT :/s//api/index_patterns/index_pattern//runtime_field` -[[index-patterns-runtime-field-upsert-params]] +[[data-views-runtime-field-upsert-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `index_pattern_id`:: -(Required, string) The ID of the index pattern. +(Required, string) The ID of the data view. -[[index-patterns-runtime-field-upsert-body]] +[[data-views-runtime-field-upsert-body]] ==== Request body `name`:: (Required, string) The name for a new runtime field or a name of an existing runtime field. @@ -30,10 +30,10 @@ experimental[] Create or update an existing runtime field `runtimeField`:: (Required, object) The runtime field definition object. -[[index-patterns-runtime-field-upsert-example]] +[[data-views-runtime-field-upsert-example]] ==== Examples -Create or update an existing runtime field on an index pattern: +Create or update an existing runtime field on a data view: [source,sh] -------------------------------------------------- @@ -50,7 +50,7 @@ $ curl -X PUT api/index_patterns/index_pattern//runtime_field -------------------------------------------------- // KIBANA -The API returns created or updated runtime field object and updated index pattern object: +The API returns created or updated runtime field object and updated data view object: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns/update-fields.asciidoc b/docs/api/data-views/update-fields.asciidoc similarity index 79% rename from docs/api/index-patterns/update-fields.asciidoc rename to docs/api/data-views/update-fields.asciidoc index e3f98631bb52a3..929dee27b9da16 100644 --- a/docs/api/index-patterns/update-fields.asciidoc +++ b/docs/api/data-views/update-fields.asciidoc @@ -1,43 +1,43 @@ -[[index-patterns-fields-api-update]] -=== Update index pattern fields API +[[data-views-fields-api-update]] +=== Update data view fields API ++++ -Update index pattern fields metadata +Update data view fields metadata ++++ experimental[] Update fields presentation metadata, such as `count`, `customLabel`, and `format`. You can update multiple fields in one request. Updates are merged with persisted metadata. To remove existing metadata, specify `null` as the value. -[[index-patterns-fields-api-update-request]] +[[data-views-fields-api-update-request]] ==== Request `POST :/api/index_patterns/index_pattern//fields` `POST :/s//api/index_patterns/index_pattern//fields` -[[index-patterns-fields-api-update-path-params]] +[[data-views-fields-api-update-path-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `id`:: -(Required, string) The ID of the index pattern fields you want to update. +(Required, string) The ID of the data view fields you want to update. -[[index-patterns-fields-api-update-request-body]] +[[data-views-fields-api-update-request-body]] ==== Request body `fields`:: (Required, object) the field object -[[index-patterns-fields-api-update-errors-codes]] +[[data-views-fields-api-update-errors-codes]] ==== Response code `200`:: Indicates a successful call. -[[index-patterns-fields-api-update-example]] +[[data-views-fields-api-update-example]] ==== Examples Set popularity `count` for field `foo`: @@ -89,7 +89,7 @@ $ curl -X POST api/saved_objects/index-pattern/my-pattern/fields // KIBANA -The endpoint returns the updated index pattern object: +The endpoint returns the updated data view object: [source,sh] -------------------------------------------------- { diff --git a/docs/api/index-patterns/update.asciidoc b/docs/api/data-views/update.asciidoc similarity index 67% rename from docs/api/index-patterns/update.asciidoc rename to docs/api/data-views/update.asciidoc index 2d5fe882d448df..6157d46888277b 100644 --- a/docs/api/index-patterns/update.asciidoc +++ b/docs/api/data-views/update.asciidoc @@ -1,36 +1,36 @@ -[[index-patterns-api-update]] -=== Update index pattern API +[[data-views-api-update]] +=== Update data view API ++++ -Update index pattern +Update data view ++++ -experimental[] Update part of an index pattern. Only the specified fields are updated in the -index pattern. Unspecified fields stay as they are persisted. +experimental[] Update part of an data view. Only the specified fields are updated in the +data view. Unspecified fields stay as they are persisted. -[[index-patterns-api-update-request]] +[[data-views-api-update-request]] ==== Request `POST :/api/index_patterns/index_pattern/` `POST :/s//api/index_patterns/index_pattern/` -[[index-patterns-api-update-path-params]] +[[data-views-api-update-path-params]] ==== Path parameters `space_id`:: (Optional, string) An identifier for the space. If `space_id` is not provided in the URL, the default space is used. `id`:: - (Required, string) The ID of the index pattern you want to update. + (Required, string) The ID of the data view you want to update. -[[index-patterns-api-update-request-body]] +[[data-views-api-update-request-body]] ==== Request body -`refresh_fields`:: (Optional, boolean) Reloads the index pattern fields after -the index pattern is updated. The default is `false`. +`refresh_fields`:: (Optional, boolean) Reloads the data view fields after +the data view is updated. The default is `false`. `index_pattern`:: - (Required, object) The index patterns fields you want to update. + (Required, object) The data view fields you want to update. + You can partially update the following fields: @@ -43,16 +43,16 @@ You can partially update the following fields: * `type` * `typeMeta` -[[index-patterns-api-update-errors-codes]] +[[data-views-api-update-errors-codes]] ==== Response code `200`:: Indicates a successful call. -[[index-patterns-api-update-example]] +[[data-views-api-update-example]] ==== Examples -Update a title of the `` index pattern: +Update a title of the `` data view: [source,sh] -------------------------------------------------- @@ -100,7 +100,7 @@ $ curl -X POST api/saved_objects/index-pattern/my-pattern -------------------------------------------------- // KIBANA -The API returns the updated index pattern object: +The API returns the updated data view object: [source,sh] -------------------------------------------------- diff --git a/docs/api/index-patterns.asciidoc b/docs/api/index-patterns.asciidoc deleted file mode 100644 index b343d80b4fc15c..00000000000000 --- a/docs/api/index-patterns.asciidoc +++ /dev/null @@ -1,42 +0,0 @@ -[[index-patterns-api]] -== Index patterns APIs - -experimental[] Manage {kib} index patterns. - -WARNING: Do not write documents directly to the `.kibana` index. When you write directly -to the `.kibana` index, the data becomes corrupted and permanently breaks future {kib} versions. - -WARNING: Use the index patterns API for managing {kib} index patterns instead of lower-level <>. - -The following index patterns APIs are available: - -* Index patterns - ** <> to retrieve a single {kib} index pattern - ** <> to create {kib} index pattern - ** <> to partially updated {kib} index pattern - ** <> to delete {kib} index pattern -* Default index pattern - ** <> to retrieve a default index pattern - ** <> to set a default index pattern -* Fields - ** <> to change field metadata, such as `count`, `customLabel` and `format` -* Runtime fields - ** <> to retrieve a runtime field - ** <> to create a runtime field - ** <> to create or update a runtime field - ** <> to partially update an existing runtime field - ** <> to delete a runtime field - -include::index-patterns/get.asciidoc[] -include::index-patterns/create.asciidoc[] -include::index-patterns/update.asciidoc[] -include::index-patterns/delete.asciidoc[] -include::index-patterns/default-get.asciidoc[] -include::index-patterns/default-set.asciidoc[] -include::index-patterns/update-fields.asciidoc[] -include::index-patterns/runtime-fields/get.asciidoc[] -include::index-patterns/runtime-fields/create.asciidoc[] -include::index-patterns/runtime-fields/upsert.asciidoc[] -include::index-patterns/runtime-fields/update.asciidoc[] -include::index-patterns/runtime-fields/delete.asciidoc[] - diff --git a/docs/api/saved-objects.asciidoc b/docs/api/saved-objects.asciidoc index 0625beb793c311..fcb4b119c06c67 100644 --- a/docs/api/saved-objects.asciidoc +++ b/docs/api/saved-objects.asciidoc @@ -6,7 +6,7 @@ Manage {kib} saved objects, including dashboards, visualizations, and more. WARNING: Do not write documents directly to the `.kibana` index. When you write directly to the `.kibana` index, the data becomes corrupted and permanently breaks future {kib} versions. -NOTE: For managing {kib} index patterns, use the <>. +NOTE: For managing {kib} index patterns, use the <>. The following saved objects APIs are available: diff --git a/docs/redirects.asciidoc b/docs/redirects.asciidoc index e827b032fb5bfa..6fafe1ce2506d7 100644 --- a/docs/redirects.asciidoc +++ b/docs/redirects.asciidoc @@ -380,3 +380,63 @@ This content has moved. Refer to <>. == Index patterns has been renamed to data views. This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api-create"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api-default-get"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api-default-set"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api-delete"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api-get"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-runtime-field-api-create"] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-runtime-field-api-delete] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-runtime-field-api-get] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-runtime-field-api-update] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-runtime-field-api-upsert] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. + +[role="exclude",id="index-patterns-api-update] +== Index patterns has been renamed to data views. + +This content has moved. Refer to <>. diff --git a/docs/user/api.asciidoc b/docs/user/api.asciidoc index e17d52675437e1..1564d78c8f444c 100644 --- a/docs/user/api.asciidoc +++ b/docs/user/api.asciidoc @@ -91,7 +91,7 @@ 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/index-patterns.asciidoc[] +include::{kib-repo-dir}/api/data-views.asciidoc[] include::{kib-repo-dir}/api/alerting.asciidoc[] include::{kib-repo-dir}/api/actions-and-connectors.asciidoc[] include::{kib-repo-dir}/api/dashboard-api.asciidoc[] From 16d2a7789370a83cd3a3729dcf48e1b938b9e1af Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 1 Dec 2021 13:52:56 +0000 Subject: [PATCH 015/126] skip flaky suite (#117971) --- .../security_and_spaces/tests/common/cases/patch_cases.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts index db741900520654..a4311774fd4480 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts @@ -665,7 +665,8 @@ export default ({ getService }: FtrProviderContext): void => { }); }); - describe('esArchiver', () => { + // FLAKY: https://github.com/elastic/kibana/issues/117971 + describe.skip('esArchiver', () => { const defaultSignalsIndex = '.siem-signals-default-000001'; beforeEach(async () => { From 78c24d72944078c592e2f767a168303da595fe19 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 1 Dec 2021 14:01:36 +0000 Subject: [PATCH 016/126] chore(NA): splits types from code on @kbn/apm-config-loader (#120001) --- package.json | 1 + packages/BUILD.bazel | 1 + packages/kbn-apm-config-loader/BUILD.bazel | 26 +++++++++++++++++---- packages/kbn-apm-config-loader/package.json | 1 - yarn.lock | 4 ++++ 5 files changed, 28 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index cbe8c64a673682..c8da0bf0513900 100644 --- a/package.json +++ b/package.json @@ -558,6 +558,7 @@ "@types/kbn__ace": "link:bazel-bin/packages/kbn-ace/npm_module_types", "@types/kbn__alerts": "link:bazel-bin/packages/kbn-alerts/npm_module_types", "@types/kbn__analytics": "link:bazel-bin/packages/kbn-analytics/npm_module_types", + "@types/kbn__apm-config-loader": "link:bazel-bin/packages/kbn-apm-config-loader/npm_module_types", "@types/kbn__apm-utils": "link:bazel-bin/packages/kbn-apm-utils/npm_module_types", "@types/kbn__i18n": "link:bazel-bin/packages/kbn-i18n/npm_module_types", "@types/kbn__i18n-react": "link:bazel-bin/packages/kbn-i18n-react/npm_module_types", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index b6aa948de0fa46..f10044a68def9b 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -80,6 +80,7 @@ filegroup( "//packages/kbn-ace:build_types", "//packages/kbn-alerts:build_types", "//packages/kbn-analytics:build_types", + "//packages/kbn-apm-config-loader:build_types", "//packages/kbn-apm-utils:build_types", "//packages/kbn-i18n:build_types", "//packages/kbn-i18n-react:build_types", diff --git a/packages/kbn-apm-config-loader/BUILD.bazel b/packages/kbn-apm-config-loader/BUILD.bazel index 731876d5b550ca..15491336ed6577 100644 --- a/packages/kbn-apm-config-loader/BUILD.bazel +++ b/packages/kbn-apm-config-loader/BUILD.bazel @@ -1,9 +1,10 @@ -load("@npm//@bazel/typescript:index.bzl", "ts_config", "ts_project") -load("@build_bazel_rules_nodejs//:index.bzl", "js_library", "pkg_npm") -load("//src/dev/bazel:index.bzl", "jsts_transpiler") +load("@npm//@bazel/typescript:index.bzl", "ts_config") +load("@build_bazel_rules_nodejs//:index.bzl", "js_library") +load("//src/dev/bazel:index.bzl", "jsts_transpiler", "pkg_npm", "pkg_npm_types", "ts_project") PKG_BASE_NAME = "kbn-apm-config-loader" PKG_REQUIRE_NAME = "@kbn/apm-config-loader" +TYPES_PKG_REQUIRE_NAME = "@types/kbn__apm-config-loader" SOURCE_FILES = glob( [ @@ -76,7 +77,7 @@ ts_project( js_library( name = PKG_BASE_NAME, srcs = NPM_MODULE_EXTRA_FILES, - deps = RUNTIME_DEPS + [":target_node", ":tsc_types"], + deps = RUNTIME_DEPS + [":target_node"], package_name = PKG_REQUIRE_NAME, visibility = ["//visibility:public"], ) @@ -95,3 +96,20 @@ filegroup( ], visibility = ["//visibility:public"], ) + +pkg_npm_types( + name = "npm_module_types", + srcs = SRCS, + deps = [":tsc_types"], + package_name = TYPES_PKG_REQUIRE_NAME, + tsconfig = ":tsconfig", + visibility = ["//visibility:public"], +) + +filegroup( + name = "build_types", + srcs = [ + ":npm_module_types", + ], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-apm-config-loader/package.json b/packages/kbn-apm-config-loader/package.json index cdd4c62b9b8d41..d973d54f41065d 100644 --- a/packages/kbn-apm-config-loader/package.json +++ b/packages/kbn-apm-config-loader/package.json @@ -1,7 +1,6 @@ { "name": "@kbn/apm-config-loader", "main": "./target_node/index.js", - "types": "./target_types/index.d.ts", "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", "private": true diff --git a/yarn.lock b/yarn.lock index 2fd7e61cbabdec..85dba799539397 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5817,6 +5817,10 @@ version "0.0.0" uid "" +"@types/kbn__apm-config-loader@link:bazel-bin/packages/kbn-apm-config-loader/npm_module_types": + version "0.0.0" + uid "" + "@types/kbn__apm-utils@link:bazel-bin/packages/kbn-apm-utils/npm_module_types": version "0.0.0" uid "" From ae12131aca7fae44198eb6e38a72ffb09672d98f Mon Sep 17 00:00:00 2001 From: Orhan Toy Date: Wed, 1 Dec 2021 15:28:49 +0100 Subject: [PATCH 017/126] [App Search, Crawler] Fix typo: falure -> failure (#120065) --- .../components/crawler/components/add_domain/utils.ts | 6 +++--- x-pack/plugins/translations/translations/ja-JP.json | 6 +++--- x-pack/plugins/translations/translations/zh-CN.json | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts index 47613d3d2b6735..e5886a726f2616 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/utils.ts @@ -79,7 +79,7 @@ const allFailureResultChanges: CrawlerDomainValidationResultChange = { networkConnectivity: { state: 'invalid', message: i18n.translate( - 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFalureMessage', + 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFailureMessage', { defaultMessage: 'Unable to establish a network connection because the "Initial Validation" check failed.', @@ -89,7 +89,7 @@ const allFailureResultChanges: CrawlerDomainValidationResultChange = { indexingRestrictions: { state: 'invalid', message: i18n.translate( - 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFalureMessage', + 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFailureMessage', { defaultMessage: 'Unable to determine indexing restrictions because the "Network Connectivity" check failed.', @@ -99,7 +99,7 @@ const allFailureResultChanges: CrawlerDomainValidationResultChange = { contentVerification: { state: 'invalid', message: i18n.translate( - 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFalureMessage', + 'xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFailureMessage', { defaultMessage: 'Unable to verify content because the "Indexing Restrictions" check failed.', diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 9db38862d26b4d..903c196fd3dc8e 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -8486,14 +8486,14 @@ "xpack.enterpriseSearch.appSearch.crawler.addDomainFlyout.description": "複数のドメインをこのエンジンのWebクローラーに追加できます。ここで別のドメインを追加して、[管理]ページからエントリポイントとクロールルールを変更します。", "xpack.enterpriseSearch.appSearch.crawler.addDomainFlyout.openButtonLabel": "ドメインを追加", "xpack.enterpriseSearch.appSearch.crawler.addDomainFlyout.title": "新しいドメインを追加", - "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFalureMessage": "[インデックス制限]チェックが失敗したため、コンテンツを検証できません。", + "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFailureMessage": "[インデックス制限]チェックが失敗したため、コンテンツを検証できません。", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationLabel": "コンテンツ検証", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.entryPointLabel": "Webクローラーエントリポイントが{entryPointValue}として設定されました", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.errorsTitle": "何か問題が発生しましたエラーを解決して、再試行してください。", - "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFalureMessage": "[ネットワーク接続]チェックが失敗したため、インデックス制限を判定できません。", + "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFailureMessage": "[ネットワーク接続]チェックが失敗したため、インデックス制限を判定できません。", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsLabel": "インデックスの制約", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.initialVaidationLabel": "初期検証", - "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFalureMessage": "[初期検証]チェックが失敗したため、ネットワーク接続を確立できません。", + "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFailureMessage": "[初期検証]チェックが失敗したため、ネットワーク接続を確立できません。", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityLabel": "ネットワーク接続", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.submitButtonLabel": "ドメインを追加", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.testUrlButtonLabel": "ブラウザーでURLをテスト", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 51befac606554b..36208ea417d519 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -8561,14 +8561,14 @@ "xpack.enterpriseSearch.appSearch.crawler.addDomainFlyout.description": "可以将多个域添加到此引擎的网络爬虫。在此添加其他域并从“管理”页面修改入口点和爬网规则。", "xpack.enterpriseSearch.appSearch.crawler.addDomainFlyout.openButtonLabel": "添加域", "xpack.enterpriseSearch.appSearch.crawler.addDomainFlyout.title": "添加新域", - "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFalureMessage": "因为“索引限制”检查失败,所以无法验证内容。", + "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationFailureMessage": "因为“索引限制”检查失败,所以无法验证内容。", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.contentVerificationLabel": "内容验证", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.entryPointLabel": "网络爬虫入口点已设置为 {entryPointValue}", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.errorsTitle": "出问题了。请解决这些错误,然后重试。", - "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFalureMessage": "无法确定索引限制,因为“网络连接性”检查失败。", + "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsFailureMessage": "无法确定索引限制,因为“网络连接性”检查失败。", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.indexingRestrictionsLabel": "索引限制", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.initialVaidationLabel": "初始验证", - "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFalureMessage": "无法建立网络连接,因为“初始验证”检查失败。", + "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityFailureMessage": "无法建立网络连接,因为“初始验证”检查失败。", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.networkConnectivityLabel": "网络连接性", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.submitButtonLabel": "添加域", "xpack.enterpriseSearch.appSearch.crawler.addDomainForm.testUrlButtonLabel": "在浏览器中测试 URL", From f4bfd4dfc0cd6b4ba2f6e0a2060b02cdc546ed81 Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Wed, 1 Dec 2021 09:35:01 -0500 Subject: [PATCH 018/126] [File upload] Rename geo-shape field to geometry (#120023) --- .../file_upload/public/components/json_upload_and_parse.tsx | 2 +- .../importer/geojson_importer/geojson_importer.test.js | 6 +++--- .../public/importer/geojson_importer/geojson_importer.ts | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx b/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx index c4fc735c493371..80ff5910ac1ef4 100644 --- a/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx +++ b/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx @@ -105,7 +105,7 @@ export class JsonUploadAndParse extends Component { test('should convert feature to geo_point ES document', () => { const esDoc = toEsDoc(FEATURE_COLLECTION.features[0], ES_FIELD_TYPES.GEO_POINT); expect(esDoc).toEqual({ - coordinates: [-112.0372, 46.608058], + geometry: [-112.0372, 46.608058], population: 200, }); }); @@ -233,7 +233,7 @@ describe('toEsDoc', () => { test('should convert feature to geo_shape ES document', () => { const esDoc = toEsDoc(FEATURE_COLLECTION.features[0], ES_FIELD_TYPES.GEO_SHAPE); expect(esDoc).toEqual({ - coordinates: { + geometry: { type: 'Point', coordinates: [-112.0372, 46.608058], }, @@ -244,7 +244,7 @@ describe('toEsDoc', () => { test('should convert GeometryCollection feature to geo_shape ES document', () => { const esDoc = toEsDoc(GEOMETRY_COLLECTION_FEATURE, ES_FIELD_TYPES.GEO_SHAPE); expect(esDoc).toEqual({ - coordinates: { + geometry: { type: 'GeometryCollection', geometries: [ { diff --git a/x-pack/plugins/file_upload/public/importer/geojson_importer/geojson_importer.ts b/x-pack/plugins/file_upload/public/importer/geojson_importer/geojson_importer.ts index d28b049e1214d6..24150051771a1f 100644 --- a/x-pack/plugins/file_upload/public/importer/geojson_importer/geojson_importer.ts +++ b/x-pack/plugins/file_upload/public/importer/geojson_importer/geojson_importer.ts @@ -375,7 +375,7 @@ export function toEsDoc( ) { const properties = feature.properties ? feature.properties : {}; return { - coordinates: + geometry: geoFieldType === ES_FIELD_TYPES.GEO_SHAPE ? feature.geometry : (feature.geometry as Point).coordinates, From ee289642b7f7ce479cc1a9e6ee5d68d684330422 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Wed, 1 Dec 2021 15:44:55 +0100 Subject: [PATCH 019/126] [APM] Display relevant anomalies from multi-metric job (#119709) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../src/lib/apm/base_span.ts | 5 + .../lib/apm/utils/get_transaction_metrics.ts | 1 + .../anomaly_detection/apm_ml_anomaly_query.ts | 27 -- .../anomaly_detection/apm_ml_detectors.ts | 28 +- ...eferred_service_anomaly_timeseries.test.ts | 173 +++++++++ ...et_preferred_service_anomaly_timeseries.ts | 40 ++ .../service_anomaly_timeseries.ts | 20 + .../app/error_group_overview/index.tsx | 5 +- .../components/app/service_overview/index.tsx | 16 +- .../service_overview_throughput_chart.tsx | 12 +- .../app/transaction_details/index.tsx | 8 +- .../app/transaction_overview/index.tsx | 7 +- .../components/routing/settings/index.tsx | 2 +- .../routing/templates/apm_main_template.tsx | 17 +- .../analyze_data_button.stories.tsx | 1 + .../templates/apm_service_template/index.tsx | 5 +- .../routing/templates/settings_template.tsx | 2 +- .../shared/EnvironmentFilter/index.tsx | 53 +-- .../failed_transaction_rate_chart/index.tsx | 12 +- .../helper/get_chart_anomaly_timeseries.tsx | 107 ++++++ .../shared/charts/latency_chart/index.tsx | 19 +- .../latency_chart/latency_chart.stories.tsx | 27 +- .../shared/charts/timeseries_chart.tsx | 47 +-- .../charts/transaction_charts/index.tsx | 8 +- .../apm_service/apm_service_context.tsx | 10 +- .../environments_context.tsx | 59 +++ .../use_environments_context.tsx | 13 + .../service_anomaly_timeseries_context.tsx | 83 ++++ ...use_service_anomaly_timeseries_context.tsx | 13 + .../public/hooks/use_environments_fetcher.tsx | 2 +- ...se_preferred_service_anomaly_timeseries.ts | 30 ++ .../selectors/latency_chart_selector.test.ts | 49 +-- .../selectors/latency_chart_selectors.ts | 64 ---- .../lib/anomaly_detection/anomaly_search.ts | 55 +++ .../anomaly_detection/apm_ml_anomaly_query.ts | 58 +++ .../anomaly_detection/apm_ml_jobs_query.ts | 24 ++ .../get_anomaly_result_bucket_size.ts | 22 ++ .../get_anomaly_timeseries.ts | 206 ++++++++++ .../routes/environments/get_environments.ts | 3 +- .../service_map/get_service_anomalies.ts | 8 +- .../apm/server/routes/services/route.ts | 59 ++- .../transactions/get_anomaly_data/fetcher.ts | 91 ----- .../transactions/get_anomaly_data/index.ts | 138 ------- .../apm/server/routes/transactions/route.ts | 23 +- x-pack/plugins/apm/typings/timeseries.ts | 25 +- x-pack/plugins/observability/server/index.ts | 2 +- .../observability/server/utils/queries.ts | 29 +- .../test/apm_api_integration/common/config.ts | 3 +- .../tests/anomalies/anomaly_charts.spec.ts | 358 ++++++++++++++++++ .../__snapshots__/latency.spec.snap | 15 - .../tests/transactions/latency.spec.ts | 23 -- 51 files changed, 1536 insertions(+), 571 deletions(-) delete mode 100644 x-pack/plugins/apm/common/anomaly_detection/apm_ml_anomaly_query.ts create mode 100644 x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.test.ts create mode 100644 x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.ts create mode 100644 x-pack/plugins/apm/common/anomaly_detection/service_anomaly_timeseries.ts create mode 100644 x-pack/plugins/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx create mode 100644 x-pack/plugins/apm/public/context/environments_context/environments_context.tsx create mode 100644 x-pack/plugins/apm/public/context/environments_context/use_environments_context.tsx create mode 100644 x-pack/plugins/apm/public/context/service_anomaly_timeseries/service_anomaly_timeseries_context.tsx create mode 100644 x-pack/plugins/apm/public/context/service_anomaly_timeseries/use_service_anomaly_timeseries_context.tsx create mode 100644 x-pack/plugins/apm/public/hooks/use_preferred_service_anomaly_timeseries.ts create mode 100644 x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts create mode 100644 x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_anomaly_query.ts create mode 100644 x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_jobs_query.ts create mode 100644 x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_result_bucket_size.ts create mode 100644 x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_timeseries.ts delete mode 100644 x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/fetcher.ts delete mode 100644 x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/index.ts create mode 100644 x-pack/test/apm_api_integration/tests/anomalies/anomaly_charts.spec.ts diff --git a/packages/elastic-apm-synthtrace/src/lib/apm/base_span.ts b/packages/elastic-apm-synthtrace/src/lib/apm/base_span.ts index ba2af8ce9ee535..4fd5ee26986064 100644 --- a/packages/elastic-apm-synthtrace/src/lib/apm/base_span.ts +++ b/packages/elastic-apm-synthtrace/src/lib/apm/base_span.ts @@ -60,6 +60,11 @@ export class BaseSpan extends Serializable { return this; } + outcome(outcome: 'success' | 'failure' | 'unknown') { + this.fields['event.outcome'] = outcome; + return this; + } + serialize(): ApmFields[] { return [this.fields, ...this._children.flatMap((child) => child.serialize())]; } diff --git a/packages/elastic-apm-synthtrace/src/lib/apm/utils/get_transaction_metrics.ts b/packages/elastic-apm-synthtrace/src/lib/apm/utils/get_transaction_metrics.ts index 1595e589572233..8545ae65d8aa0f 100644 --- a/packages/elastic-apm-synthtrace/src/lib/apm/utils/get_transaction_metrics.ts +++ b/packages/elastic-apm-synthtrace/src/lib/apm/utils/get_transaction_metrics.ts @@ -66,6 +66,7 @@ export function getTransactionMetrics(events: ApmFields[]) { return { ...metricset.key, + 'metricset.name': 'transaction', 'transaction.duration.histogram': sortAndCompressHistogram(histogram), _doc_count: metricset.events.length, }; diff --git a/x-pack/plugins/apm/common/anomaly_detection/apm_ml_anomaly_query.ts b/x-pack/plugins/apm/common/anomaly_detection/apm_ml_anomaly_query.ts deleted file mode 100644 index 00fb4b5ee4a54a..00000000000000 --- a/x-pack/plugins/apm/common/anomaly_detection/apm_ml_anomaly_query.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { ApmMlDetectorIndex } from './apm_ml_detectors'; - -export function apmMlAnomalyQuery(detectorIndex: ApmMlDetectorIndex) { - return [ - { - bool: { - filter: [ - { - terms: { - result_type: ['model_plot', 'record'], - }, - }, - { - term: { detector_index: detectorIndex }, - }, - ], - }, - }, - ]; -} diff --git a/x-pack/plugins/apm/common/anomaly_detection/apm_ml_detectors.ts b/x-pack/plugins/apm/common/anomaly_detection/apm_ml_detectors.ts index 7c682321224080..e8c894cfdd01b1 100644 --- a/x-pack/plugins/apm/common/anomaly_detection/apm_ml_detectors.ts +++ b/x-pack/plugins/apm/common/anomaly_detection/apm_ml_detectors.ts @@ -5,8 +5,28 @@ * 2.0. */ -export const enum ApmMlDetectorIndex { - txLatency = 0, - txThroughput = 1, - txFailureRate = 2, +export const enum ApmMlDetectorType { + txLatency = 'txLatency', + txThroughput = 'txThroughput', + txFailureRate = 'txFailureRate', +} + +const detectorIndices = { + [ApmMlDetectorType.txLatency]: 0, + [ApmMlDetectorType.txThroughput]: 1, + [ApmMlDetectorType.txFailureRate]: 2, +}; + +export function getApmMlDetectorIndex(type: ApmMlDetectorType) { + return detectorIndices[type]; +} + +export function getApmMlDetectorType(detectorIndex: number) { + let type: ApmMlDetectorType; + for (type in detectorIndices) { + if (detectorIndices[type] === detectorIndex) { + return type; + } + } + throw new Error('Could not map detector index to type'); } diff --git a/x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.test.ts b/x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.test.ts new file mode 100644 index 00000000000000..9620ea3480ef4c --- /dev/null +++ b/x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.test.ts @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import uuid from 'uuid'; +import { ENVIRONMENT_ALL } from '../environment_filter_values'; +import { Environment } from '../environment_rt'; +import { ApmMlDetectorType } from './apm_ml_detectors'; +import { getPreferredServiceAnomalyTimeseries } from './get_preferred_service_anomaly_timeseries'; +import { ServiceAnomalyTimeseries } from './service_anomaly_timeseries'; + +const PROD = 'production' as Environment; +const DEV = 'development' as Environment; + +function createMockAnomalyTimeseries({ + type, + environment = PROD, + version = 3, +}: { + type: ApmMlDetectorType; + environment?: Environment; + version?: number; +}): ServiceAnomalyTimeseries { + return { + anomalies: [], + bounds: [], + environment, + jobId: uuid(), + type, + serviceName: 'opbeans-java', + transactionType: 'request', + version, + }; +} + +describe('getPreferredServiceAnomalyTimeseries', () => { + describe('with a wide set of series', () => { + const allAnomalyTimeseries = [ + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txLatency, + environment: PROD, + }), + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txLatency, + environment: DEV, + }), + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txThroughput, + environment: PROD, + }), + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txFailureRate, + environment: PROD, + }), + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txFailureRate, + environment: PROD, + version: 2, + }), + ]; + + describe('with one environment', () => { + const environments = [PROD]; + + describe('and all being selected', () => { + const environment = ENVIRONMENT_ALL.value; + it('returns the series for prod', () => { + expect( + getPreferredServiceAnomalyTimeseries({ + allAnomalyTimeseries, + detectorType: ApmMlDetectorType.txLatency, + environment, + environments, + fallbackToTransactions: false, + })?.environment + ).toBe(PROD); + }); + }); + }); + + describe('with multiple environments', () => { + const environments = [PROD, DEV]; + + describe('and all being selected', () => { + const environment = ENVIRONMENT_ALL.value; + + it('returns no series', () => { + expect( + getPreferredServiceAnomalyTimeseries({ + allAnomalyTimeseries, + detectorType: ApmMlDetectorType.txLatency, + environment, + environments, + fallbackToTransactions: false, + }) + ).toBeUndefined(); + + expect( + getPreferredServiceAnomalyTimeseries({ + allAnomalyTimeseries, + detectorType: ApmMlDetectorType.txLatency, + environment, + environments, + fallbackToTransactions: true, + }) + ).toBeUndefined(); + }); + }); + + describe('and production being selected', () => { + const environment = PROD; + + it('returns the series for production', () => { + const series = getPreferredServiceAnomalyTimeseries({ + allAnomalyTimeseries, + detectorType: ApmMlDetectorType.txFailureRate, + environment, + environments, + fallbackToTransactions: false, + }); + + expect(series).toBeDefined(); + + expect(series?.environment).toBe(PROD); + }); + }); + }); + }); + + describe('with multiple versions', () => { + const allAnomalyTimeseries = [ + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txLatency, + environment: PROD, + version: 3, + }), + createMockAnomalyTimeseries({ + type: ApmMlDetectorType.txLatency, + environment: PROD, + version: 2, + }), + ]; + + const environments = [PROD]; + const environment = ENVIRONMENT_ALL.value; + + it('selects the most recent version when transaction metrics are being used', () => { + const series = getPreferredServiceAnomalyTimeseries({ + allAnomalyTimeseries, + detectorType: ApmMlDetectorType.txLatency, + environment, + environments, + fallbackToTransactions: false, + }); + + expect(series?.version).toBe(3); + }); + + it('selects the legacy version when transaction metrics are being used', () => { + const series = getPreferredServiceAnomalyTimeseries({ + allAnomalyTimeseries, + detectorType: ApmMlDetectorType.txLatency, + environment, + environments, + fallbackToTransactions: true, + }); + + expect(series?.version).toBe(2); + }); + }); +}); diff --git a/x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.ts b/x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.ts new file mode 100644 index 00000000000000..473d2ffd92b0c2 --- /dev/null +++ b/x-pack/plugins/apm/common/anomaly_detection/get_preferred_service_anomaly_timeseries.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ENVIRONMENT_ALL } from '../environment_filter_values'; +import { Environment } from '../environment_rt'; +import { ApmMlDetectorType } from './apm_ml_detectors'; +import { ServiceAnomalyTimeseries } from './service_anomaly_timeseries'; + +export function getPreferredServiceAnomalyTimeseries({ + environment, + environments, + detectorType, + allAnomalyTimeseries, + fallbackToTransactions, +}: { + environment: Environment; + environments: Environment[]; + detectorType: ApmMlDetectorType; + allAnomalyTimeseries: ServiceAnomalyTimeseries[]; + fallbackToTransactions: boolean; +}) { + const seriesForType = allAnomalyTimeseries.filter( + (serie) => serie.type === detectorType + ); + + const preferredEnvironment = + environment === ENVIRONMENT_ALL.value && environments.length === 1 + ? environments[0] + : environment; + + return seriesForType.find( + (serie) => + serie.environment === preferredEnvironment && + (fallbackToTransactions ? serie.version <= 2 : serie.version >= 3) + ); +} diff --git a/x-pack/plugins/apm/common/anomaly_detection/service_anomaly_timeseries.ts b/x-pack/plugins/apm/common/anomaly_detection/service_anomaly_timeseries.ts new file mode 100644 index 00000000000000..833f66a442ac31 --- /dev/null +++ b/x-pack/plugins/apm/common/anomaly_detection/service_anomaly_timeseries.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Coordinate } from '../../typings/timeseries'; +import { ApmMlDetectorType } from './apm_ml_detectors'; + +export interface ServiceAnomalyTimeseries { + jobId: string; + type: ApmMlDetectorType; + environment: string; + serviceName: string; + version: number; + transactionType: string; + anomalies: Array; + bounds: Array<{ x: number; y0: number | null; y1: number | null }>; +} diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx index c836f5f7acd611..c568771be0b72d 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/index.tsx @@ -184,10 +184,7 @@ export function ErrorGroupOverview() { - + diff --git a/x-pack/plugins/apm/public/components/app/service_overview/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/index.tsx index 557854dd2692b5..6f3b5c71af8109 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/index.tsx @@ -23,7 +23,6 @@ import { ServiceOverviewInstancesChartAndTable } from './service_overview_instan import { ServiceOverviewThroughputChart } from './service_overview_throughput_chart'; import { TransactionsTable } from '../../shared/transactions_table'; import { useApmParams } from '../../../hooks/use_apm_params'; -import { useFallbackToTransactionsFetcher } from '../../../hooks/use_fallback_to_transactions_fetcher'; import { AggregatedTransactionsBadge } from '../../shared/aggregated_transactions_badge'; import { useApmRouter } from '../../../hooks/use_apm_router'; import { useTimeRange } from '../../../hooks/use_time_range'; @@ -36,7 +35,8 @@ import { replace } from '../../shared/Links/url_helpers'; export const chartHeight = 288; export function ServiceOverview() { - const { agentName, serviceName, transactionType } = useApmServiceContext(); + const { agentName, serviceName, transactionType, fallbackToTransactions } = + useApmServiceContext(); const { query, query: { @@ -47,9 +47,7 @@ export function ServiceOverview() { transactionType: transactionTypeFromUrl, }, } = useApmParams('/services/{serviceName}/overview'); - const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ - kuery, - }); + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); const history = useHistory(); @@ -96,11 +94,7 @@ export function ServiceOverview() { )} - + @@ -112,7 +106,6 @@ export function ServiceOverview() { @@ -142,7 +135,6 @@ export function ServiceOverview() { height={nonLatencyChartHeight} showAnnotations={false} kuery={kuery} - environment={environment} /> )} diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx index 7472eb780f119f..81628171f6a11b 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_throughput_chart.tsx @@ -14,11 +14,14 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; +import { ApmMlDetectorType } from '../../../../common/anomaly_detection/apm_ml_detectors'; import { asExactTransactionRate } from '../../../../common/utils/formatters'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; +import { useEnvironmentsContext } from '../../../context/environments_context/use_environments_context'; import { useLegacyUrlParams } from '../../../context/url_params_context/use_url_params'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useFetcher } from '../../../hooks/use_fetcher'; +import { usePreferredServiceAnomalyTimeseries } from '../../../hooks/use_preferred_service_anomaly_timeseries'; import { useTheme } from '../../../hooks/use_theme'; import { useTimeRange } from '../../../hooks/use_time_range'; import { TimeseriesChart } from '../../shared/charts/timeseries_chart'; @@ -34,12 +37,10 @@ const INITIAL_STATE = { export function ServiceOverviewThroughputChart({ height, - environment, kuery, transactionName, }: { height?: number; - environment: string; kuery: string; transactionName?: string; }) { @@ -53,6 +54,12 @@ export function ServiceOverviewThroughputChart({ query: { rangeFrom, rangeTo }, } = useApmParams('/services/{serviceName}'); + const { environment } = useEnvironmentsContext(); + + const preferredAnomalyTimeseries = usePreferredServiceAnomalyTimeseries( + ApmMlDetectorType.txThroughput + ); + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); const { transactionType, serviceName } = useApmServiceContext(); @@ -157,6 +164,7 @@ export function ServiceOverviewThroughputChart({ timeseries={timeseries} yLabelFormat={asExactTransactionRate} customTheme={comparisonChartTheme} + anomalyTimeseries={preferredAnomalyTimeseries} /> ); diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx index 96c7f104de404d..cf8d69410d26b0 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/index.tsx @@ -14,7 +14,6 @@ import { ChartPointerEventContextProvider } from '../../../context/chart_pointer import { useApmParams } from '../../../hooks/use_apm_params'; import { useApmRouter } from '../../../hooks/use_apm_router'; import { useTimeRange } from '../../../hooks/use_time_range'; -import { useFallbackToTransactionsFetcher } from '../../../hooks/use_fallback_to_transactions_fetcher'; import { AggregatedTransactionsBadge } from '../../shared/aggregated_transactions_badge'; import { TransactionCharts } from '../../shared/charts/transaction_charts'; import { replace } from '../../shared/Links/url_helpers'; @@ -32,7 +31,7 @@ export function TransactionDetails() { } = query; const { start, end } = useTimeRange({ rangeFrom, rangeTo }); const apmRouter = useApmRouter(); - const { transactionType } = useApmServiceContext(); + const { transactionType, fallbackToTransactions } = useApmServiceContext(); const history = useHistory(); @@ -49,11 +48,6 @@ export function TransactionDetails() { }), }); - const { kuery } = query; - const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ - kuery, - }); - return ( <> {fallbackToTransactions && } diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx index a1362f7373e2a4..e1d6fb65bbc569 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/index.tsx @@ -10,7 +10,6 @@ import React from 'react'; import { useHistory } from 'react-router-dom'; import { useApmServiceContext } from '../../../context/apm_service/use_apm_service_context'; import { useApmParams } from '../../../hooks/use_apm_params'; -import { useFallbackToTransactionsFetcher } from '../../../hooks/use_fallback_to_transactions_fetcher'; import { useTimeRange } from '../../../hooks/use_time_range'; import { AggregatedTransactionsBadge } from '../../shared/aggregated_transactions_badge'; import { TransactionCharts } from '../../shared/charts/transaction_charts'; @@ -30,10 +29,8 @@ export function TransactionOverview() { const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ - kuery, - }); - const { transactionType, serviceName } = useApmServiceContext(); + const { transactionType, serviceName, fallbackToTransactions } = + useApmServiceContext(); const history = useHistory(); diff --git a/x-pack/plugins/apm/public/components/routing/settings/index.tsx b/x-pack/plugins/apm/public/components/routing/settings/index.tsx index 45af7e62260b3b..dfaf65ed61b001 100644 --- a/x-pack/plugins/apm/public/components/routing/settings/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/settings/index.tsx @@ -95,8 +95,8 @@ export const settings = { }), params: t.partial({ query: t.partial({ - name: t.string, environment: t.string, + name: t.string, pageStep: agentConfigurationPageStepRt, }), }), diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx index 7ba0ca625d74c8..710b4b6f71a35f 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_main_template.tsx @@ -12,6 +12,7 @@ import { useKibana, KibanaPageTemplateProps, } from '../../../../../../../src/plugins/kibana_react/public'; +import { EnvironmentsContextProvider } from '../../../context/environments_context/environments_context'; import { useFetcher } from '../../../hooks/use_fetcher'; import { ApmPluginStartDeps } from '../../../plugin'; import { ApmEnvironmentFilter } from '../../shared/EnvironmentFilter'; @@ -33,11 +34,13 @@ export function ApmMainTemplate({ pageTitle, pageHeader, children, + environmentFilter = true, ...pageTemplateProps }: { pageTitle?: React.ReactNode; pageHeader?: EuiPageHeaderProps; children: React.ReactNode; + environmentFilter?: boolean; } & KibanaPageTemplateProps) { const location = useLocation(); @@ -61,12 +64,14 @@ export function ApmMainTemplate({ location.pathname.includes(path) ); - return ( + const rightSideItems = environmentFilter ? [] : []; + + const pageTemplate = ( ], + rightSideItems, ...pageHeader, }} {...pageTemplateProps} @@ -74,4 +79,12 @@ export function ApmMainTemplate({ {children} ); + + if (environmentFilter) { + return ( + {pageTemplate} + ); + } + + return pageTemplate; } diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx index 836b31bc5dfdb4..d076ddca9b8cf8 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx @@ -51,6 +51,7 @@ export default { alerts: [], transactionTypes: [], serviceName, + fallbackToTransactions: false, }} > diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx index 0ae718c79cf39c..0b97301b4e7c52 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/index.tsx @@ -25,6 +25,7 @@ import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plug import { ApmServiceContextProvider } from '../../../../context/apm_service/apm_service_context'; import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { useBreadcrumb } from '../../../../context/breadcrumbs/use_breadcrumb'; +import { ServiceAnomalyTimeseriesContextProvider } from '../../../../context/service_anomaly_timeseries/service_anomaly_timeseries_context'; import { useApmParams } from '../../../../hooks/use_apm_params'; import { useApmRouter } from '../../../../hooks/use_apm_router'; import { useTimeRange } from '../../../../hooks/use_time_range'; @@ -57,7 +58,9 @@ interface Props { export function ApmServiceTemplate(props: Props) { return ( - + + + ); } diff --git a/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx b/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx index dabe9043495bc8..ec8366dfb36b4e 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/settings_template.tsx @@ -38,12 +38,12 @@ export function SettingsTemplate({ children, selectedTab }: Props) { return ( {children} diff --git a/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx b/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx index d259d4340ce4ca..4344ed3a80f649 100644 --- a/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/EnvironmentFilter/index.tsx @@ -16,9 +16,10 @@ import { } from '../../../../common/environment_filter_values'; import { useEnvironmentsFetcher } from '../../../hooks/use_environments_fetcher'; import { fromQuery, toQuery } from '../Links/url_helpers'; -import { useTimeRange } from '../../../hooks/use_time_range'; -import { useApmParams } from '../../../hooks/use_apm_params'; import { useUxUrlParams } from '../../../context/url_params_context/use_ux_url_params'; +import { FETCH_STATUS } from '../../../hooks/use_fetcher'; +import { Environment } from '../../../../common/environment_rt'; +import { useEnvironmentsContext } from '../../../context/environments_context/use_environments_context'; function updateEnvironmentUrl( history: History, @@ -62,23 +63,13 @@ function getOptions(environments: string[]) { } export function ApmEnvironmentFilter() { - const { path, query } = useApmParams('/*'); - - const serviceName = 'serviceName' in path ? path.serviceName : undefined; - const environment = - ('environment' in query && query.environment) || ENVIRONMENT_ALL.value; - - const rangeFrom = 'rangeFrom' in query ? query.rangeFrom : undefined; - const rangeTo = 'rangeTo' in query ? query.rangeTo : undefined; - - const { start, end } = useTimeRange({ rangeFrom, rangeTo, optional: true }); + const { status, environments, environment } = useEnvironmentsContext(); return ( ); } @@ -88,34 +79,32 @@ export function UxEnvironmentFilter() { urlParams: { start, end, environment, serviceName }, } = useUxUrlParams(); + const { environments, status } = useEnvironmentsFetcher({ + serviceName, + start, + end, + }); + return ( ); } export function EnvironmentFilter({ - start, - end, environment, - serviceName, + environments, + status, }: { - start?: string; - end?: string; - environment?: string; - serviceName?: string; + environment: Environment; + environments: Environment[]; + status: FETCH_STATUS; }) { const history = useHistory(); const location = useLocation(); - const { environments, status = 'loading' } = useEnvironmentsFetcher({ - serviceName, - start, - end, - }); // Set the min-width so we don't see as much collapsing of the select during // the loading state. 200px is what is looks like if "production" is @@ -135,7 +124,7 @@ export function EnvironmentFilter({ onChange={(event) => { updateEnvironmentUrl(history, location, event.target.value); }} - isLoading={status === 'loading'} + isLoading={status === FETCH_STATUS.LOADING} style={{ minWidth }} data-test-subj="environmentFilter" /> diff --git a/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx index a5952a363a9e06..349a487ff1f19b 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx @@ -23,6 +23,9 @@ import { } from '../../time_comparison/get_time_range_comparison'; import { useApmParams } from '../../../../hooks/use_apm_params'; import { useTimeRange } from '../../../../hooks/use_time_range'; +import { useEnvironmentsContext } from '../../../../context/environments_context/use_environments_context'; +import { ApmMlDetectorType } from '../../../../../common/anomaly_detection/apm_ml_detectors'; +import { usePreferredServiceAnomalyTimeseries } from '../../../../hooks/use_preferred_service_anomaly_timeseries'; function yLabelFormat(y?: number | null) { return asPercent(y || 0, 1); @@ -32,7 +35,6 @@ interface Props { height?: number; showAnnotations?: boolean; kuery: string; - environment: string; } type ErrorRate = @@ -52,7 +54,6 @@ const INITIAL_STATE: ErrorRate = { export function FailedTransactionRateChart({ height, showAnnotations = true, - environment, kuery, }: Props) { const theme = useTheme(); @@ -66,6 +67,12 @@ export function FailedTransactionRateChart({ const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const { environment } = useEnvironmentsContext(); + + const preferredAnomalyTimeseries = usePreferredServiceAnomalyTimeseries( + ApmMlDetectorType.txFailureRate + ); + const { serviceName, transactionType, alerts } = useApmServiceContext(); const comparisonChartThem = getComparisonChartTheme(theme); const { comparisonStart, comparisonEnd } = getTimeRangeComparison({ @@ -154,6 +161,7 @@ export function FailedTransactionRateChart({ yLabelFormat={yLabelFormat} yDomain={{ min: 0, max: 1 }} customTheme={comparisonChartThem} + anomalyTimeseries={preferredAnomalyTimeseries} alerts={alerts.filter( (alert) => alert[ALERT_RULE_TYPE_ID]?.[0] === AlertType.TransactionErrorRate diff --git a/x-pack/plugins/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx b/x-pack/plugins/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx new file mode 100644 index 00000000000000..ffb62b7c62aac7 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/charts/helper/get_chart_anomaly_timeseries.tsx @@ -0,0 +1,107 @@ +/* + * Copyright 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 { Fit } from '@elastic/charts'; +import { i18n } from '@kbn/i18n'; +import { rgba } from 'polished'; +import { EuiTheme } from '../../../../../../../../src/plugins/kibana_react/common'; +import { getSeverityColor } from '../../../../../common/anomaly_detection'; +import { + ANOMALY_SEVERITY, + ANOMALY_THRESHOLD, +} from '../../../../../common/ml_constants'; +import { ServiceAnomalyTimeseries } from '../../../../../common/anomaly_detection/service_anomaly_timeseries'; +import { APMChartSpec } from '../../../../../typings/timeseries'; +import { getSeverity } from '../../../../../../ml/public'; + +export function getChartAnomalyTimeseries({ + anomalyTimeseries, + theme, +}: { + anomalyTimeseries?: ServiceAnomalyTimeseries; + theme: EuiTheme; +}): + | { + boundaries: APMChartSpec[]; + scores: APMChartSpec[]; + } + | undefined { + if (!anomalyTimeseries) { + return undefined; + } + + const boundaries = [ + { + title: 'model plot', + type: 'area', + fit: Fit.Lookahead, + hideLegend: true, + hideTooltipValue: true, + areaSeriesStyle: { + point: { + opacity: 0, + }, + }, + color: rgba(theme.eui.euiColorVis1, 0.5), + stackAccessors: ['x'], + yAccessors: ['y0'], + y0Accessors: ['y1'], + data: anomalyTimeseries.bounds, + }, + ]; + + const severities = [ + { severity: ANOMALY_SEVERITY.MAJOR, threshold: ANOMALY_THRESHOLD.MAJOR }, + { + severity: ANOMALY_SEVERITY.CRITICAL, + threshold: ANOMALY_THRESHOLD.CRITICAL, + }, + ]; + + const scores: APMChartSpec[] = severities.map(({ severity, threshold }) => { + const color = getSeverityColor(threshold); + + const style = { + line: { + opacity: 0, + }, + area: { + fill: color, + }, + point: { + visible: true, + opacity: 0.75, + radius: 3, + strokeWidth: 1, + fill: color, + stroke: rgba(0, 0, 0, 0.1), + }, + }; + + const data = anomalyTimeseries.anomalies.map((anomaly) => ({ + ...anomaly, + y: getSeverity(anomaly.y ?? 0).id === severity ? anomaly.actual : null, + })); + + return { + title: i18n.translate('xpack.apm.anomalyScore', { + defaultMessage: + '{severity, select, minor {Minor} major {Major} critical {Critical}} anomaly', + values: { + severity, + }, + }), + type: 'line', + hideLegend: true, + lineSeriesStyle: style, + data, + color, + }; + }); + + return { boundaries, scores }; +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx index 2876febc21d1ee..3c0693c2dea04b 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx @@ -26,11 +26,13 @@ import { import { MLHeader } from '../../../shared/charts/transaction_charts/ml_header'; import * as urlHelpers from '../../../shared/Links/url_helpers'; import { getComparisonChartTheme } from '../../time_comparison/get_time_range_comparison'; +import { useEnvironmentsContext } from '../../../../context/environments_context/use_environments_context'; +import { ApmMlDetectorType } from '../../../../../common/anomaly_detection/apm_ml_detectors'; +import { usePreferredServiceAnomalyTimeseries } from '../../../../hooks/use_preferred_service_anomaly_timeseries'; interface Props { height?: number; kuery: string; - environment: string; } const options: Array<{ value: LatencyAggregationType; text: string }> = [ @@ -43,7 +45,7 @@ function filterNil(value: T | null | undefined): value is T { return value != null; } -export function LatencyChart({ height, kuery, environment }: Props) { +export function LatencyChart({ height, kuery }: Props) { const history = useHistory(); const theme = useTheme(); const comparisonChartTheme = getComparisonChartTheme(theme); @@ -51,17 +53,22 @@ export function LatencyChart({ height, kuery, environment }: Props) { const { latencyAggregationType, comparisonEnabled } = urlParams; const license = useLicenseContext(); + const { environment } = useEnvironmentsContext(); + const { latencyChartsData, latencyChartsStatus } = useTransactionLatencyChartsFetcher({ kuery, environment, }); - const { currentPeriod, previousPeriod, anomalyTimeseries, mlJobId } = - latencyChartsData; + const { currentPeriod, previousPeriod } = latencyChartsData; const { alerts } = useApmServiceContext(); + const preferredAnomalyTimeseries = usePreferredServiceAnomalyTimeseries( + ApmMlDetectorType.txLatency + ); + const timeseries = [ currentPeriod, comparisonEnabled ? previousPeriod : undefined, @@ -111,7 +118,7 @@ export function LatencyChart({ height, kuery, environment }: Props) { @@ -124,7 +131,7 @@ export function LatencyChart({ height, kuery, environment }: Props) { customTheme={comparisonChartTheme} timeseries={timeseries} yLabelFormat={getResponseTimeTickFormatter(latencyFormatter)} - anomalyTimeseries={anomalyTimeseries} + anomalyTimeseries={preferredAnomalyTimeseries} alerts={alerts.filter( (alert) => alert[ALERT_RULE_TYPE_ID]?.[0] === diff --git a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx index 5799a73b5822c5..f9dcf139dcfdb1 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx @@ -28,7 +28,6 @@ import { Meta, Story } from '@storybook/react'; import React from 'react'; import { MemoryRouter } from 'react-router-dom'; import { KibanaContextProvider } from '../../../../../../../../src/plugins/kibana_react/public'; -import { ENVIRONMENT_ALL } from '../../../../../common/environment_filter_values'; import { LatencyAggregationType } from '../../../../../common/latency_aggregation_types'; import type { ApmPluginContextValue } from '../../../../context/apm_plugin/apm_plugin_context'; import { MockApmPluginContextWrapper } from '../../../../context/apm_plugin/mock_apm_plugin_context'; @@ -106,6 +105,7 @@ const stories: Meta = { serviceName, transactionType, transactionTypes: [], + fallbackToTransactions: false, }} > @@ -124,9 +124,7 @@ const stories: Meta = { export default stories; export const Example: Story = () => { - return ( - - ); + return ; }; Example.args = { alertsResponse: { @@ -207,17 +205,6 @@ Example.args = { ], }, latencyChartResponse: { - anomalyTimeseries: { - jobId: 'apm-production-00aa-high_mean_transaction_duration', - anomalyScore: [ - { - x0: 1622613600000, - x: 1622616000000, - y: 90.7449171687341, - }, - ], - anomalyBoundaries: [], - }, currentPeriod: { overallAvgDuration: 3912.628446632232, latencyTimeseries: [ @@ -816,18 +803,12 @@ Example.args = { }; export const NoData: Story = () => { - return ( - - ); + return ; }; + NoData.args = { alertsResponse: { alerts: [] }, latencyChartResponse: { - anomalyTimeseries: { - jobId: 'apm-production-00aa-high_mean_transaction_duration', - anomalyScore: [], - anomalyBoundaries: [], - }, currentPeriod: { latencyTimeseries: [], overallAvgDuration: null }, previousPeriod: { latencyTimeseries: [], overallAvgDuration: null }, }, diff --git a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx index 29ef524508b028..1cb8a4facfd69d 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart.tsx @@ -16,7 +16,6 @@ import { LineSeries, niceTimeFormatter, Position, - RectAnnotation, ScaleType, Settings, XYBrushEvent, @@ -31,23 +30,20 @@ import { useChartTheme, } from '../../../../../observability/public'; import { asAbsoluteDateTime } from '../../../../common/utils/formatters'; -import { - Coordinate, - RectCoordinate, - TimeSeries, -} from '../../../../typings/timeseries'; +import { Coordinate, TimeSeries } from '../../../../typings/timeseries'; import { useAnnotationsContext } from '../../../context/annotations/use_annotations_context'; import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; import { APMServiceAlert } from '../../../context/apm_service/apm_service_context'; import { useChartPointerEventContext } from '../../../context/chart_pointer_event/use_chart_pointer_event_context'; import { FETCH_STATUS } from '../../../hooks/use_fetcher'; import { useTheme } from '../../../hooks/use_theme'; -import { getLatencyChartSelector } from '../../../selectors/latency_chart_selectors'; import { unit } from '../../../utils/style'; import { ChartContainer } from './chart_container'; import { getAlertAnnotations } from './helper/get_alert_annotations'; import { getTimeZone } from './helper/timezone'; import { isTimeseriesEmpty, onBrushEnd } from './helper/helper'; +import { ServiceAnomalyTimeseries } from '../../../../common/anomaly_detection/service_anomaly_timeseries'; +import { getChartAnomalyTimeseries } from './helper/get_chart_anomaly_timeseries'; interface Props { id: string; @@ -65,9 +61,7 @@ interface Props { yTickFormat?: (y: number) => string; showAnnotations?: boolean; yDomain?: YDomainRange; - anomalyTimeseries?: ReturnType< - typeof getLatencyChartSelector - >['anomalyTimeseries']; + anomalyTimeseries?: ServiceAnomalyTimeseries; customTheme?: Record; alerts?: APMServiceAlert[]; } @@ -103,10 +97,20 @@ export function TimeseriesChart({ const min = Math.min(...xValues); const max = Math.max(...xValues); + const anomalyChartTimeseries = getChartAnomalyTimeseries({ + anomalyTimeseries, + theme, + }); + const xFormatter = niceTimeFormatter([min, max]); const isEmpty = isTimeseriesEmpty(timeseries); const annotationColor = theme.eui.euiColorSuccess; - const allSeries = [...timeseries, ...(anomalyTimeseries?.boundaries ?? [])]; + const allSeries = [ + ...timeseries, + // TODO: re-enable anomaly boundaries when we have a fix for https://github.com/elastic/kibana/issues/100660 + // ...(anomalyChartTimeseries?.boundaries ?? []), + ...(anomalyChartTimeseries?.scores ?? []), + ]; const xDomain = isEmpty ? { min: 0, max: 1 } : { min, max }; return ( @@ -185,11 +189,15 @@ export function TimeseriesChart({ false : undefined } - stackAccessors={serie.stackAccessors ?? undefined} areaSeriesStyle={serie.areaSeriesStyle} lineSeriesStyle={serie.lineSeriesStyle} /> ); })} - {anomalyTimeseries?.scores && ( - ({ - coordinates: { x0, x1 }, - }) - )} - style={{ fill: anomalyTimeseries.scores.color }} - /> - )} {getAlertAnnotations({ alerts, chartStartTime: xValues[0], diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/index.tsx index 9ff128657dbb1f..ff1eec200a0c22 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/index.tsx @@ -38,13 +38,12 @@ export function TransactionCharts({ - + @@ -55,10 +54,7 @@ export function TransactionCharts({ - + ['alerts'] @@ -30,12 +31,14 @@ export interface APMServiceContextValue { transactionTypes: string[]; alerts: APMServiceAlert[]; runtimeName?: string; + fallbackToTransactions: boolean; } export const APMServiceContext = createContext({ serviceName: '', transactionTypes: [], alerts: [], + fallbackToTransactions: false, }); export function ApmServiceContextProvider({ @@ -46,7 +49,7 @@ export function ApmServiceContextProvider({ const { path: { serviceName }, query, - query: { rangeFrom, rangeTo }, + query: { kuery, rangeFrom, rangeTo }, } = useApmParams('/services/{serviceName}'); const { start, end } = useTimeRange({ rangeFrom, rangeTo }); @@ -77,6 +80,10 @@ export function ApmServiceContextProvider({ end, }); + const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ + kuery, + }); + return ( diff --git a/x-pack/plugins/apm/public/context/environments_context/environments_context.tsx b/x-pack/plugins/apm/public/context/environments_context/environments_context.tsx new file mode 100644 index 00000000000000..6350dd3f0a7e84 --- /dev/null +++ b/x-pack/plugins/apm/public/context/environments_context/environments_context.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; +import { Environment } from '../../../common/environment_rt'; +import { useApmParams } from '../../hooks/use_apm_params'; +import { useEnvironmentsFetcher } from '../../hooks/use_environments_fetcher'; +import { FETCH_STATUS } from '../../hooks/use_fetcher'; +import { useTimeRange } from '../../hooks/use_time_range'; + +export const EnvironmentsContext = React.createContext<{ + environment: Environment; + environments: Environment[]; + status: FETCH_STATUS; +}>({ + environment: ENVIRONMENT_ALL.value, + environments: [], + status: FETCH_STATUS.NOT_INITIATED, +}); + +export function EnvironmentsContextProvider({ + children, +}: { + children: React.ReactElement; +}) { + const { path, query } = useApmParams('/*'); + + const serviceName = 'serviceName' in path ? path.serviceName : undefined; + const environment = + ('environment' in query && (query.environment as Environment)) || + ENVIRONMENT_ALL.value; + + const rangeFrom = 'rangeFrom' in query ? query.rangeFrom : undefined; + const rangeTo = 'rangeTo' in query ? query.rangeTo : undefined; + + const { start, end } = useTimeRange({ rangeFrom, rangeTo, optional: true }); + + const { environments, status } = useEnvironmentsFetcher({ + serviceName, + start, + end, + }); + + return ( + + {children} + + ); +} diff --git a/x-pack/plugins/apm/public/context/environments_context/use_environments_context.tsx b/x-pack/plugins/apm/public/context/environments_context/use_environments_context.tsx new file mode 100644 index 00000000000000..179140dff9d88b --- /dev/null +++ b/x-pack/plugins/apm/public/context/environments_context/use_environments_context.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useContext } from 'react'; +import { EnvironmentsContext } from './environments_context'; + +export function useEnvironmentsContext() { + return useContext(EnvironmentsContext); +} diff --git a/x-pack/plugins/apm/public/context/service_anomaly_timeseries/service_anomaly_timeseries_context.tsx b/x-pack/plugins/apm/public/context/service_anomaly_timeseries/service_anomaly_timeseries_context.tsx new file mode 100644 index 00000000000000..77095d847e3c5b --- /dev/null +++ b/x-pack/plugins/apm/public/context/service_anomaly_timeseries/service_anomaly_timeseries_context.tsx @@ -0,0 +1,83 @@ +/* + * Copyright 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 { ServiceAnomalyTimeseries } from '../../../common/anomaly_detection/service_anomaly_timeseries'; +import { useApmParams } from '../../hooks/use_apm_params'; +import { FETCH_STATUS, useFetcher } from '../../hooks/use_fetcher'; +import { useTimeRange } from '../../hooks/use_time_range'; +import { useApmPluginContext } from '../apm_plugin/use_apm_plugin_context'; +import { useApmServiceContext } from '../apm_service/use_apm_service_context'; +import { isActivePlatinumLicense } from '../../../common/license_check'; +import { useLicenseContext } from '../license/use_license_context'; + +export const ServiceAnomalyTimeseriesContext = React.createContext<{ + status: FETCH_STATUS; + allAnomalyTimeseries: ServiceAnomalyTimeseries[]; +}>({ + status: FETCH_STATUS.NOT_INITIATED, + allAnomalyTimeseries: [], +}); + +export function ServiceAnomalyTimeseriesContextProvider({ + children, +}: { + children: React.ReactChild; +}) { + const { serviceName, transactionType } = useApmServiceContext(); + + const { core } = useApmPluginContext(); + + const license = useLicenseContext(); + + const mlCapabilities = core.application.capabilities.ml as + | { canGetJobs: boolean } + | undefined; + + const canGetAnomalies = + mlCapabilities?.canGetJobs && isActivePlatinumLicense(license); + + const { + query: { rangeFrom, rangeTo }, + } = useApmParams('/services/{serviceName}'); + + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + + const { status, data } = useFetcher( + (callApmApi) => { + if (!transactionType || !canGetAnomalies) { + return; + } + + return callApmApi({ + endpoint: 'GET /internal/apm/services/{serviceName}/anomaly_charts', + params: { + path: { + serviceName, + }, + query: { + start, + end, + transactionType, + }, + }, + }); + }, + [serviceName, canGetAnomalies, transactionType, start, end] + ); + + return ( + + {children} + + ); +} diff --git a/x-pack/plugins/apm/public/context/service_anomaly_timeseries/use_service_anomaly_timeseries_context.tsx b/x-pack/plugins/apm/public/context/service_anomaly_timeseries/use_service_anomaly_timeseries_context.tsx new file mode 100644 index 00000000000000..a21a2d0345068d --- /dev/null +++ b/x-pack/plugins/apm/public/context/service_anomaly_timeseries/use_service_anomaly_timeseries_context.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useContext } from 'react'; +import { ServiceAnomalyTimeseriesContext } from './service_anomaly_timeseries_context'; + +export function useServiceAnomalyTimeseriesContext() { + return useContext(ServiceAnomalyTimeseriesContext); +} diff --git a/x-pack/plugins/apm/public/hooks/use_environments_fetcher.tsx b/x-pack/plugins/apm/public/hooks/use_environments_fetcher.tsx index e37677e806e8a7..caec2c3d3556fb 100644 --- a/x-pack/plugins/apm/public/hooks/use_environments_fetcher.tsx +++ b/x-pack/plugins/apm/public/hooks/use_environments_fetcher.tsx @@ -34,7 +34,7 @@ export function useEnvironmentsFetcher({ start?: string; end?: string; }) { - const { data = INITIAL_DATA, status = 'loading' } = useFetcher( + const { data = INITIAL_DATA, status } = useFetcher( (callApmApi) => { if (start && end) { return callApmApi({ diff --git a/x-pack/plugins/apm/public/hooks/use_preferred_service_anomaly_timeseries.ts b/x-pack/plugins/apm/public/hooks/use_preferred_service_anomaly_timeseries.ts new file mode 100644 index 00000000000000..fedfc9609f25b0 --- /dev/null +++ b/x-pack/plugins/apm/public/hooks/use_preferred_service_anomaly_timeseries.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ApmMlDetectorType } from '../../common/anomaly_detection/apm_ml_detectors'; +import { getPreferredServiceAnomalyTimeseries } from '../../common/anomaly_detection/get_preferred_service_anomaly_timeseries'; +import { useApmServiceContext } from '../context/apm_service/use_apm_service_context'; +import { useEnvironmentsContext } from '../context/environments_context/use_environments_context'; +import { useServiceAnomalyTimeseriesContext } from '../context/service_anomaly_timeseries/use_service_anomaly_timeseries_context'; + +export function usePreferredServiceAnomalyTimeseries( + detectorType: ApmMlDetectorType +) { + const { allAnomalyTimeseries } = useServiceAnomalyTimeseriesContext(); + + const { environment, environments } = useEnvironmentsContext(); + + const { fallbackToTransactions } = useApmServiceContext(); + + return getPreferredServiceAnomalyTimeseries({ + environment, + environments, + fallbackToTransactions, + detectorType, + allAnomalyTimeseries, + }); +} diff --git a/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts b/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts index 808beb72f2e7ae..8be5fc89574312 100644 --- a/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts +++ b/x-pack/plugins/apm/public/selectors/latency_chart_selector.test.ts @@ -31,11 +31,6 @@ const latencyChartData = { overallAvgDuration: 1, latencyTimeseries: [{ x: 1, y: 10 }], }, - anomalyTimeseries: { - jobId: '1', - anomalyBoundaries: [{ x: 1, y: 2, y0: 1 }], - anomalyScore: [{ x: 1, x0: 2 }], - }, } as LatencyChartsResponse; describe('getLatencyChartSelector', () => { @@ -45,15 +40,12 @@ describe('getLatencyChartSelector', () => { expect(latencyChart).toEqual({ currentPeriod: undefined, previousPeriod: undefined, - mlJobId: undefined, - anomalyTimeseries: undefined, }); }); it('returns average timeseries', () => { - const { anomalyTimeseries, ...latencyWithoutAnomaly } = latencyChartData; const latencyTimeseries = getLatencyChartSelector({ - latencyChart: latencyWithoutAnomaly as LatencyChartsResponse, + latencyChart: latencyChartData, theme, latencyAggregationType: LatencyAggregationType.avg, }); @@ -76,9 +68,8 @@ describe('getLatencyChartSelector', () => { }); it('returns 95th percentile timeseries', () => { - const { anomalyTimeseries, ...latencyWithoutAnomaly } = latencyChartData; const latencyTimeseries = getLatencyChartSelector({ - latencyChart: latencyWithoutAnomaly as LatencyChartsResponse, + latencyChart: latencyChartData, theme, latencyAggregationType: LatencyAggregationType.p95, }); @@ -100,9 +91,8 @@ describe('getLatencyChartSelector', () => { }); it('returns 99th percentile timeseries', () => { - const { anomalyTimeseries, ...latencyWithoutAnomaly } = latencyChartData; const latencyTimeseries = getLatencyChartSelector({ - latencyChart: latencyWithoutAnomaly as LatencyChartsResponse, + latencyChart: latencyChartData, theme, latencyAggregationType: LatencyAggregationType.p99, }); @@ -146,39 +136,6 @@ describe('getLatencyChartSelector', () => { color: 'green', title: 'Previous period', }, - mlJobId: '1', - anomalyTimeseries: { - boundaries: [ - { - type: 'area', - fit: 'lookahead', - hideLegend: true, - hideTooltipValue: true, - stackAccessors: ['y'], - areaSeriesStyle: { point: { opacity: 0 } }, - title: 'anomalyBoundariesLower', - data: [{ x: 1, y: 1 }], - color: 'rgba(0,0,0,0)', - }, - { - type: 'area', - fit: 'lookahead', - hideLegend: true, - hideTooltipValue: true, - stackAccessors: ['y'], - areaSeriesStyle: { point: { opacity: 0 } }, - title: 'anomalyBoundariesUpper', - data: [{ x: 1, y: 1 }], - color: 'rgba(0,0,255,0.5)', - }, - ], - scores: { - title: 'anomalyScores', - type: 'rectAnnotation', - data: [{ x: 1, x0: 2 }], - color: 'yellow', - }, - }, }); }); }); diff --git a/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts b/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts index bb681430893471..d656352c64f9fa 100644 --- a/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts +++ b/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts @@ -5,9 +5,7 @@ * 2.0. */ -import { Fit } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; -import { rgba } from 'polished'; import { EuiTheme } from '../../../../../src/plugins/kibana_react/common'; import { asDuration } from '../../common/utils/formatters'; import { APMChartSpec, Coordinate } from '../../typings/timeseries'; @@ -19,8 +17,6 @@ export type LatencyChartsResponse = export interface LatencyChartData { currentPeriod?: APMChartSpec; previousPeriod?: APMChartSpec; - mlJobId?: string; - anomalyTimeseries?: { boundaries: APMChartSpec[]; scores: APMChartSpec }; } export function getLatencyChartSelector({ @@ -48,11 +44,6 @@ export function getLatencyChartSelector({ previousPeriod: latencyChart.previousPeriod, theme, }), - mlJobId: latencyChart.anomalyTimeseries?.jobId, - anomalyTimeseries: getAnomalyTimeseries({ - anomalyTimeseries: latencyChart.anomalyTimeseries, - theme, - }), }; } @@ -125,58 +116,3 @@ function getLatencyTimeseries({ } } } - -function getAnomalyTimeseries({ - anomalyTimeseries, - theme, -}: { - anomalyTimeseries: LatencyChartsResponse['anomalyTimeseries']; - theme: EuiTheme; -}): { boundaries: APMChartSpec[]; scores: APMChartSpec } | undefined { - if (!anomalyTimeseries) { - return undefined; - } - - const boundariesConfigBase = { - type: 'area', - fit: Fit.Lookahead, - hideLegend: true, - hideTooltipValue: true, - stackAccessors: ['y'], - areaSeriesStyle: { - point: { - opacity: 0, - }, - }, - }; - - const boundaries = [ - { - ...boundariesConfigBase, - title: 'anomalyBoundariesLower', - data: anomalyTimeseries.anomalyBoundaries.map((coord) => ({ - x: coord.x, - y: coord.y0, - })), - color: rgba(0, 0, 0, 0), - }, - { - ...boundariesConfigBase, - title: 'anomalyBoundariesUpper', - data: anomalyTimeseries.anomalyBoundaries.map((coord) => ({ - x: coord.x, - y: coord.y - coord.y0, - })), - color: rgba(theme.eui.euiColorVis1, 0.5), - }, - ]; - - const scores = { - title: 'anomalyScores', - type: 'rectAnnotation', - data: anomalyTimeseries.anomalyScore, - color: theme.eui.euiColorVis9, - }; - - return { boundaries, scores }; -} diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.ts new file mode 100644 index 00000000000000..fbc08aa657f715 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/anomaly_search.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 { + ESSearchRequest, + ESSearchResponse, +} from '../../../../../../src/core/types/elasticsearch'; +import { Setup } from '../helpers/setup_request'; + +interface SharedFields { + job_id: string; + bucket_span: number; + detector_index: number; + timestamp: number; + partition_field_name: string; + partition_field_value: string; + by_field_name: string; + by_field_value: string; +} + +interface MlModelPlot extends SharedFields { + result_type: 'model_plot'; + model_feature: string; + model_lower: number; + model_upper: number; + model_median: number; + actual: number; +} + +interface MlRecord extends SharedFields { + result_type: 'record'; + record_score: number; + initial_record_score: number; + function: string; + function_description: string; + typical: number[]; + actual: number[]; + field_name: string; + is_interim: boolean; +} + +type AnomalyDocument = MlRecord | MlModelPlot; + +export async function anomalySearch( + mlAnomalySearch: Required['ml']['mlSystem']['mlAnomalySearch'], + params: TParams +): Promise> { + const response = await mlAnomalySearch(params, []); + + return response as unknown as ESSearchResponse; +} diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_anomaly_query.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_anomaly_query.ts new file mode 100644 index 00000000000000..f988043023ac06 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_anomaly_query.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { termQuery, termsQuery } from '../../../../observability/server'; +import { + ApmMlDetectorType, + getApmMlDetectorIndex, +} from '../../../common/anomaly_detection/apm_ml_detectors'; + +export function apmMlAnomalyQuery({ + serviceName, + transactionType, + detectorTypes, +}: { + serviceName?: string; + detectorTypes?: ApmMlDetectorType[]; + transactionType?: string; +}) { + return [ + { + bool: { + filter: [ + { + bool: { + should: [ + { + bool: { + filter: [ + ...termQuery('is_interim', false), + ...termQuery('result_type', 'record'), + ], + }, + }, + { + bool: { + filter: termQuery('result_type', 'model_plot'), + }, + }, + ], + minimum_should_match: 1, + }, + }, + ...termsQuery( + 'detector_index', + ...(detectorTypes?.map((type) => getApmMlDetectorIndex(type)) ?? []) + ), + ...termQuery('partition_field_value', serviceName), + ...termQuery('by_field_value', transactionType), + ], + }, + }, + ] as QueryDslQueryContainer[]; +} diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_jobs_query.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_jobs_query.ts new file mode 100644 index 00000000000000..4eec3b39f3739b --- /dev/null +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/apm_ml_jobs_query.ts @@ -0,0 +1,24 @@ +/* + * Copyright 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 { + MlJob, + QueryDslQueryContainer, +} from '@elastic/elasticsearch/lib/api/types'; + +export function apmMlJobsQuery(jobs: MlJob[]) { + if (!jobs.length) { + throw new Error('At least one ML job should be given'); + } + + return [ + { + terms: { + job_id: jobs.map((job) => job.job_id), + }, + }, + ] as QueryDslQueryContainer[]; +} diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_result_bucket_size.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_result_bucket_size.ts new file mode 100644 index 00000000000000..1e87c4fe3d320c --- /dev/null +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_result_bucket_size.ts @@ -0,0 +1,22 @@ +/* + * Copyright 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 { getBucketSize } from '../helpers/get_bucket_size'; + +export function getAnomalyResultBucketSize({ + start, + end, +}: { + start: number; + end: number; +}) { + return getBucketSize({ + start, + end, + numBuckets: 100, + }); +} diff --git a/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_timeseries.ts b/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_timeseries.ts new file mode 100644 index 00000000000000..77ffef9801a865 --- /dev/null +++ b/x-pack/plugins/apm/server/lib/anomaly_detection/get_anomaly_timeseries.ts @@ -0,0 +1,206 @@ +/* + * Copyright 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 { Logger } from '@kbn/logging'; +import { compact, keyBy } from 'lodash'; +import { rangeQuery } from '../../../../observability/server'; +import { apmMlAnomalyQuery } from './apm_ml_anomaly_query'; +import { + ApmMlDetectorType, + getApmMlDetectorType, +} from '../../../common/anomaly_detection/apm_ml_detectors'; +import type { ServiceAnomalyTimeseries } from '../../../common/anomaly_detection/service_anomaly_timeseries'; +import { apmMlJobsQuery } from './apm_ml_jobs_query'; +import { asMutableArray } from '../../../common/utils/as_mutable_array'; +import { maybe } from '../../../common/utils/maybe'; +import type { Setup } from '../helpers/setup_request'; +import { anomalySearch } from './anomaly_search'; +import { getAnomalyResultBucketSize } from './get_anomaly_result_bucket_size'; +import { getMlJobsWithAPMGroup } from './get_ml_jobs_with_apm_group'; + +export async function getAnomalyTimeseries({ + serviceName, + transactionType, + start, + end, + logger, + mlSetup, +}: { + serviceName: string; + transactionType: string; + start: number; + end: number; + logger: Logger; + mlSetup: Required['ml']; +}): Promise { + if (!mlSetup) { + return []; + } + + const { intervalString } = getAnomalyResultBucketSize({ + start, + end, + }); + + const { jobs: mlJobs } = await getMlJobsWithAPMGroup( + mlSetup.anomalyDetectors + ); + + if (!mlJobs.length) { + return []; + } + + const anomaliesResponse = await anomalySearch( + mlSetup.mlSystem.mlAnomalySearch, + { + body: { + size: 0, + query: { + bool: { + filter: [ + ...apmMlAnomalyQuery({ + serviceName, + transactionType, + }), + ...rangeQuery(start, end, 'timestamp'), + ...apmMlJobsQuery(mlJobs), + ], + }, + }, + aggs: { + by_timeseries_id: { + composite: { + size: 5000, + sources: asMutableArray([ + { + jobId: { + terms: { + field: 'job_id', + }, + }, + }, + { + detectorIndex: { + terms: { + field: 'detector_index', + }, + }, + }, + { + serviceName: { + terms: { + field: 'partition_field_value', + }, + }, + }, + { + transactionType: { + terms: { + field: 'by_field_value', + }, + }, + }, + ] as const), + }, + aggs: { + timeseries: { + date_histogram: { + field: 'timestamp', + fixed_interval: intervalString, + extended_bounds: { + min: start, + max: end, + }, + }, + aggs: { + top_anomaly: { + top_metrics: { + metrics: asMutableArray([ + { field: 'record_score' }, + { field: 'actual' }, + ] as const), + size: 1, + sort: { + record_score: 'desc', + }, + }, + }, + model_lower: { + min: { + field: 'model_lower', + }, + }, + model_upper: { + max: { + field: 'model_upper', + }, + }, + }, + }, + }, + }, + }, + }, + } + ); + + const jobsById = keyBy(mlJobs, (job) => job.job_id); + + function divide(value: number | null, divider: number) { + if (value === null) { + return null; + } + return value / divider; + } + + const series: Array = + anomaliesResponse.aggregations?.by_timeseries_id.buckets.map((bucket) => { + const jobId = bucket.key.jobId as string; + const job = maybe(jobsById[jobId]); + + if (!job) { + logger.warn(`Could not find job for id ${jobId}`); + return undefined; + } + + const type = getApmMlDetectorType(Number(bucket.key.detectorIndex)); + + // ml failure rate is stored as 0-100, we calculate failure rate as 0-1 + const divider = type === ApmMlDetectorType.txFailureRate ? 100 : 1; + + return { + jobId, + type, + serviceName: bucket.key.serviceName as string, + environment: job.custom_settings!.job_tags!.environment as string, + transactionType: bucket.key.transactionType as string, + version: Number(job.custom_settings!.job_tags!.apm_ml_version), + anomalies: bucket.timeseries.buckets.map((dateBucket) => ({ + x: dateBucket.key as number, + y: + (dateBucket.top_anomaly.top[0]?.metrics.record_score as + | number + | null + | undefined) ?? null, + actual: divide( + (dateBucket.top_anomaly.top[0]?.metrics.actual as + | number + | null + | undefined) ?? null, + divider + ), + })), + bounds: bucket.timeseries.buckets.map((dateBucket) => ({ + x: dateBucket.key as number, + y0: divide(dateBucket.model_lower.value, divider), + y1: divide(dateBucket.model_upper.value, divider), + })), + }; + }) ?? []; + + return compact(series); +} diff --git a/x-pack/plugins/apm/server/routes/environments/get_environments.ts b/x-pack/plugins/apm/server/routes/environments/get_environments.ts index 34ac9cb18d7967..3b208ef8758991 100644 --- a/x-pack/plugins/apm/server/routes/environments/get_environments.ts +++ b/x-pack/plugins/apm/server/routes/environments/get_environments.ts @@ -14,6 +14,7 @@ import { ProcessorEvent } from '../../../common/processor_event'; import { rangeQuery, termQuery } from '../../../../observability/server'; import { getProcessorEventForTransactions } from '../../lib/helpers/transactions'; import { Setup } from '../../lib/helpers/setup_request'; +import { Environment } from '../../../common/environment_rt'; /** * This is used for getting the list of environments for the environments selector, @@ -78,5 +79,5 @@ export async function getEnvironments({ (environmentBucket) => environmentBucket.key as string ); - return environments; + return environments as Environment[]; } diff --git a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts index 65c022b7175deb..66b12dab59775f 100644 --- a/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts +++ b/x-pack/plugins/apm/server/routes/service_map/get_service_anomalies.ts @@ -22,8 +22,8 @@ import { rangeQuery } from '../../../../observability/server'; import { withApmSpan } from '../../utils/with_apm_span'; import { getMlJobsWithAPMGroup } from '../../lib/anomaly_detection/get_ml_jobs_with_apm_group'; import { Setup } from '../../lib/helpers/setup_request'; -import { apmMlAnomalyQuery } from '../../../common/anomaly_detection/apm_ml_anomaly_query'; -import { ApmMlDetectorIndex } from '../../../common/anomaly_detection/apm_ml_detectors'; +import { apmMlAnomalyQuery } from '../../lib/anomaly_detection/apm_ml_anomaly_query'; +import { ApmMlDetectorType } from '../../../common/anomaly_detection/apm_ml_detectors'; export const DEFAULT_ANOMALIES: ServiceAnomaliesResponse = { mlJobIds: [], @@ -58,7 +58,9 @@ export async function getServiceAnomalies({ query: { bool: { filter: [ - ...apmMlAnomalyQuery(ApmMlDetectorIndex.txLatency), + ...apmMlAnomalyQuery({ + detectorTypes: [ApmMlDetectorType.txLatency], + }), ...rangeQuery( Math.min(end - 30 * 60 * 1000, start), end, diff --git a/x-pack/plugins/apm/server/routes/services/route.ts b/x-pack/plugins/apm/server/routes/services/route.ts index 6df0af26ad8d6e..0f4034a2187486 100644 --- a/x-pack/plugins/apm/server/routes/services/route.ts +++ b/x-pack/plugins/apm/server/routes/services/route.ts @@ -44,7 +44,14 @@ import { offsetPreviousPeriodCoordinates } from '../../../common/utils/offset_pr import { getServicesDetailedStatistics } from './get_services_detailed_statistics'; import { getServiceDependenciesBreakdown } from './get_service_dependencies_breakdown'; import { getBucketSizeForAggregatedTransactions } from '../../lib/helpers/get_bucket_size_for_aggregated_transactions'; +import { getAnomalyTimeseries } from '../../lib/anomaly_detection/get_anomaly_timeseries'; +import { + UnknownMLCapabilitiesError, + InsufficientMLCapabilities, + MLPrivilegesUninitialized, +} from '../../../../ml/server'; import { getServiceInstancesDetailedStatisticsPeriods } from './get_service_instances/detailed_statistics'; +import { ML_ERRORS } from '../../../common/anomaly_detection'; const servicesRoute = createApmServerRoute({ endpoint: 'GET /internal/apm/services', @@ -848,6 +855,55 @@ const serviceInfrastructureRoute = createApmServerRoute({ }, }); +const serviceAnomalyChartsRoute = createApmServerRoute({ + endpoint: 'GET /internal/apm/services/{serviceName}/anomaly_charts', + params: t.type({ + path: t.type({ + serviceName: t.string, + }), + query: t.intersection([rangeRt, t.type({ transactionType: t.string })]), + }), + options: { + tags: ['access:apm'], + }, + handler: async (resources) => { + const setup = await setupRequest(resources); + + if (!setup.ml) { + throw Boom.notImplemented(ML_ERRORS.ML_NOT_AVAILABLE); + } + + const { + path: { serviceName }, + query: { start, end, transactionType }, + } = resources.params; + + try { + const allAnomalyTimeseries = await getAnomalyTimeseries({ + serviceName, + transactionType, + start, + end, + mlSetup: setup.ml, + logger: resources.logger, + }); + + return { + allAnomalyTimeseries, + }; + } catch (error) { + if ( + error instanceof UnknownMLCapabilitiesError || + error instanceof InsufficientMLCapabilities || + error instanceof MLPrivilegesUninitialized + ) { + throw Boom.forbidden(error.message); + } + throw error; + } + }, +}); + export const serviceRouteRepository = createApmServerRouteRepository() .add(servicesRoute) .add(servicesDetailedStatisticsRoute) @@ -867,4 +923,5 @@ export const serviceRouteRepository = createApmServerRouteRepository() .add(serviceProfilingTimelineRoute) .add(serviceProfilingStatisticsRoute) .add(serviceAlertsRoute) - .add(serviceInfrastructureRoute); + .add(serviceInfrastructureRoute) + .add(serviceAnomalyChartsRoute); diff --git a/x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/fetcher.ts b/x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/fetcher.ts deleted file mode 100644 index 704bc751e5772e..00000000000000 --- a/x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/fetcher.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { ESSearchResponse } from '../../../../../../../src/core/types/elasticsearch'; -import { PromiseReturnType } from '../../../../../observability/typings/common'; -import { rangeQuery } from '../../../../../observability/server'; -import { asMutableArray } from '../../../../common/utils/as_mutable_array'; -import { withApmSpan } from '../../../utils/with_apm_span'; -import { Setup } from '../../../lib/helpers/setup_request'; -import { apmMlAnomalyQuery } from '../../../../common/anomaly_detection/apm_ml_anomaly_query'; -import { ApmMlDetectorIndex } from '../../../../common/anomaly_detection/apm_ml_detectors'; - -export type ESResponse = Exclude< - PromiseReturnType, - undefined ->; - -export function anomalySeriesFetcher({ - serviceName, - transactionType, - intervalString, - ml, - start, - end, -}: { - serviceName: string; - transactionType: string; - intervalString: string; - ml: Required['ml']; - start: number; - end: number; -}) { - return withApmSpan('get_latency_anomaly_data', async () => { - const params = { - body: { - size: 0, - query: { - bool: { - filter: [ - ...apmMlAnomalyQuery(ApmMlDetectorIndex.txLatency), - { term: { partition_field_value: serviceName } }, - { term: { by_field_value: transactionType } }, - ...rangeQuery(start, end, 'timestamp'), - ] as QueryDslQueryContainer[], - }, - }, - aggs: { - job_id: { - terms: { - field: 'job_id', - }, - aggs: { - ml_avg_response_times: { - date_histogram: { - field: 'timestamp', - fixed_interval: intervalString, - extended_bounds: { min: start, max: end }, - }, - aggs: { - anomaly_score: { - top_metrics: { - metrics: asMutableArray([ - { field: 'record_score' }, - { field: 'timestamp' }, - { field: 'bucket_span' }, - ] as const), - sort: { - record_score: 'desc' as const, - }, - }, - }, - lower: { min: { field: 'model_lower' } }, - upper: { max: { field: 'model_upper' } }, - }, - }, - }, - }, - }, - }, - }; - - return ml.mlSystem.mlAnomalySearch(params, []) as unknown as Promise< - ESSearchResponse - >; - }); -} diff --git a/x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/index.ts b/x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/index.ts deleted file mode 100644 index 0cdbe1774504af..00000000000000 --- a/x-pack/plugins/apm/server/routes/transactions/get_anomaly_data/index.ts +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { compact } from 'lodash'; -import { Logger } from 'src/core/server'; -import { isFiniteNumber } from '../../../../common/utils/is_finite_number'; -import { maybe } from '../../../../common/utils/maybe'; -import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; -import { getBucketSize } from '../../../lib/helpers/get_bucket_size'; -import { Setup } from '../../../lib/helpers/setup_request'; -import { anomalySeriesFetcher } from './fetcher'; -import { getMLJobIds } from '../../service_map/get_service_anomalies'; -import { ANOMALY_THRESHOLD } from '../../../../common/ml_constants'; -import { withApmSpan } from '../../../utils/with_apm_span'; - -export async function getAnomalySeries({ - environment, - serviceName, - transactionType, - transactionName, - kuery, - setup, - logger, - start, - end, -}: { - environment: string; - serviceName: string; - transactionType: string; - transactionName?: string; - kuery: string; - setup: Setup; - logger: Logger; - start: number; - end: number; -}) { - const { ml } = setup; - - // don't fetch anomalies if the ML plugin is not setup - if (!ml) { - return undefined; - } - - // don't fetch anomalies if requested for a specific transaction name - // as ML results are not partitioned by transaction name - if (!!transactionName) { - return undefined; - } - - // don't fetch anomalies when no specific environment is selected - if (!environment || environment === ENVIRONMENT_ALL.value) { - return undefined; - } - - // Don't fetch anomalies if kuery is present - if (kuery) { - return undefined; - } - - return withApmSpan('get_latency_anomaly_series', async () => { - const { intervalString } = getBucketSize({ start, end }); - - // move the start back with one bucket size, to ensure to get anomaly data in the beginning - // this is required because ML has a minimum bucket size (default is 900s) so if our buckets - // are smaller, we might have several null buckets in the beginning - const mlStart = start - 900 * 1000; - - const [anomaliesResponse, jobIds] = await Promise.all([ - anomalySeriesFetcher({ - serviceName, - transactionType, - intervalString, - ml, - start: mlStart, - end, - }), - getMLJobIds(ml.anomalyDetectors, environment), - ]); - - const scoreSeriesCollection = - anomaliesResponse?.aggregations?.job_id.buckets - .filter((bucket) => jobIds.includes(bucket.key as string)) - .map((bucket) => { - const dateBuckets = bucket.ml_avg_response_times.buckets; - - return { - jobId: bucket.key as string, - anomalyScore: compact( - dateBuckets.map((dateBucket) => { - const metrics = maybe(dateBucket.anomaly_score.top[0])?.metrics; - const score = metrics?.record_score; - - if ( - !metrics || - !isFiniteNumber(score) || - score < ANOMALY_THRESHOLD.CRITICAL - ) { - return null; - } - - const anomalyStart = Date.parse(metrics.timestamp as string); - const anomalyEnd = - anomalyStart + (metrics.bucket_span as number) * 1000; - - return { - x0: anomalyStart, - x: anomalyEnd, - y: score, - }; - }) - ), - anomalyBoundaries: dateBuckets - .filter( - (dateBucket) => - dateBucket.lower.value !== null && - dateBucket.upper.value !== null - ) - .map((dateBucket) => ({ - x: dateBucket.key, - y0: dateBucket.lower.value as number, - y: dateBucket.upper.value as number, - })), - }; - }); - - if ((scoreSeriesCollection?.length ?? 0) > 1) { - logger.warn( - `More than one ML job was found for ${serviceName} for environment ${environment}. Only showing results from ${scoreSeriesCollection?.[0].jobId}` - ); - } - - return scoreSeriesCollection?.[0]; - }); -} diff --git a/x-pack/plugins/apm/server/routes/transactions/route.ts b/x-pack/plugins/apm/server/routes/transactions/route.ts index 5b3f4e4f3bd4ca..fb73fe1555965b 100644 --- a/x-pack/plugins/apm/server/routes/transactions/route.ts +++ b/x-pack/plugins/apm/server/routes/transactions/route.ts @@ -18,7 +18,6 @@ import { getServiceTransactionGroups } from '../services/get_service_transaction import { getServiceTransactionGroupDetailedStatisticsPeriods } from '../services/get_service_transaction_group_detailed_statistics'; import { getTransactionBreakdown } from './breakdown'; import { getTransactionTraceSamples } from './trace_samples'; -import { getAnomalySeries } from './get_anomaly_data'; import { getLatencyPeriods } from './get_latency_charts'; import { getErrorRatePeriods } from '../../lib/transaction_groups/get_error_rate'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; @@ -204,26 +203,16 @@ const transactionLatencyChartsRoute = createApmServerRoute({ end, }; - const [{ currentPeriod, previousPeriod }, anomalyTimeseries] = - await Promise.all([ - getLatencyPeriods({ - ...options, - latencyAggregationType: - latencyAggregationType as LatencyAggregationType, - comparisonStart, - comparisonEnd, - }), - getAnomalySeries(options).catch((error) => { - logger.warn(`Unable to retrieve anomalies for latency charts.`); - logger.error(error); - return undefined; - }), - ]); + const { currentPeriod, previousPeriod } = await getLatencyPeriods({ + ...options, + latencyAggregationType: latencyAggregationType as LatencyAggregationType, + comparisonStart, + comparisonEnd, + }); return { currentPeriod, previousPeriod, - anomalyTimeseries, }; }, }); diff --git a/x-pack/plugins/apm/typings/timeseries.ts b/x-pack/plugins/apm/typings/timeseries.ts index 0157ca4dd6f043..257c659c9ef8f3 100644 --- a/x-pack/plugins/apm/typings/timeseries.ts +++ b/x-pack/plugins/apm/typings/timeseries.ts @@ -11,6 +11,8 @@ import { Fit, FitConfig, LineSeriesStyle, + SeriesColorAccessorFn, + SeriesColorsArray, } from '@elastic/charts'; import { DeepPartial } from 'utility-types'; import { Maybe } from '../typings/common'; @@ -20,6 +22,12 @@ export interface Coordinate { y: Maybe; } +export interface BandCoordinate { + x: number; + y0: number | null; + y1: number | null; +} + export interface RectCoordinate { x: number; x0: number; @@ -28,26 +36,37 @@ export interface RectCoordinate { type Accessor = Array; export type TimeSeries< - TCoordinate extends { x: number } = Coordinate | RectCoordinate + TCoordinate extends { x: number } = + | Coordinate + | RectCoordinate + | BandCoordinate > = APMChartSpec; export interface APMChartSpec< - TCoordinate extends { x: number } = Coordinate | RectCoordinate + TCoordinate extends { x: number } = + | Coordinate + | RectCoordinate + | BandCoordinate > { title: string; + id?: string; titleShort?: string; hideLegend?: boolean; hideTooltipValue?: boolean; data: TCoordinate[]; legendValue?: string; type: string; - color: string; + color: string | SeriesColorsArray | SeriesColorAccessorFn; areaColor?: string; fit?: Exclude | FitConfig; stackAccessors?: Accessor; + yAccessors?: Accessor; + y0Accessors?: Accessor; splitSeriesAccessors?: Accessor; + markSizeAccessor?: string | AccessorFn; lineSeriesStyle?: DeepPartial; areaSeriesStyle?: DeepPartial; + groupId?: string; } export type ChartType = 'area' | 'linemark'; diff --git a/x-pack/plugins/observability/server/index.ts b/x-pack/plugins/observability/server/index.ts index 51204c7512a3d5..80da043d26d766 100644 --- a/x-pack/plugins/observability/server/index.ts +++ b/x-pack/plugins/observability/server/index.ts @@ -17,7 +17,7 @@ import { unwrapEsResponse, WrappedElasticsearchClientError, } from '../common/utils/unwrap_es_response'; -export { rangeQuery, kqlQuery, termQuery } from './utils/queries'; +export { rangeQuery, kqlQuery, termQuery, termsQuery } from './utils/queries'; export { getInspectResponse } from '../common/utils/get_inspect_response'; export * from './types'; diff --git a/x-pack/plugins/observability/server/utils/queries.ts b/x-pack/plugins/observability/server/utils/queries.ts index 54900cd46ea479..e3a7ad36e64855 100644 --- a/x-pack/plugins/observability/server/utils/queries.ts +++ b/x-pack/plugins/observability/server/utils/queries.ts @@ -4,16 +4,37 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - +import { reject } from 'lodash'; +import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; -export function termQuery(field: T, value: string | undefined) { - if (!value) { +function isUndefinedOrNull(value: any): value is undefined | null { + return value === undefined || value === null; +} + +export function termQuery( + field: T, + value: string | boolean | number | undefined | null +): QueryDslQueryContainer[] { + if (isUndefinedOrNull(value)) { + return []; + } + + return [{ term: { [field]: value } }]; +} + +export function termsQuery( + field: string, + ...values: Array +): QueryDslQueryContainer[] { + const filtered = reject(values, isUndefinedOrNull); + + if (!filtered.length) { return []; } - return [{ term: { [field]: value } as Record }]; + return [{ terms: { [field]: filtered } }]; } export function rangeQuery( diff --git a/x-pack/test/apm_api_integration/common/config.ts b/x-pack/test/apm_api_integration/common/config.ts index cee1fdbbc50b3f..4311a31fa5ec13 100644 --- a/x-pack/test/apm_api_integration/common/config.ts +++ b/x-pack/test/apm_api_integration/common/config.ts @@ -16,6 +16,7 @@ import { APMFtrConfigName } from '../configs'; import { createApmApiClient } from './apm_api_supertest'; import { RegistryProvider } from './registry'; import { synthtraceEsClientService } from './synthtrace_es_client_service'; +import { MachineLearningAPIProvider } from '../../functional/services/ml/api'; export interface ApmFtrConfig { name: APMFtrConfigName; @@ -99,7 +100,7 @@ export function createTestConfig(config: ApmFtrConfig) { ), }; }, - + ml: MachineLearningAPIProvider, // legacy clients legacySupertestAsNoAccessUser: getLegacySupertestClient(kibanaServer, ApmUser.noAccessUser), legacySupertestAsApmReadUser: getLegacySupertestClient(kibanaServer, ApmUser.apmReadUser), diff --git a/x-pack/test/apm_api_integration/tests/anomalies/anomaly_charts.spec.ts b/x-pack/test/apm_api_integration/tests/anomalies/anomaly_charts.spec.ts new file mode 100644 index 00000000000000..174d3b9fa6dff7 --- /dev/null +++ b/x-pack/test/apm_api_integration/tests/anomalies/anomaly_charts.spec.ts @@ -0,0 +1,358 @@ +/* + * Copyright 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 { range, omit } from 'lodash'; +import { apm, timerange } from '@elastic/apm-synthtrace'; +import { FtrProviderContext } from '../../common/ftr_provider_context'; +import { ApmApiError } from '../../common/apm_api_supertest'; +import job from '../../../../plugins/ml/server/models/data_recognizer/modules/apm_transaction/ml/apm_tx_metrics.json'; +import datafeed from '../../../../plugins/ml/server/models/data_recognizer/modules/apm_transaction/ml/datafeed_apm_tx_metrics.json'; +import { ServiceAnomalyTimeseries } from '../../../../plugins/apm/common/anomaly_detection/service_anomaly_timeseries'; +import { ApmMlDetectorType } from '../../../../plugins/apm/common/anomaly_detection/apm_ml_detectors'; + +export default function ApiTest({ getService }: FtrProviderContext) { + const registry = getService('registry'); + + const apmApiClient = getService('apmApiClient'); + const ml = getService('ml'); + + const synthtraceEsClient = getService('synthtraceEsClient'); + + async function statusOf(p: Promise<{ status: number }>) { + try { + const { status } = await p; + return status; + } catch (err) { + if (err instanceof ApmApiError) { + return err.res.status; + } + throw err; + } + } + + function getAnomalyCharts( + { + start, + end, + transactionType, + serviceName, + }: { + start: string; + end: string; + transactionType: string; + serviceName: string; + }, + user = apmApiClient.readUser + ) { + return user({ + endpoint: 'GET /internal/apm/services/{serviceName}/anomaly_charts', + params: { + path: { + serviceName, + }, + query: { + start, + end, + transactionType, + }, + }, + }); + } + + registry.when( + 'fetching service anomalies with a basic license', + { config: 'basic', archives: ['apm_mappings_only_8.0.0'] }, + () => { + it('returns a 501', async () => { + const status = await statusOf( + getAnomalyCharts({ + serviceName: 'a', + transactionType: 'request', + start: '2021-01-01T00:00:00.000Z', + end: '2021-01-01T00:15:00.000Z', + }) + ); + + expect(status).to.eql(501); + }); + } + ); + + registry.when( + 'fetching service anomalies with a trial license', + { config: 'trial', archives: ['apm_mappings_only_8.0.0'] }, + () => { + const start = '2021-01-01T00:00:00.000Z'; + const end = '2021-01-08T00:15:00.000Z'; + + const spikeStart = new Date('2021-01-03T00:00:00.000Z').getTime(); + const spikeEnd = new Date('2021-01-03T02:00:00.000Z').getTime(); + + const NORMAL_DURATION = 100; + const NORMAL_RATE = 1; + + before(async () => { + const serviceA = apm.service('a', 'production', 'java').instance('a'); + + const serviceB = apm.service('b', 'development', 'go').instance('b'); + + const events = timerange(new Date(start).getTime(), new Date(end).getTime()) + .interval('1m') + .rate(1) + .flatMap((timestamp) => { + const isInSpike = timestamp >= spikeStart && timestamp < spikeEnd; + const count = isInSpike ? 4 : NORMAL_RATE; + const duration = isInSpike ? 1000 : NORMAL_DURATION; + const outcome = isInSpike ? 'failure' : 'success'; + + return [ + ...range(0, count).flatMap((_) => + serviceA + .transaction('tx', 'request') + .timestamp(timestamp) + .duration(duration) + .outcome(outcome) + .serialize() + ), + ...serviceB + .transaction('tx', 'Worker') + .timestamp(timestamp) + .duration(duration) + .success() + .serialize(), + ]; + }); + + await synthtraceEsClient.index(events); + }); + + after(async () => { + await synthtraceEsClient.clean(); + }); + + it('returns a 403 for a user without access to ML', async () => { + expect( + await statusOf( + getAnomalyCharts( + { + serviceName: 'a', + transactionType: 'request', + start, + end, + }, + apmApiClient.noMlAccessUser + ) + ) + ).to.eql(403); + }); + + describe('without ml jobs', () => { + it('returns a 200 for a user _with_ access to ML', async () => { + const status = await statusOf( + getAnomalyCharts({ + serviceName: 'a', + transactionType: 'request', + start, + end, + }) + ); + + expect(status).to.eql(200); + }); + }); + + describe('with ml jobs', () => { + before(async () => { + await Promise.all([ + ml.createAndRunAnomalyDetectionLookbackJob( + // @ts-expect-error not entire job config + { + ...job, + job_id: 'apm-tx-metrics-prod', + allow_lazy_open: false, + custom_settings: { + job_tags: { + apm_ml_version: '3', + environment: 'production', + }, + }, + }, + { + ...datafeed, + job_id: 'apm-tx-metrics-prod', + indices: ['apm-*'], + datafeed_id: 'apm-tx-metrics-prod-datafeed', + query: { + bool: { + filter: [ + ...datafeed.query.bool.filter, + { term: { 'service.environment': 'production' } }, + ], + }, + }, + } + ), + ml.createAndRunAnomalyDetectionLookbackJob( + // @ts-expect-error not entire job config + { + ...job, + job_id: 'apm-tx-metrics-development', + allow_lazy_open: false, + custom_settings: { + job_tags: { + apm_ml_version: '3', + environment: 'development', + }, + }, + }, + { + ...datafeed, + job_id: 'apm-tx-metrics-development', + indices: ['apm-*'], + datafeed_id: 'apm-tx-metrics-development-datafeed', + query: { + bool: { + filter: [ + ...datafeed.query.bool.filter, + { term: { 'service.environment': 'development' } }, + ], + }, + }, + } + ), + ]); + }); + + after(async () => { + await ml.cleanMlIndices(); + }); + + it('returns a 200 for a user _with_ access to ML', async () => { + const status = await statusOf( + getAnomalyCharts({ + serviceName: 'a', + transactionType: 'request', + start, + end, + }) + ); + + expect(status).to.eql(200); + }); + + describe('inspecting the body', () => { + let allAnomalyTimeseries: ServiceAnomalyTimeseries[]; + + let latencySeries: ServiceAnomalyTimeseries | undefined; + let throughputSeries: ServiceAnomalyTimeseries | undefined; + let failureRateSeries: ServiceAnomalyTimeseries | undefined; + + before(async () => { + allAnomalyTimeseries = ( + await getAnomalyCharts({ + serviceName: 'a', + transactionType: 'request', + start, + end, + }) + ).body.allAnomalyTimeseries; + + latencySeries = allAnomalyTimeseries.find( + (spec) => spec.type === ApmMlDetectorType.txLatency + ); + throughputSeries = allAnomalyTimeseries.find( + (spec) => spec.type === ApmMlDetectorType.txThroughput + ); + failureRateSeries = allAnomalyTimeseries.find( + (spec) => spec.type === ApmMlDetectorType.txFailureRate + ); + }); + + it('returns model plots for all detectors and job ids for the given transaction type', () => { + expect(allAnomalyTimeseries.length).to.eql(3); + + expect( + allAnomalyTimeseries.every((spec) => spec.bounds.some((bound) => bound.y0 ?? 0 > 0)) + ); + }); + + it('returns the correct metadata', () => { + function omitTimeseriesData(series: ServiceAnomalyTimeseries | undefined) { + return series ? omit(series, 'anomalies', 'bounds') : undefined; + } + + expect(omitTimeseriesData(latencySeries)).to.eql({ + type: ApmMlDetectorType.txLatency, + jobId: 'apm-tx-metrics-prod', + serviceName: 'a', + environment: 'production', + transactionType: 'request', + version: 3, + }); + + expect(omitTimeseriesData(throughputSeries)).to.eql({ + type: ApmMlDetectorType.txThroughput, + jobId: 'apm-tx-metrics-prod', + serviceName: 'a', + environment: 'production', + transactionType: 'request', + version: 3, + }); + + expect(omitTimeseriesData(failureRateSeries)).to.eql({ + type: ApmMlDetectorType.txFailureRate, + jobId: 'apm-tx-metrics-prod', + serviceName: 'a', + environment: 'production', + transactionType: 'request', + version: 3, + }); + }); + + it('returns anomalies for during the spike', () => { + const latencyAnomalies = latencySeries?.anomalies.filter( + (anomaly) => anomaly.y ?? 0 > 0 + ); + + const throughputAnomalies = throughputSeries?.anomalies.filter( + (anomaly) => anomaly.y ?? 0 > 0 + ); + + const failureRateAnomalies = failureRateSeries?.anomalies.filter( + (anomaly) => anomaly.y ?? 0 > 0 + ); + + expect(latencyAnomalies?.length).to.be.greaterThan(0); + + expect(throughputAnomalies?.length).to.be.greaterThan(0); + + expect(failureRateAnomalies?.length).to.be.greaterThan(0); + + expect( + latencyAnomalies?.every( + (anomaly) => anomaly.x >= spikeStart && (anomaly.actual ?? 0) > NORMAL_DURATION + ) + ); + + expect( + throughputAnomalies?.every( + (anomaly) => anomaly.x >= spikeStart && (anomaly.actual ?? 0) > NORMAL_RATE + ) + ); + + expect( + failureRateAnomalies?.every( + (anomaly) => anomaly.x >= spikeStart && (anomaly.actual ?? 0) > 0 + ) + ); + }); + }); + }); + } + ); +} diff --git a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/latency.spec.snap b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/latency.spec.snap index ff9e52b57aeaa0..dec67450bdbda9 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/latency.spec.snap +++ b/x-pack/test/apm_api_integration/tests/transactions/__snapshots__/latency.spec.snap @@ -129,18 +129,3 @@ Array [ }, ] `; - -exports[`APM API tests trial apm_8.0.0 Transaction latency with a trial license when data is loaded with environment selected should return a non-empty anomaly series 1`] = ` -Array [ - Object { - "x": 1627974000000, - "y": 85916.7945636914, - "y0": 24329.7607058434, - }, - Object { - "x": 1627974900000, - "y": 88154.9755916935, - "y0": 23498.4070709888, - }, -] -`; diff --git a/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts b/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts index 6c69d09b45d62b..bcdae590b7fc39 100644 --- a/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts +++ b/x-pack/test/apm_api_integration/tests/transactions/latency.spec.ts @@ -295,24 +295,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('should have a successful response', () => { expect(response.status).to.eql(200); }); - - it('should return the ML job id for anomalies of the selected environment', () => { - const latencyChartReturn = response.body as LatencyChartReturnType; - expect(latencyChartReturn).to.have.property('anomalyTimeseries'); - expect(latencyChartReturn.anomalyTimeseries).to.have.property('jobId'); - expectSnapshot(latencyChartReturn.anomalyTimeseries?.jobId).toMatchInline( - `"apm-production-6117-high_mean_transaction_duration"` - ); - }); - - it('should return a non-empty anomaly series', () => { - const latencyChartReturn = response.body as LatencyChartReturnType; - expect(latencyChartReturn).to.have.property('anomalyTimeseries'); - expect(latencyChartReturn.anomalyTimeseries?.anomalyBoundaries?.length).to.be.greaterThan( - 0 - ); - expectSnapshot(latencyChartReturn.anomalyTimeseries?.anomalyBoundaries).toMatch(); - }); }); describe('with all environments selected', () => { @@ -335,11 +317,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { it('should have a successful response', () => { expect(response.status).to.eql(200); }); - - it('should not return anomaly timeseries data', () => { - const latencyChartReturn = response.body as LatencyChartReturnType; - expect(latencyChartReturn).to.not.have.property('anomalyTimeseries'); - }); }); } ); From 850d41c21c3bb69074ea2925f65bcf374e170ae5 Mon Sep 17 00:00:00 2001 From: Oliver Gupte Date: Wed, 1 Dec 2021 09:55:23 -0500 Subject: [PATCH 020/126] [APM] Adds support to install latest prerelease APM package version (#118836) * [APM] Adds support to install latest prerelease APM package version (#117975) * fixes some type errors * fixes linting failures * PR feedback adding shared isPrereleaseVersion function --- .../components/tutorial/instruction.js | 3 +- x-pack/plugins/apm/common/fleet.ts | 5 +++ .../config_agent/config_agent.stories.tsx | 1 + .../tutorial/config_agent/index.test.tsx | 10 ++++++ .../public/tutorial/config_agent/index.tsx | 14 ++++++-- .../tutorial/config_agent/rum_script.tsx | 3 ++ .../tutorial_fleet_instructions/index.tsx | 15 ++++++-- .../tutorial_fleet_instructions.stories.tsx | 1 + x-pack/plugins/apm/server/plugin.ts | 2 ++ .../apm_routes/register_apm_server_routes.ts | 3 ++ .../fleet/create_cloud_apm_package_policy.ts | 6 +++- .../get_apm_package_policy_definition.ts | 35 ++++++++++++++++--- .../fleet/register_fleet_policy_callbacks.ts | 7 ++++ .../plugins/apm/server/routes/fleet/route.ts | 4 ++- x-pack/plugins/apm/server/routes/typings.ts | 1 + x-pack/plugins/fleet/server/plugin.ts | 4 +++ .../server/endpoint/mocks.ts | 1 + 17 files changed, 104 insertions(+), 11 deletions(-) diff --git a/src/plugins/home/public/application/components/tutorial/instruction.js b/src/plugins/home/public/application/components/tutorial/instruction.js index ebe78b78f300d7..68360c86d2edeb 100644 --- a/src/plugins/home/public/application/components/tutorial/instruction.js +++ b/src/plugins/home/public/application/components/tutorial/instruction.js @@ -24,7 +24,7 @@ export function Instruction({ variantId, isCloudEnabled, }) { - const { tutorialService, http, uiSettings, getBasePath } = getServices(); + const { tutorialService, http, uiSettings, getBasePath, kibanaVersion } = getServices(); let pre; if (textPre) { @@ -82,6 +82,7 @@ export function Instruction({ http={http} variantId={variantId} isCloudEnabled={isCloudEnabled} + kibanaVersion={kibanaVersion} /> diff --git a/x-pack/plugins/apm/common/fleet.ts b/x-pack/plugins/apm/common/fleet.ts index 97551cc16b4bea..00a958952d2deb 100644 --- a/x-pack/plugins/apm/common/fleet.ts +++ b/x-pack/plugins/apm/common/fleet.ts @@ -4,7 +4,12 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import semverParse from 'semver/functions/parse'; export const POLICY_ELASTIC_AGENT_ON_CLOUD = 'policy-elastic-agent-on-cloud'; export const SUPPORTED_APM_PACKAGE_VERSION = '7.16.0'; + +export function isPrereleaseVersion(version: string) { + return semverParse(version)?.prerelease?.length ?? 0 > 0; +} diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx index 7bebd89dc00210..c52b32863e33a3 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx @@ -72,6 +72,7 @@ function Wrapper({ basePath="http://localhost:5601" isCloudEnabled={!onPrem} variantId={apmAgent} + kibanaVersion="8.0.0" /> ); } diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx index 3c26df3f8cb38e..bc5b5246fa7ce0 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/index.test.tsx @@ -57,6 +57,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect(component.getByTestId('loading')).toBeInTheDocument(); @@ -76,6 +77,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled={false} + kibanaVersion="8.0.0" /> ); expect( @@ -123,6 +125,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled={false} + kibanaVersion="8.0.0" /> ); expect( @@ -158,6 +161,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect( @@ -199,6 +203,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect( @@ -237,6 +242,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect( @@ -271,6 +277,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect( @@ -306,6 +313,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); @@ -329,6 +337,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect( @@ -367,6 +376,7 @@ describe('TutorialConfigAgent', () => { } basePath="http://localhost:5601" isCloudEnabled + kibanaVersion="8.0.0" /> ); expect( diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx index 8e8bf5cf32134f..485109584fbe48 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/index.tsx @@ -9,7 +9,10 @@ import { i18n } from '@kbn/i18n'; import { HttpStart } from 'kibana/public'; import React, { useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; -import { SUPPORTED_APM_PACKAGE_VERSION } from '../../../common/fleet'; +import { + isPrereleaseVersion, + SUPPORTED_APM_PACKAGE_VERSION, +} from '../../../common/fleet'; import { APIReturnType } from '../../services/rest/createCallApmApi'; import { getCommands } from './commands/get_commands'; import { getPolicyOptions, PolicyOption } from './get_policy_options'; @@ -38,6 +41,7 @@ interface Props { http: HttpStart; basePath: string; isCloudEnabled: boolean; + kibanaVersion: string; } const INITIAL_STATE = { @@ -50,10 +54,12 @@ function getFleetLink({ isFleetEnabled, hasFleetAgents, basePath, + kibanaVersion, }: { isFleetEnabled: boolean; hasFleetAgents: boolean; basePath: string; + kibanaVersion: string; }) { if (!isFleetEnabled) { return; @@ -66,7 +72,9 @@ function getFleetLink({ } : { label: GET_STARTED_WITH_FLEET_LABEL, - href: `${basePath}/app/integrations#/detail/apm-${SUPPORTED_APM_PACKAGE_VERSION}/overview`, + href: isPrereleaseVersion(kibanaVersion) + ? `${basePath}/app/integrations#/detail/apm/overview` + : `${basePath}/app/integrations#/detail/apm-${SUPPORTED_APM_PACKAGE_VERSION}/overview`, }; } @@ -75,6 +83,7 @@ function TutorialConfigAgent({ http, basePath, isCloudEnabled, + kibanaVersion, }: Props) { const [data, setData] = useState(INITIAL_STATE); const [isLoading, setIsLoading] = useState(true); @@ -138,6 +147,7 @@ function TutorialConfigAgent({ isFleetEnabled: data.isFleetEnabled, hasFleetAgents, basePath, + kibanaVersion, })} /> diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx index ae3ec803ac5883..4a4bfb252bfe54 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/rum_script.tsx @@ -12,12 +12,14 @@ interface Props { http: HttpStart; basePath: string; isCloudEnabled: boolean; + kibanaVersion: string; } function TutorialConfigAgentRumScript({ http, basePath, isCloudEnabled, + kibanaVersion, }: Props) { return ( ); } diff --git a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/index.tsx b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/index.tsx index 69f3c4bbbc4075..27bdfd1910042c 100644 --- a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/index.tsx +++ b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/index.tsx @@ -19,13 +19,17 @@ import { i18n } from '@kbn/i18n'; import { HttpStart } from 'kibana/public'; import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; -import { SUPPORTED_APM_PACKAGE_VERSION } from '../../../common/fleet'; +import { + isPrereleaseVersion, + SUPPORTED_APM_PACKAGE_VERSION, +} from '../../../common/fleet'; import { APIReturnType } from '../../services/rest/createCallApmApi'; interface Props { http: HttpStart; basePath: string; isDarkTheme: boolean; + kibanaVersion: string; } const CentralizedContainer = styled.div` @@ -36,7 +40,12 @@ const CentralizedContainer = styled.div` type APIResponseType = APIReturnType<'GET /internal/apm/fleet/migration_check'>; -function TutorialFleetInstructions({ http, basePath, isDarkTheme }: Props) { +function TutorialFleetInstructions({ + http, + basePath, + isDarkTheme, + kibanaVersion, +}: Props) { const [data, setData] = useState(); const [isLoading, setIsLoading] = useState(false); @@ -69,6 +78,8 @@ function TutorialFleetInstructions({ http, basePath, isDarkTheme }: Props) { const apmIntegrationHref = shouldLinkToMigration ? `${basePath}/app/apm/settings/schema` + : isPrereleaseVersion(kibanaVersion) + ? `${basePath}/app/integrations#/detail/apm/overview` : `${basePath}/app/integrations/detail/apm-${SUPPORTED_APM_PACKAGE_VERSION}/overview`; if (isLoading) { diff --git a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx index d826ca81416ec6..733b7a91ed663b 100644 --- a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx +++ b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx @@ -23,6 +23,7 @@ function Wrapper({ hasFleetPoliciesWithApmIntegration }: Args) { http={http} basePath="http://localhost:5601" isDarkTheme={false} + kibanaVersion="8.0.0" /> ); } diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index 9ece2c507847e2..b0c21fe28abb21 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -176,6 +176,7 @@ export class APMPlugin ruleDataClient, plugins: resourcePlugins, telemetryUsageCounter, + kibanaVersion: this.initContext.env.packageInfo.version, }); if (plugins.alerting) { @@ -193,6 +194,7 @@ export class APMPlugin ruleDataClient, config: currentConfig, logger: this.logger, + kibanaVersion: this.initContext.env.packageInfo.version, }); core.deprecations.registerDeprecations({ diff --git a/x-pack/plugins/apm/server/routes/apm_routes/register_apm_server_routes.ts b/x-pack/plugins/apm/server/routes/apm_routes/register_apm_server_routes.ts index 6ac4b3ac18e24f..a7a43569236550 100644 --- a/x-pack/plugins/apm/server/routes/apm_routes/register_apm_server_routes.ts +++ b/x-pack/plugins/apm/server/routes/apm_routes/register_apm_server_routes.ts @@ -50,6 +50,7 @@ export function registerRoutes({ config, ruleDataClient, telemetryUsageCounter, + kibanaVersion, }: { core: APMRouteHandlerResources['core']; plugins: APMRouteHandlerResources['plugins']; @@ -58,6 +59,7 @@ export function registerRoutes({ config: APMRouteHandlerResources['config']; ruleDataClient: APMRouteHandlerResources['ruleDataClient']; telemetryUsageCounter?: TelemetryUsageCounter; + kibanaVersion: string; }) { const routes = repository.getRoutes(); @@ -115,6 +117,7 @@ export function registerRoutes({ validatedParams ), ruleDataClient, + kibanaVersion, }).then((value) => { return { aborted: false, diff --git a/x-pack/plugins/apm/server/routes/fleet/create_cloud_apm_package_policy.ts b/x-pack/plugins/apm/server/routes/fleet/create_cloud_apm_package_policy.ts index a3c7bfd079a4c3..34a6de753d9109 100644 --- a/x-pack/plugins/apm/server/routes/fleet/create_cloud_apm_package_policy.ts +++ b/x-pack/plugins/apm/server/routes/fleet/create_cloud_apm_package_policy.ts @@ -30,6 +30,7 @@ export async function createCloudApmPackgePolicy({ esClient, logger, setup, + kibanaVersion, }: { cloudPluginSetup: APMPluginSetupDependencies['cloud']; fleetPluginStart: NonNullable; @@ -37,6 +38,7 @@ export async function createCloudApmPackgePolicy({ esClient: ElasticsearchClient; logger: Logger; setup: Setup; + kibanaVersion: string; }): Promise { const { attributes } = await savedObjectsClient.get( APM_SERVER_SCHEMA_SAVED_OBJECT_TYPE, @@ -46,9 +48,11 @@ export async function createCloudApmPackgePolicy({ (attributes as { schemaJson: string }).schemaJson ); // Merges agent config and source maps with the new APM cloud package policy - const apmPackagePolicyDefinition = getApmPackagePolicyDefinition({ + const apmPackagePolicyDefinition = await getApmPackagePolicyDefinition({ apmServerSchema, cloudPluginSetup, + fleetPluginStart, + kibanaVersion, }); const mergedAPMPackagePolicy = await mergePackagePolicyWithApm({ setup, diff --git a/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts b/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts index 9e1889fbe1ed8e..d5cee57b11a822 100644 --- a/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts +++ b/x-pack/plugins/apm/server/routes/fleet/get_apm_package_policy_definition.ts @@ -6,20 +6,28 @@ */ import { + isPrereleaseVersion, POLICY_ELASTIC_AGENT_ON_CLOUD, SUPPORTED_APM_PACKAGE_VERSION, } from '../../../common/fleet'; -import { APMPluginSetupDependencies } from '../../types'; +import { + APMPluginSetupDependencies, + APMPluginStartDependencies, +} from '../../types'; import { APM_PACKAGE_NAME } from './get_cloud_apm_package_policy'; interface GetApmPackagePolicyDefinitionOptions { apmServerSchema: Record; cloudPluginSetup: APMPluginSetupDependencies['cloud']; + fleetPluginStart: APMPluginStartDependencies['fleet']; + kibanaVersion: string; } -export function getApmPackagePolicyDefinition( +export async function getApmPackagePolicyDefinition( options: GetApmPackagePolicyDefinitionOptions ) { - const { apmServerSchema, cloudPluginSetup } = options; + const { apmServerSchema, cloudPluginSetup, fleetPluginStart, kibanaVersion } = + options; + return { name: 'Elastic APM', namespace: 'default', @@ -33,18 +41,37 @@ export function getApmPackagePolicyDefinition( streams: [], vars: getApmPackageInputVars({ cloudPluginSetup, + fleetPluginStart, apmServerSchema: preprocessLegacyFields({ apmServerSchema }), + kibanaVersion, }), }, ], package: { name: APM_PACKAGE_NAME, - version: SUPPORTED_APM_PACKAGE_VERSION, + version: await getApmPackageVersion(fleetPluginStart, kibanaVersion), title: 'Elastic APM', }, }; } +async function getApmPackageVersion( + fleetPluginStart: APMPluginStartDependencies['fleet'], + kibanaVersion: string +) { + if (fleetPluginStart && isPrereleaseVersion(kibanaVersion)) { + try { + const latestApmPackage = await fleetPluginStart.fetchFindLatestPackage( + 'apm' + ); + return latestApmPackage.version; + } catch (error) { + return SUPPORTED_APM_PACKAGE_VERSION; + } + } + return SUPPORTED_APM_PACKAGE_VERSION; +} + export function preprocessLegacyFields({ apmServerSchema, }: { diff --git a/x-pack/plugins/apm/server/routes/fleet/register_fleet_policy_callbacks.ts b/x-pack/plugins/apm/server/routes/fleet/register_fleet_policy_callbacks.ts index 06e55c7fdcca8b..8a26321248ff3c 100644 --- a/x-pack/plugins/apm/server/routes/fleet/register_fleet_policy_callbacks.ts +++ b/x-pack/plugins/apm/server/routes/fleet/register_fleet_policy_callbacks.ts @@ -25,11 +25,13 @@ export async function registerFleetPolicyCallbacks({ ruleDataClient, config, logger, + kibanaVersion, }: { plugins: APMRouteHandlerResources['plugins']; ruleDataClient: APMRouteHandlerResources['ruleDataClient']; config: NonNullable; logger: NonNullable; + kibanaVersion: string; }) { if (!plugins.fleet) { return; @@ -45,6 +47,7 @@ export async function registerFleetPolicyCallbacks({ ruleDataClient, config, logger, + kibanaVersion, }); // Registers a callback invoked when a policy is updated to populate the APM @@ -56,6 +59,7 @@ export async function registerFleetPolicyCallbacks({ ruleDataClient, config, logger, + kibanaVersion, }); } @@ -73,6 +77,7 @@ function registerPackagePolicyExternalCallback({ ruleDataClient, config, logger, + kibanaVersion, }: { fleetPluginStart: NonNullable; callbackName: 'packagePolicyCreate' | 'packagePolicyUpdate'; @@ -80,6 +85,7 @@ function registerPackagePolicyExternalCallback({ ruleDataClient: APMRouteHandlerResources['ruleDataClient']; config: NonNullable; logger: NonNullable; + kibanaVersion: string; }) { const callbackFn: | PostPackagePolicyCreateCallback @@ -100,6 +106,7 @@ function registerPackagePolicyExternalCallback({ config, logger, ruleDataClient, + kibanaVersion, }); return await mergePackagePolicyWithApm({ setup, diff --git a/x-pack/plugins/apm/server/routes/fleet/route.ts b/x-pack/plugins/apm/server/routes/fleet/route.ts index b64d1764c84651..5c176ffaab84da 100644 --- a/x-pack/plugins/apm/server/routes/fleet/route.ts +++ b/x-pack/plugins/apm/server/routes/fleet/route.ts @@ -165,7 +165,8 @@ const createCloudApmPackagePolicyRoute = createApmServerRoute({ endpoint: 'POST /internal/apm/fleet/cloud_apm_package_policy', options: { tags: ['access:apm', 'access:apm_write'] }, handler: async (resources) => { - const { plugins, context, config, request, logger } = resources; + const { plugins, context, config, request, logger, kibanaVersion } = + resources; const cloudApmMigrationEnabled = config.agent.migrations.enabled; if (!plugins.fleet || !plugins.security) { throw Boom.internal(FLEET_SECURITY_REQUIRED_MESSAGE); @@ -192,6 +193,7 @@ const createCloudApmPackagePolicyRoute = createApmServerRoute({ esClient, logger, setup, + kibanaVersion, }); return { cloudApmPackagePolicy }; diff --git a/x-pack/plugins/apm/server/routes/typings.ts b/x-pack/plugins/apm/server/routes/typings.ts index 8eefc1c10778a8..5b6d44ab9295db 100644 --- a/x-pack/plugins/apm/server/routes/typings.ts +++ b/x-pack/plugins/apm/server/routes/typings.ts @@ -69,4 +69,5 @@ export interface APMRouteHandlerResources { }; ruleDataClient: IRuleDataClient; telemetryUsageCounter?: TelemetryUsageCounter; + kibanaVersion: string; } diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 3ee83a91e0df50..b2dba997351ea4 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -85,6 +85,7 @@ import { FleetArtifactsClient } from './services/artifacts'; import type { FleetRouter } from './types/request_context'; import { TelemetryEventsSender } from './telemetry/sender'; import { setupFleet } from './services/setup'; +import { fetchFindLatestPackage } from './services/epm/registry'; export interface FleetSetupDeps { licensing: LicensingPluginSetup; @@ -165,6 +166,8 @@ export interface FleetStartContract { * @param packageName */ createArtifactsClient: (packageName: string) => FleetArtifactsClient; + + fetchFindLatestPackage: typeof fetchFindLatestPackage; } export class FleetPlugin @@ -382,6 +385,7 @@ export class FleetPlugin createArtifactsClient(packageName: string) { return new FleetArtifactsClient(core.elasticsearch.client.asInternalUser, packageName); }, + fetchFindLatestPackage, }; } diff --git a/x-pack/plugins/security_solution/server/endpoint/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/mocks.ts index 4c722672efe461..3ad3b32b7fec1b 100644 --- a/x-pack/plugins/security_solution/server/endpoint/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/mocks.ts @@ -167,6 +167,7 @@ export const createMockFleetStartContract = (indexPattern: string): FleetStartCo registerExternalCallback: jest.fn((...args: ExternalCallback) => {}), packagePolicyService: createPackagePolicyServiceMock(), createArtifactsClient: jest.fn().mockReturnValue(createArtifactsClientMock()), + fetchFindLatestPackage: jest.fn().mockReturnValue('8.0.0'), }; }; From 31d2db035c905fb5819fa6dc2354f3be795a34cf Mon Sep 17 00:00:00 2001 From: Jonathan Buttner <56361221+jonathan-buttner@users.noreply.github.com> Date: Wed, 1 Dec 2021 10:03:19 -0500 Subject: [PATCH 021/126] [Cases] Stub Metrics API (#119393) * Working lifespan metrics api * Adding remaining metrics handlers and some tests * Fixing jest snapshot * Switch to kbn archiver * Refactoring based on pr feedback * Cleaning up names and code Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/cases/common/api/index.ts | 1 + .../plugins/cases/common/api/metrics/case.ts | 88 ++++++ .../plugins/cases/common/api/metrics/index.ts | 8 + x-pack/plugins/cases/common/constants.ts | 2 + .../__snapshots__/audit_logger.test.ts.snap | 84 ++++++ .../cases/server/authorization/index.ts | 8 + .../cases/server/authorization/types.ts | 1 + x-pack/plugins/cases/server/client/client.ts | 10 + .../server/client/metrics/alert_details.ts | 37 +++ .../server/client/metrics/alerts_count.ts | 23 ++ .../cases/server/client/metrics/client.ts | 36 +++ .../cases/server/client/metrics/connectors.ts | 21 ++ .../client/metrics/get_case_metrics.test.ts | 128 ++++++++ .../server/client/metrics/get_case_metrics.ts | 105 +++++++ .../cases/server/client/metrics/lifespan.ts | 28 ++ .../cases/server/client/metrics/types.ts | 13 + x-pack/plugins/cases/server/client/mocks.ts | 10 + .../plugins/cases/server/routes/api/index.ts | 3 + .../routes/api/metrics/get_case_metrics.ts | 43 +++ .../cases_api_integration/common/lib/utils.ts | 23 ++ .../security_and_spaces/tests/common/index.ts | 1 + .../tests/common/metrics/get_case_metrics.ts | 62 ++++ .../cases/migrations/7.13.2/data.json.gz | Bin 1340 -> 1376 bytes .../kbn_archiver/cases/7.13.2/cases.json | 274 ++++++++++++++++++ 24 files changed, 1009 insertions(+) create mode 100644 x-pack/plugins/cases/common/api/metrics/case.ts create mode 100644 x-pack/plugins/cases/common/api/metrics/index.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/alert_details.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/alerts_count.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/client.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/connectors.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/get_case_metrics.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/lifespan.ts create mode 100644 x-pack/plugins/cases/server/client/metrics/types.ts create mode 100644 x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts create mode 100644 x-pack/test/cases_api_integration/security_and_spaces/tests/common/metrics/get_case_metrics.ts create mode 100644 x-pack/test/functional/fixtures/kbn_archiver/cases/7.13.2/cases.json diff --git a/x-pack/plugins/cases/common/api/index.ts b/x-pack/plugins/cases/common/api/index.ts index 2ef03dd96e3150..09f5317b79788c 100644 --- a/x-pack/plugins/cases/common/api/index.ts +++ b/x-pack/plugins/cases/common/api/index.ts @@ -11,3 +11,4 @@ export * from './helpers'; export * from './runtime_types'; export * from './saved_object'; export * from './user'; +export * from './metrics'; diff --git a/x-pack/plugins/cases/common/api/metrics/case.ts b/x-pack/plugins/cases/common/api/metrics/case.ts new file mode 100644 index 00000000000000..5ed1eab2a4cdd7 --- /dev/null +++ b/x-pack/plugins/cases/common/api/metrics/case.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as rt from 'io-ts'; + +export type CaseMetricsResponse = rt.TypeOf; + +export const CaseMetricsResponseRt = rt.partial( + rt.type({ + alerts: rt.partial( + rt.type({ + /** + * Number of alerts attached to the case + */ + count: rt.number, + /** + * Host information represented from the alerts attached to this case + */ + hosts: rt.type({ + /** + * Total unique hosts represented in the alerts + */ + total: rt.number, + values: rt.array( + rt.type({ + /** + * Host name + */ + name: rt.string, + /** + * Number of alerts that have this particular host name + */ + count: rt.number, + }) + ), + }), + /** + * User information represented from the alerts attached to this case + */ + users: rt.type({ + /** + * Total unique users represented in the alerts + */ + total: rt.number, + values: rt.array( + rt.type({ + /** + * Username + */ + name: rt.string, + /** + * Number of alerts that have this particular username + */ + count: rt.number, + }) + ), + }), + }).props + ), + /** + * External connectors associated with the case + */ + connectors: rt.array( + rt.type({ + id: rt.string, + name: rt.string, + pushCount: rt.number, + }) + ), + /** + * The case's open,close,in-progress details + */ + lifespan: rt.type({ + /** + * Date the case was created, in ISO format + */ + creationDate: rt.string, + /** + * Date the case was closed, in ISO format. Will be null if the case is not currently closed + */ + closeDate: rt.union([rt.string, rt.null]), + }), + }).props +); diff --git a/x-pack/plugins/cases/common/api/metrics/index.ts b/x-pack/plugins/cases/common/api/metrics/index.ts new file mode 100644 index 00000000000000..eb35d41a04b2f1 --- /dev/null +++ b/x-pack/plugins/cases/common/api/metrics/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './case'; diff --git a/x-pack/plugins/cases/common/constants.ts b/x-pack/plugins/cases/common/constants.ts index 0eb2917c3495e4..bc0578191f8b75 100644 --- a/x-pack/plugins/cases/common/constants.ts +++ b/x-pack/plugins/cases/common/constants.ts @@ -55,6 +55,8 @@ export const CASE_USER_ACTIONS_URL = `${CASE_DETAILS_URL}/user_actions`; export const CASE_ALERTS_URL = `${CASES_URL}/alerts/{alert_id}`; export const CASE_DETAILS_ALERTS_URL = `${CASE_DETAILS_URL}/alerts`; +export const CASE_METRICS_DETAILS_URL = `${CASES_URL}/metrics/{case_id}`; + /** * Action routes */ diff --git a/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap b/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap index 50c085b7f22a86..ed0fa1eb0f3ed9 100644 --- a/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap +++ b/x-pack/plugins/cases/server/authorization/__snapshots__/audit_logger.test.ts.snap @@ -1092,6 +1092,90 @@ Object { } `; +exports[`audit_logger log function event structure creates the correct audit event for operation: "getCaseMetrics" with an error and entity 1`] = ` +Object { + "error": Object { + "code": "Error", + "message": "an error", + }, + "event": Object { + "action": "case_get_metrics", + "category": Array [ + "database", + ], + "outcome": "failure", + "type": Array [ + "access", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "1", + "type": "cases", + }, + }, + "message": "Failed attempt to access cases [id=1] as owner \\"awesome\\"", +} +`; + +exports[`audit_logger log function event structure creates the correct audit event for operation: "getCaseMetrics" with an error but no entity 1`] = ` +Object { + "error": Object { + "code": "Error", + "message": "an error", + }, + "event": Object { + "action": "case_get_metrics", + "category": Array [ + "database", + ], + "outcome": "failure", + "type": Array [ + "access", + ], + }, + "message": "Failed attempt to access a case as any owners", +} +`; + +exports[`audit_logger log function event structure creates the correct audit event for operation: "getCaseMetrics" without an error but with an entity 1`] = ` +Object { + "event": Object { + "action": "case_get_metrics", + "category": Array [ + "database", + ], + "outcome": "success", + "type": Array [ + "access", + ], + }, + "kibana": Object { + "saved_object": Object { + "id": "5", + "type": "cases", + }, + }, + "message": "User has accessed cases [id=5] as owner \\"super\\"", +} +`; + +exports[`audit_logger log function event structure creates the correct audit event for operation: "getCaseMetrics" without an error or entity 1`] = ` +Object { + "event": Object { + "action": "case_get_metrics", + "category": Array [ + "database", + ], + "outcome": "success", + "type": Array [ + "access", + ], + }, + "message": "User has accessed a case as any owners", +} +`; + exports[`audit_logger log function event structure creates the correct audit event for operation: "getCaseStatuses" with an error and entity 1`] = ` Object { "error": Object { diff --git a/x-pack/plugins/cases/server/authorization/index.ts b/x-pack/plugins/cases/server/authorization/index.ts index 1a746405151739..c5208177554b5e 100644 --- a/x-pack/plugins/cases/server/authorization/index.ts +++ b/x-pack/plugins/cases/server/authorization/index.ts @@ -152,6 +152,14 @@ export const Operations: Record { + return new Set(['alertHosts', 'alertUsers']); + } + + public async compute(): Promise { + // we already retrieved the metrics so just return them as they are + if (this.retrievedMetrics) { + return {}; + } + + this.retrievedMetrics = true; + + return { + alerts: { + hosts: { total: 0, values: [] }, + users: { total: 0, values: [] }, + }, + }; + } +} diff --git a/x-pack/plugins/cases/server/client/metrics/alerts_count.ts b/x-pack/plugins/cases/server/client/metrics/alerts_count.ts new file mode 100644 index 00000000000000..11e2d32db7ca2a --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/alerts_count.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseMetricsResponse } from '../../../common'; +import { MetricsHandler } from './types'; + +export class AlertsCount implements MetricsHandler { + public getFeatures(): Set { + return new Set(['alertsCount']); + } + + public async compute(): Promise { + return { + alerts: { + count: 0, + }, + }; + } +} diff --git a/x-pack/plugins/cases/server/client/metrics/client.ts b/x-pack/plugins/cases/server/client/metrics/client.ts new file mode 100644 index 00000000000000..527ce527d0cc21 --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/client.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseMetricsResponse } from '../../../common'; +import { CasesClient } from '../client'; + +import { CasesClientArgs } from '../types'; + +import { getCaseMetrics, CaseMetricsParams } from './get_case_metrics'; + +/** + * API for interacting with the metrics. + */ +export interface MetricsSubClient { + getCaseMetrics(params: CaseMetricsParams): Promise; +} + +/** + * Creates the interface for retrieving metrics for cases. + * + * @ignore + */ +export const createMetricsSubClient = ( + clientArgs: CasesClientArgs, + casesClient: CasesClient +): MetricsSubClient => { + const casesSubClient: MetricsSubClient = { + getCaseMetrics: (params: CaseMetricsParams) => getCaseMetrics(params, casesClient, clientArgs), + }; + + return Object.freeze(casesSubClient); +}; diff --git a/x-pack/plugins/cases/server/client/metrics/connectors.ts b/x-pack/plugins/cases/server/client/metrics/connectors.ts new file mode 100644 index 00000000000000..6ad5fcc056ee59 --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/connectors.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseMetricsResponse } from '../../../common'; +import { MetricsHandler } from './types'; + +export class Connectors implements MetricsHandler { + public getFeatures(): Set { + return new Set(['connectors']); + } + + public async compute(): Promise { + return { + connectors: [], + }; + } +} diff --git a/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts b/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts new file mode 100644 index 00000000000000..072525d080f0a8 --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getCaseMetrics } from './get_case_metrics'; +import { CaseAttributes, CaseResponse } from '../../../common'; +import { createCasesClientMock } from '../mocks'; +import { CasesClientArgs } from '../types'; +import { createAuthorizationMock } from '../../authorization/mock'; +import { loggingSystemMock, savedObjectsClientMock } from '../../../../../../src/core/server/mocks'; +import { createCaseServiceMock } from '../../services/mocks'; +import { SavedObject } from 'kibana/server'; + +describe('getMetrics', () => { + const mockCreateCloseInfo = { + created_at: '2021-11-23T19:59:43Z', + closed_at: '2021-11-23T19:59:44Z', + }; + + const client = createCasesClientMock(); + client.cases.get.mockImplementation(async () => { + return { + created_at: '2021-11-23T19:59:43Z', + closed_at: '2021-11-23T19:59:44Z', + } as unknown as CaseResponse; + }); + + const authorization = createAuthorizationMock(); + const soClient = savedObjectsClientMock.create(); + const caseService = createCaseServiceMock(); + caseService.getCase.mockImplementation(async () => { + return { + id: '1', + attributes: { + owner: 'security', + }, + } as unknown as SavedObject; + }); + + const logger = loggingSystemMock.createLogger(); + + const clientArgs = { + authorization, + unsecuredSavedObjectsClient: soClient, + caseService, + logger, + } as unknown as CasesClientArgs; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('returns the lifespan metrics', async () => { + const metrics = await getCaseMetrics( + { caseId: '', features: ['lifespan'] }, + client, + clientArgs + ); + + expect(metrics).toEqual({ + lifespan: { + creationDate: mockCreateCloseInfo.created_at, + closeDate: mockCreateCloseInfo.closed_at, + }, + }); + }); + + it('populates the alertHosts and alertUsers sections', async () => { + const metrics = await getCaseMetrics( + { caseId: '', features: ['alertHosts'] }, + client, + clientArgs + ); + + expect(metrics.alerts?.hosts).toBeDefined(); + expect(metrics.alerts?.users).toBeDefined(); + }); + + it('populates multiple sections at a time', async () => { + const metrics = await getCaseMetrics( + { caseId: '', features: ['alertsCount', 'lifespan'] }, + client, + clientArgs + ); + + expect(metrics.lifespan).toEqual({ + creationDate: mockCreateCloseInfo.created_at, + closeDate: mockCreateCloseInfo.closed_at, + }); + expect(metrics.alerts?.count).toBeDefined(); + }); + + it('populates multiple alerts sections at a time', async () => { + const metrics = await getCaseMetrics( + { caseId: '', features: ['alertsCount', 'alertHosts'] }, + client, + clientArgs + ); + + expect(metrics.alerts?.count).toBeDefined(); + expect(metrics.alerts?.hosts).toBeDefined(); + }); + + it('throws an error for an invalid feature', async () => { + expect.assertions(1); + + await expect( + getCaseMetrics({ caseId: '', features: ['bananas'] }, client, clientArgs) + ).rejects.toThrow(); + }); + + it('throws an error for an invalid feature among valid features', async () => { + expect.assertions(1); + + try { + await getCaseMetrics( + { caseId: '', features: ['bananas', 'lifespan', 'alertsCount'] }, + client, + clientArgs + ); + } catch (error) { + expect(error.message).toContain('invalid features: [bananas]'); + } + }); +}); diff --git a/x-pack/plugins/cases/server/client/metrics/get_case_metrics.ts b/x-pack/plugins/cases/server/client/metrics/get_case_metrics.ts new file mode 100644 index 00000000000000..a64325da8453e7 --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/get_case_metrics.ts @@ -0,0 +1,105 @@ +/* + * Copyright 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 { merge } from 'lodash'; + +import { CaseMetricsResponseRt, CaseMetricsResponse } from '../../../common'; +import { Operations } from '../../authorization'; +import { createCaseError } from '../../common'; +import { CasesClient } from '../client'; +import { CasesClientArgs } from '../types'; +import { AlertsCount } from './alerts_count'; +import { AlertDetails } from './alert_details'; +import { Connectors } from './connectors'; +import { Lifespan } from './lifespan'; +import { MetricsHandler } from './types'; + +export interface CaseMetricsParams { + /** + * The ID of the case. + */ + caseId: string; + /** + * The metrics to retrieve. + */ + features: string[]; +} + +export const getCaseMetrics = async ( + params: CaseMetricsParams, + casesClient: CasesClient, + clientArgs: CasesClientArgs +): Promise => { + const handlers = buildHandlers(params, casesClient, clientArgs); + await checkAuthorization(params, clientArgs); + checkAndThrowIfInvalidFeatures(params, handlers, clientArgs); + + const computedMetrics = await Promise.all( + params.features.map(async (feature) => { + const handler = handlers.get(feature); + + return handler?.compute(); + }) + ); + + const mergedResults = computedMetrics.reduce((acc, metric) => { + return merge(acc, metric); + }, {}); + + return CaseMetricsResponseRt.encode(mergedResults ?? {}); +}; + +const buildHandlers = ( + params: CaseMetricsParams, + casesClient: CasesClient, + clientArgs: CasesClientArgs +): Map => { + const handlers = [ + new Lifespan(params.caseId, casesClient), + new AlertsCount(), + new AlertDetails(), + new Connectors(), + ]; + + const handlersByFeature = new Map(); + for (const handler of handlers) { + // assign each feature to the handler that owns that feature + handler.getFeatures().forEach((value) => handlersByFeature.set(value, handler)); + } + + return handlersByFeature; +}; + +const checkAndThrowIfInvalidFeatures = ( + params: CaseMetricsParams, + handlers: Map, + clientArgs: CasesClientArgs +) => { + const invalidFeatures = params.features.filter((feature) => !handlers.has(feature)); + if (invalidFeatures.length > 0) { + const invalidFeaturesAsString = invalidFeatures.join(', '); + const validFeaturesAsString = [...handlers.keys()].join(', '); + + throw createCaseError({ + logger: clientArgs.logger, + message: `invalid features: [${invalidFeaturesAsString}], please only provide valid features: [${validFeaturesAsString}]`, + }); + } +}; + +const checkAuthorization = async (params: CaseMetricsParams, clientArgs: CasesClientArgs) => { + const { caseService, unsecuredSavedObjectsClient, authorization } = clientArgs; + + const caseInfo = await caseService.getCase({ + unsecuredSavedObjectsClient, + id: params.caseId, + }); + + await authorization.ensureAuthorized({ + operation: Operations.getCaseMetrics, + entities: [{ owner: caseInfo.attributes.owner, id: caseInfo.id }], + }); +}; diff --git a/x-pack/plugins/cases/server/client/metrics/lifespan.ts b/x-pack/plugins/cases/server/client/metrics/lifespan.ts new file mode 100644 index 00000000000000..ed1470738b366f --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/lifespan.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseMetricsResponse } from '../../../common'; +import { CasesClient } from '../client'; +import { MetricsHandler } from './types'; + +export class Lifespan implements MetricsHandler { + constructor(private readonly caseId: string, private readonly casesClient: CasesClient) {} + + public getFeatures(): Set { + return new Set(['lifespan']); + } + + public async compute(): Promise { + const caseInfo = await this.casesClient.cases.get({ id: this.caseId }); + return { + lifespan: { + creationDate: caseInfo.created_at, + closeDate: caseInfo.closed_at, + }, + }; + } +} diff --git a/x-pack/plugins/cases/server/client/metrics/types.ts b/x-pack/plugins/cases/server/client/metrics/types.ts new file mode 100644 index 00000000000000..82038f76feaa2d --- /dev/null +++ b/x-pack/plugins/cases/server/client/metrics/types.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CaseMetricsResponse } from '../../../common'; + +export interface MetricsHandler { + getFeatures(): Set; + compute(): Promise; +} diff --git a/x-pack/plugins/cases/server/client/mocks.ts b/x-pack/plugins/cases/server/client/mocks.ts index f0ca7ae9eaf717..bc601d084caef6 100644 --- a/x-pack/plugins/cases/server/client/mocks.ts +++ b/x-pack/plugins/cases/server/client/mocks.ts @@ -12,6 +12,7 @@ import { AttachmentsSubClient } from './attachments/client'; import { CasesSubClient } from './cases/client'; import { ConfigureSubClient } from './configure/client'; import { CasesClientFactory } from './factory'; +import { MetricsSubClient } from './metrics/client'; import { StatsSubClient } from './stats/client'; import { SubCasesClient } from './sub_cases/client'; import { UserActionsSubClient } from './user_actions/client'; @@ -33,6 +34,14 @@ const createCasesSubClientMock = (): CasesSubClientMock => { }; }; +type MetricsSubClientMock = jest.Mocked; + +const createMetricsSubClientMock = (): MetricsSubClientMock => { + return { + getCaseMetrics: jest.fn(), + }; +}; + type AttachmentsSubClientMock = jest.Mocked; const createAttachmentsSubClientMock = (): AttachmentsSubClientMock => { @@ -101,6 +110,7 @@ export const createCasesClientMock = (): CasesClientMock => { subCases: createSubCasesClientMock(), configure: createConfigureSubClientMock(), stats: createStatsSubClientMock(), + metrics: createMetricsSubClientMock(), }; return client as unknown as CasesClientMock; }; diff --git a/x-pack/plugins/cases/server/routes/api/index.ts b/x-pack/plugins/cases/server/routes/api/index.ts index 266ea9ddb0f18c..70daef5b528d63 100644 --- a/x-pack/plugins/cases/server/routes/api/index.ts +++ b/x-pack/plugins/cases/server/routes/api/index.ts @@ -40,6 +40,7 @@ import { initDeleteSubCasesApi } from './sub_case/delete_sub_cases'; import { ENABLE_CASE_CONNECTOR } from '../../../common'; import { initGetCasesByAlertIdApi } from './cases/alerts/get_cases'; import { initGetAllAlertsAttachToCaseApi } from './comments/get_alerts'; +import { initGetCaseMetricsApi } from './metrics/get_case_metrics'; /** * Default page number when interacting with the saved objects API. @@ -91,4 +92,6 @@ export function initCaseApi(deps: RouteDeps) { // Alerts initGetCasesByAlertIdApi(deps); initGetAllAlertsAttachToCaseApi(deps); + // Metrics + initGetCaseMetricsApi(deps); } diff --git a/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts b/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts new file mode 100644 index 00000000000000..27b9d139770cec --- /dev/null +++ b/x-pack/plugins/cases/server/routes/api/metrics/get_case_metrics.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +import { RouteDeps } from '../types'; +import { wrapError } from '../utils'; + +import { CASE_METRICS_DETAILS_URL } from '../../../../common'; + +export function initGetCaseMetricsApi({ router, logger }: RouteDeps) { + router.get( + { + path: CASE_METRICS_DETAILS_URL, + validate: { + params: schema.object({ + case_id: schema.string({ minLength: 1 }), + }), + query: schema.object({ + features: schema.arrayOf(schema.string({ minLength: 1 })), + }), + }, + }, + async (context, request, response) => { + try { + const client = await context.cases.getCasesClient(); + return response.ok({ + body: await client.metrics.getCaseMetrics({ + caseId: request.params.case_id, + features: request.query.features, + }), + }); + } catch (error) { + logger.error(`Failed to get case metrics in route: ${error}`); + return response.customError(wrapError(error)); + } + } + ); +} diff --git a/x-pack/test/cases_api_integration/common/lib/utils.ts b/x-pack/test/cases_api_integration/common/lib/utils.ts index 568104b7d9ad6b..d20ba068f98968 100644 --- a/x-pack/test/cases_api_integration/common/lib/utils.ts +++ b/x-pack/test/cases_api_integration/common/lib/utils.ts @@ -52,6 +52,7 @@ import { ConnectorMappings, CasesByAlertId, CaseResolveResponse, + CaseMetricsResponse, } from '../../../../plugins/cases/common/api'; import { getPostCaseRequest, postCollectionReq, postCommentGenAlertReq } from './mock'; import { getCaseUserActionUrl, getSubCasesUrl } from '../../../../plugins/cases/common/api/helpers'; @@ -1094,6 +1095,28 @@ export const getCase = async ({ return theCase; }; +export const getCaseMetrics = async ({ + supertest, + caseId, + features, + expectedHttpCode = 200, + auth = { user: superUser, space: null }, +}: { + supertest: SuperTest.SuperTest; + caseId: string; + features: string[]; + expectedHttpCode?: number; + auth?: { user: User; space: string | null }; +}): Promise => { + const { body: metricsResponse } = await supertest + .get(`${getSpaceUrlPrefix(auth?.space)}${CASES_URL}/metrics/${caseId}`) + .query({ features: JSON.stringify(features) }) + .auth(auth.user.username, auth.user.password) + .expect(expectedHttpCode); + + return metricsResponse; +}; + export const resolveCase = async ({ supertest, caseId, diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/index.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/index.ts index 0b933582d84a59..18f42e9d54c86e 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/index.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/index.ts @@ -39,6 +39,7 @@ export default ({ loadTestFile }: FtrProviderContext): void => { loadTestFile(require.resolve('./sub_cases/delete_sub_cases')); loadTestFile(require.resolve('./sub_cases/get_sub_case')); loadTestFile(require.resolve('./sub_cases/find_sub_cases')); + loadTestFile(require.resolve('./metrics/get_case_metrics')); // NOTE: Migrations are not included because they can inadvertently remove the .kibana indices which removes the users and spaces // which causes errors in any tests after them that relies on those diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/metrics/get_case_metrics.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/metrics/get_case_metrics.ts new file mode 100644 index 00000000000000..3d5c8856d927d9 --- /dev/null +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/metrics/get_case_metrics.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; + +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; +import { deleteAllCaseItems, getCaseMetrics } from '../../../../common/lib/utils'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext): void => { + const supertest = getService('supertest'); + const es = getService('es'); + const kibanaServer = getService('kibanaServer'); + + describe('case metrics', () => { + const closedCaseId = 'e49ad6e0-cf9d-11eb-a603-13e7747d215z'; + + before(async () => { + await kibanaServer.importExport.load( + 'x-pack/test/functional/fixtures/kbn_archiver/cases/7.13.2/cases.json' + ); + }); + + after(async () => { + await kibanaServer.importExport.unload( + 'x-pack/test/functional/fixtures/kbn_archiver/cases/7.13.2/cases.json' + ); + await deleteAllCaseItems(es); + }); + + it('returns the lifespan of the case', async () => { + const metrics = await getCaseMetrics({ + supertest, + caseId: closedCaseId, + features: ['lifespan'], + }); + + expect(metrics).to.eql({ + lifespan: { + creationDate: '2021-06-17T18:57:41.682Z', + closeDate: '2021-06-17T18:57:42.682Z', + }, + }); + }); + + it('returns an error when passing invalid features', async () => { + const errorResponse = (await getCaseMetrics({ + supertest, + caseId: closedCaseId, + features: ['bananas'], + expectedHttpCode: 500, + // casting here because we're expecting an error with a message field + })) as unknown as { message: string }; + + expect(errorResponse.message).to.contain('invalid features'); + }); + }); +}; diff --git a/x-pack/test/functional/es_archives/cases/migrations/7.13.2/data.json.gz b/x-pack/test/functional/es_archives/cases/migrations/7.13.2/data.json.gz index 26a782f32508b561ac4c6264250f78a61d322b59..0ec2d30c5241dc60e34caa8ac793ed84b469d5fa 100644 GIT binary patch literal 1376 zcmV-m1)usKiwFp-CY@mb17u-zVJ>QOZ*BnXS7+jJ_#+&lHuOtvi{5aqpCP|f#Qny;IR(F3b_3LCh)yU}xwbfJ$(?FZC ziDwXJZ03~?=r9TyH2@f5J;M;`ARtki;1zVCxpN&;4|aa2TNd2vz%}Q(HHV(J@Iu>i za*0ex62hNMj`1Vff&^?VLBVN;f@-^I+g1{l((_3s?3m&2I!SfP`W#UqvpUlT5XNVl zwxye{Zh80Ca^-ldg=0AO;-O{1_M~h^3Ge`-m`)~H9M5FJj!tY6aNyQ^`s2w6(u1aO zurmk-&$3+GTDY!Oa-5sn?;;p8dw-L~uw%loTK6ceOW?~!T$uK{E_ms=*V<~`dGNJ1 zD_OTE%1T!XW%<B zkQiVbfy784x!a=j1;aZb<}7{66= zX!1yI-Wmo>hH02uV^0Kk5WysXSn(dklk-T13m=3ubbExY@Ug;$seRHQ0tALSS5D;; zc_b%QPCltQt;(n#u;j^(A=~Ft{4VT=e3!xqrQ8k6WD~aYc`|t&nBrCg%riWz)owUW zu{fieT?C0|qdG|hN1@0n$0b&fKjSf**(nnFI$dPzS5 z>W!pZv=lhQ}h%!O7M}qOhNUiBUK=7h}TZX%|6?_sa z-V2~YhyxTI1@rjp6ENcC~z>I z!MLG{E0MWpMN%zkT=|7d?{n>MU%VVNvJ+rP*r9R#cJV0*zQhm_Mjsj|-0{7EK+a>e(nQWzHIlef zwozv|*48M2H~M#(bj8D><1>7fm4_P=vP*B2kX1VYj$``vdv*fycpA_EXx3&QxB(!S zZHoK?j8*4iFs#mSm~F4aYVt&B&+JauvIX_f*khpf9JqSHfRHMWcg_ix-S& zeX!n#FkUXHs;20eRa56%6JfN>cwH00HfYlN4cQUG`4)br?ATJUeBkUT3bI}~t6&z{ zNsQ#oz|^|6{Qgh0&Mqp`zs7$@G@glIcp=xz$Rt}}wuVR6f;-u*_L@%^ft+xm&Em|H3 z{2hVzklP$*hXX(-cy+M#hw|%F iq=cSDW!Rc33tDfqZ1LFvp=_@>|h literal 1340 zcmV-C1;hFuiwFqC^#fr517u-zVJ>QOZ*BnXSy6AJI1ql%uZVaK6i9%Or`y+)?sN~; zJ#vKkhOiZQ~AdJs< zeb077+l%hK`67rGv%m@b*+a*M^+7v~65tMGIbAHOJfEn94P96jV8^ZZ^v9Evlsik~ zV0VxVk>`cJHw#0n;W(ZizsX?E?EO_0!>$R_cHg72uYfNr`C!)TQt;AyFRjJ$?8TSX zq+wkjC@bA5mE{{7Z8>LiQ%)0CjO4Rs31NG`Vi^S2$xI<-PMr+p)2j~91$wVx4sNLFke zKyrX_1`4Nu_u zJLOT_yfX}#4A*h3lQR+AKm>~fV$FLrPp%^w&SH?#(Crbn(#M1gQ~Q)j1_(@TuAI&# z^GHoWsC4CR5 zHK7LNCDSMpduLvJ#68B~@T}pV4)IxL|$-C~6<3IB|x90|pnx6a5)33LK1Q zFmCAL8f5NSk+fS*p8Ue2_j&fWA6^X_)d?^p?9$kLU3@5#FF8bnQ3$GF_ih46#Zj!> z!$S2Q0=8!2qA7F-$CS`r_cSl}Wz60~6DGosX6NiVODmA8)HjeNm^PF--MkgW)B5LM)#V}ght~Ux# z6(9Y9pu-(M8VJ-pW|SsszA{MiP1!+b!_nBI1>V&wZRLrFMaO5TvYX2d3E6pcm5|kk z2tnY+{zncG>UbJ3J2F&NfYILvm}VTL?e8g#<7Ii_I#!kh6H zq*Napwy7qP1)C5cGk*+Iu<6Brws?QSY$;Qx8#F+s^qcgAT>%jvY{@Ew}8enEDGaJq({ zDLZx)EH|7TWkJ>}X9;GRo#dCA8JJqXr-eTgt&@w&^sn*XQ0BBCI@PM>xo$F{ArnXO zmAa#1lWi*m7ik=%K{&fwdnC@WP6nKGan%@!O*QTH!8W^qVKdE7GQ{&e$Bn(4>fLUs z+iE>#SeiQD;z)^o1JC!JdE{Oz@M?#)cVNF~r5%kxcbd%N>qVe(pl)?#RShL$swl8h z-n4v%=!Mp*<}ZR)i;f0?_Yr6dxy^C4+W~aYCX18*^ZaxDji!al^gd0f^;m|zB}0ZL;3qtq=KHJGVDy1g4P=?JA8IP==#0J6aNAC>Ay_lAOHX(+K_ty diff --git a/x-pack/test/functional/fixtures/kbn_archiver/cases/7.13.2/cases.json b/x-pack/test/functional/fixtures/kbn_archiver/cases/7.13.2/cases.json new file mode 100644 index 00000000000000..d8969d85c0e7e5 --- /dev/null +++ b/x-pack/test/functional/fixtures/kbn_archiver/cases/7.13.2/cases.json @@ -0,0 +1,274 @@ +{ + "attributes": { + "action": "push-to-service", + "action_at": "2021-06-17T18:57:45.524Z", + "action_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + }, + "action_field": [ + "pushed" + ], + "new_value": "{\"pushed_at\":\"2021-06-17T18:57:45.524Z\",\"pushed_by\":{\"username\":\"711621466\",\"full_name\":\"j@j.com\",\"email\":null},\"connector_id\":\"d68508f0-cf9d-11eb-a603-13e7747d215c\",\"connector_name\":\"Test Jira\",\"external_id\":\"10106\",\"external_title\":\"TPN-99\",\"external_url\":\"https://cases-testing.atlassian.net/browse/TPN-99\"}", + "old_value": null + }, + "coreMigrationVersion": "7.13.2", + "migrationVersion": { + "cases-user-actions": "7.10.0" + }, + "id": "e6e0f650-cf9d-11eb-a603-13e7747d215c", + "references": [ + { + "id": "e49ad6e0-cf9d-11eb-a603-13e7747d215c", + "name": "associated-cases", + "type": "cases" + } + ], + "type": "cases-user-actions", + "updated_at": "2021-06-17T18:57:45.542Z" +} + +{ + "attributes": { + "closed_at": null, + "closed_by": null, + "connector": { + "fields": [ + { + "key": "issueType", + "value": "10002" + }, + { + "key": "parent", + "value": null + }, + { + "key": "priority", + "value": null + } + ], + "id": "d68508f0-cf9d-11eb-a603-13e7747d215c", + "name": "Test Jira", + "type": ".jira" + }, + "created_at": "2021-06-17T18:57:41.682Z", + "created_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + }, + "description": "asdf", + "external_service": { + "connector_id": "d68508f0-cf9d-11eb-a603-13e7747d215c", + "connector_name": "Test Jira", + "external_id": "10106", + "external_title": "TPN-99", + "external_url": "https://cases-testing.atlassian.net/browse/TPN-99", + "pushed_at": "2021-06-17T18:57:45.524Z", + "pushed_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + } + }, + "settings": { + "syncAlerts": true + }, + "status": "open", + "tags": [ + "some tag" + ], + "title": "A case", + "type": "individual", + "updated_at": "2021-06-17T18:57:58.037Z", + "updated_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + } + }, + "id": "e49ad6e0-cf9d-11eb-a603-13e7747d215c", + "coreMigrationVersion": "7.13.2", + "migrationVersion": { + "cases": "7.12.0" + }, + "references": [ + ], + "type": "cases", + "updated_at": "2021-06-17T18:57:58.076Z" +} + +{ + "attributes": { + "closed_at": "2021-06-17T18:57:42.682Z", + "closed_by": null, + "connector": { + "fields": [ + { + "key": "issueType", + "value": "10002" + }, + { + "key": "parent", + "value": null + }, + { + "key": "priority", + "value": null + } + ], + "id": "d68508f0-cf9d-11eb-a603-13e7747d215c", + "name": "Test Jira", + "type": ".jira" + }, + "created_at": "2021-06-17T18:57:41.682Z", + "created_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + }, + "description": "asdf", + "external_service": { + "connector_id": "d68508f0-cf9d-11eb-a603-13e7747d215c", + "connector_name": "Test Jira", + "external_id": "10106", + "external_title": "TPN-99", + "external_url": "https://cases-testing.atlassian.net/browse/TPN-99", + "pushed_at": "2021-06-17T18:57:45.524Z", + "pushed_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + } + }, + "settings": { + "syncAlerts": true + }, + "status": "open", + "tags": [ + "some tag" + ], + "title": "A case", + "type": "individual", + "updated_at": "2021-06-17T18:57:58.037Z", + "updated_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + } + }, + "coreMigrationVersion": "7.13.2", + "migrationVersion": { + "cases": "7.12.0" + }, + "id": "e49ad6e0-cf9d-11eb-a603-13e7747d215z", + "references": [ + ], + "type": "cases", + "updated_at": "2021-06-17T18:57:58.076Z" +} + +{ + "attributes": { + "associationType": "case", + "comment": "A comment", + "created_at": "2021-06-17T18:57:58.037Z", + "created_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + }, + "pushed_at": null, + "pushed_by": null, + "type": "user", + "updated_at": null, + "updated_by": null + }, + "coreMigrationVersion": "7.13.2", + "migrationVersion": { + "cases-comments": "7.12.0" + }, + "id": "ee59cdd0-cf9d-11eb-a603-13e7747d215c", + "references": [ + { + "id": "e49ad6e0-cf9d-11eb-a603-13e7747d215c", + "name": "associated-cases", + "type": "cases" + } + ], + "type": "cases-comments", + "updated_at": "2021-06-17T18:57:58.087Z" +} + +{ + "attributes": { + "action": "create", + "action_at": "2021-06-17T18:57:41.682Z", + "action_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + }, + "action_field": [ + "description", + "status", + "tags", + "title", + "connector", + "settings" + ], + "new_value": "{\"type\":\"individual\",\"title\":\"A case\",\"tags\":[\"some tag\"],\"description\":\"asdf\",\"connector\":{\"id\":\"d68508f0-cf9d-11eb-a603-13e7747d215c\",\"name\":\"Test Jira\",\"type\":\".jira\",\"fields\":{\"issueType\":\"10002\",\"parent\":null,\"priority\":null}},\"settings\":{\"syncAlerts\":true}}", + "old_value": null + }, + "coreMigrationVersion": "7.13.2", + "migrationVersion": { + "cases-user-actions": "7.10.0" + }, + "id": "e5509250-cf9d-11eb-a603-13e7747d215c", + "references": [ + { + "id": "e49ad6e0-cf9d-11eb-a603-13e7747d215c", + "name": "associated-cases", + "type": "cases" + } + ], + "type": "cases-user-actions", + "updated_at": "2021-06-17T18:57:42.925Z" +} + +{ + "attributes": { + "action": "create", + "action_at": "2021-06-17T18:57:58.037Z", + "action_by": { + "email": null, + "full_name": "j@j.com", + "username": "711621466" + }, + "action_field": [ + "comment" + ], + "new_value": "{\"comment\":\"A comment\",\"type\":\"user\"}", + "old_value": null + }, + "coreMigrationVersion": "7.13.2", + "migrationVersion": { + "cases-user-actions": "7.10.0" + }, + "id": "eee3be50-cf9d-11eb-a603-13e7747d215c", + "references": [ + { + "id": "e49ad6e0-cf9d-11eb-a603-13e7747d215c", + "name": "associated-cases", + "type": "cases" + }, + { + "id": "ee59cdd0-cf9d-11eb-a603-13e7747d215c", + "name": "associated-cases-comments", + "type": "cases-comments" + } + ], + "type": "cases-user-actions", + "updated_at": "2021-06-17T18:57:58.979Z" +} From 5deb23b8ce3991fe164ffbd2e4a608474035d14b Mon Sep 17 00:00:00 2001 From: mgiota Date: Wed, 1 Dec 2021 17:12:40 +0100 Subject: [PATCH 022/126] [RAC] turn off observability alerts as data writing in a more granular way (#119602) * [RAC] turn off writing to disabled alerts indices * fix error * fix errors * do not install component templates for disabled registration contexts * add resource installer unit tests * refactoring: disable installing index level resources in the rule data plugin service and not in the resourceInstaller * refactor based on review comments * update comment for isWriteEnabled method Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/rule_registry/server/config.ts | 1 + x-pack/plugins/rule_registry/server/plugin.ts | 1 + .../resource_installer.test.ts | 126 ++++++++++++++++++ .../resource_installer.ts | 3 +- .../rule_data_plugin_service.ts | 26 ++-- 5 files changed, 145 insertions(+), 12 deletions(-) create mode 100644 x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts diff --git a/x-pack/plugins/rule_registry/server/config.ts b/x-pack/plugins/rule_registry/server/config.ts index c4d4793a8bce37..4b691c15d1b3c7 100644 --- a/x-pack/plugins/rule_registry/server/config.ts +++ b/x-pack/plugins/rule_registry/server/config.ts @@ -12,6 +12,7 @@ export const config: PluginConfigDescriptor = { deprecations: ({ deprecate, unused }) => [unused('unsafe.indexUpgrade.enabled')], schema: schema.object({ write: schema.object({ + disabledRegistrationContexts: schema.arrayOf(schema.string(), { defaultValue: [] }), enabled: schema.boolean({ defaultValue: true }), cache: schema.object({ enabled: schema.boolean({ defaultValue: true }), diff --git a/x-pack/plugins/rule_registry/server/plugin.ts b/x-pack/plugins/rule_registry/server/plugin.ts index f5fa657274166b..713e7862207b87 100644 --- a/x-pack/plugins/rule_registry/server/plugin.ts +++ b/x-pack/plugins/rule_registry/server/plugin.ts @@ -84,6 +84,7 @@ export class RuleRegistryPlugin this.ruleDataService = new RuleDataService({ logger, kibanaVersion, + disabledRegistrationContexts: this.config.write.disabledRegistrationContexts, isWriteEnabled: this.config.write.enabled, isWriterCacheEnabled: this.config.write.cache.enabled, getClusterClient: async () => { diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts new file mode 100644 index 00000000000000..99df3991410d5e --- /dev/null +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.test.ts @@ -0,0 +1,126 @@ +/* + * Copyright 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 { ResourceInstaller } from './resource_installer'; +import { loggerMock } from '@kbn/logging/mocks'; +import { AlertConsumers } from '@kbn/rule-data-utils/alerts_as_data_rbac'; + +import { Dataset } from './index_options'; +import { IndexInfo } from './index_info'; +import { elasticsearchServiceMock } from 'src/core/server/mocks'; +import { + DEFAULT_ILM_POLICY_ID, + ECS_COMPONENT_TEMPLATE_NAME, + TECHNICAL_COMPONENT_TEMPLATE_NAME, +} from '../../common/assets'; + +describe('resourceInstaller', () => { + describe('if write is disabled', () => { + it('should not install common resources', async () => { + const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); + const getClusterClient = jest.fn(() => Promise.resolve(mockClusterClient)); + const installer = new ResourceInstaller({ + logger: loggerMock.create(), + isWriteEnabled: false, + disabledRegistrationContexts: [], + getResourceName: jest.fn(), + getClusterClient, + }); + installer.installCommonResources(); + expect(getClusterClient).not.toHaveBeenCalled(); + }); + + it('should not install index level resources', () => { + const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); + const getClusterClient = jest.fn(() => Promise.resolve(mockClusterClient)); + + const installer = new ResourceInstaller({ + logger: loggerMock.create(), + isWriteEnabled: false, + disabledRegistrationContexts: [], + getResourceName: jest.fn(), + getClusterClient, + }); + const indexOptions = { + feature: AlertConsumers.LOGS, + registrationContext: 'observability.logs', + dataset: Dataset.alerts, + componentTemplateRefs: [], + componentTemplates: [ + { + name: 'mappings', + }, + ], + }; + const indexInfo = new IndexInfo({ indexOptions, kibanaVersion: '8.1.0' }); + + installer.installIndexLevelResources(indexInfo); + expect(mockClusterClient.cluster.putComponentTemplate).not.toHaveBeenCalled(); + }); + }); + + describe('if write is enabled', () => { + it('should install common resources', async () => { + const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); + const getClusterClient = jest.fn(() => Promise.resolve(mockClusterClient)); + const getResourceNameMock = jest + .fn() + .mockReturnValueOnce(DEFAULT_ILM_POLICY_ID) + .mockReturnValueOnce(TECHNICAL_COMPONENT_TEMPLATE_NAME) + .mockReturnValueOnce(ECS_COMPONENT_TEMPLATE_NAME); + const installer = new ResourceInstaller({ + logger: loggerMock.create(), + isWriteEnabled: true, + disabledRegistrationContexts: [], + getResourceName: getResourceNameMock, + getClusterClient, + }); + + await installer.installCommonResources(); + + expect(mockClusterClient.ilm.putLifecycle).toHaveBeenCalled(); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenCalledTimes(2); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ name: TECHNICAL_COMPONENT_TEMPLATE_NAME }) + ); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ name: ECS_COMPONENT_TEMPLATE_NAME }) + ); + }); + it('should install index level resources', async () => { + const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); + const getClusterClient = jest.fn(() => Promise.resolve(mockClusterClient)); + const installer = new ResourceInstaller({ + logger: loggerMock.create(), + isWriteEnabled: true, + disabledRegistrationContexts: [], + getResourceName: jest.fn(), + getClusterClient, + }); + + const indexOptions = { + feature: AlertConsumers.LOGS, + registrationContext: 'observability.logs', + dataset: Dataset.alerts, + componentTemplateRefs: [], + componentTemplates: [ + { + name: 'mappings', + }, + ], + }; + const indexInfo = new IndexInfo({ indexOptions, kibanaVersion: '8.1.0' }); + + await installer.installIndexLevelResources(indexInfo); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenCalledWith( + expect.objectContaining({ name: '.alerts-observability.logs.alerts-mappings' }) + ); + }); + }); +}); diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts index bbfa17c5694f1e..0d55335a652ea9 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/resource_installer.ts @@ -28,6 +28,7 @@ interface ConstructorOptions { getClusterClient: () => Promise; logger: Logger; isWriteEnabled: boolean; + disabledRegistrationContexts: string[]; } export class ResourceInstaller { @@ -40,7 +41,6 @@ export class ResourceInstaller { try { const installResources = async (): Promise => { const { logger, isWriteEnabled } = this.options; - if (!isWriteEnabled) { logger.info(`Write is disabled; not installing ${resources}`); return; @@ -113,7 +113,6 @@ export class ResourceInstaller { public async installIndexLevelResources(indexInfo: IndexInfo): Promise { await this.installWithTimeout(`resources for index ${indexInfo.baseName}`, async () => { const { componentTemplates, ilmPolicy } = indexInfo.indexOptions; - if (ilmPolicy != null) { await this.createOrUpdateLifecyclePolicy({ name: indexInfo.getIlmPolicyName(), diff --git a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts index 9e64fadd4b3ab4..126be5c6d2972a 100644 --- a/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts +++ b/x-pack/plugins/rule_registry/server/rule_data_plugin_service/rule_data_plugin_service.ts @@ -36,12 +36,12 @@ export interface IRuleDataService { getResourceName(relativeName: string): string; /** - * If write is enabled, everything works as usual. - * If it's disabled, writing to all alerts-as-data indices will be disabled, + * If write is enabled for the specified registration context, everything works as usual. + * If it's disabled, writing to the registration context's alerts-as-data indices will be disabled, * and also Elasticsearch resources associated with the indices will not be * installed. */ - isWriteEnabled(): boolean; + isWriteEnabled(registrationContext: string): boolean; /** * If writer cache is enabled (the default), the writer will be cached @@ -83,6 +83,7 @@ interface ConstructorOptions { kibanaVersion: string; isWriteEnabled: boolean; isWriterCacheEnabled: boolean; + disabledRegistrationContexts: string[]; } export class RuleDataService implements IRuleDataService { @@ -95,11 +96,11 @@ export class RuleDataService implements IRuleDataService { constructor(private readonly options: ConstructorOptions) { this.indicesByBaseName = new Map(); this.indicesByFeatureId = new Map(); - this.resourceInstaller = new ResourceInstaller({ getResourceName: (name) => this.getResourceName(name), getClusterClient: options.getClusterClient, logger: options.logger, + disabledRegistrationContexts: options.disabledRegistrationContexts, isWriteEnabled: options.isWriteEnabled, }); @@ -115,8 +116,12 @@ export class RuleDataService implements IRuleDataService { return joinWithDash(this.getResourcePrefix(), relativeName); } - public isWriteEnabled(): boolean { - return this.options.isWriteEnabled; + public isWriteEnabled(registrationContext: string): boolean { + return this.options.isWriteEnabled && !this.isRegistrationContextDisabled(registrationContext); + } + + public isRegistrationContextDisabled(registrationContext: string): boolean { + return this.options.disabledRegistrationContexts.includes(registrationContext); } /** @@ -150,7 +155,7 @@ export class RuleDataService implements IRuleDataService { 'Rule data service is not initialized. Make sure to call initializeService() in the rule registry plugin setup phase' ); } - + const { registrationContext } = indexOptions; const indexInfo = new IndexInfo({ indexOptions, kibanaVersion: this.options.kibanaVersion }); const indicesAssociatedWithFeature = this.indicesByFeatureId.get(indexOptions.feature) ?? []; @@ -173,8 +178,9 @@ export class RuleDataService implements IRuleDataService { if (isLeft(result)) { return result; } - - await this.resourceInstaller.installIndexLevelResources(indexInfo); + if (!this.isRegistrationContextDisabled(registrationContext)) { + await this.resourceInstaller.installIndexLevelResources(indexInfo); + } const clusterClient = await this.options.getClusterClient(); return right(clusterClient); @@ -195,7 +201,7 @@ export class RuleDataService implements IRuleDataService { return new RuleDataClient({ indexInfo, resourceInstaller: this.resourceInstaller, - isWriteEnabled: this.isWriteEnabled(), + isWriteEnabled: this.isWriteEnabled(registrationContext), isWriterCacheEnabled: this.isWriterCacheEnabled(), waitUntilReadyForReading, waitUntilReadyForWriting, From 064cc2d6b725720fcd084b7f69a3b4f1c8780827 Mon Sep 17 00:00:00 2001 From: Tim Roes Date: Wed, 1 Dec 2021 17:28:34 +0100 Subject: [PATCH 023/126] [Discover] Improve data grid rendering performance (#119942) --- .../discover_grid/discover_grid.tsx | 49 +++++++++++-------- 1 file changed, 28 insertions(+), 21 deletions(-) diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx index f0e0513c7748c3..fa83a7527de120 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx @@ -33,7 +33,12 @@ import { getLeadControlColumns, getVisibleColumns, } from './discover_grid_columns'; -import { defaultPageSize, gridStyle, pageSizeArr, toolbarVisibility } from './constants'; +import { + defaultPageSize, + gridStyle, + pageSizeArr, + toolbarVisibility as toolbarVisibilityDefaults, +} from './constants'; import { DiscoverServices } from '../../build_services'; import { getDisplayedColumns } from '../../utils/columns'; import { @@ -158,6 +163,8 @@ export const EuiDataGridMemoized = React.memo((props: EuiDataGridProps) => { return ; }); +const CONTROL_COLUMN_IDS_DEFAULT = ['openDetails', 'select']; + export const DiscoverGrid = ({ ariaLabelledBy, columns, @@ -182,7 +189,7 @@ export const DiscoverGrid = ({ useNewFieldsApi, isSortEnabled = true, isPaginationEnabled = true, - controlColumnIds = ['openDetails', 'select'], + controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT, className, }: DiscoverGridProps) => { const [selectedDocs, setSelectedDocs] = useState([]); @@ -345,6 +352,23 @@ export const DiscoverGrid = ({ [usedSelectedDocs, isFilterActive, rows, setIsFilterActive] ); + const toolbarVisibility = useMemo( + () => + defaultColumns + ? { + ...toolbarVisibilityDefaults, + showColumnSelector: false, + showSortSelector: isSortEnabled, + additionalControls, + } + : { + ...toolbarVisibilityDefaults, + showSortSelector: isSortEnabled, + additionalControls, + }, + [defaultColumns, additionalControls, isSortEnabled] + ); + if (!rowCount && isLoading) { return (