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 01/90] [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 2ef03dd96e315..09f5317b79788 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 0000000000000..5ed1eab2a4cdd --- /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 0000000000000..eb35d41a04b2f --- /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 0eb2917c3495e..bc0578191f8b7 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 50c085b7f22a8..ed0fa1eb0f3ed 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 1a74640515173..c5208177554b5 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 0000000000000..11e2d32db7ca2 --- /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 0000000000000..527ce527d0cc2 --- /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 0000000000000..6ad5fcc056ee5 --- /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 0000000000000..072525d080f0a --- /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 0000000000000..a64325da8453e --- /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 0000000000000..ed1470738b366 --- /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 0000000000000..82038f76feaa2 --- /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 f0ca7ae9eaf71..bc601d084caef 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 266ea9ddb0f18..70daef5b528d6 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 0000000000000..27b9d139770ce --- /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 568104b7d9ad6..d20ba068f9896 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 0b933582d84a5..18f42e9d54c86 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 0000000000000..3d5c8856d927d --- /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 0000000000000..d8969d85c0e7e --- /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 02/90] [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 c4d4793a8bce3..4b691c15d1b3c 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 f5fa657274166..713e7862207b8 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 0000000000000..99df3991410d5 --- /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 bbfa17c5694f1..0d55335a652ea 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 9e64fadd4b3ab..126be5c6d2972 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 03/90] [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 f0e0513c7748c..fa83a7527de12 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 (
@@ -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 04/90] [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 7546aa39ab6fd..fa6a53a80b287 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 05/90] 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 dcf76b337ff91..06cb6dfff2281 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 06/90] [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 ee0e1e5caeae4..86211ba3727eb 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 b2039dad4d57c..c72d476e4c466 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 17425050a4e10..9fc0edd0b7cf8 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 bd7f192dc7fd2..90a0addfae490 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 b2dba997351ea..4b45cf645201c 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 0b7065edf63ba..8e037c25ceca9 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 4f034a0add32f..d48d80add2435 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 0000000000000..d1d45ad48f30e --- /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 0000000000000..7dd61be1ab1be --- /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 0000000000000..0286c29cba0c5 --- /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 9b2846b68364e..7abe1873b70a3 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 ab88e5af18efa..7e615f923b221 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 8de68c91f4ef3..aafa8765723d1 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 8fe60f59f01d7..c2c86e7fd119d 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 cebdbe7b8fe86..0188f1432c22b 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 06641cc60e13d..90de01702868a 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 dea4402472958..1f4f12648a25b 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 f129e95fd9508..b638f92f19aa9 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 68ee826eca01c..79436c66d073f 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 3ad3b32b7fec1..9b9d72805425a 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 9b454a266834c..8cbdbc064f8b9 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 63e56af3fec6f..708cac5a845ce 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 c1dfee0252b38..c705246014a7b 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 1eb9cfaf109a8..41286e44b1bd4 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 f9e04f4edebee..73bdf3c7c3a81 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 6efac10b94fef..1ae9608ee9397 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 2af1c9a597ebb..99559f6a1b8f0 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 0570eeb708d4e..b8efa2636d8c7 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 45b6201c47773..0e40836c28337 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 ced0e00d34585..5d3e862611b0f 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 0000000000000..0c26582f920b1 --- /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 cba94cce83232..db38598ea6dd1 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 00bc0618f57ad..86f4fd28f506a 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 166f834500927..42b0f4f44fdf8 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 cc8f7966cdd1f..0d8f91e481730 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 f8e393fc3994f..8fcdbd7304656 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 87f0ed7193a67..5e7bf0659947c 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 918d3aadfd6e8..8bbd30a4a6a1d 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 7729934123899..89d691e5c9ce8 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 7a4301185de4c..aedb1061af2fa 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 8fc1192fa95a6..4fe65b7e219f3 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 0883a144615bc..040ade4dad41c 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 07/90] [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 24b4a66624305..1f2df04713c4b 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 08/90] [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 d8696118d7f4e..c967b20e0450d 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 a6801cf9de3a3..a9e24c7b944ab 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 0000000000000..8677592ea289e --- /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 0000000000000..3c6980f74bcf5 --- /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 0000000000000..5cf5863f58b32 --- /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 0000000000000..1b1043ecbc3d2 --- /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 09/90] [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 3f913d76f475d..4b229b3687174 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 494d123cae125..36fe00308bf86 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 d701eb62d1312..ded46faf59f2c 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 4d57cce653d4e..8840b8d355864 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 10/90] [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 b1d9d3ea2ea18..1d698e9087937 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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 CtRVvc literal 285124 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⪚N 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 SugN%k*GnqqXD(k04s0`}cu9r&YR$NR+> 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%0AL-)s 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 q{cb=0+j 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%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 11/90] 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 99e0d9cf972f3..6f65c620b527c 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 12/90] 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 83fc3c4079619..8fee215545bbe 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 13/90] [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 0000000000000..4772723f5d927 --- /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 0000000000000..2219a50a5e7f3 --- /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 0000000000000..ba537f712cf27 --- /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 8ecd861304458..9c3c1da534f72 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 bc766462f18ae..7dd279b176761 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 805b4aa0d7e0d..c70424f7910f4 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 1952d50cdd92a..e136ccf58a340 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 dc46a4b57bcd8..40cfdfeba49a5 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 89609efb7ed7f..5e664aa310314 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 0ce5dc6f9f02d..5191297119440 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 e4a84e2bb85b5..a4af2333333f6 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 8fee215545bbe..49f5895bd98f8 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 80c4699f6c211..ad39b4bb02452 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 32/90] [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 f498c6f0a244d..45bc3df77bd22 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 829d88bbafd08..45c064d06c51f 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 154f83796490b..ae0f5ad670ce9 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 c222e4038f517..77eeb88904100 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 39d8268de2d0b..4b647867cf64a 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 1ed34978416fa..7d0f747b9bd5a 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 9dd7ef19ffc07..a4d7107a7f15c 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 3b4ff997f324e..78aee49d1b288 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 b412cd69c82af..c65d0b0a4ec2c 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 b5beebf6fb8d4..0715c7377da7d 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 ea3f852a5290a..1ef6641e9bc72 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 9d198947e06c7..28d814b871104 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 08d1a2639fa0b..9a7f68550d840 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 78f742b9f7c9b..bac6d085acf05 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 b70bcded4c608..a4ef9382b4995 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 b3ed7ab854190..2788d63fdf983 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 bfd6f1daa4bc0..0f4b9058316a0 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 4a0e472f17455..d1a1f2dcdbe8a 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 fa83a7527de12..c9d2ec72bfc02 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 49b72ef126a76..3bf80872b0685 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 c517d3a65b6b9..6fb614327d2af 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 d5b2248162b2f..30e0cf24f7d52 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 e97a2b2901f33..b81dda5c27915 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 8fd5f73701932..c1673dad7eaa7 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 8a980cc4160d8..2eee9a177e4f8 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 7146f84e194e2..4a7f0b1c36868 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 a28e509d3ba72..aa15ccb79da8b 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 3537699e4fe20..8eab6b1e12c8c 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 5133ca46015a0..c956b36b62594 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 707a98d87c924..433227133370e 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 26b5016881b85..8ee8741d73d3f 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 e8faa51bbab40..ef2600b4d04df 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 0000000000000..f6872e9951c37 --- /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 10c97c53b3fb3..c8b870b1a1dae 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 33/90] [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 054ef958c1914..2373f8dd309ba 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 5071eb71fece1..44d88acae1617 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 e188b8e99b5b9..2330cd3690c77 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 8e037c25ceca9..9853877dc2d61 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 34/90] [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 c750be12be2df..67c45fea37d78 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 633390c368957..0769f02fc0272 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 511aba4e6a932..61592420e9116 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 35/90] [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 3b4edb8c72b07..ceb9388a561f0 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 36/90] [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 aaa8bdb2047aa..0000000000000 --- 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 2048ccae4fa60..d95c4f536abc3 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 a0684b59241b0..0000000000000 --- 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 7f6ede930e4c3..84dbc8921f0e4 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 fd9bd489f31b2..09386431200ed 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 1b090a653546d..953f8b88c990b 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 da1c25c83a37b..455665dc7012c 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 1d5300c5880b2..bd4e36bb7c177 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 3623498223da7..57b9a0ffbc243 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 2fae6996f4aa2..4f506b5e0b4f7 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 52aa8431e2975..9b0395bbcb3b6 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 c0d3d571bb1e8..3f602f7979d1f 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 27829d2539c7d..f6c97df4f8b71 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 9113b73de187a..2c98da198fa07 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 d8a09fe1baf23..ca7bfe66804f3 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 a1cb5d8138c40..c14e1fab4a410 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 1ea9f481d302f..f46bcd0906c60 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 37/90] 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 0000000000000..13a7c1e1f2f2d --- /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 0000000000000..9e9ea0ab1f246 --- /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 0000000000000..ac917dda0e142 --- /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 0000000000000..da3ce0fab6021 --- /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 0000000000000..f54035b7f69ff --- /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 0000000000000..e00a51dbdf438 --- /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 f0900ae259592..2675b6e4c617e 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 0133642b8c4b3..1d62ea7fe40c6 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 5384122a18621..20ff3d5081ba6 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 49a08a12454e3..9b70f5bba6e24 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 6d8b35673fba3..71d178494cff1 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 ae58df0e058af..b0f3b29599242 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 b27e848c98a13..8021253c80e99 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 19bfd961f6461..8648b531ef3a8 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 334166e716ff3..9be1d3746899f 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 caa5875504441..590c5d4f3abc5 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 bba8cefd749ee..50c540266724a 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 278aa1b03bab1..077e0fb0becda 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 57c4904d711c7..5710a99a65660 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 82b8a77d621c7..c16a9639b3127 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 7dd279b176761..3ddd7953a6310 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 e2ce88f84f702..309784576818f 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 c29080cfcaf90..a4a0c7bb16aa8 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 11796050a545b..4d64bd3cf1ad4 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 ea577f3336936..9141594dd5ccf 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 eb7227ebceb07..f0547e621afc4 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 0d730c5f96e97..f096da7dda573 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 c084ea757035f..38a15c3e39453 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 ef821b7e39dca..7fe29f7648841 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 b62e87a566b97..76877319c0c48 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 e754d0ca03257..a76655a235c4f 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 c70424f7910f4..2aed5db789f44 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 e136ccf58a340..50f8d93ca8f4a 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 477999abdc05a..e28c5c5f9d597 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 40cfdfeba49a5..c8a96c8eede83 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 17ded6385da4f..8c312c8c9abfa 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 0b434b6677353..8467abbab6c47 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 5299fa93e6dab..c112d7da7b8cd 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 0c27eb3be1a2d..a7440805b242c 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 e6e9b5121bf2c..a4013a0e8024d 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 8d487a0222979..bda0c9fa59056 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 138df2b1e9ced..6d249b6d5660c 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 18ce1da00e117..e954d1f4f66e5 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 9c605dacdfd22..20bd9b422ea0b 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 047d200d0af02..267127c59e6dc 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 4fa101a329cd0..db06f9dd8cd91 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 138174792708f..313fc460c5c5e 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 1e01f43439a31..db512537dfdb8 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 51b7ddd90a052..5ad02ef2b9a50 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 08f1f7e4f3671..ed676443202ab 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 78a6724fc8cfb..b55fb733a8c86 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 f96b5103a8edc..8978fa92bb7f1 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 ce65c2c23d0d9..136edad6ce198 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 962bb9cc9785e..ae36de49fb57c 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 28ee223c5f2f8..cb6ebf6430eb8 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 6f44e2c1c22b5..18f291ce20f35 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 1191c7b018237..c2ab88cbd49b2 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 6398362220de1..a4cf9f280e9a7 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 1c9c4f4e69f43..8f38669976ef4 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 e33b4ef3fbb1b..8b62792973115 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 5191297119440..96611d8305f89 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 a4af2333333f6..a2792e7e8e317 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 92d2b28f1283d..da50dfd4b0860 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 41e162cff2d05..67a8bed8dc8b9 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 841f986309482..891ee07c3a245 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 cdf77307a6938..065ac693bfcef 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 5f7ce27637f3e..9de353677649d 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 9027aa4520418..c895965700c45 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 965639bd12145..724d9cdc44fc8 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 38/90] [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 4b229b3687174..466ccc61838f0 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 8840b8d355864..817c43df4f8b6 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 e5886a726f261..1f744d5eabf9b 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 39/90] [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 c06e57035819f..3d6f7999545a0 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 40/90] 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 a33f5ec90e3a0..fd29b5f590967 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 41/90] [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 a5a0b52e3fbef..8fc87b49a6607 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 9fc0edd0b7cf8..8cbfa311081d2 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 ff829eca5ec18..1b6e28a07f8e0 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 308c4ab66f15c..fb9dc7b6b4ce6 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 42/90] [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 79436c66d073f..5d6dbeca3e0c6 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 71c093e0781b0..2a4c59f94c8c6 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 a53d5d43de524..4c54dcb0f7725 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 0000000000000..57a23d677e014 --- /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 88af71508f33a..0000000000000 --- 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 43/90] 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 977b7f462777e..f35de2328714b 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 bd85df3dea638..f9e6a0b756d00 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 ac70d5276beb9..0e118d527c69b 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 228b7a2491fde..afff935619740 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 8c719373eda71..7a634b7fe10ec 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 375648e0abc8d..1724f616e7fc8 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 8f0737067ec6a..703c6c098d11e 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 1d60175d56f60..d3a88004bc8dc 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 8934ad9dab4cd..421b92a6e8b7f 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 cfca95fddc507..6a5a0f3b42e04 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 44/90] [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 bc0578191f8b7..70ccb1ddebd10 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 402e44618c7cc..c51c25c5b976c 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 41754fad836b0..d016dce48a24e 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 9cde5da159960..bf02202ff83b2 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 bf42cfe38863e..58c17695d0dfe 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 67d4409444016..c30ddd199fc49 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 8429712a30f74..681bb65870c1e 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 7f7de11a3435c..e163d9ada4a51 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 bd4450baaf3fb..06387072c2323 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 943cf5fcad96d..9c825ad95618a 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 371d6dcf3063e..f36ecd5b6b5d1 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 e95410c1967b6..9b326f3216084 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 932ce69372110..588bda245b044 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 0000000000000..93efdcabd8c38 --- /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 5723f78649b5c..e77f72929ecd8 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 06b07ebd396a8..9f1e2e6c6dda3 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 6105fdbb2aef3..2c775cb5fd86d 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 10bfa2e78acc4..a513056ba31a5 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 97a1c1d2e8ff3..76c31d6f8c4c4 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 432c2d9fc5b2b..94e7d321840a8 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 2128063ea9084..1e2143888bf1e 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 d947f9aa86489..19eb16a3bd52b 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 05b18da3293bd..c734442d5a77b 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 a95683e7de4aa..18009d9e176a8 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 45/90] 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 172a83935b966..d2f31f3a4faa2 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 5201b7005c66e..f15a317f9f934 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 e8c7ce6abb029..c35fde302578a 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 1eef032945e69..65d196b6e068a 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 5ad39a3f91303..c5e70a6c93eff 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 fba6ea7b491c6..2446e7a7d1c51 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 a7478de1cc96e..00652309b88c1 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 f4b95e0e20e51..2358333bbe7ef 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 4b5a0a7bdade7..3d720ccade546 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 2c553295aa840..b1b6f3f79aee3 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 4b5a0a7bdade7..3d720ccade546 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 d400c423c5e04..8ba2a125a5504 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 cdbddb8d89c89..c241a529818fa 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 eed8858dc95d8..ed656b5144956 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 fb0b92e87a424..b45591a233e19 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 0695ed149c9a4..0085329cd66e6 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 02be86c3db0c2..1408fadc102e4 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 cd07b4db728c4..cf5ee80d2a82a 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 46/90] [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 706dc3549badc..bb8156a8b55fa 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 5413da9d56161..19d04ea3de17e 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 35675d246a15e..99f3d30c6caae 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 5a423ad510af1..58ad584fd5b60 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 48cbf4ba00d87..85ffde0acfea3 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 2a982c2be1cfc..0fa8c00409d1a 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 d62bd6252f130..f7076b4d02afb 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 d284f5c741eb3..748e5068833cf 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 47/90] 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 7669b9b644916..403d8594999a7 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 6aa528d4f04d1..131d4452c980c 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 7a599e7c84acf..f99f621a52c83 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 cec80af843c4c..9bb65a9dd0b57 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 f1d9beaca5136..1cf1cf8a0d5bd 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 1f2e7c883e1cb..1a41004c882e3 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 c7c85fdd49359..1a25d1a7a8d1e 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 93bead4d31f4c..8cd5b86314a2c 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 9f65e6b599a98..e162b126c0679 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 aa8bbd6970f86..4fc12f62305fa 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 d041f1b294e7a..4314dc1465f94 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 b28343f37ea25..5f3c79f9432e7 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 e52a174850c4c..009dbffafebd8 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 409caee7d4b4b..76d3f07facf05 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 cf24a857c9723..01997e32f243e 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 48/90] [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 b8e6922414ebf..d10785d614cd3 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 6b9954465f39d..b61b225c2fe94 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 5c41a1b4db7e6..10d558e648376 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 b46b7a0986179..002c480503454 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 1e2386c8743fe..e137f2dbb0f78 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 edaae8cadc1d5..577a7544d93ea 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 328d2da0f6df0..e1dde61bfc3ff 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 fd638a6731c63..04cee211c78db 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 0338f78a0a892..6b5fb0c5fb1b4 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 1e39b02655ada..7ad78cdff9545 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 3866bac88ef44..6922fc04f2e71 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 9f65481d07489..0000000000000 --- 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 d6eb7729effaf..ad2ab74098c22 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 166e8d61142ea..ec081916f455d 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 70f77c26fdbf9..b14329985db90 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 711d6964221bd..979d79c84578a 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 3eaa8053b6709..9576c018c1c27 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 95f2c6f400de9..744cd70e9eeb2 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 5375da3606f18..5c9e4892866cb 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 bf607030c07d3..d4f0e350071bf 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 49/90] 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 f8db22563ec5a..de112dd60863f 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 50/90] [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 f5bd4dad085d8..28c7caf3c50e3 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 c9720063290b0..a415d181900d7 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 5041cb997ff58..93a9a118d23bc 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 b35f680df457c..ec9b3652fddbd 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 51/90] [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 1fec1c76430eb..a9aa96c2d9c60 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 19ce0d45e2485..a9aa96c2d9c60 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 f7522cb4dd585..7e1e71a01642f 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 82259aa2312ae..b42a0425355cc 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 dbb52ade2652c..811c43fdfc5b9 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 37fbab924afa3..c2254c18f4364 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 bdd342934eeb6..c4d7902e151b4 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 47d0ccf5ba3b2..648bc96b5c9e7 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 f845e8ecba6b6..b4abd253b4a96 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 cf69e4ba02c3e..d06f4d3ea105b 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 a511af16bbf71..1578c77f283fb 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 7aea1e881bb52..3311207eb1420 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 029ddb00d1832..66bfda1a02619 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 d6b1afea98592..764a13c17ce84 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 06cdee581d3fd..b541c7234f08e 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 9568f9c894e24..a1684d6564a0a 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 7a6ff229fbcd9..c95006866194b 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 21d0e132599fb..db7ba367d0ace 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 708c3c396d0d1..cc0ef8d4e8b79 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 d0951172c21a9..32fa616831dfb 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 4282a584ea9f3..a7c3cb900d7c9 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 ca4fba4a908ff..e7cc34ef49bef 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 b7c415615f97a..5d8a787929acf 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 a2f2ba331d959..ab9d4a6344aec 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 84cca38014fde..3a388104d926e 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 37199840ae3fb..d3ba561bcd699 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 685bc8f42b1d8..95787629079fa 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 45433a39d8b97..7ae54e60944cc 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 ccd71404a2216..f9dfc0625ac17 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 72aba6e186fcb..a9e5679c5b831 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 a7def2a23ef1d..6087553522eb8 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 4db6f67acb265..412c4a69ec2f5 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 15cb7ef7b1c46..eb363f4f77067 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 f925339e68490..959fb94c5bbd7 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 1708509b31864..59dcf350e9aba 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 73fb7c19a6f46..bb95c615d874e 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 e833b8411cd9f..6e9672d08b366 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 7dc0a98461760..f5086fd1a83da 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 50fe19f4d804a..70f3e7004fb8e 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 947786695ded3..224662f0fd6ab 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 8795255dfcfd4..1306509a87a54 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 7eb98b7475952..58e8d1869233f 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 828b8d8701188..b897fef57f076 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 18b407a035708..166a4c2da871c 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 b33e47dd27b96..8f64b4e7e6db3 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 017ba82e8e33c..4be37de54b365 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 60118b1e55e58..b1ea4899615a6 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 7124a3de968ba..d71dfcae1b4e6 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 79836b0ac1e4e..dcfb0efc11455 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 d05386c2504c5..9dd17ee9ffed9 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 8de9692a116fa..cc4d3eeee2533 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 a3a6618e7d07a..334bfa76b84e1 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 2d1be6ee7914a..cb6ea7760842b 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 1bbfc837ebd62..bf92417c8023a 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 11c501f9426f4..9a68a8b658149 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 f00eb332c564b..35e8647bc413d 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 8fdd6483a14f8..f71db57c1b42a 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 b3f145beb886b..a5ba7360c966f 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 983ee00ef9b6b..ae2caa8ce8401 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 456a0bbe898ea..1393f11189cca 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 3d369a56a7bc0..540ad05d1da8b 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 68e1195a9c7eb..0f635cc8cd198 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 28bd3d6ad43a0..8b5d9bbd65635 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 9e9c6f81a43bb..516068d40eb0e 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 7db1a77244bbe..7771d470b1556 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 35dd2a0b08d4e..42f5707bae6e3 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 f2f353ffc0cff..cc27c614f5897 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 3c4e45bd3a1e5..21376d82eb17a 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 f7542b7b4b8a6..684b5cc12eaf9 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 0c837e60cd2dc..c553052b35319 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 3c4b1cd0ef373..15164842fe0d6 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 1d4d9b1e0f2ea..18dcdfe103b1f 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 a609a8b356f10..94504afcc6c02 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 5bbc9b7726002..05bb496a7444e 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 b97b8ed4f6549..59985a927aa8f 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 ec307173ec20c..c7e67566acfc2 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 17f7d78167232..bde058942f2bb 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 643b3f657ef0c..f52a760db842e 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 a280950c37cd6..954cd6509e2b0 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 2ff4831616ab9..12d46c4be2282 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 51e45035f420d..0ca14c5489c56 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 f9c94eea3ff29..8b8f6ec204e98 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 78a1cfe20d212..fb1416070ddc0 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 b20cf4582c824..6e8a9e0f43b2f 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 c90ad5a311790..86d6bc6f75b6f 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 ace2faf819877..4ef866f2fd705 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 8e65b53c3e68d..cc55d83828426 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 c0f38af37c1f5..02b284e6bd200 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 8a5099618d109..872aa546d6553 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 dd184c6a94b46..681e710aa896c 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 52/90] [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 97695ec60062c..ad0f9cb5dae49 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 1d5df9c6e88b8..d00e1fc555b17 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 53/90] [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 5a7f931538bf6..235c9aa843797 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 dc7365672ffa2..f3bebfa68ca4a 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 54/90] 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 c8da0bf051390..75da2784a391b 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 f10044a68def9..9e124cf63a391 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 e66a621781234..686866ce7bc88 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 ac5ec227e92c5..80076a9851087 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 85dba79953939..7a1afe15ddd33 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 55/90] [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 dbe658b8b2d3c..d0c7b56638bc2 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 b764c9de48346..706fe55d0754e 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 56/90] [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 8972f92831717..89a21b0424ed0 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 57/90] [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 017290dde9b15..af231c327f955 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 8847a99fe3af0..70500b26c16e6 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 bfa8c7db657d0..73e3baaca2ad1 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 58/90] [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 5067cbbee9bf4..65f82da69ccc5 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 9a9e8f0f56717..f1e88223e57b6 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 59/90] [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 b19a1dbe86fe1..06040d9a186ff 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 4c4a424b51eea..97f4d847361f2 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 8c6352fff9864..2f888d3d733c0 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 04b9b1b45b633..0a0e409ef53a9 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 0000000000000..40e567c299826 --- /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 3abf04ed29e67..12a83f19ca258 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 dcf6b121d6258..71a1de1df6a77 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 60/90] 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 32b0950aa1065..67264a26ac5db 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 eb632465e4699..acbb06c6aa6ec 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 a976eeed912b2..7c5dfccb5b008 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 0d04fc3d6a860..a3c369b143b4a 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 b2e2b4bc6003f..91cb6c370d759 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 75da2784a391b..06e338ab87ca7 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 15dbc163cd288..a6e5f167735c0 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 fa18a40744354..ac523fb77a9e1 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 6697dfe53ee36..75c0bf4985b84 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 d9538467a0984..cb0928fa3763d 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 55639f16d7a97..7b6ac5a6ec5f6 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 aae77a7508954..fabe55d93c8ef 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 7708eca0ec67a..cf536ce5158c1 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 0eb9438ce594f..a3b3cdcbe28d0 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 44223783ada57..f6a7893fe5998 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 b27d6d2de2f8f..13754ad452b01 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 df0dec0054497..afc42a59ee96d 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 1fb97a5914ee4..0492829dd5320 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 485e5f1044aa3..647fcdfcbaad3 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 ab8b9766f28d0..c1d0f69e4ea07 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 d7645d86dbd1a..5165ca2fc90fc 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 90c8a63c746f1..4d37e1825c85a 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 ac90a0479ce2a..57ac8c62273e0 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 fa7eff8234011..b2e24676cdbd4 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 53f9c82b86815..94b1a34728779 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 697402adf3dd1..26fa12497357c 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 7fccc53bd7449..b347915ae3310 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 ac337f8bb5b87..e82fcf791804e 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 89ff4fc6b0c6c..186f949d9c8e8 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 c1ae5afd816ee..3c09b60054a0c 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 b75315120e90d..2beedafd699fd 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 be9a9462f76d8..107d82aa59ee8 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 bfee34694748d..521fb122e4659 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 2ab60e66b860f..284465c8f305b 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 ceb65827cd9a4..1a2f9d4296f8a 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 00532b9150aef..648677e67e1cf 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 f99f621a52c83..24c085ef64de3 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 975c0160d83b2..262ee9e702f40 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 d6f2b8c5fb2f7..7c52205022440 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 383fa2d1914cc..d31909a19ff75 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 9bb65a9dd0b57..30225acb3dd8d 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 7c84146d1aa86..92c0f2a9b7fca 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 fc67ac4a595eb..bdb00ee4fdce9 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 6bbbed9a1ca60..1a3f275aa31ed 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 9996d609fc074..c8fcea83eae45 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 9e77786c1562c..b2948a4d59129 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 894ff38e12a35..1b6aa2de3c192 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 98ae0f8b81aa6..ca031e8ab282b 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 715337ba813b5..89a32d6dc5d2f 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 02a809b3c2c36..5772703a5a6b8 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 6c3eee4981725..f5c6bbf8e9422 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 8e9604b50fb57..30609837447d1 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 fa461946d397f..d4393791a74fa 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 29cc01da3f63d..63a1b02d5b2e7 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 2e79bf6fea57c..c28bf3c258f77 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 a5ed81c15c9b1..9e3a419d63964 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 f5c1755b228e9..e3d9688e60962 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 27998f881a03d..5888e6eaf6806 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 0f65d3f1e33e2..01a7786c5d856 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 09ac0c1dd94bb..8be3526e3ad29 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 180e826b5bc4e..9e968c9bae8a0 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 9478d84741b7e..385f052adece6 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 f9d703900fc04..836ff33b335c4 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 4a86d8322b9ef..dfbd43f99142c 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 76c460de4ed42..36e61af6cea33 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 ceaad76d6d124..5beb4fb989d5b 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 cace655a82a0f..c864c06e4003c 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 b86212251cb74..9cc2eb78aafbe 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 12b0a77a7865d..ffdfd82058693 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 507d2be7198d5..9a575a9446a01 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 26d366bb8dabe..fe471ef853b23 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 14ab7bebbf057..69587c58f1045 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 d179beeb76860..bf8a96a4ab1e6 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 3d856e4686126..19af3a1f976ab 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 956a6c55b61ba..faeae649021df 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 81121a17080c2..1be7cd133bca2 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 fa9e33a2ba82c..85f354d8a81cb 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 33d0d079d26f8..5a71355da8bbe 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 9e1cfe60caa3c..0a1127cf11b3d 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 64c85dad73312..abf320a696714 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 18c0ad38f4601..ae06e39f7a274 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 0000000000000..a2d9c88664722 --- /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 d1482c55429f4..91fb8552beed8 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 e57859bfa253e..846847dcd7e05 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 cfb1a5c354c2d..f7a8f7030d4f9 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 155de8fbdd947..6ca632eac4f2e 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 b61b225c2fe94..a862ff872f61a 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 5d49f1d9a8f18..30ca3e79f6d7b 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 e9280ba3e5976..68e29f7afcc79 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 6c9a0cb45e273..6e09e2aecfd48 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 85fb94dd765b0..fb2d46bfa5aa2 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 04cee211c78db..97dc298d11c56 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 b0c21fe28abb2..b603d9e72a2b0 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 f196b718968da..773b1ce694125 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 4e1c0ca050a09..83d2ac35b3672 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 e460991029915..d32e751a6ca99 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 66b12dab59775..0a0a92760decd 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 ec081916f455d..a9f5615acb1c0 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 6b917919bade5..347fca380c863 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 419c3e44d68a6..7a38988ac1b17 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 5b6d44ab9295d..a089c7bf3968a 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 02aae547407e5..0044a5abe8176 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 96a17bd894391..daec52bccda37 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 586f636a088e1..60be59ab2db6c 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 2219a50a5e7f3..2109160f5bb25 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 e11661e4a942e..03e5d835df9b3 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 0949be0ced0a6..70dd55f40ad4b 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 13dd77da40931..32e1b61a2c3e6 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 919e1e8706c94..8c1b4212040aa 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 8d867eeb74f86..04b899e3cb886 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 d582572862012..be905cd67c976 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 34b1a74510e1a..3e91f4c1fb58f 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 e3f106488571e..27a635d25eeaf 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 ba9bff98b0ca9..b2b685f51573b 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 9e8cca488e4ef..48a428fd08b4c 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 c2cbe16b62fb6..1ec21c4991a1b 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 2033ad53bf7b0..a650176f5f77c 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 3dd092fa48b99..485a104b3ff9d 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 286fc5f769cad..316249ec0fe3c 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 5b437d3da69ab..097ec3d98e162 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 bd178047b2251..ff00ef958acdf 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 d5ed944f7e7c8..e42a5cc873c1c 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 85746298d4e51..ac5602ddd830f 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 e853d5de5899d..d4c3648d05325 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 be8831860c9ec..1afd36e406daf 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 c44427f3ca9e1..178c4e5bc9fde 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 323adcc756674..63a159121e009 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 c65fdece6c5f0..fcddcab378bc6 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 3fa567b8aca96..2284ad5e796ee 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 b7c52361a33a1..722f9a3f17f6d 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 6e99db7e1ed0b..4b04f15682777 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 6fdc868429138..55ba3de538060 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 0bafdc4fad1e8..419bd2d9e7ee1 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 d8c17f064d016..e5381757670ea 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 3e2c8b0ca2ec8..4ca8adee5f9a8 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 b3289a510deef..1ce268ee74a5a 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 af05198ef9974..feaad62b96e79 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 0e436760a88ee..0af6bceab26a5 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 8da9267daabac..13106ec3012be 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 040ade4dad41c..c10c63db62ee3 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 9f957e2c61910..ceb19837c434d 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 8532e2e4eece4..90adfdfa8fced 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 8f500f54cf4ba..82299825b4154 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 cc934a8c68d8b..a86de3ac02b83 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 c63c6c4bdb120..4463a55b1744a 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 250873b90f1a0..4fbd60f7929ce 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 8d33179bde402..8898eb0e5c521 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 6b2fa92a63b08..00c911e001fb3 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 cad76dd059c01..75ea3d4467eb4 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 61b1a5f9d9527..506051b95fd5a 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 c0da9389f13af..db18cbb9e114f 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 81a1e6ba7ca7a..4fe7e94803fd7 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 22f714e408a1c..f62c31b10e459 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 600a335effe2c..139ac8bad417c 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 7cb98603548ba..ac2fc8ddd324e 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 7a1afe15ddd33..ca0569e44007b 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 61/90] 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 06e338ab87ca7..a6dfd03893c81 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 9e124cf63a391..8208496f7d800 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 686866ce7bc88..c6611e71e35ab 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 061b8306bcc6f..c0b75ab491ac0 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 e30db61ae0c28..012b39d733a78 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 ab018a0ab73b0..6bb37b3500152 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 647fcdfcbaad3..cc03c81070745 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 ca0569e44007b..9472271c20998 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 62/90] [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 e2b2afaa715ee..a2ac498986c08 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 d1a9f692c2e9f..b8224d9a30d08 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 271d24d73357b..3442e69aab44a 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 63/90] [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 66e23686e14e0..f0c22ebf8b730 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 64/90] [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 a912668d91432..0dcafd012ee7c 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 9eacfb54a411f..56df931ffade5 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 b97043bf83304..b477ac220f6a9 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 ce8e90def5aad..10643e729d837 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 c04fe543804b4..610e6e56af350 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 bc6aedd4662c1..ca2cede4e8555 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 497f75b91650f..bf19bd6ecf4b8 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 ae75822e4a7c9..56f6558eff48b 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 65/90] [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 9081a8512c11a..378e22f834e1d 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 e3cf86b67148f..d4c74a9c646e7 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 f0fbed22f38a0..65847a18d4e0a 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 237ee5644cdc0..295e30fc1bffd 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 be34980045395..acc5133f5b7d1 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 0b82ccf5d2dba..de3793b6a30ae 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 5256ba81c9b8a..c403937016ec8 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 232ec09cf8b06..5fc7e31fdf9f5 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 94aadf6598b5a..572771537ec72 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 bc9748fa8f6ab..498e09e14b7e0 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 3af0fe00f2465..ec918f89321ad 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 3bc62d888e02f..a89c56c66ce27 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 db61cfaf86c51..1d2326b77dd26 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 66/90] [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 89a21b0424ed0..fa5801e622706 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 0000000000000..da7f8997a16b6 --- /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 0000000000000..2dd191a7bf672 --- /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 0000000000000..4cc75d207e287 --- /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 fbf412ca704d8..995f685d4287f 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 0000000000000..91f4922c27e05 --- /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 0000000000000..ab935522ab921 --- /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 0000000000000..85bf99f5e5a6d --- /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 0000000000000..d0ce6364208bc --- /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 0000000000000..3a8494cb7d0e8 --- /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 0000000000000..fa8153dc161ca --- /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 277be1ef8ac80..3b6011aeab7fc 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 c96666dfbfe3c..871710abee11b 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 2aa95fa5cb6ca..f332747f1ccfc 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 6557e6fe7b663..ae1f6da10bc6e 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 67/90] 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 a6dfd03893c81..1e5a135b723ed 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 078786abb8c64..52b1f816090df 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 9472271c20998..fc670fda132ca 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 68/90] [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 2aaef04e3bec3..3d844fa4de9fc 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 0e04c32f52ba2..5835730e35f9b 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 b77e0bb76f1fd..c8d6fa08147ea 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 02c910640edeb..6a11910d4f26f 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 87499f279524d..8a23c2319a3c2 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 8711a824fb7b5..6830fd904751c 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 572771537ec72..f97ac6e538575 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 1d2326b77dd26..b71e60e5ef0be 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 69/90] [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 7f78bb1c698ab..a31557124d49a 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 cd7bcd810dc39..0fc8bd99c021d 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 e5ed24d475497..fc5718abb43f0 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 f6c7d60ed7db8..55407835c0a4b 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 4b9d48a92e0f5..6e93bc40f7d7f 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 0d359c865220f..ea0cd804efec0 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 1a9bfd7e30c57..d506de357675a 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 80e4e5c8057f6..7b42e85584428 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 4a7f0b1c36868..6d7e515e33fa4 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 70/90] [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 b259c0f1d9e33..38f5eec836bd6 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 39e08e29bdc2a..2fff4c2e92676 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 d1dfd6ccfd565..0000000000000 --- 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 82e54b5b86072..0000000000000 --- 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 4d01e2ff00ec1..a5809ea776322 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 4f524886935cd..d0c75e08ae01b 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 3920aa40e1f15..59c09c415f50e 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 235cdd9c740ee..d586f0e4856d4 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 200bf0c719320..487d0862cf467 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 5cf0a0c0b28fc..22bad4fffade9 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 bc2172a257635..54c2500d03b03 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 0000000000000..216dcc98c0e41 --- /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 0000000000000..3ec474974917b --- /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 71/90] 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 c398316e634b9..a64ab63494b35 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 72/90] [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 481f59093d7dc..52c3a69938d74 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 1188cc8469a58..b5fb2aa9d915a 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 61ea124695cb9..0971371f7949b 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 a4c19827c902a..a885c86bc8817 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 0000000000000..237f6dac6a254 --- /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 041457aadf8eb..6e7003f1cafed 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 56b2042dc4854..b37d88a5dc426 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 0000000000000..964b7fa0099af --- /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 0000000000000..734b6c8c6212d --- /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 73/90] [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 5694e0160042c..0df2eb9842312 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 7a136b470e943..7da6735c6ce86 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 42f008b2570ea..c727ca9562fad 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 5c5625f8c7730..eb161e6e0f2a3 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 330bf16e038fa..5e5bc04f317d2 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 21e8f449dcc70..4080ad4f1359f 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 d71ce99eb1bd1..2f275f9218d50 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 f97ac6e538575..9e2a51065eb6c 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 b71e60e5ef0be..84150a6a9e82e 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 74/90] [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 06040d9a186ff..4462daa1cbf28 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 2f888d3d733c0..270ab84f01d7a 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 12a83f19ca258..40c4e53ba869b 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 0000000000000..41ff88be079d4 --- /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 0000000000000..72a91881ab97a --- /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 bc78fa138c39b..de681d5c17f2c 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 75/90] 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 b8224d9a30d08..e3b237bffaf95 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 76/90] [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 005e280fcc744..82d02882698d4 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 949bc25ddd253..af177fee33bce 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 77/90] 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 9583e195d1c82..a9d8cd7c6ec1c 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 a7ce86ea46359..54a5c319c6222 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 64c1c4ce2fa9f..f92d505c058ed 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 da16dbc5e69e8..5f2870fb6e244 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 46a532cdefef4..ab692b146e7f6 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 9be58f1b71861..0d17525016043 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 78/90] [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 b33541c5057d8..7a88b065d8701 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 26bf4ce6740a9..a6e7eef88724b 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 00cbdb941c11b..340093995b297 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 095401ff31422..75ff13b66b29c 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 1945b7e3ce3e7..bc335ff6680ee 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 45d26d9269f6e..e2adaaae35547 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 9d404abcf2223..9a827b137ae78 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 ed67fdb1c96f6..00a225635fb8b 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 f6c0fb6f3837f..1b8836fc2438d 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 2697e4a571ad8..36f386e49c5c7 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 db83d9e1bcfe5..fc36a0c4337cf 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 5a40c79d6e5ec..a339676ac361f 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 8f624dabd64d1..0000000000000 --- 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 fa7ac50c08765..0000000000000 --- 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 a50e3e91ab9e5..0000000000000 --- 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 f78451e205b1e..0000000000000 --- 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 dfd9c6c9a7fcd..71d6d5eb0c583 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 5348c12fb6c8e..c89199c2cb0c5 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 1d02acaf65f48..c4cf876cbdc7d 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 189f230c02c8d..3697d27015fdc 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 4a64462b27ad5..e112942b09749 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 0000000000000..de710c2f1b17c --- /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 0000000000000..ad737ac410e3b --- /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 9ac61cc9487ee..0000000000000 --- 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 a546d20e49583..b1310e363eef0 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 0000000000000..5686be269121a --- /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 c8076ab6a4484..0000000000000 --- 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 0dc0e8a3fe1f2..0000000000000 --- 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 a1bf4d9d35f65..0000000000000 --- 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 0000000000000..865af2266f2e0 --- /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 0000000000000..24bdc191b3d66 --- /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 2539490be16fb..b38072464c653 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 67ee6c55ac06f..1df49fed07358 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 5857a0417239c..e43af97e84af0 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 0000000000000..0951503b04cd4 --- /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 0000000000000..832006930a326 --- /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 0000000000000..08463146a683e --- /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 76d3f07facf05..58d04788e98eb 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 01997e32f243e..da71c1796066f 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 a2e0c2d2921dc..ec5e2aae6e2e2 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 8840cd4bee0dd..bc5f6e3db9169 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 79/90] [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 e9cbda1f487cb..1630d63aee5c6 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 40997de054c7f..089bbd4bcb4e8 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 80/90] :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 539d69207f5f9..3b9fdaf094822 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 81/90] 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 7a88b065d8701..b33541c5057d8 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 a6e7eef88724b..26bf4ce6740a9 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 340093995b297..00cbdb941c11b 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 75ff13b66b29c..095401ff31422 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 bc335ff6680ee..1945b7e3ce3e7 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 e2adaaae35547..45d26d9269f6e 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 9a827b137ae78..9d404abcf2223 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 00a225635fb8b..ed67fdb1c96f6 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 1b8836fc2438d..f6c0fb6f3837f 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 36f386e49c5c7..2697e4a571ad8 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 fc36a0c4337cf..db83d9e1bcfe5 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 a339676ac361f..5a40c79d6e5ec 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 0000000000000..8f624dabd64d1 --- /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 0000000000000..fa7ac50c08765 --- /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 0000000000000..a50e3e91ab9e5 --- /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 0000000000000..f78451e205b1e --- /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 71d6d5eb0c583..dfd9c6c9a7fcd 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 c89199c2cb0c5..5348c12fb6c8e 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 c4cf876cbdc7d..1d02acaf65f48 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 3697d27015fdc..189f230c02c8d 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 e112942b09749..4a64462b27ad5 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 de710c2f1b17c..0000000000000 --- 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 ad737ac410e3b..0000000000000 --- 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 0000000000000..9ac61cc9487ee --- /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 b1310e363eef0..a546d20e49583 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 5686be269121a..0000000000000 --- 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 0000000000000..c8076ab6a4484 --- /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 0000000000000..0dc0e8a3fe1f2 --- /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 0000000000000..a1bf4d9d35f65 --- /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 865af2266f2e0..0000000000000 --- 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 24bdc191b3d66..0000000000000 --- 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 b38072464c653..2539490be16fb 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 1df49fed07358..67ee6c55ac06f 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 e43af97e84af0..5857a0417239c 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 0951503b04cd4..0000000000000 --- 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 832006930a326..0000000000000 --- 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 08463146a683e..0000000000000 --- 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 58d04788e98eb..76d3f07facf05 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 da71c1796066f..01997e32f243e 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 ec5e2aae6e2e2..a2e0c2d2921dc 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 bc5f6e3db9169..8840cd4bee0dd 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 82/90] 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 307d47af9ac50..e4c80a0783b5d 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 83/90] [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 f67a9df4a4a85..4b0d8cdc55094 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 84/90] [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 611e150323855..46a8e2d01fc96 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 eb81ea2d6a0ac..5b71e9b15860e 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 90a0addfae490..90c9181b5007a 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 d48d80add2435..035659185955d 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 0000000000000..588366036932f --- /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 0000000000000..766843311cfdc --- /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 0000000000000..975d28eb9dcbf --- /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 0000000000000..7f1a6f969272b --- /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 0000000000000..da0a372db8aa2 --- /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 c869c9c780bd9..1fce6f17bdea6 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 78a340d6bbca0..6d5f81b076560 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 0000000000000..dc77a6b9eea8d --- /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 adea89ce1a051..83443dc20b9b8 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 2851c92816cea..2348fdf017c86 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 d4ba29a4ef950..4daef6cca45bd 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 448cb215941de..6fa0c51f500da 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 df91314479f18..0c314ba5573c8 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 0000000000000..3a5d942d3b532 --- /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 05ccadeaf67ac..5c681e5dbbaec 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 528592051ccce..9ad5abc1c7ed2 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 0447130e1bd14..32911a2c8e4ab 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 3b987a7211411..493b41bc0165c 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 569916ac20315..5489f7a394c99 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 a9da5c6d135a3..816aef5ca2dce 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 3252c5a27d85d..3a7308fef75f1 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 f39b080e56e30..3cf8e60c5e168 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 7410dd20d9286..32568ec2b48ee 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 3453bc529b272..fa4d4e40b3e52 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 2539490be16fb..33fd1918dad59 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 9b9d72805425a..dce08e2522beb 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 29a4e5ce0b299..bd72c5a4044ee 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 02f0cb4867646..51f88730eb6fd 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 86bba69699195..8abe054daeaf5 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 f6c1d6b44eca6..d4adf55004389 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 82616aa36d27e..75686d7834070 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 85/90] 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 e1dde61bfc3ff..b4f2c4b4bee11 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 ad2ab74098c22..545fb4dbc4606 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 fb73fe1555965..b9db2762bce93 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 86/90] [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 d568e7224fd20..1815ab91b5316 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 87/90] [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 4b45cf645201c..1e421fefce835 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 5907247527585..c2dbcc1046f54 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 88/90] [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 dad7fdfe2bc5f..5fb13ce31247b 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 863d8d1000f38..22dd2ef4156df 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 433a81884f157..959a630b08b51 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 d4dec3a8a5825..6bdd014296419 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 66512a1126b06..736e062475e6a 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 c5e1b5c8d916f..17bff3f33e8ac 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 9e2a51065eb6c..569669032cb0b 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 84150a6a9e82e..01b8cc98ba5ec 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 89/90] [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 52bd024d8116b..81b0a71e8d943 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 7f81e9d105186..f573a2641b864 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 507bfc36d47f0..bf767c7e65207 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 0f2ce2c917738..43cca5f0c6a07 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 4d687969308bb..044678b918fde 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 33a98c7dbf33c..736fd30bfbcbb 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 31300707d147d..60587e56bdbae 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 d795e63bf81d1..5229380ac55f4 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 2945b9efed958..4cf5407d79691 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 96d60e2f92385..3926c017a9502 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 726855783be63..ae102f2ed540f 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 6dab8595663ed..4aa0b74148438 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 89f3c05e621ec..9932fe1625c9d 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 0000000000000..2504a2adb31aa --- /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 0000000000000..6ba924ff32268 --- /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 c1a6d05cc0577..730135424a4dd 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 cf3d870538004..eded70a75e4ac 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 d285d3a36f66a..e104261f90847 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 0000000000000..8b27bacff8ecb --- /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 f6c4e3fd057cf..8f7471f255a5d 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 43cc69687ffb7..66c5b8da0591c 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 009b447402f9e..40a7276bc10d0 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 3152ac27189b3..e7fa87435cf09 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 e266c729f26fa..5ac95c9a91f64 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 71a960fc1919b..0384517bf9834 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 d094e53c59a92..0000000000000 --- 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 7c762ac3409f8..9e843c98cb649 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 b5d4edc8cb43b..b7e07e6f8e274 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 9138b199fd578..26afa65b9527c 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 32658447acf2b..3ddb804cac213 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 ba10479a2bd2c..fb748cdc63aff 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 ddf727842780d..fcf915618a0b7 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 70f56f8f4e6d2..ec69989a8313d 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 adbb23b921d4b..19f31d481f58e 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 95a2b104c7a1b..82aab592a1344 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 82795b8bd9317..ebe0cc6a4178d 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 17994bf799487..f5de99d04c01c 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 bfcd34c4ae710..aabae1a26c1df 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 4f336d9a8ad27..6b903214f8f97 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 f58525ea6f974..5f308387e9d8b 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 1cbb3e92134b8..1da2ca14bd16f 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 962f5c4fb0d7a..f5356e5eb29a5 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 a415d181900d7..796d641f3eff7 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 93a9a118d23bc..3b257fb812bf9 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 3adaaaf091e08..e9427a996ad1e 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 27190c9b82142..defc2cb9aa9b3 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 6d23246860423..986878e65eb8b 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 0eb6e356e1397..cb3651e4a458a 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 19f79da940253..26de152f1473e 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 90/90] 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 1e5a135b723ed..b2299c2391886 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 8208496f7d800..1cf887290af77 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 0f35aab461078..81ee6d770103c 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 8fa6cd3c232fa..96bf21906ed4a 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 609fe6d00f173..b9eae3d022439 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 fc670fda132ca..c4d2a31724d48 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 ""

    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%0A2B?K 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'&rQ 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 z zg+@Xu*So;h($bv?Atx}F+snz;okd~y?oBrwn{X-jUJ8Q0;dS#CUL1oGM&YuVNhl`a zpgyF)xygZ8;K)vdY`Bl7YN@qutvMq7`aM3znr6m_bjBj0ZsmmerC$ABo@5&uBCmmJ z*%?{W0N)vt?^dgro;3bi;Qstj2Fz=v<&CruP^n|GpD9K*SBX*47T8l8aAhEyM%3-- zr3y?ESj~8&s-YW(uRZELTa-7&xnQ^22FdiA%ej7`&z+O3ss(-_t8JMJ$4hb|F68I9s*K_d* zC->%;B3A+HdrVW&x(7Q|1GpDjX`-ViT5(BNBKVIzGZ2#E)MI^bV0e()W~oT8(m0<} z7MF6O5V2xo(zHfc|M?1Q--{^!IXAl5v)IQ01Y4xDgfymk7hz9B0a#NFmEB8AWp$^h zdd0nNq!Ob-!uHb~N`5d00&%kK@Q(>9kk zny|{X$S628&s({5jBzEIGngo8<+(|b5uy(tZvSTCUUha4e@UEhx;y5S(dvke)M$S} zpJs^-6b10WJi}>sUK6&|pljM5>k+K@p0aS9{$vzU#C&UBJJ9=pAQE18A#-QTrRw;_ zpespb!qv2B#n1pOkFKYcLaM1)uDBH9x8s01a2)8Hn=mb5O_6-HXuHv}y1h6}1&8g?< z_j;Ym=x)s6P@2v$Jn8S%mwH9bv(ch~6hGlGX759DXrBWm$PS%s!P>M}1^~(~qFIoJ z2Y`cB+Yp;#))x2ZvXQm1*W(J`#yUI}g+4MWi*M?Vo->#|&!N$9AqNUnLv-+tIxJ>~ zXjmPref+2}7iY@C%x1Pi)tO*Ss#*uTke&OtTpc*E^nxp1qZ(GO_NY%hEnGqH{EHLC zF8O9eTps$_qZJi1%0NEa$Uc!#xG*0qehX&;LMBTgR491TSYZ{*hC7{f?4p&gEk=kw znd5seur)6sR*9jYzLO$=Q10tLqeQLDd&ef?1=Qm+Z5;O?8VZDtVyolQlYig+Ob@c& z;#jXRV$_&=`?-YVOz>>ig~dKClqlq!#;a13-7T-HN#~iP7jPM?kEQk$uw3_@GRUi! zkx>Zg-k#?UVYnG_$Nh02#qm{v_IKzIEW z;gF&O`+;?;JPNfHxTz?F?6Yq;b=?orY@>XyJiKblXAT*JKIs`o`rHmkamUW=6^uqzy$Za5rEz~^$eavs>pPJ74SF%45JSxIsB8%M z#QIGjxc2QOnvPnnlF&&9D4(joEirHP+x55(qrx)EH`-E;1J^FTAv_O!hW`AhKk7`x z_rZN#Ya>PxwqV?n1O4I22j!O7ltDr%Zc!EoW-7+ECPz-QP)P2iJ$wDzj{r=a8K zmbjT^B!n@*OyL^;_kBK#tOjjXjL)Lp%*!L4pcDJ)_vNp)65tR&nlbVs<=Mkb*$&@fk!dwHb(lYOQ98xZ61IZN#gAyRz~xw~S0c$8&W;Njc{I8CFI z54HT4gP54H6L(>?ej1RT${E&k6R}}jqDg!*jnlhJ9UXhXpNPHJN#Y{>#3ujtbYKQ2 z9EaDuJDqBeJptL$-r(EuQO)ZpC*eXt-{<^qn9yCP{T(Y;DxT=Z900X`%zNN2?4TLs z*)Tutavve^_OFkgoC`J3nHPs_fX&4)Y-w=)$7pL-ZTPwrAD^z<{lha;>A^j47BjUE zh@{3{nJ6x9pQj!1i0pImzIRe3!85o{r%{d?NxY<&1}%U5lKx~C`0CiALeA++!ieCN!TXnw!#5d2MqvXoeDq_@!JM#hG3E0t|&Io-3LeJ-2r zc2-qRiE6@30LJcH#(v2B&WBl=7WmX7X{vg+N`=d<{z#xi%2&Yi+>G^uL6P3UX2me8 zVElYiVP6aY>z$v{6F7FqzC{|mg9HtQCOSawA=`&^E5Gk>7;#um$zLpC3`*3qi)#3m zn7&eXZ=&vMl}DqeXb+nN|5-pdK>&2ayua0zUAchcK!F09-03tsG0AvynWu1DW$S55 z$H)_A7esLi$VoKV(~vZrfg-$@f%tt+)2WxUYmYuo`%(oY3NmK&DQj1W(n(V>F=^>m zs@Ld;uBx3@wYB4##4_T8z0%=j_vFDNTI}V>k`Q#o+7I#BDb$ReY*HJ>*`UJ`;umnc zzyz7yU8A!Y)i12}q3@2@o_hnNW?1(2)4kfDqOggFW4R=M#hQ;^l=1Y)p&z`)kn`$W zJ?>R$o0Ybis?x^d+-aC=@C^g{0XX@UHK-SBAY=o~wmJ*-^6)8>G^es%pQZZgx@FJ0 zL^ERN8Sr=Kat0+>Jbf_lbcNz9zJ5r6%;{i`;2RONSs9s}5682>vVB57u9$D3S0;YK ziNQ1ywd-$C?U}P6Ox>r;q@#z?EFo(jWSvJ&u|FD=9qt(j8QV|ci$@&*k_rrsMv1Sk zo;v39tw7n@saiPbMhUO|HX1tEH4gEayvWJKA)Dcu<9h8E(Q;s3- zclfyVw|0BxUIUcWQjdF4hTtnurlnd}P2id3VK|D*DlaCEikbgfu91F? z;9f8liwK%5HW||(--GDOvmvLE{l*1zRu;C+rdo9=az=ezoRj2v+A_XrU<=ru(jOmsJptm*>KfvuXO?dn_PrmZR)&rJWOhT!tlkTJ?{^VKZ^|3 ztP5Z4IxKlK>0$JZqX*wV{LPrl_2k|(QbVL|^V#lHuS$hXU|#G$zyd-6N^;Z#WPj^V z6J$>K=43}+*pOsVJOaa`0^V`D~TUTwH zfKBEuH9;vRJuVjr;<-t%1(&Xvsx@Wj{wx=$wBSollg=>F28vDl#Qoh0E0ctx0LDhP zNh6(Oe01ANXUC&+`4R4BG83PS3Qp5|>w;^!#?@o*I?0=9eUSX@xB9s6vU02k&{gg& ziz_0w>W_3AwzzY;3l?G*=M)fbuNM+>UPw`muw7|no7Kj!CP5%*buytuf|Wa8vUTFUw2mAE&L?!_#ol%GXf<#>}T{-c0XJU;nZN zlt8~T0ZI30-r|odQPT^n8QY;BtXTp3AbA(Hjd@xlJXA5>sDNc+>^s1~A$@mKi*_PT z+-rGPuc@hE8#>n{9u~mb+2nKZGif=FweY6KDKW*S2YnOXpYe$37<*f#&^%mtCylg8 z_gci;q_Y>1s8e0C9eU7B|KRY?&oLd?M+h$oA{*anRc?o;qOT>_)>`J*S6z3$f0&H~K@|)XGqO%kJlmp~w9esHZvaWV zv)@9rP0IVvT|L>0nI{9mi<5C2!xQ$6-nSZvaSnY2=ZgcXTxFQ|C*CL^7J1#ja;wrh z!)GO%B1hc~1s!(9_9*E>7O*xI3by+v=#$1AhF`E~uR5f0_1zGBj%^xXi^$gZ#E zYr&y%_lE5Q02>8Qr4(6373<+NFMzSzb}W+{vgmd21n2c^~CJZ&k~w{ zlWKyQ9e9c>@3pH7t`8ufINNl4Y@RBv=O@+nkv z({y(IA_XU^3HG3wMaAc+O4)+fnn0;Z#>bCCCG`!PE1fYlMZjsFr|@DitTRm6Z9CEt zZWqXgmEKoo^9}Mp7H`e{jBYBST78? zC+3Ji86VY9{BCUB8f@1RtRIY<(2DL3nrWGd+qKtW=9>`q`R?P`)lBYAqviA!SU-2z z5v5>rM&3#nHB2{68a!wfk)8qDq;Df9M`6ajw<;(It>cR5fN5Ay4a7(6?zW}e5gU;} z@6fY02oM7SeBd+P7k^;9vVrTsKAn^_MwsO1*U`HY`emF2TAO$H{f51&we@@?Y=nJW z$E3*POR&C?u9)gIAY81TGMWOI0;ld46_*f!Y2?pJc9OMJSy0GnwxLGRJC`uy_QYMLY)>8s=|oy?JsmPDN6Rx6DK z%lureITpyhGmcoA)RHiPgQ;$gU5}&k5WE?D1)*p9Pnw#%S~aCU25;0XJG#j`8>iW~ zut*$M4JfA#dfaX}sffYHNp<_{_5hZp8}^|d7ccmu!P<)DP&2ucg-uqwyQ}S%IN@Zj zD=jf>Y<(LZJ`;IeD3_=60L!o}oFbji!aVwId?3~3PNVCsJM!*dHJolr;B5hxsxY?TNsPb9et}`50JyXFpbJ zJRIK>|J$WCh%-IfEBW^MzY_ezQnC~TV8OfLKiJO#77@9=l$jK6*J9wh%+3UE2;gF8 zKWhHo@^8sJ%Zf*mbs*5vc~lCZd1vgAm=)~ib$^9h01*ooVDr^LL>r!b1A6^&s+IT? z5aa_-Z+>OxkCumkZkwCBgbh{gx$(i|d~^;@>{;JsET2`n`M>2%q?UIG*ANFjfSAdo$hQ>u|SAko7D>Inlj8p_{1qU89 zeM|U*+&{9%^`U8cAAYsR3~vm_cOSiE0X$RD<3Ah)B3S?i;K$s4!bj)5;%T5ACi+Ot z-llNMI>z41I-bWv})2sY%-C4VCzpPz*E%zmpa0*|D4Pj~e z>-Tx9)#@Y$sMn$Kow`@Q9hWPDi3U*NEOB9X;xzNLwc~tY{J&4L)1_^_^9CK8!zDK- zKaL#X9Q&wUpP1GD!&3vG(PpxO{~E1emfU}m8St8yAK3yA+E|;H za=AX$X8eqsY0ZKuzPnH6ZTyF9Bo)urq`=f_bmdJ1xEl+&K;KR)ghH*s}n6Vevj6ESj^?HaUin?M?5EK$6c$L z@(;5gb-_1;#i8NAxTV0v{v5Z6Tl+uk3<*Rg9Ic5N+_$Xo<<@>a4cgs163f9i?-}Ke zA1qFmoCB(9cjJ7kH~VmC8G252c_Xtk@q4AFT@&1 zAJdlY6@tQzeptQIXI ztY&GrFV|D%OGF#D--BpAzFs!7G&y$G63ggXNX(FPm5CVl(hDkX3Ds!8Ka+1c)`)-L zI27^OnQPw-FCequGn@H60RB^MvIa1KbADPglkOJ%FADR^hkJ{?z?_Fhs|x#oAN}jb*UGNmef)m_yv{jK 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 d7c69e5445167..646c611901c7f 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 7fa95d920c17b..6f837d1db26e2 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 b0ff75e73e86c..fd1f03c586f12 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 bc5f8bf87e100..e11661e4a942e 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 57816db01b58c..a7d795c93e0a7 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 f1e8dc6a6efa4..5af9b1652c889 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 7c5510519d202..0d2c2e60abfa9 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 6cdccfdc78633..85ebb0032971d 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 c104312f19edc..0df1f57eaefa0 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 16e3dad5f46e9..d1203e19c0208 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 14/90] [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 faf0cb8ab272c..0f25d564e5580 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 727e0fd18a52d..f44446991fde5 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 2e89ee70d057d..3f6f9f0966c9c 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 8229b84d15b54..859e9be9d29dd 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 ccca51b13f9ef..8b954b7271e41 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 9eb743a3911c2..507d2be7198d5 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 9043514fad317..465c5d741d5a9 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 c765725eb9750..7748a5fe37179 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 b07962c6e66a0..3b4edb8c72b07 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 15704925b1c6b..aef3cda8679ea 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 30369b0fd586c..80bdb8ce737b0 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 c6db0dfb6aae8..5ec4f8db4a0ed 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 0c92267382053..efde7184ac731 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 915c56d59dbb3..0944b4bb2cad4 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 ac27ca4398326..1143bf8f7561e 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 85d4d73da82cd..6f610d8a6a2ff 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 a6f1eb8572ef1..a9547fe90a007 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 15/90] [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 251ff1e6e5f38..fb766124ea6ee 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 e24da8a2ba0d4..828471a1aea61 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 ee3098b8577d4..8c256c54c24ab 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 eb406cffccbb4..476a9e4d615f2 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 16/90] 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 628b3a8bf173c..d8b727bf3b6bc 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 17/90] 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 a4311774fd448..7eae95ff54bac 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 18/90] [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 b9693fde1d659..fa5104da8dab6 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 eb123590af20c..4271b8417a984 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 781c332430c0f..3aacd1db2f3dd 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 708cac5a845ce..06e63c6b7ec59 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 ffa0bf0637900..6cd1ae275d592 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 c705246014a7b..e324f66ad38f6 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 471d00728bac3..93f3756fc111c 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 19/90] 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 49e1397d10f97..349719c019c22 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 20/90] [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 e811af224e9af..61a1ba4ee1ce5 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 21/90] [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 1122c2095ed3d..26a9eaefc0413 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 22/90] [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 8f4bed0196071..f7522cb4dd585 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 19a23e5002567..82259aa2312ae 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 23/90] [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 75b865a936238..90a5bd6758bde 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 e6c6303642a6b..7043613b8e20a 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 5e554ae6566e1..72dec66279164 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 60a4c56fdb3b8..ba10479a2bd2c 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 24/90] 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 ebead1ae0bfbd..8e600eb6b23be 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 9cb2df76bd6c9..d7645d86dbd1a 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 3da5e0ed9a6ff..454121392ac68 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 25/90] [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 a208ef405306f..d8a5f57a41a6e 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 26/90] [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 00fc7abaa043b..8c9ec4e5a54e7 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 0000000000000..b9ee0557faea9 --- /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 be0afc65aed3b..bfb263b415891 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 0000000000000..4f16ab01ba19c --- /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 7bc5f4037c3e8..539d69207f5f9 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 dd27632b36e44..d86500ff8a4fa 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 bdffacde65639..fa20eb6f20fa8 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 656d00960766e..92dde282da502 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 30cd63752f420..f638bfd908be4 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 fd754906ceb02..e13fbf62708ee 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 23003a4ec3404..195a72cca9fed 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 27/90] [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 e013fb11c2d68..f4218d53c27de 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 2958e3e171948..c5779a56bfe82 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 f9ba0ce545bad..540dfe150d037 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 015442dd3c4fe..9ca854598e786 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 375ceffe492da..7c4b0d52e5182 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 fdd24ed2394b2..f63a2c7babb97 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 0000000000000..55dd67088eb2c --- /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 ecec66db845c2..cd5a72c2a1414 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 6269c690a18ad..49658f3def5a1 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 11d7dcedcaa34..c30b4f96e8145 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 68eb8aa130d2e..c951acae21633 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 46a91738c380d..684838ed4efe0 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 b96b98870e38e..b63f89b490dc9 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 bf42a5b0865a2..dde3b827bcdae 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 28/90] [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 f71d2b9ec6326..19315b5835d5f 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 6635ada9a4036..7ceffcaaff5db 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 29/90] [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 f622ea9248b24..d88f4119b691f 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 bc77c6e44fa56..f3321580aa052 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 06a0b90985af7..1fa256b0f088c 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 bc13a12e01ca4..daab0540c23af 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 85285eed2817a..f49c6327483e3 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 5e7bf0659947c..dfff89a90c732 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 b7586ee959652..f6c1d6b44eca6 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 30/90] [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 06c1bb931f730..2ff2fd67435ab 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 36cc4a3c22e44..7055d39f80aa1 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 31/90] [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 58af86b09ed03..c46ef8893fa40 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 fabf6da49cf47..f0900ae259592 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 cbbc9a33642b5..0133642b8c4b3 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 e457453a38f19..5384122a18621 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 0000000000000..49a08a12454e3 --- /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 2c675b9f28804..6d8b35673fba3 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 0000000000000..b27e848c98a13 --- /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 0000000000000..19bfd961f6461 --- /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 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 z 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%0AHAbZI|8sPuU!^iCy7BUfTqJgeGV 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%0AtVqZJ*hs05rJPyHv-9bN{Q7@(2m&&+LM< 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